diff --git a/.gitignore b/.gitignore
index ea85efc..4b9cea0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,8 +24,11 @@
/storage/backups/
/storage/importprice/
/storage/imports/
+/storage/jobs/
/storage/logs/
+/storage/media-trash/
/storage/releases/
+/storage/reports/
/storage/runtime/
/storage/secrets/
/storage/tmp/
diff --git a/PACKAGE-MANIFEST.json b/PACKAGE-MANIFEST.json
index dffaf78..af4c335 100644
--- a/PACKAGE-MANIFEST.json
+++ b/PACKAGE-MANIFEST.json
@@ -2,24 +2,24 @@
"format": "ave-core-package-v2",
"product": "AVE.cms",
"version": "3.3",
- "build": "0.37",
+ "build": "0.38",
"package": "core",
- "built_at": "2026-07-30T13:19:22+00:00",
+ "built_at": "2026-08-05T18:33:56+00:00",
"installed_modules": 0,
"bundled_optional_modules": [],
"optional_after_install": [
"setup/"
],
- "core_fingerprint": "ad00f4c5d033c613ea66b4bc56a4b5de126abdf00d79eaa64b0b1bbd1855d0da",
+ "core_fingerprint": "a8ac3d2be6a3c4b43c7d871c4e5ece44b1641f1fdace69329e296468e1d192d2",
"files": {
- ".gitignore": "9aa78fb183d01611e3ce9789d244d09ffb862c6ae718438b2132a7edd53a16ec",
+ ".gitignore": "20d4fb177d47da6944a7a1c2dbf5918fd62766881aa52b00901f9054b1db4b49",
".htaccess": "71c06b7bc41b09c347a562ca72768acaa0ee1ef8388c749fc67956c793d8a826",
- "README.md": "7d3f3a226250482eb09aab8188b88c728145a632d7cafe6d742b6003a0ca4d8c",
+ "README.md": "19b820f1b092780039aae011e133dc6a1e5f1cf213b435e0ff1962b592b9095b",
"adminx/.htaccess": "d03ea2d2972af8b7545a2d57c6253f303d15adeb30b775e161d887ca5ff73378",
"adminx/Support/AdminLocale.php": "a7fe84d86d65c9f021106172b1789c8bc6221c36b2fe39cf883ca9a505e3e8ad",
"adminx/Support/BulkActionExecutor.php": "82859d10eec39a53091ed46604d6819e7111b7d879e5f0f1595c26f8a7ff1a60",
"adminx/Support/CodeEditor.php": "51532980b1990e595b796d884c1a8bcc46f77f88344386e5153b4bef4cae973c",
- "adminx/Support/GlobalSearchRegistry.php": "7722b193cd60161a29d8fd166c4445294528eac5336b2810a1d9c281347a188e",
+ "adminx/Support/GlobalSearchRegistry.php": "7f0cb38a76ecb4c71af2891176406b1d46004c7b778e44cd2fce8367407e9da1",
"adminx/Support/InterfaceSettings.php": "e42cdc1157d8a55760278ab46d603316039fad0680eadf7c95824984f45f63ea",
"adminx/Support/ModuleExtensions.php": "36de2286496c8327ee22d806f98a6bc9521a2d81cd1bb4182122c7925ed8d0a7",
"adminx/Support/Notifications.php": "ab08805d571cd3d8a4b2a09fdc6ce96fb4c7b5ec75691322cf8a4e1a142112a3",
@@ -28,14 +28,16 @@
"adminx/Support/Roles.php": "6be335dd643317f77bd7c2db92f25895e601fe72818befd62f6aeb3ecac9fce7",
"adminx/Support/RouteGuard.php": "e9e20c097c0db354851546585be72bfc71a5d14652871f8bd1160e845d4dab1b",
"adminx/Support/SavedViews.php": "4548ca129f270184e61cb670e7f44a1c103099a6a6c2820bed1a11bc18f227c4",
- "adminx/Support/SectionHelp.php": "75388bc96c0b43aad13befdf22884401b05361fc1d6dd5d0f1e85e00c09d2bdb",
- "adminx/Support/SensitiveRoutes.php": "8d40c429d6abbc1416e3797908672e551d2b3abe64cb1763c6c410e7edb9dbce",
+ "adminx/Support/SectionHelp.php": "6a5101c1f7b61ea1b94aa4a37985d3a5955aaed8b73537f918f90f7749dfa08b",
+ "adminx/Support/SensitiveRoutes.php": "d14d809310b43fdb66ec141b0573ec1020aea3720d20269d39f201f411d9f9c5",
"adminx/Support/SystemFeatures.php": "f18ada623710f8c3efc6588c037227f6074e75bad9a3820aeef60b4d8d4b20a4",
"adminx/Support/SystemHealth.php": "286aee452e90f71ad64437bd39d6dd985d312eb85bbb711490d3a0b631a16aea",
"adminx/Support/Twig/AdminConstantExpression.php": "44bb7d2d978e3c873d457ba1ca7b8021c6f5292e1a4f8b74e49348d01dc84b1d",
"adminx/Support/Twig/AdminLocaleExtension.php": "1fb6c1d1c35d74fdb4a578cd15b3f19441725db6f11b336dc6948ed982842f3a",
"adminx/Support/Twig/AdminLocaleNodeVisitor.php": "ccf387680fe8b0e11bd0fe0d23769be8b7ed9afc363cb9a802db5c4aeb7d405b",
"adminx/Support/Twig/AdminTextNode.php": "e51d8d3ee49411f42c8a874cd283f60c1fa0af6506b34568a119ebe2d18d7268",
+ "adminx/Support/ViewOverrideEditor.php": "c3804e0b399cacd604ad2765885366a4baefe0ee7a441475276fe7d3074dab36",
+ "adminx/Support/WorkItemContext.php": "d4b87b78ff1f2bdd89d77bc0483ebb46e5c11616635211ead9a43b34568e3a59",
"adminx/assets/css/adminkit.css": "15409efc9387120866479c3351a4a291ee7d8207694a84b228fc5d35fc184cbe",
"adminx/assets/fonts/NunitoSans-Bold.woff2": "2d48580b7e1be60fa94b8092ebe86471fe0adfe5ca75242a7af2042ac9da825f",
"adminx/assets/fonts/NunitoSans-ExtraBold.woff2": "66612ee9d1cdc341c9eec8a43104bbf515e7cc52821558bfc7dfcf33c8cb0cc1",
@@ -44,7 +46,7 @@
"adminx/assets/fonts/OpenSans-Regular.woff2": "a26ed465673123933c5510730a7286f49016a40fa94062021d1dc4c9bfeddbd3",
"adminx/assets/fonts/OpenSans-SemiBold.woff2": "7d963e1d2f61c11c2e8bd2eb528777b5a55569708d50a7ee7bd097d7fafe6da4",
"adminx/assets/img/logo.svg": "685d9bf037b33fbcfc200947d5051c5325762f8ab8a29ac9e1e587076321e463",
- "adminx/assets/js/adminx.js": "be65a81e87bb6580c0f3b59514c92627611ad18ba62f090a1600ed5fff20b63e",
+ "adminx/assets/js/adminx.js": "4303a0a0c89c8e339143e6d1e0269a51b02b1fe72383f83af6a2a8d3b4ee1cf0",
"adminx/assets/js/bulk-actions.js": "d7ee80678e6703aff2418a4679ba8e5027e7220cb089848bcced6d9f100b3aae",
"adminx/assets/js/command-palette.js": "f62f0bad5ddf2b6e813e7eda094d73df63dce09a6e581025971e8f10430e8d9f",
"adminx/assets/js/editor-codemirror.js": "90a04c219e84f5391a40b0d1fc807ecfe4ca582a198bc202bdc5aa6dccec51fa",
@@ -139,7 +141,7 @@
"adminx/assets/vendor/tabler/fonts/tabler-icons.woff2": "cce741fcb6c526dfea3c0d48ff486279ac723617cd5b4de2bd5d726e94cef477",
"adminx/assets/vendor/tabler/tabler-icons.min.css": "676509f34c06d34b75e4227e4c36105e5d220b458f609fffec247f20a8d72a8d",
"adminx/core-permissions.php": "084fbff2f7625f0e1b6a6a15d00fce536212adbdf40f6a7fa2eef34cab54394b",
- "adminx/index.php": "212b324ada416cff2da4eb876976411eab53890a7ef60784136ffdf4fa60decf",
+ "adminx/index.php": "bf4c543d4b32cf24df073318151ae6a7192132897ccbb81089e7c78398247462",
"adminx/language/en/client.xml": "de712c66a939fcae607c087e0941dfbf824152a41be85aeae0a0406cc0ef3053",
"adminx/language/en/common.xml": "e5f9972786f1d2a8e05f86913b07c361b82811f99cf51bee6d38e9ed275fc995",
"adminx/language/en/interface.xml": "80ccb298e1ae8ea31c533832072b99c1eb1369871f6d1b357635aa59622d9d52",
@@ -150,19 +152,20 @@
"adminx/language/ru/interface.xml": "03fa6351745d2e47c2b3407da65c8b7b048b8e862409dc9bb934e939b9439c75",
"adminx/language/ru/runtime.xml": "3c411a18695af7a63dd0685a8351ac3a51695aea7d1fa2550fb24cc9e3e82be6",
"adminx/language/ru/section-help.xml": "e821c8589580e4fb898f6f7352691f81348303edab99c338c942511c9bfdca65",
- "adminx/modules/Auth/Controller.php": "bad2d7fe5f7eaf4b7f22661945d95df5a3201498b2920e17de5ede6f9f560686",
- "adminx/modules/Auth/language/en/interface.xml": "175f757bdc70cb47353a379a6a2303d4903ae7d446fd9a1362919a35517d11a2",
- "adminx/modules/Auth/language/en/runtime.xml": "2a549aa418e35f02d97ce89bc9a88103ac39153526e2c0a11deb689920a3da69",
- "adminx/modules/Auth/language/ru/interface.xml": "f8d95a4a8039dabdca7d5f3095feb4904714225b1a285527fd43b0cab65bcf79",
- "adminx/modules/Auth/language/ru/runtime.xml": "94f025e2ddd2327ced6aa4740dba80025ae1d71b08f2ce6bd7de9a222277e058",
- "adminx/modules/Auth/module.php": "da1ef0924fdaee46a2c1333c43ed05d3afcb02ca16f1994b0eea840a657a4f12",
+ "adminx/modules/Auth/Controller.php": "55253fc157e5769435108d45b489e0430c3c9ca34842032ac067638654449b0a",
+ "adminx/modules/Auth/language/en/interface.xml": "f1fff693b755b370504cfb643bd03c44e718a72c421c45237abefc26cffa6bab",
+ "adminx/modules/Auth/language/en/runtime.xml": "79a073f6546110618937c7138a205e552b1e1f3d3a244eec5a24a335c5ae7004",
+ "adminx/modules/Auth/language/ru/interface.xml": "b88a7d7ba803f33b65d3cfef971973ce18c66cf46dc65939258f5706a2c89c09",
+ "adminx/modules/Auth/language/ru/runtime.xml": "ee70e8b6abce1f90db8f416ed9eab7f8e1fb50d8e3d8361c2abba6ccf7f90202",
+ "adminx/modules/Auth/module.php": "af27a6f74966bd1883daa63222ebb95de0378d6a5284eca4e24f993e595248d1",
"adminx/modules/Auth/view/login.twig": "2046a79080fe3f609b88421be5cb62c291402b9717e23b14d8cf93b3c6aa0c18",
+ "adminx/modules/Auth/view/password.twig": "d7fa6526d3100a04e6bdd322b3478111743330324eb83727c9464e36912faf8e",
"adminx/modules/Blocks/Controller.php": "5665327885171e07f87823b473f97e22f416ab896471a25ff7a2dff498a30d22",
"adminx/modules/Blocks/Model.php": "69dcdd7488f308349741bff0911066c5f1ceace23216ea408fbc79da4a73bc14",
- "adminx/modules/Blocks/Revisions.php": "b0ff697364a5573c221d8a85545970c8f554af2c352bb51ff7e98930d4e7f91a",
+ "adminx/modules/Blocks/Revisions.php": "9c820024215c0760ba93fbed902b9cbbfdbe402fc9ac514e9908d06fcb794817",
"adminx/modules/Blocks/Syntax.php": "9b2eb8d40171633cdbef6cf21545958f801f4983d62176e9256bec8e4763a624",
"adminx/modules/Blocks/assets/blocks.css": "13ec7cd2b5a9c2abda0ff2d1419fed50dc1e122edf8ec278e11cb12d75b8ff38",
- "adminx/modules/Blocks/assets/blocks.js": "8d6633fa870026c2eb014878bcb985d5807fca8040876364be7b3ca34d8fccb8",
+ "adminx/modules/Blocks/assets/blocks.js": "22d512d111a1f0dcae0a649bc1d49439c733151e87382f55dd5d5d17863fa61c",
"adminx/modules/Blocks/language/en/interface.xml": "6b358b561f81febe1a3284045ff20132737e624a04b2481b51681e258f748e22",
"adminx/modules/Blocks/language/en/runtime.xml": "cd76ddcfb5751496dc4cc160dc2c6f38ae5699a3a5c0041b5fb214fa434f04e1",
"adminx/modules/Blocks/language/ru/interface.xml": "6048c75a95fb474287cf4903fe1b82f2608741b355134be885eadf511da5b656",
@@ -179,9 +182,9 @@
"adminx/modules/Blocks/migrations/010_disable_retired_catalog_endpoints.sql": "c80e95a32c596ed073ca1e15ae027f2e3f813d67867c31926ea5060e3ff5dace",
"adminx/modules/Blocks/migrations/011_sysblock_editor_mode.php": "e8c4046116dc2241b1eed3cb677515497fc07c25425628e4d349688df698743d",
"adminx/modules/Blocks/migrations/012_merge_visual_blocks.php": "5c9cd6efd66a027134621859da1059b2c403bacb732885d6b405699cbce8fc14",
- "adminx/modules/Blocks/module.php": "e196ec71bc17da48f9e1663f74db4a7de8fcd28d0f32a3f36beebd8247656322",
+ "adminx/modules/Blocks/module.php": "53eb434566d820814f5b25382200b75ed02b0067c066c8f8cb62bee13529b964",
"adminx/modules/Blocks/view/index.twig": "39f9225b6a95c65549d0c861afb7db7879ca338c251290653dded6ab7cb715cc",
- "adminx/modules/Catalog/Controller.php": "996c5454307133d98a1334584d917b2157f62c2fdc0812683fab93b7ab7f5988",
+ "adminx/modules/Catalog/Controller.php": "425ebd7b8e54ef659879e7bf8212120feda968a7560e2a614b505be882fed410",
"adminx/modules/Catalog/Model.php": "e7c7cffd91754e04dac322c31a64b420739c671079a7f8e7effb550f5019ee13",
"adminx/modules/Catalog/assets/catalog-drawer.css": "b3e4f798d7bdf329aa91987ae5be435910ddccfeb8a32211059846ab9dc6b7c4",
"adminx/modules/Catalog/assets/catalog.css": "49e7a33fc444f8330806e1cc5cbb0d523b673c64faafd25dbf0fe33067643efd",
@@ -193,12 +196,12 @@
"adminx/modules/Catalog/language/ru/interface.xml": "15d8de452eef296375ba40d557ce15ac0363881a7b763b7111c8cc221e9861ff",
"adminx/modules/Catalog/language/ru/runtime.xml": "fe59945f4ceb2bf2d85699623369e7e5889613b8cecd8551a390c78023531d14",
"adminx/modules/Catalog/migrations/005_add_catalog_purpose.sql": "006ff237e25042a4fa9b9f74d5079741eeee1aa52db0cd996ea4c8b817e6700f",
- "adminx/modules/Catalog/module.php": "6d8b0d0bc67d314c3aee6f5813c36d32b6f4bc0de884515e13b059927c3aa9ce",
+ "adminx/modules/Catalog/module.php": "69f6f46206bec880a6f08329e0b44e35bcf3c7e57ad5e85e3b720b7b4adb7f38",
"adminx/modules/Catalog/view/edit.twig": "7fa6f39eec641b23f2191a9df2186a4d4855e50d4b1cc506118a94313cf481a7",
"adminx/modules/Catalog/view/index.twig": "754c7c4dc81176e8c99b3d9e8c1fda2f62f03df341c3df1f7393f72d43c6f8e2",
"adminx/modules/Console/Controller.php": "af0309a50d7f4366279be8ea12959cf7718a3c68b895a65ec5846554fd6a4857",
"adminx/modules/Console/Model.php": "53aad480b8d4e5d68c4e9345d219ea5cbff6d04eee7ce4aa15deab6f00dac1cc",
- "adminx/modules/Console/Runner.php": "69d38df0f96d7de1d2fdcaa0e62c25c545854cfc29a26f9f9375059c1465e906",
+ "adminx/modules/Console/Runner.php": "bd65deeeaea97f4a7ee47826148775e9488a2edac80f5f8640ada6ac96f6b26b",
"adminx/modules/Console/assets/console.css": "e2645bf876bfeafc15e6f4e5ad9889adb773aea35ddc42ff151d8ed1f8866eef",
"adminx/modules/Console/assets/console.js": "f0f2cec892c4b5cdeb11730bf42e9cf68ff779974338086cdf92618ebcacdb10",
"adminx/modules/Console/language/en/client.xml": "02bef78a30b83340eb8968297639b6283dc642236e853bef413e5b7d2ef70315",
@@ -208,16 +211,20 @@
"adminx/modules/Console/language/ru/interface.xml": "55f68a6bb3fea3fbaf953482b36593a1f3e585d3a99b6e2da30d6c097915ed08",
"adminx/modules/Console/language/ru/runtime.xml": "441ebbfbd7f0e21cef5d298ec5fe314d3236cddd57e05f05fe60eb1ac3d1b8b0",
"adminx/modules/Console/migrations/001_create_console_snippets.sql": "70272e04d744eca3d48416d9ffc83d78ad00a02d2a6f68bc388618e350c427e5",
- "adminx/modules/Console/module.php": "1ff91297cbdf4a9cf0f83262f44b720d52ff235e59918b0f45544d26a079eff1",
+ "adminx/modules/Console/module.php": "cb95fd418b5f7970dea53d5bcdd0478bb0560c8b2688a95d5492ab053f324de8",
"adminx/modules/Console/view/index.twig": "c64fe9632db751357ed98cf2ddca524001e71200297e1b50f0d5c827483933af",
- "adminx/modules/Customers/Controller.php": "ccb32fb836387ab694e74607867ace0274d4bbdcc44566a5bcd2e7d6f1b2c75a",
- "adminx/modules/Customers/Model.php": "baa3362be7a06c222f4ebe35862500f69a16785234330b886485e73aee0cfa81",
- "adminx/modules/Customers/assets/customers.css": "62e0d5f0430079909cf5b77a761dd4983cd7f2179124257b180e94ff87fd3718",
- "adminx/modules/Customers/assets/customers.js": "08399baf41e7762979f54c561b32beebd26ab544cd7bdce70de1079859f0967c",
- "adminx/modules/Customers/language/en/client.xml": "21310e86bb84cc1fbaf65fad3f09bb4d058e820d919a9af6ae5e2700c2e8d1b7",
+ "adminx/modules/Customers/Controller.php": "8f64a15c6bb87eb6ef3535bac2c5364a3bb64ad6d1575eb0ae82c56a0bd04462",
+ "adminx/modules/Customers/CustomerCenter.php": "02eca82e2d1e2d7998fe6203458ee535421913197e76fb28a6e674231fb989fd",
+ "adminx/modules/Customers/GlobalSearchProvider.php": "6be85ba385ade05cef1167a6acf146a7e078d176b72db773e0d26d2ab8ea65de",
+ "adminx/modules/Customers/Model.php": "fb84df79d1ef9b403f16e44100325d26db5c144b6cbc6a69e3425a9a3f29a043",
+ "adminx/modules/Customers/assets/customers.css": "2542f8ba075ce20f4fa48a966eda5de82b5e574a17f5bebc88727b608eb47bb8",
+ "adminx/modules/Customers/assets/customers.js": "3a0bc1875dea633b78840b75feb11e903d2b2404080e0f505821156f98a8ffa7",
+ "adminx/modules/Customers/language/en/center.xml": "0ebf643e8a2e00fdf07a290adfd108d0d7e53781d15c37f44d55564c7476b738",
+ "adminx/modules/Customers/language/en/client.xml": "6f22d85d37d66aba749b7b4794635fd644a12e9e71e2a5eff66ee3b1c9813e40",
"adminx/modules/Customers/language/en/interface.xml": "573a7ca126beeaff77a8865d6114dac0429b588d8061f939c5ed7af316d4070b",
"adminx/modules/Customers/language/en/runtime.xml": "c9e6e3c654f97f0a7d047af51e07958a27da21659635f1a04d463070d4a112a3",
- "adminx/modules/Customers/language/ru/client.xml": "45b4958eb3dbeebb403440054ad640c4e548c15a0b68c3edacd95abd8b936e61",
+ "adminx/modules/Customers/language/ru/center.xml": "0e7f08205412ae33c8df6b744fe434d36c9fff1dff153e18dbbe12bf53701f28",
+ "adminx/modules/Customers/language/ru/client.xml": "592ffa9b57036d44d8be1c71d52b12db0a2f0e20fb310db19209b9e870b8cab9",
"adminx/modules/Customers/language/ru/interface.xml": "3a469c1a855f36613b56e3a5e3073579b849663c3639fae753f0b281ffb67e0b",
"adminx/modules/Customers/language/ru/runtime.xml": "2733e5d3af9ba28fe9225f1205344773d1876d6c0e6e72e943c71b91f13ba62d",
"adminx/modules/Customers/migrations/001_normalize_public_groups.sql": "4cad06703e4d5b810e425ff5f440e7e0bea493d93ee261cd5195cb5c28443698",
@@ -226,8 +233,11 @@
"adminx/modules/Customers/migrations/004_materialize_public_auth_schema.sql": "682fd96a76d21e8420c938378832f00691fce80963a798168827995234f765cd",
"adminx/modules/Customers/migrations/005_checkout_registration.sql": "4e5ac6d4d5868f9e1c91b896fc03ad0982d5716287101e721a3820d21abe1744",
"adminx/modules/Customers/migrations/006_phone_identity.php": "97e8aa457fd8f8ade781a03a98bdc7ee03cac5734782f9e72fb0b76bdbd2cdbb",
- "adminx/modules/Customers/module.php": "4db18f68c747765353d6d747ce43e3095067de8e6f76d06c44902e7f4c19c167",
- "adminx/modules/Customers/view/index.twig": "bd116c06b95df1a79b08654974d8133b84963f84fdecc3b90d7579221a120413",
+ "adminx/modules/Customers/migrations/007_customer_center.php": "7adde1ce2b92f24b7f1d1d483aca4304bad918d06ae2f213226eca96dcff344e",
+ "adminx/modules/Customers/module.php": "a8a567e986129c8960621235c5bb75c03fd19bcae5a0ae4a1065d8d1eb063d21",
+ "adminx/modules/Customers/view/customer-center-detail.twig": "2239602955041c4eebe704c70e835fd45272f721abd28bf254904901bd77a4eb",
+ "adminx/modules/Customers/view/customer-center.twig": "223e657861275fbfe482ce624a6216a91e8df893cd1c5fe58a2999606468addf",
+ "adminx/modules/Customers/view/index.twig": "5b011dab9ca33d66fbd138297875861054477af56f093282d08aaa4c576a7f12",
"adminx/modules/Dashboard/Controller.php": "7e6ad0610df7581bb010cee574d8d093c4737af439bd2b0763142f50ddee1c54",
"adminx/modules/Dashboard/Widgets.php": "56fc7ba7c1f9e30d7eae8c61524b6441b1c706a2cd56b1db883bb8bff7186eed",
"adminx/modules/Dashboard/assets/dashboard.css": "8e28b56cac2e55d9b57304ea6e265fd94a52400674c082fbdd78f1eed1872424",
@@ -243,13 +253,13 @@
"adminx/modules/Dashboard/view/widgets/recent-documents.twig": "d03f36f047574f8ce57fdcfd79b26d9b20ca01dba69ce7c71a3e9a277f0105d0",
"adminx/modules/Dashboard/view/widgets/shortcuts.twig": "af165425ea7889cdc3edbd72c7f0dd9dc5c4c06486bc4ab37816112cfb696718",
"adminx/modules/Dashboard/view/widgets/system-kpis.twig": "52dab540a189443b76811ac4b457a566cf90134366749aa9c7d82e2d23ffdaa3",
- "adminx/modules/Database/Backup.php": "cab7b7d1a8ab9d2d18ece85604670458a851665b0af64f7c37d5763cc658c464",
+ "adminx/modules/Database/Backup.php": "08192cdadd31b0d304393cec761ca78d696d10e7b9585389662fa71f53e8e4c0",
"adminx/modules/Database/BackupRestore.php": "1fb34abdec27ed24665ec0749f4ed44167f3881d3477129d5d4de6c7b36d6653",
- "adminx/modules/Database/Controller.php": "c3f59beb5874b8959a5a37c49fecc9b6b48581bf20284b73290c44fb91a14363",
+ "adminx/modules/Database/Controller.php": "87577df32e3cacc36edb57747ac9169d0e32a30b2b2f11dbbc4db18be486e3e6",
"adminx/modules/Database/Model.php": "52c23131d07bc798fb2a3489f91ae909985e60d2965e3cd5fbaf5ab441d85477",
"adminx/modules/Database/SqlDumpReader.php": "f0b3a501d0afea0ae50d35b43e901844e14d9faec286738956dc6f2b1c5ea4b3",
- "adminx/modules/Database/assets/database.css": "aefc5ac895e05190df663d2a7a384430bcbdf2cef92ef1ccd3b819524a20cdbd",
- "adminx/modules/Database/assets/database.js": "f54e2756a54eedf5654eee7357a022478988293c9419bb7ad024eb8f69ad8c0a",
+ "adminx/modules/Database/assets/database.css": "9bbcaefb3c3f3e6230250cf90cb20ffe933f86812ddb8c49d17a3f65097aef5d",
+ "adminx/modules/Database/assets/database.js": "191c97d3d7586440ca736c5cffc228e4ea9f8915ba61e5a55146f849df7e9d12",
"adminx/modules/Database/language/en/client.xml": "4464d65adfd150e597436cade1d36b0c0436654fb4c710218fe2fad117b12369",
"adminx/modules/Database/language/en/interface.xml": "da319d6e408fd13179bb4094bff6cab3c72880f691f2e80a3ff13245144014d7",
"adminx/modules/Database/language/en/runtime.xml": "180dbaa39dc46cafbd06c7f6d05cb033739d95550337be5a31d50d1332369f4e",
@@ -259,28 +269,36 @@
"adminx/modules/Database/migrations/001_mysql_legacy_index_compatibility.php": "e9a021b5643933d6ca000d54bd1a12e339080939aa84fd3ec28d0093a5b8222c",
"adminx/modules/Database/migrations/002_module_lifecycle_recovery.php": "779b04c8b35f3d81657848016536a9e3ef70fb76dd3ce5b1ba4b4a72166f7a2d",
"adminx/modules/Database/migrations/003_document_fields_text_composite_index.php": "541a8df87dd5fec6946f26dcca88f78a2bf5e09608f9300baa8532202020ffbf",
- "adminx/modules/Database/module.php": "61c12758ca1a7b59907c13cd9dbcc39ce771fc671edba665d7b6d4bcf82c9aca",
- "adminx/modules/Database/view/index.twig": "566ef7db0a78b98ab1e41750dc364c073735404c62576f7995ddaa4a6d51828a",
+ "adminx/modules/Database/module.php": "550471695f5bf7ab5045f0b22c891f65b398346fb03f5f0a0cc3bcf3fed379a7",
+ "adminx/modules/Database/view/index.twig": "4e3d3a8ccdeeb2812d4b6d3ae471c8f162d8ac0e30c5dfcc4847356b4cc063a9",
"adminx/modules/Directories/Controller.php": "bae664ccff5a63a215fa1b59b721d0b0a4055ac3633319476d09889ead0d7d27",
"adminx/modules/Directories/Model.php": "ead423e3d0a07badf5a773780ee37d92394240fc753c10fad274a3131db7c2ce",
"adminx/modules/Directories/assets/directories.css": "6250526e076f3da647c1e696ce965ae2d9d3ddce890b8cf022af4b33aee18e1d",
"adminx/modules/Directories/assets/directories.js": "8e0b59128ab92a07731009190716ad3dc14f99ff7ed2bef299e1df645a4b82a0",
+ "adminx/modules/Directories/language/en/client.xml": "3e4a857ad0fab8667b45b03e25a13db28ed03be9074dc4133f161dc90bd4e292",
+ "adminx/modules/Directories/language/en/interface.xml": "2e732d6a46e30428587ebe6d97c9ef4311cd4cfed1d9a8235d97d97e79886d6c",
+ "adminx/modules/Directories/language/ru/client.xml": "446a6b32ca10184998950b0ee536ae41e08571e6d71ae13f75d15aa68dc5b0b9",
+ "adminx/modules/Directories/language/ru/interface.xml": "a4030ac2f2f1f5ba2ab600c7f82c9e4058adda89dfbc2e5983ded602c26681cb",
"adminx/modules/Directories/migrations/001_create_directories.sql": "d1f84fccf75892fc1dcfe6b770112101e233d96d9f4866a08d1977646a690530",
- "adminx/modules/Directories/module.php": "562709b6a6ca8bea3e2e05d1dde05af0ce7e627e94d52df3b161349dadeb90da",
+ "adminx/modules/Directories/module.php": "f6b7f0bfb96d1c2c7aa52c51e60abaa09cdba7a4309d8363394a3a02a8df96a0",
"adminx/modules/Directories/view/index.twig": "0bde23bc578b9ffad3c47534c304c0016b661a36588d6d3c9ffb92e2daa388a0",
- "adminx/modules/Documents/Controller.php": "8cd40c0e942f7eaef30af8afea990746014df03c4063a69fd6e34019045fd72d",
+ "adminx/modules/Documents/BulkEditor.php": "6ca33e4ee73f83e043b13363bddb391199a1da902e74dfa7709a10ac32be574b",
+ "adminx/modules/Documents/Controller.php": "e461ac2766b15194741b0a4ca2c2aafac9edab9b9f602516011dd5168269104e",
"adminx/modules/Documents/DocumentHookRunner.php": "7e0cd24ed5791b6d5010e4a05351b709be09b6df1e700a3ff06685b9078b2b1d",
+ "adminx/modules/Documents/DocumentMediaReplacement.php": "e97d960c852162e655a4389cc5f477f0178597da50e733b00bdf5bcab076c65d",
"adminx/modules/Documents/EditConflict.php": "ebc3ebb92c3fc3ccf3909d2ff517014fc888ee20576a520b4979f68bde632b97",
- "adminx/modules/Documents/Model.php": "60ad2c0508a6f1ad1e090dc54cadd19ef864fa9657558c5d82291dc30796c15e",
- "adminx/modules/Documents/Revisions.php": "5d40ba1ae4c9563e14464f795b054f9d4edb05e02c8a719bd796126054616132",
- "adminx/modules/Documents/assets/documents.css": "c7898e92c20f71c155928eb4acb298a3975370269f449960c7576776c9134b9c",
- "adminx/modules/Documents/assets/documents.js": "d1af08bd3869764c103cd97880d8d82cba1d233fc4b5dfb01885064713ed6750",
+ "adminx/modules/Documents/Model.php": "6ac1f3e85c73e5e7c8a531b31f9b72ea1a78ba561355102301e386baf0eafdac",
+ "adminx/modules/Documents/Revisions.php": "8caef88f7456000b001757cff13393ae36991b33c4c3070c27f3eaa4e8bf6492",
+ "adminx/modules/Documents/assets/documents.css": "5e9dbbbfbf276ad94a32657dac8a8cf0a5c184e77fb6b1d40e0261876dbe84eb",
+ "adminx/modules/Documents/assets/documents.js": "b65c2396c0f866e1895d84637875a935ca4a0886378c65068e5b4215b6dd94c8",
"adminx/modules/Documents/assets/redirects.js": "95ca395c6b4fd3814da37450c27da351e75f509e26421c975dd8e0ee5f657efd",
- "adminx/modules/Documents/language/en/client.xml": "10de693182945b4c5347aafe508c212ba193acbc1384812aa2c802b5298bf908",
+ "adminx/modules/Documents/language/en/bulk-editor.xml": "b7af92bd151c7899a56cc461f4a09edaa842213cb6e6b4b4363af31aee228e50",
+ "adminx/modules/Documents/language/en/client.xml": "9ccb6f2aa9a83862abff2c1fa1c6b10760600c3202293fd7e42073c9cfb5fae4",
"adminx/modules/Documents/language/en/interface.xml": "f3a30b3c565d2e01c841c843dc529fed9844dc2e095f90b7902008ded7214ed2",
"adminx/modules/Documents/language/en/runtime.xml": "7009fa27d67ab168fecd9d9bf182216dfb0397d9c006eb6563ee3c464daa5b5e",
"adminx/modules/Documents/language/en/zz-interface.xml": "839ea37d585ff10d7b819a4fcd4bda876c94d51019489cc8d35af15fbc905f2b",
- "adminx/modules/Documents/language/ru/client.xml": "14f67aa847553269adb37efa6bb408d866e30f8db0eee92810564e0f7eb67305",
+ "adminx/modules/Documents/language/ru/bulk-editor.xml": "29500cbda63189ed9a0afdb57b20f998241594b254d0225a776a8be32d108834",
+ "adminx/modules/Documents/language/ru/client.xml": "3e14cb51de149aca6c3f309ffb3973a47f80f638805325ff0a5cc23dd1025302",
"adminx/modules/Documents/language/ru/interface.xml": "718386366f913c590c2bb881f49ad3b7d436de82faeec30655a7c2f9b14d58e0",
"adminx/modules/Documents/language/ru/runtime.xml": "6c3e9a2dbf862bef5a76ff0bb600084fcd9d5d1a7f0cbfd02377242b74fcd759",
"adminx/modules/Documents/language/ru/zz-interface.xml": "2d819845ff2ae5246203374a685f8a5ad881ba9067166161eb96d5c9271026dd",
@@ -300,13 +318,14 @@
"adminx/modules/Documents/migrations/014_document_relation_edges.sql": "3491ade2987535f8db1b3b00ff27f5a2062b02a3a1cb2e707d2752ff446b566c",
"adminx/modules/Documents/migrations/015_document_creation_presets.sql": "a123f8867ab6f6346002d08317acac37062c2792913ad14102c81812d45571bd",
"adminx/modules/Documents/migrations/016_reconcile_document_content_columns.php": "06671bb26bf29479dce24888fb3712c0d20e2aac5b3d70196604ce4097c875fc",
- "adminx/modules/Documents/module.php": "9fd49d13abaa566c76d4d2d7b0e4e2dac2b7d58d1f27e3545400b3a1c900ebfe",
+ "adminx/modules/Documents/module.php": "36069766b3397735293f9f7d491c6f874eb8fc3c12c7d5d983ec8eee6b4655a8",
"adminx/modules/Documents/view/_product_panels.twig": "e07898ea6a7cc0004ac7545b689afdc6b474e6d8b24357f5c5190b4ca5589142",
- "adminx/modules/Documents/view/api.twig": "60e004a449d5df2b39e24a073acdf3622b2d379e668bca5834d59bf9e3e07294",
- "adminx/modules/Documents/view/edit.twig": "206ad52382062e3603601f038638f26c5602a5a01b0494eb80c0902d8f266f6c",
- "adminx/modules/Documents/view/index.twig": "b6f005bbb66550e43f59d75b8311f290e6c728687473a1a7da2dd74af56b8a7e",
- "adminx/modules/Documents/view/redirects.twig": "0d8e6c0431c3cb4571a40f021ad3f55a9c2df1092b500fa3735258bb80231d7a",
- "adminx/modules/Documents/view/views.twig": "07ae0d509df51aeb551ae5aea2a19766c1cb00fd255ab3d9734ffdb7e55764c8",
+ "adminx/modules/Documents/view/api.twig": "a035a2d566298587ce8530c98915e80e4e7f9b0f41a60e0e55d4547b996a6c40",
+ "adminx/modules/Documents/view/bulk-editor.twig": "27d9baca8cf591dc2ee81b26fda3efc9017c6809c1d23168a749d01bddfebdfa",
+ "adminx/modules/Documents/view/edit.twig": "a7934bde27ca84a47b9a5865b8bedb3e28756b91337e479592e1fefba93ec6aa",
+ "adminx/modules/Documents/view/index.twig": "004594c77dba92188e58d73228af397ac825e723c3c1aba9ee7b94072f828ba1",
+ "adminx/modules/Documents/view/redirects.twig": "4a4903edc81e4770220852d9be9f02a983ddde6f829a4360ea01d3b68456582b",
+ "adminx/modules/Documents/view/views.twig": "821f19085ba3997b6ef8f005e838f6fd449f0b32bce0d2804271311856cce8f0",
"adminx/modules/Events/Controller.php": "c57fc25e815c47c14626371d044079e6711f0a4bce2004d2b9256db62f0d0e85",
"adminx/modules/Events/Model.php": "a3a09370aa47766c7c4e70ec002af98a13bfcad3151b9ecb96a6ffb6cddf7ae2",
"adminx/modules/Events/assets/events.css": "91457d384056a6ea96bdc6bf012c033c19e0cb21401460ae9b0f9398493258fc",
@@ -322,45 +341,64 @@
"adminx/modules/Events/view/index.twig": "7057cee5abe6ace177509c54c2d1736ab88b96f9f17f6db2bec0553b4eb1ac5f",
"adminx/modules/GlobalSearch/Controller.php": "6a109bbe2ca833df90138af056cb6cc32c313677d3bda071b3638448ca7e33fa",
"adminx/modules/GlobalSearch/Model.php": "b81c82cc43c6f90e411645b3f934b42d7457eaa7eea1f5afd7c8efa362f82d97",
- "adminx/modules/GlobalSearch/module.php": "b7b5d9c9179500edbbb82a7ca0583374ac2a13bc8aa3f2eca5c6b9242d6ddbeb",
- "adminx/modules/Groups/Controller.php": "37959bbc4cf73ea2968616c195763fbd1bbe14cea90c01d4dae5fad2970803d6",
- "adminx/modules/Groups/Model.php": "889ba3e4c93ee59ddd6515f4fa4b5ce4c82335e91b3dc6eb315dd095ce6f8fa2",
+ "adminx/modules/GlobalSearch/language/en/interface.xml": "a025b7a82786864c5d74bea07880e3c7b3f0cd7e52d8142ea5be8db346ae1a3e",
+ "adminx/modules/GlobalSearch/language/ru/interface.xml": "0e04520cac25e685b624730af1016c66124e7b040fbc759d9f3b386e625cc851",
+ "adminx/modules/GlobalSearch/module.php": "ecb43024f7ec904897196c70741021e16d7dbafd92189b67870e6a57748fe31f",
+ "adminx/modules/Groups/Controller.php": "cfa1f34a638002b8e3aa9f5058a17578e464b51aecb2354579065999a841dfb5",
+ "adminx/modules/Groups/Model.php": "e782959ec804e4c32b3496dd9b49ae589c2a6149d8484e8ea35a1a68bdf65a5b",
+ "adminx/modules/Groups/PermissionSimulator.php": "c24f53a6b6538d0b403bb41d67d8c4e6740f872fd42617f1ad2e7c5d076dac0c",
"adminx/modules/Groups/Setup.php": "b7140a87474e343455fa81809f8f8f2dfe7e1ee3640c5f024a1bb06ebd783865",
- "adminx/modules/Groups/assets/groups.css": "6d16a57db9ab5f42f8722b52dcecefb02a51d68360b9855187dfece83b36191d",
- "adminx/modules/Groups/assets/groups.js": "1e8e6c9b183cae19587e823f037e2dec5e69aedf10629c555edeffe68369a64b",
+ "adminx/modules/Groups/assets/groups.css": "403f4555599cf1637ec2b5a2e6248a1fdde7b1bf599646c1c103e816fc3fa85f",
+ "adminx/modules/Groups/assets/groups.js": "235a058028abd1d9559b915f8a36da9333bd7b381b0113f9c98b28305c593188",
"adminx/modules/Groups/language/en/client.xml": "dbceb0c80a844d05f3c370dbc495a71142818c0c9e3ff94c33586bea89f07831",
"adminx/modules/Groups/language/en/interface.xml": "ca7dfd681c7f1e8580914cafdfd259d5d3be84868e7ee97288fa36ab3f785de7",
"adminx/modules/Groups/language/en/runtime.xml": "7ab07b963b2b29f046f6c363f04c1104de6d5914f5e70b6b8cd42f5770847168",
+ "adminx/modules/Groups/language/en/simulator.xml": "de91b32f039df2dd87ecd47e27725a6dffe018867a53a72df2d21e3394e63146",
"adminx/modules/Groups/language/ru/client.xml": "320b9b55d6eaf6f4d3643f3fa4675544a779540ec34b3b94e03deac6f57579b0",
"adminx/modules/Groups/language/ru/interface.xml": "6f9da63ae65ecc8890ea16dbe7e879bdf5520d5f74c0a6204285b19d580f15e3",
"adminx/modules/Groups/language/ru/runtime.xml": "eea7d7d2b88befb79b50d00c89dc63d0bdfa95883483d9606ce0605c03c92402",
+ "adminx/modules/Groups/language/ru/simulator.xml": "14d8db8fa0e8a71206ad93817fbf2fac71cc023003977e03ffb2b7e581d16659",
"adminx/modules/Groups/migrations/001_register_public_debug_permission.sql": "a81a4843b74ad72aca16c8016b767dca248b2ea950673d99c6945d1b8b867fe9",
"adminx/modules/Groups/migrations/002_remove_observer_role.sql": "310c6d1a9bfa5693f4a3f680f63279ea9dd040e51284d6cf5de9ad519bd2152d",
"adminx/modules/Groups/migrations/003_seed_default_roles.sql": "75cda12582ae86e538fdd455d064eacfcadf5f4dc50e51838718f154d73ed750",
"adminx/modules/Groups/migrations/004_merge_legacy_roles.sql": "3ca98bc7f0348d04594e42beb8768a6fde6a732d39e7528068efc0b89d9c5ce0",
"adminx/modules/Groups/migrations/005_register_development_site_permission.sql": "0a87db84297b7a8b5959217b82b6dbdc88507a822b342e145ddb7d800f50a73e",
"adminx/modules/Groups/migrations/006_normalize_control_panel_permission.sql": "eb58f4d6a59efe656359d003d81f995e989393d7235a3fae7e38c0733fe174fc",
- "adminx/modules/Groups/module.php": "4f1d59f9aa351b18b111396d74001597ffefa744cd55240c7339fee06f009542",
- "adminx/modules/Groups/view/list.twig": "48949134b29f8c2f62bef3d90e1438131e5dbc53cba84214e11e5cbed10040ed",
- "adminx/modules/Media/Controller.php": "a2aef03585bf4144d60821ef2a4ed075a1393bbdfd7d28da672cad3dd67584d5",
+ "adminx/modules/Groups/module.php": "fcc5b6212c5d6b77d9a17c9a4878c50233a5b48b373cb6a113825a82c82b248a",
+ "adminx/modules/Groups/view/list.twig": "15af0a1544c7933f57e6bb45ec2a3302d12a025b671c98e1009bae01f5bce605",
+ "adminx/modules/Groups/view/simulator.twig": "82f0c5aba5acc6e7a079c03e355edefe4061efca60d34b3195ee16ffdc951306",
+ "adminx/modules/Media/Controller.php": "cf853d384714160ef9fdb8d4ad108fefe331572fa2cd43e3d05faf67c3e0d368",
+ "adminx/modules/Media/GlobalSearchProvider.php": "799e9b9f1455ad1070bb388245ea6adc5c76b9bf5756bfe0d46b96f3378be92d",
"adminx/modules/Media/ImagePresets.php": "8874cbf436a1a33f655c9a395b5f16e143c04c7df1d957c43e3d4ce3ae0645d5",
- "adminx/modules/Media/Model.php": "657f2be87d6639d541d2494ccde70e8e5cf69e6ee7f798b1c92ea9f8364f9d30",
- "adminx/modules/Media/assets/media.css": "df70c5a04119c46ea39537aea6b08abae381fbf56e367e82e0223d9d5efe9bb7",
- "adminx/modules/Media/assets/media.js": "3364bd7ea9353072cd9067111f17bd11d7cb717469555bd821dfc7fcdde5f4bb",
+ "adminx/modules/Media/MediaAudit.php": "2deeacd899b4410cc620b40b6e448c388f54eb553b5a57a23475ac0b5cae02f3",
+ "adminx/modules/Media/MediaSearchIndex.php": "7625627ecc00b74ea75aa1818dec55c468515c966dc00333fe1f2706eef154cc",
+ "adminx/modules/Media/MediaTrash.php": "3251e6cccd092d0c04c0cac70838c070210443c87dd0967c84a4e323bb15c5fb",
+ "adminx/modules/Media/MediaUsageIndex.php": "d39d232bc56352c9cc2335a2e3bd2a7b7f415709c70ece4b38f1a462c2969415",
+ "adminx/modules/Media/Model.php": "1ac78ca828c6f492857e731a715d54939525dd29545bf81fb4065fcc02f0bc50",
+ "adminx/modules/Media/assets/media.css": "e7db9f602bc1a46644ccf172f977ebe0798c572c73d33f64584c9569d531611f",
+ "adminx/modules/Media/assets/media.js": "1ce96968f03008c9e0d536070579962e80070b946920ee03d9f4e965664044e3",
+ "adminx/modules/Media/language/en/analyzer.xml": "5c6e8bec29fe73d0403cf041c7580800ecc2677d94f2148ffaf44c04d337c6d4",
"adminx/modules/Media/language/en/client.xml": "06cecdb6cacdd0871334a3da0a3c7be27d7f835e2a048d37ea31ae4f37469270",
+ "adminx/modules/Media/language/en/improvements.xml": "5873d8eb9c43db0a584161ae3f086dfd101a8df25bbd4d518a2fd283f4f8cb3d",
"adminx/modules/Media/language/en/interface.xml": "2eab0a0d6acf094c43c690e4c09683378a26dfaec7e258c23f3f7bfb1fc9e9a7",
"adminx/modules/Media/language/en/runtime.xml": "8768433d736f0e8b3508b1a68de1281b2f841c2a9decbd8195603a31bff3a92f",
+ "adminx/modules/Media/language/ru/analyzer.xml": "c0102f4d337a3279b412e56e508a1d8d4b1196bdcebecd46bc3e95e56ba520ae",
"adminx/modules/Media/language/ru/client.xml": "272d1eddafc77c79533be4fa89d5daa2d560c1860bc2bab4a1fbf6d609849768",
+ "adminx/modules/Media/language/ru/improvements.xml": "d3b92183909c2159debe29d4594544129f3981d253dded9f20704e0394b158a5",
"adminx/modules/Media/language/ru/interface.xml": "743b1b2e5f498ce05225aca69f866abe2f24765a260baa9d81c1947954029fa9",
"adminx/modules/Media/language/ru/runtime.xml": "538db360abf2d61e32d6476846173ea4f5115703021362314a9100df3854d6f7",
"adminx/modules/Media/migrations/001_image_presets.sql": "303dec5f331135ab3fda9d264b7a7b674b987cdefa0a7904c544a5d63554f15a",
- "adminx/modules/Media/module.php": "97131d5f990b1eb43fa69b0f255ffaf993b03bb392092fa558dc498f156c75e9",
- "adminx/modules/Media/view/file.twig": "0fedbf7fb3d7b36ff9dd717b73b5d5077e9d101a8a3b5ba5f44db64bfc0394f8",
- "adminx/modules/Media/view/index.twig": "a834a9ce896c5b3d633f5b9a28de360f3a57efd14afcfd7957b0b02363ea65a1",
+ "adminx/modules/Media/migrations/002_media_search_index.sql": "e84168429acdd900d494c91e398a8974ae97023d8bee3385321c2947dd627378",
+ "adminx/modules/Media/module.php": "af83896b4cef13943f197b4c121a534a7ebea86a771ae12714a2c8c4d51e4495",
+ "adminx/modules/Media/view/audit.twig": "06936cd87c80b5c7f6ecec8729f227c2ab3fd492e61b11ae7040e6423939b518",
+ "adminx/modules/Media/view/file.twig": "b317dacbc61411831a9029e30fb1ff3457fa1d34164df3b891b6a9a2fdbe32ce",
+ "adminx/modules/Media/view/index.twig": "c3a4c42477df3a10fcc8ee558bb03fe25782a58f6f47734cb078686798a2d06a",
+ "adminx/modules/Media/view/trash.twig": "991f5db2deac791b9d378d2c06bc85d69d4afe3960202c57929e335ce4fd8a90",
"adminx/modules/Modules/Controller.php": "de3c800b32a05ab41dac31d4964242fb0635aef6ef32f69a332509159b8e755d",
"adminx/modules/Modules/ModuleArchiveInstaller.php": "22f015a6695de9f4fea12a580adfb76837e59ee4e9de92c153782c5a40a97560",
- "adminx/modules/Modules/ModuleRepository.php": "651efb2eb73beefd4d486761d0a554d45725f58aab47bcb6e88d7d61a0b8b87c",
- "adminx/modules/Modules/NativeModuleAdapter.php": "607ed915ed6a956250b8625117084d9b5c46f149235e99457a514016d7ba375d",
+ "adminx/modules/Modules/ModuleRepository.php": "29ced1e9d5c36dab4f0018c10fab1b80282b8d225805bf13f075e148016c45f9",
+ "adminx/modules/Modules/NativeModuleAdapter.php": "b753875997fcabd019e4dc7420f5b43f3b75b6c673c24ee98462e6809f00b665",
+ "adminx/modules/Modules/NotificationProvider.php": "55571216fe84feca3484b06937f988748d00ec9bb68b45d0e85d16a3c3836b25",
"adminx/modules/Modules/assets/modules.css": "ba3f1f6721dd1e529903254abe8fd24e20873b6c00e0a2d2d2d7bcc65170d884",
"adminx/modules/Modules/assets/modules.js": "7ed1e03f0114ff942b4db057ca57586c2cc94ed55a2d10f5ca5dafa908acabb5",
"adminx/modules/Modules/language/en/client.xml": "f54084951cb19973f33c9a28576353a09050129f8305d47590465083c0130791",
@@ -369,12 +407,13 @@
"adminx/modules/Modules/language/ru/client.xml": "176d4ebdae73e7533082676c2e56199d47a43336ace47fbeb31392adad26d212",
"adminx/modules/Modules/language/ru/interface.xml": "ee33c8914bb44478a8801ae23522954c860a6ecb007b848bb956fc07d5be4ce7",
"adminx/modules/Modules/language/ru/runtime.xml": "271e31a8ae1586ed045861933a6db150427c78be7560942185633f35cf90686a",
- "adminx/modules/Modules/module.php": "d3954b60d4eef716ba12e4782999fde169210d1cbfd35f0e6b9887c22b3f77e3",
+ "adminx/modules/Modules/module.php": "aad8c5f3a11dec21eb14a5d9a83e30c88cb4ea1206e78bc758804d015a828456",
"adminx/modules/Modules/view/index.twig": "2ca402c0886f611129e884129f6e0b0022e14a8c385d5d4ad55abe49ee39f5c2",
- "adminx/modules/Navigation/Controller.php": "796d25525322eb63e0428ad5f9964ae52ff3d91fc9aeee275c9f854aeb99a5de",
- "adminx/modules/Navigation/Model.php": "46909ee83e0aff609337ccd942c7a69765d734ffbb47bea66015f4a821f0c4b8",
- "adminx/modules/Navigation/assets/navigation.css": "66d2ee424dcb1d2044c337498b570e1c2539c7148ad19975fc776e8f5ed94ffb",
- "adminx/modules/Navigation/assets/navigation.js": "b9c23fdd643e00f6f28cb57f4d75f4687bbd6d7b32b76f04df4126e24440f2f7",
+ "adminx/modules/Navigation/Controller.php": "99dca17606ed02b4554db50bb99c0414efac51f871c7fab9113f0c6ce77df4fc",
+ "adminx/modules/Navigation/Model.php": "f9e59561d2c1b918af994e827d206ea7f0683dff7aa342a6de9193bd877348ba",
+ "adminx/modules/Navigation/Revisions.php": "165a2e2d8ad218c1437fffbed9297b7be25d0ae6567f0d72aa78da872cefa1b8",
+ "adminx/modules/Navigation/assets/navigation.css": "e7ad029b253b19546ed2c0eb2a3527dbb3b03a56db13c6f3089c3da9c12933ca",
+ "adminx/modules/Navigation/assets/navigation.js": "72d68867419fab1b3e7e822a42a7fbcd866ccdbef8fa3051a245e23f23f5ec30",
"adminx/modules/Navigation/language/en/client.xml": "9a0ad0248941cd6377ada049666387581bea0dd76353d34779b4c1343b74ba50",
"adminx/modules/Navigation/language/en/interface.xml": "5ec5a64240356c4b87f65baea911762e64e88dd652c1fd7c801079247d697b79",
"adminx/modules/Navigation/language/en/runtime.xml": "341b984ede453a135b6e155fd29c08d9d5a2ab16e62046379f982d9a56dc4a81",
@@ -382,32 +421,35 @@
"adminx/modules/Navigation/language/ru/interface.xml": "cd5ac333b85534be6a81377a1b40fbd449174cf2d1f019d25b3bb3f5ba0713a5",
"adminx/modules/Navigation/language/ru/runtime.xml": "45d994c39fa7fa092525ed4a61d6775008f3993f4cdcdd615d61e5f15a749cff",
"adminx/modules/Navigation/migrations/001_create_navigation_tables.sql": "43c937b8d7d7f5b70569c591db58ee8592386b988e8cf148fae723b1f68b3012",
- "adminx/modules/Navigation/module.php": "e7783bfdceac8787da92d10be2ffc38ed4a8988db4112e83faec8448c8ee4656",
- "adminx/modules/Navigation/view/index.twig": "870b617bc857aeb3838e76ce79f0a7fbb81ff299eaa0155767fef5b86fbdf65d",
- "adminx/modules/PublicSite/Controller.php": "91233dfdcb4d893511f0c7f13db8673bfeace19fce2d303a82d7c4b849f4c00e",
- "adminx/modules/PublicSite/Model.php": "48ae7a07d130aa6ac6df195ab12b2e2d8e00e31e09a4e8bfb914f40eda8c93ad",
+ "adminx/modules/Navigation/migrations/002_navigation_revisions.sql": "cf24c9e9cdb95c2ba4ccea63ec4375d62f29370d5ef909a82a0c990624b8ad02",
+ "adminx/modules/Navigation/module.php": "8420e2f45024b5a1b076cd86a6658d19fe04156d337f87bcbe597b30a56dfce0",
+ "adminx/modules/Navigation/view/index.twig": "39092089d109c382f1714e5d724d1e857a8e579ca44b929b40708c9a3f6697e8",
+ "adminx/modules/PublicSite/Controller.php": "5805f86bed300709232e0a45fedf6950857dc8f23cb499f9c17786b61a67c722",
+ "adminx/modules/PublicSite/Model.php": "912fcd71f2ba7215fc9a411882c1eb5e0953b6ebaedfbb92f01b7d3de477a015",
"adminx/modules/PublicSite/PresentationModel.php": "3407e5e29165c264c65527433cb94d7d13a80f724dc4d1bf23a49cd2de88b125",
"adminx/modules/PublicSite/PresentationsController.php": "e2c7cc517f1a38d6b5e6828b1d652caa6b63622532d2f1f3c5f176e164ba6533",
+ "adminx/modules/PublicSite/PublicViewTemplates.php": "d1d7f7bff22703500f17807d5fe6b02d42a2fcc4cb6d7e7224fe0a47f7dc1ffa",
"adminx/modules/PublicSite/assets/presentations.css": "fddb0b4300129f7d7c33853b7e31bce131eb6f867e577443429dcafac8cc67d4",
"adminx/modules/PublicSite/assets/presentations.js": "3a74e7c7ae3269b98eca52d2d61db1f4f21871c6f4a5425cc7bab58d24efd963",
- "adminx/modules/PublicSite/assets/public-site.css": "e66be43cbe9df41e5fac5317a6a3ff405afcc6713c9777629cb05e76603f298e",
+ "adminx/modules/PublicSite/assets/public-site.css": "69a17727b3a18a88d103886c2d7f79f2c59539ac70d735379e591657e7f04489",
"adminx/modules/PublicSite/language/en/client.xml": "5a93fd6babc20670e54795211cf44ed155417aa933e5d4a50be21aebfa7bd510",
"adminx/modules/PublicSite/language/en/interface.xml": "e5e868af542e9fe6c981dff18e31a0050d2d7ae2b8b217e7b71bd98b496b5f5b",
"adminx/modules/PublicSite/language/ru/client.xml": "f49060544db65a516b2a643420871571b4da5911ae800075c01ae35e55a5d639",
"adminx/modules/PublicSite/language/ru/interface.xml": "67a7d1a651d8dd4ca3edc6c281d68c15146a8e84cb18833f9f4041fbbd57a619",
"adminx/modules/PublicSite/migrations/001_create_presentations.sql": "023d97f077af57107549dd9e420f5ed55a278fb8318caeb8d86f2dc7750dbfbb",
- "adminx/modules/PublicSite/module.php": "a69322a39a6b658c24755a068efb42df73d89e41a11f8354cebf07f93aecb9a8",
+ "adminx/modules/PublicSite/module.php": "10fc91443e4a98b3f529d07fe1cde7bbced8f4f84335fb125d4b2bf509edc2f0",
"adminx/modules/PublicSite/view/_placement_pagination.twig": "b10413bdba07695500803625486b56ae5283c5a0a6dff83c668c8f93d1eab182",
- "adminx/modules/PublicSite/view/_tabs.twig": "dc0a2f83f9f6a917357f4a327fffdc59bfeda83f69e2a0bf0b9805de93237b9d",
+ "adminx/modules/PublicSite/view/_tabs.twig": "16229bf10dcfc7fa2da84a7041912f52fe597ea4209088826236c454d98bd52c",
"adminx/modules/PublicSite/view/diagnostics.twig": "242682325bd7c99c75f9694d0e7ff6217124bf093364c027d13f609db660f4b7",
"adminx/modules/PublicSite/view/index.twig": "54ea9422b90235e2926924f11c43b56d90ca8e6c4f255501fcc9c52068cb6f92",
"adminx/modules/PublicSite/view/map.twig": "11fba1f54578b4908c669a7dae128949f53a7f1f03746f45a5059c92f473385d",
- "adminx/modules/PublicSite/view/placements.twig": "c4c2af900bfae3ceb8d35802a277429a69afe47ddad49b6a6fd2509207dff36e",
+ "adminx/modules/PublicSite/view/placements.twig": "9e1ef173a28ed883ea236da0611a4c2e74de09937c5ca4b5a28ff8caa98c9776",
"adminx/modules/PublicSite/view/presentations.twig": "d0b245362001ef2a1508fc5c4fa462895b4bbff104025544656828c4513d4cc1",
- "adminx/modules/Requests/Controller.php": "c6d2c56bf10f28cfdda15c0f6d75e134ab5029087954fc44857323462029f1bb",
- "adminx/modules/Requests/Model.php": "211e9f5d7b40d1d174c75d92673c6072f10d6ebb1ddeafaa9a109483b042c222",
- "adminx/modules/Requests/assets/requests.css": "c62d55179c0413c398c3bc2743a3f7e66e0cb653c85a24469ea8940ec5e9a438",
- "adminx/modules/Requests/assets/requests.js": "980bc0c1c311a40e0c49facf0a2b0dc984a3b05c8291ffc6a66f7942762b74af",
+ "adminx/modules/Requests/Controller.php": "b0171c1bfcbf1674b9ba0f8e9461dfa7b3ba5d7bce368b8a0e0dcc2659d32a67",
+ "adminx/modules/Requests/Model.php": "3ab6c5b11cccb31512e61026ae650c414e4bc30debaac3c2b306e9116e3fc49d",
+ "adminx/modules/Requests/Revisions.php": "78483f6667f25c050cbb2d224baa8ccf8d977b30eb84538c3cfb18c7af764bdc",
+ "adminx/modules/Requests/assets/requests.css": "bf29e90ce2211bbd4ce3b61b29bd3e60d5e5d8f75c9e4ffd99402cb000f27685",
+ "adminx/modules/Requests/assets/requests.js": "da981f0941d3008ceb4042540ecbfde1385431395f2f56eb94836b4139feaa0e",
"adminx/modules/Requests/language/en/client.xml": "544406edaf2b568062e697f7264b5c5fbe3fc45c27e019615601e831612db0bc",
"adminx/modules/Requests/language/en/interface.xml": "766190d3f850f6fc414a4646d786f79f394ee8f03524b3a2ae820fbe792d4602",
"adminx/modules/Requests/language/en/runtime.xml": "8f618793f78ea2941557d9eb9c253f8b12ac6b60b76e7158801461b30dbfea28",
@@ -427,8 +469,9 @@
"adminx/modules/Requests/migrations/011_order_tiebreaker.php": "533f3bd0cd40af166feb13dd08ad1a57dbc0a14e044cc10827ffcfc091ff178f",
"adminx/modules/Requests/migrations/012_condition_value_sources.php": "c874ea024343e4d698cda7a138e13b23776a58f51706c2a16102ded1234b2aa2",
"adminx/modules/Requests/migrations/013_sort_rules.php": "4c58c56d9766c16517bc2ceee1d6313b1728e564a332fe9a5cdf69a04d7afe70",
- "adminx/modules/Requests/module.php": "c8fae975cbeec874dda310e5653c6887e34a7ce14bd33b03b72a664d68145709",
- "adminx/modules/Requests/view/edit.twig": "319e06df37e3d5d449d7a7c6b2078b2049ca230109f9b754de550b3c34aab282",
+ "adminx/modules/Requests/migrations/014_request_revisions.sql": "1149785b788aeca0e6e074dbb0251f92e3813b4083170b7731348a7f8edf6bf5",
+ "adminx/modules/Requests/module.php": "d18ef457c854b5d223c731aeac386a806c14bc6fa0941d9f79911f2b15334060",
+ "adminx/modules/Requests/view/edit.twig": "b4ffac2dcbdc0895e00befe395c29e3c9d71bfe47852998e89f6ba8fe4e0d0a6",
"adminx/modules/Requests/view/index.twig": "164490c16e041b928e1ecf604915656399690055d1f7de4bc88caf5f5abd485d",
"adminx/modules/Requests/view/native-audit.twig": "42120fd41aa4afa39560fea3f2625a4e78a61cb4f9ccc0c0388ca319d4f39c06",
"adminx/modules/Rubrics/AdminView.php": "a866300dda84253046f88d19a4467ae1a545c8b1dcac7672d35be986bb38a180",
@@ -440,7 +483,7 @@
"adminx/modules/Rubrics/FieldEditors/ChoiceFieldEditor.php": "bedce6236a9ca6d0cc6da23589313b9e6694a5b0f804ae85021691d3f8b4e57a",
"adminx/modules/Rubrics/FieldEditors/FieldEditorInterface.php": "fbf290cf1d6304a07c5bb753782d4473682b0cce78c6301c743ef05e19b45fed",
"adminx/modules/Rubrics/FieldEditors/ListFieldEditor.php": "bc1c7ead2ed6666f7861418ed2222166a44870edc5efb401226a5b9d80e549a2",
- "adminx/modules/Rubrics/FieldEditors/MediaFieldEditor.php": "4497d64ee4b50126c6003fd5e31997f1ba5e391e08a97c4fb2f07a108f3373af",
+ "adminx/modules/Rubrics/FieldEditors/MediaFieldEditor.php": "e63ba6ea4c569ac5237f057ee722e5a936a2235d670eb29fdcf171f61a95e3ad",
"adminx/modules/Rubrics/FieldEditors/RelationFieldEditor.php": "9504549a3b81893ec8a114a286a960450bbd302cb2f8f9af97660c8332f91925",
"adminx/modules/Rubrics/FieldEditors/SimpleFieldEditor.php": "e961e7ab2bf3a16d6d9131513f11d2d4b9520ecee5572ae7e1b7ae8475d1cacb",
"adminx/modules/Rubrics/FieldTypes.php": "c6cc64b0e1b1fb29b65275d337e5747b9f9f68ca46171e7e7f07129cd27b8409",
@@ -454,9 +497,9 @@
"adminx/modules/Rubrics/assets/field-sets.js": "efbb011014f756dd59ac1357441d06c9b69b278a9d934f7cd9d2d1d7398cd313",
"adminx/modules/Rubrics/assets/rubrics.css": "98ec76c4301d02bdfef75de9af85e3ae493bfb3c491827b2a9c6e2552fdcae10",
"adminx/modules/Rubrics/assets/rubrics.js": "38ddc91374036bf9aa12cc55abd5ee412b829a729379ed7f9727d84bc12be84d",
- "adminx/modules/Rubrics/language/en/interface.xml": "e9f7ec72f954e35c81838e982ae58580ee0922b0a34b1885119db931366945ba",
+ "adminx/modules/Rubrics/language/en/interface.xml": "b13fb75bc6770cc6970ee314b2f3d8c492d6227532533d46381c8919fce8bc78",
"adminx/modules/Rubrics/language/en/runtime.xml": "4cad3d97c6a2695d038286cedc2c4509230c3bc9fa789dba2da9db89e8d9c93d",
- "adminx/modules/Rubrics/language/ru/interface.xml": "24df4dc3e08f8ac35d261c269e618c4b613eac6585493c58fa180a945016223e",
+ "adminx/modules/Rubrics/language/ru/interface.xml": "3654fb74ac081dbb291f5ad13f0c83b2a83b9ce9bc2ebdfa06f9e0a49417b2b0",
"adminx/modules/Rubrics/language/ru/runtime.xml": "1bf3f8341af4561a4b6b1da98a28b689105285758da0fed959a6222fd83757d1",
"adminx/modules/Rubrics/migrations/001_create_rubrics_tables.sql": "a827a92e9d83361569b7e1e7c65b65cb019d1675a9078e05002de25b3e62c72c",
"adminx/modules/Rubrics/migrations/002_rubric_field_settings.sql": "4406f7ce1a9e9b0a105c4a33588791d41f12a55449baeca2565d5573e79f798d",
@@ -474,10 +517,10 @@
"adminx/modules/Rubrics/migrations/014_rubric_purpose.php": "2913a1a7bb6f4c5665ad05704dcbbde78c7ab6b75b0ad7643fd00e482af69411",
"adminx/modules/Rubrics/migrations/015_merge_directory_permissions.php": "648b3e232e9426f84d69238295515342e42695e46288b901950cde2e8979b0e6",
"adminx/modules/Rubrics/migrations/016_rubric_trash.sql": "09385e8d14d5d4d977db59c60035338404019783cc44c6c784cc2172faab08f0",
- "adminx/modules/Rubrics/module.php": "3fbfbc6f5c3919d76b1055e505bac915798743d6dbbbf1fd178ef9d42d07ba77",
+ "adminx/modules/Rubrics/module.php": "4aec29585bc8cb20be30b4a741eeb124f5836bd714593ff717f0ce59a889ebb1",
"adminx/modules/Rubrics/view/_content_tabs.twig": "e4c0a9b899b5085aeaec2e1793b8eeac4a7619959fffc7ce39151af1250e0d9f",
"adminx/modules/Rubrics/view/field-sets.twig": "911dd7cc9546411e1b29724466328c7d2db8db630b2b52d33e8443a066b16810",
- "adminx/modules/Rubrics/view/index.twig": "5b715531de7a7aaad85b92657a2b22a1f16bafbf8198a62fe2175fecac83bce5",
+ "adminx/modules/Rubrics/view/index.twig": "896fb1f4b8e56803f857857b288f78207efe60cd659277f257abf85b2e8e1cc8",
"adminx/modules/Security/Controller.php": "c7f2263f460057191402dacf8948b822f9b33bbacbe94e6e9ad871613147fc86",
"adminx/modules/Security/assets/security.css": "fd8c477d07c38450587153402380040b72fa9a92c60edd532c4b21046cfe375a",
"adminx/modules/Security/assets/security.js": "f270dd0b910b9aa4815680b8d80d66ffb31bc7862f74e628cc60efba4205a99b",
@@ -493,7 +536,7 @@
"adminx/modules/Settings/Constants.php": "03c0af9ffe9c17fe879974c49396567ac0584f2474101715baf6ada847ac3ff4",
"adminx/modules/Settings/Controller.php": "90aff255d936753ab763ec534a097e9988f6c737bd5be2ba1194a7700a372e72",
"adminx/modules/Settings/Model.php": "9e16004c78a03d39db1bdfd5e23b88b77e8afc7b8f57a2a21997602ace277440",
- "adminx/modules/Settings/ProductionDiagnostics.php": "41430528b6387ad2df815a3834f3032c96e29a71d099ce68a846dbe942d4acc7",
+ "adminx/modules/Settings/ProductionDiagnostics.php": "b23d473a5f6e7c231c68abe4d48159b177699b5f0c23020e96252b240f86c87d",
"adminx/modules/Settings/Schema.php": "7367374ace3e25fd86e5a829ebedb0358ba38bf5be0cfab9b859f1e5d3cf0525",
"adminx/modules/Settings/assets/settings.css": "c8207dc25cdad75f5d2b811a4f8b4444dc48df88d9a0982e9d442f810497bacf",
"adminx/modules/Settings/assets/settings.js": "4254d8985d73ff4646799eefdb54deae1f094c2373531cfc22d6692e48b9d1a6",
@@ -509,15 +552,16 @@
"adminx/modules/Settings/migrations/004_seed_core_display_defaults.sql": "31aab8dd3cfd944bc406343f580ed753470191e7918516c9e7c2b9a8381ba7b9",
"adminx/modules/Settings/migrations/005_order_system_navigation.php": "df82c4966f28ff3b7d9cf184013477c60a4ae635345f21809bd58b94310e8957",
"adminx/modules/Settings/migrations/006_create_admin_saved_views.sql": "69cf1cc085a31b2310f82fe55ad6e0abbb6f14707715205e5a53f06334759a99",
- "adminx/modules/Settings/module.php": "a754703ca23db15f500d3edaaa912abeb2097c32bf8615b31605f6018c952199",
+ "adminx/modules/Settings/migrations/007_public_site_url.sql": "7aab89b5e7ea5f68b519322341c90d42b424b7f994d706f949aa326e571f6cbe",
+ "adminx/modules/Settings/module.php": "b5de078a2dd6e0b766ac0d5456f7fa60ded80741c29053e6689ee3e48b539593",
"adminx/modules/Settings/view/index.twig": "7d64c286f8e580ae51b1529253fd816cdcabf8122a564fcc428ced98bd7b14d6",
"adminx/modules/Templates/Controller.php": "00b1758860293b56b052a8c41f7174d0d97ba1d78e012b80f8e9f29194eb77d4",
"adminx/modules/Templates/Model.php": "4f7a9082f462170533c0c140ef085f6a33111d20061b464864eb86066d50289f",
- "adminx/modules/Templates/Revisions.php": "9ed6496fb8e28474028944cccf0f34af98f816374bcb54075c8222fdc9a8864c",
+ "adminx/modules/Templates/Revisions.php": "54522d2b5a05564637902e48dcdff99a51d858b22b159c109a125f2f6c746430",
"adminx/modules/Templates/Syntax.php": "a0172c03a4e091f5fcaafde39713189bc341c1cf7ac9ae1eed50c5cec657bd24",
"adminx/modules/Templates/TagRegistry.php": "85344896cf21767c67b19092830e1ee9545b21067f1e43140efe2faf6eca2731",
"adminx/modules/Templates/assets/templates.css": "fca6f4e7a5deffdc99d4fedff515a59b8e76c8289961971947e10ea384e9221d",
- "adminx/modules/Templates/assets/templates.js": "5e5ba6534ee1752d7b23154d44626358a83ba209461b3c0623b8f07efc20fbd6",
+ "adminx/modules/Templates/assets/templates.js": "0d648c0c6a1dfff93e6c7d3a7d1303ed6b3229ad617ef7a20f684d3b8aefd408",
"adminx/modules/Templates/language/en/client.xml": "d7280440a3c00674ae2db6a2c837a8114fbfd4fa27590b7e0ddd72395fb08887",
"adminx/modules/Templates/language/en/interface.xml": "50d541fc8b9af282413030476e7677ff2fb07ae20168311aa130d37e2b9670f7",
"adminx/modules/Templates/language/en/runtime.xml": "4d9c9214729aadcacb7e062417b8befb2965f3184ca39334e2aef7fd90fb47b5",
@@ -530,9 +574,11 @@
"adminx/modules/Templates/view/index.twig": "7c53cd26dd6bd6fd4af757ed53e239c0ba21578c75aa6cbc575ffb5d0c6db454",
"adminx/modules/Themes/Controller.php": "85af532e079d799c0bad87921b99587c946fe92ec073b4016eea650e5c4ef12d",
"adminx/modules/Themes/Model.php": "e291c6d4bbd964e7086180e7329df2867e2748c8f007596a95c88a954159e320",
- "adminx/modules/Themes/Revisions.php": "04ee9814b4f0f329ad9c1983333f5f923343bd0179d68897e21102dfea97c9df",
+ "adminx/modules/Themes/Revisions.php": "f3927eadf841873b7a64976e28f2752b6d1be839327922720a0cd33e30d0884d",
"adminx/modules/Themes/assets/themes.css": "c54dd5451693f5117a22c9b7d7a742847e6c6d97a7700d38dd28111337392d38",
- "adminx/modules/Themes/assets/themes.js": "6c1b2346f475f97299b8657ca3d867293680c40df929ca467c4c30dc81d76c0e",
+ "adminx/modules/Themes/assets/themes.js": "1ab50ed9c1ff67ad4e4b8b295c245ad5f040c7b11bab102d007953ba1f79042e",
+ "adminx/modules/Themes/assets/view-overrides.css": "62e6d1a90c8819f50318240e93941054aaeb1b15442d3cebb954a4e839075699",
+ "adminx/modules/Themes/assets/view-overrides.js": "e531167445281fe7beb93110d6e089ab258a4d110108c3fd44fd4ff981dc7c6d",
"adminx/modules/Themes/language/en/client.xml": "5f9d0a1ca7320e8590468e626433fff92b55cb9ca38d8723d4a363feb77dc3b5",
"adminx/modules/Themes/language/en/interface.xml": "30365f6c02c048fa2d0e94feb82bda45bdf8cc9fa665a7943593bb60636f368a",
"adminx/modules/Themes/language/en/runtime.xml": "66f4efbea3acf5be49cda9931841873e7c8bd68e263ef7a247233b4d762e9887",
@@ -541,9 +587,11 @@
"adminx/modules/Themes/language/ru/runtime.xml": "f8046256e75de65f6f20c8d5b5bd6a927653ca4dc8b6b8f205756b255b624c51",
"adminx/modules/Themes/migrations/001_create_theme_asset_revisions.sql": "21a2ce27d0b97be6493cdb86bffbfb0cb8b16762cc7b0025d83bec71d56a760c",
"adminx/modules/Themes/migrations/002_place_theme_navigation.php": "62a2f2953f3d5bb8df7e39c83a1de83a56008952540c8c28c6a12f33a8fd7f95",
- "adminx/modules/Themes/module.php": "d5fce96f5841882714e8f540369568bc3c1676313d1a2ad659b3efa96c71189c",
+ "adminx/modules/Themes/module.php": "7f961194564ff6b2d7a6c450fad2f966118d71589a6e2d9f1f183d4726f35c7b",
"adminx/modules/Themes/view/index.twig": "68a06ac9ee43b0052c877e89c411a1d149f212418def78e44a1f4a73d80344a9",
+ "adminx/modules/Themes/view/view-overrides.twig": "876f8f47ff598962614198fd89e5f112f04294215d1ffbe5f6ea3bb294af60ea",
"adminx/modules/Updates/Controller.php": "1aef3e6cec043e4e66ab862b4f0c7081d452bc8a1295fc125860eb0b02fa89ce",
+ "adminx/modules/Updates/NotificationProvider.php": "19ae6ba3da35213683a2287c8523a3b966daf7ab432d9c94f9364a59ea9b379d",
"adminx/modules/Updates/assets/updates.css": "53cc7af1afac5910ffd0c11be847215fa53ff95b9a1efb140e5a5f3f6c48d9ec",
"adminx/modules/Updates/assets/updates.js": "c3788da4b31718e297fefcc47e740f20be10342f3c637aa0a7c4678ab1bcd920",
"adminx/modules/Updates/language/en/client.xml": "d1f09120fed6c918cbbd4df166627bc44579d530f61c77c753cf147582ce3399",
@@ -552,22 +600,25 @@
"adminx/modules/Updates/language/ru/client.xml": "7dc664bbf759fe501c96a145dd6a052f2dd5541890a8aeb1d533fee378cde0f3",
"adminx/modules/Updates/language/ru/interface.xml": "1d8a827ac996bf7da2d15f75b52d2205f0f36105cd73b50cebbbf1e99ea98bc7",
"adminx/modules/Updates/language/ru/runtime.xml": "45d622ea8c6f772d5f53690bd7c08beb55efcbd51c7308f0336c995885b68258",
- "adminx/modules/Updates/module.php": "c26612bb4383e4433543a9e822bc18360b57815af67875b29434bfdc8e263dd2",
+ "adminx/modules/Updates/module.php": "13dcee85d0558141f4305c2b0dd37401706dc4cbf193564153a0eaecf5dbc681",
"adminx/modules/Updates/view/index.twig": "8d975051ca96fd99902714bd60b6a85131d6304578ea65a3dbf732523b638ece",
- "adminx/modules/Users/Controller.php": "ed5728b5794d250fcbec2e2bc83bf7812a4279e028949b2373ed83f7873d72d3",
- "adminx/modules/Users/Model.php": "7e30cd6dacb7ef7b7f619f0e888d84cc8ffa470b6e76cac8cb6049aa13d89326",
- "adminx/modules/Users/assets/users.css": "19b53f5a235b79b5ff34576692ace47cab69e85586958f763118f59a07b2920d",
- "adminx/modules/Users/assets/users.js": "a9d7bd3b5b2e44988ac1c5d270d44f896b7cf1796608961caa0d8129508d11bb",
- "adminx/modules/Users/language/en/client.xml": "d1d17febaf2fbc74243f0e799bae71b32c656ceed81da7fc62f13dbf73ca7b4e",
- "adminx/modules/Users/language/en/interface.xml": "28db6106985d83555542a171a8a59b06cfc0797251ad9a533fd4796be5eb4c56",
- "adminx/modules/Users/language/en/runtime.xml": "b68f556143021c97fd369813ee0fcdfe66af5febcc74ed757b53605b2b797b10",
- "adminx/modules/Users/language/ru/client.xml": "69d389f961f82692717c4bfdb6057700c23f09e226410108053ec9f1574295f9",
- "adminx/modules/Users/language/ru/interface.xml": "3129fdc122cf197452954b328192ef8a042b085b540f572de86fc5b239e7e462",
- "adminx/modules/Users/language/ru/runtime.xml": "00c74dd13ee0fb0a578f0465ebd74a9c2b87d43399ee0e22ddbc911df2043b6c",
+ "adminx/modules/Users/Controller.php": "dd8e11ec359064b37437057f0e1295dd1f20239186d5726119ee0764bce2fd10",
+ "adminx/modules/Users/Model.php": "afd334340bbbeed9ac638421bc490262a21173007734740d2724d4ddc8cace63",
+ "adminx/modules/Users/NotificationProvider.php": "460ab91a010e473937318542903a30053e08303b512b94ffe43559a85da8c57d",
+ "adminx/modules/Users/assets/users.css": "1322f3db7bbfa13e548a8c019ac6580f947de5786c5f460435db2561dc7b1f28",
+ "adminx/modules/Users/assets/users.js": "d7d2cdeda4a0bf569ef14eae2bdbb6feb593ea65951382cc2208052518fafd10",
+ "adminx/modules/Users/language/en/client.xml": "a84c325dcf979712bf3eb5cfe1cae2f2d4a9bf698702d003bfeb66954eaee159",
+ "adminx/modules/Users/language/en/interface.xml": "4434abf4230c2a616004dbfcfd4d79f43ccc60f32030842d0eade5bc3bfc28eb",
+ "adminx/modules/Users/language/en/runtime.xml": "2f4b8e5ae2ed591f03bc5d10e4e305b2404dee89f75ee4480f0daead10cc58f5",
+ "adminx/modules/Users/language/ru/client.xml": "64054dfdd9c2bd70084b283e776597c86b1899a603fb5a07935832ff5960a3ba",
+ "adminx/modules/Users/language/ru/interface.xml": "9df72a9413ddbde9513a6ad9b5d04a0bd68a828fc328197bdd180a5a77d4b274",
+ "adminx/modules/Users/language/ru/runtime.xml": "5bb9db970f2e2da5849e20272d700ec4c70de65443ab4bf10b960aea79195842",
"adminx/modules/Users/migrations/001_normalize_public_session_activity.sql": "e72f1cacea2cff5f74f7baebe3cb1f154b87fd7368541b1a3a5d2300a0deae86",
"adminx/modules/Users/migrations/002_harden_public_remember_tokens.php": "85c92acd3ed962dfc4bf85b78e07de87569b1f0aacb2c616287c95bb39fbee2a",
- "adminx/modules/Users/module.php": "81c13d81fd73878aaa372590b0ed5f2a8c19ec59d409c5199a304271b1011746",
- "adminx/modules/Users/view/list.twig": "b64d5ee4c2e680a3d49dfbd2efe17c7da9c057746fd3b0884b4bb536cacc363e",
+ "adminx/modules/Users/migrations/003_system_user_security.php": "6e2cd00d63dd7c050c0a578fde2031764d52a697a70b711ddddad1e32dbad917",
+ "adminx/modules/Users/migrations/004_system_session_expiry.php": "00a1012683681fc5fbdbf3cc6258001ab2c6377f445f7b616fd1c513d2b30bcc",
+ "adminx/modules/Users/module.php": "c952fe3182dc176870aa155f5848089c21f4026146bab53efac0902d2de7730d",
+ "adminx/modules/Users/view/list.twig": "845e0b0c8a04891096a2352b1a683fbd4614333017beea413434793173749efa",
"adminx/view/404.twig": "86f93ca1cb44b0c225a03a33704b903f8a96e1697a05d40b0b71dedb8f665769",
"adminx/view/_pagination.twig": "9d5e761594ae97d7cb7b518592028adfd2041b5d99f736b24a318b2766e350dd",
"adminx/view/_saved_views.twig": "51217212a3b0ef7437de4dd55a07fdf55aaa3138155b00f65fd85af686412da1",
@@ -576,38 +627,41 @@
"adminx/view/main.twig": "4aa00f5a2c50e3cc4d339c0ad9377526db6e8a65575843be59dfd20df5210344",
"configs/db.config.example.php": "e42bdb47aa7d1bc9cd85cb36e05acf940cafd951d6220664c485d1b971f18809",
"configs/index.php": "48e6b249e3d83530187c095ede0198af498c59f384bd458db74f9e0c2306eba9",
- "configs/public.config.php": "7047f7acfb9f64e56c7320c3cdc306522a187f5f9e12cef6e95937446ee07441",
+ "configs/public.config.php": "54ad564eeb68979b3040fc3cddda8e9b5607c016fd91a045bdb2ef3d0a1afa03",
"help/README.md": "d12965e7851dec5241dd74db731c110a7e0f4acfd7139ae28ce21d53193b1123",
- "help/administration/README.md": "b07c99046a52b6b30cf8e50ee00a33137087771ca486b8c4e365a8844096850b",
+ "help/administration/README.md": "af3efa4bcd54eb23236735d461484e13b6319751904ca8856412b931e2ae032d",
"help/administration/console.md": "5efb2adbee857eaf0b8c2816ef1556addb2c9b21420bf972c6bdf62911fa9ad4",
"help/administration/content-and-system-tools.md": "55747a150dcf00cb3682d30b1edcf054201eb051d0e25274513ad41716a9f392",
+ "help/administration/customer-center.md": "6d35e85b1cc8e44db1e2866fc0c908390745d32b77120b1ae6fe5cd710ef7eab",
"help/administration/dashboard.md": "98a93834bb648b4b94fead19d31c371d988013028ece38caf9d4b8d455628e93",
"help/administration/operations.md": "4c585d6c3236f11656000332ff99c066187eb36cd860852c7fc857020487c05a",
- "help/administration/search-and-activity.md": "f0f470ab432ff344b176699393574acc2c9a9d153b2d71986db9201bea374482",
- "help/administration/settings.md": "89ff256f830a827929847d0d30662e1af0a2cefcf7bff214d6875d7c14a164da",
+ "help/administration/permission-simulator.md": "f5f7d59c121833068e75fd202efc60def6e5837d86172ab5ab07233fbd0a5bd9",
+ "help/administration/search-and-activity.md": "24bd0d317f5e26e3f152e0a452f8ad37b0fca148c0b10a1357ba000a3373d38f",
+ "help/administration/settings.md": "e1ff48e80116a51b928ca4348a57efcbd939f15553e9ceb5c2ea833296e7601d",
"help/administration/updates.md": "1fe89c7ab6a1cac896bcbf447e130acc3792c7c93b3d2b063160dda32e1b9ca8",
- "help/administration/users.md": "4f035c98f136e7a3b794d3634c2d22809bfb07b3be3f8ddf3d403ae07d96c14e",
+ "help/administration/users.md": "1df60ef3d2dba8d53e48ec9d759e1d17236893ea36a5c86ef91063cbc6a4a026",
"help/api/README.md": "13f2b6663760feb1660dd3ba5d2b0b2c3528d00540c45efa040a54494fb511a6",
"help/api/authentication.md": "71f289056bbcd688c2ed19c1af43e4b233db92d76760b95ac9e63efddea99c08",
"help/api/documents.md": "717101e0fedee8ddd987d499a9ceffb19b4d24e0a04481aef72cc6330e88fa43",
"help/api/errors.md": "630270fb28d5d385e368f3b0cc1c5cc2acb3c56607bb8c9af62c2e62a6d09993",
- "help/content/README.md": "3278c036ddadf187cf1fb0648682f6a1acefdf5d1d95c4960692a35fefe8cf99",
+ "help/content/README.md": "273451d12b6360df56cc58323bfb8fd7521b4e3daf8f7ad93c874fe6877af048",
"help/content/blocks.md": "1d55be2a9f1a48df426e5856a54307d77b352d0037d68f08ed7e16a322d9ef8c",
- "help/content/catalog.md": "5ccfe015ac45bed261bdae480a87704142b41c772c7bb8c425363a1dc06fc6d9",
+ "help/content/bulk-editor.md": "821107322b125c9344bd04346037fbd19f8ccd0ad6da822fe78af3299d01f746",
+ "help/content/catalog.md": "2e278644df3a40d05fad7b2a753a90398667b4bb6cbd88dcee8177e3a930b3b8",
"help/content/content-model-tools.md": "baaf738aec454b1855ea110b8f5e1ef3ceaaad51cb920d4551cd088daeab7e76",
"help/content/content-studio.md": "91ef485e614a9a71a07d4e6c143377f7052ddf3b00d3f2f0d0a32258bdb14dbe",
"help/content/directories.md": "ff6c5ea9bd7fe1fb9d0aa1875d03fc3bc00b2bd2b0ec83d6496cd55168db294c",
- "help/content/documents.md": "e5d7f51af5488cf3363326697bc5dec56f377b45963fcd6a029a354871661afd",
+ "help/content/documents.md": "273851452c0fb8fddd47019fea600da187025dcca271bdd91d59acae15d6b4c5",
"help/content/navigation.md": "a02d0f88b5a3aa67fd14a2c26a48c9c3c4bb73f4824fa453c20f3e2ef4ef24b8",
"help/content/presentations.md": "6e349bb4d1d1577617e6bf3d987b86ca6b255f64a47cd1ddb0e38c5242b788cb",
- "help/content/public-site.md": "3abb9bc9c78059d22e8a75cc4d01220c0b9558da4a1b2c8b342bc26c8e353d04",
+ "help/content/public-site.md": "ea0edea4b3afda64987e5643397237fab227f5fdfa9d9551b73b93b32558f818",
"help/content/requests.md": "c008b1026520c85400fb9240cb117fcaf384531c06e859c1e36ccbb3a79a8590",
"help/content/rubrics.md": "2c9842ce5647fc85663b02cef14f141c673694f0a20856c9262b6ccbea436c3c",
"help/content/templates.md": "c6fae2ef91c741479d1f34fe66d00e83f2d2ec1aba1a4099773a04a6e1b6552c",
"help/content/themes.md": "f522107e2ee27590a40d726f26538a3101925d0d0173fa1e58422089b5418388",
"help/content/twig-components.md": "15e40ce305f4416eff6ede5168be32c033f712776484fb6c72fead9a0d7d70e1",
"help/core/README.md": "c8c42e4915e049e2821cbb548a496bd4caaa9c7921a205db5d7ddaa9445ace42",
- "help/core/auth.md": "da714664fb7848676229a9695d49c811786165a79de7fda4b7ff0156a52eff6a",
+ "help/core/auth.md": "bc987c47877223d5b1d97a9fc35e28113ce8b3e9e61e2b0f5ca2c623f4f0371a",
"help/core/bootstrap.md": "72b6759b1066e2906dc855dac13880e0227c1d70f751f81365c6afae2cf919f7",
"help/core/controllers.md": "6767a22647bd06b7af5bfee2a9268bce95d67baaf3f4a828b88233def1e4c665",
"help/core/permissions.md": "3147cfd90fd1139961822505e611c444e54bea4ab66b86f1c0da121301fcc57a",
@@ -625,35 +679,38 @@
"help/debug/README.md": "41b7954c443330efe28cd3a14519c7c8076165a9d96c0dc3d3781a111e757085",
"help/debug/custom-data.md": "445ed27dbda5b0ca035504e2f0cda023746def5edd3aa1f62189e133946e293b",
"help/en/README.md": "cdf84634ac731f1f434ec496b171307c38fccd6e6df335dd4dbf074e3e2cc12e",
- "help/en/administration/README.md": "5482951c74022a90b44f70bf8c47ed4499b95eeabd79bd99edf33f89cfa06805",
+ "help/en/administration/README.md": "478a59925324a3dfb3da193b8e83b9a45e38fe77cf41644efbc35cb0b65e0298",
"help/en/administration/console.md": "0938f6598c01381d79235a6b524d34f0f9a35fa37a35e7042baf04cf4f4c195e",
+ "help/en/administration/customer-center.md": "a252969dde9cb67d26e21a998cf4bddb128da66f518742e856d9c02ef62efc81",
"help/en/administration/dashboard.md": "1945cb5191944f41a88e5a59eb91f1baef550f9a1d751817b08be5112d23d122",
"help/en/administration/operations.md": "cea8833c931040aa0d00ba0a181270cf95b6ca95f199b6c250c0c8b839b86b97",
- "help/en/administration/search-and-activity.md": "65f3df81100e462eb16f17a4d07c8106156a99166cc4bfe18fea2e078318a669",
- "help/en/administration/settings.md": "68586a8a8a397d9b5f76d52867f5a1ea0247ee47087faec22802b2f8c4c2c755",
+ "help/en/administration/permission-simulator.md": "2299db13d8242f69ac5a205acf4a859fabf3a4e96d46152f9f384c86070aa8e4",
+ "help/en/administration/search-and-activity.md": "91843360a78326531e329c140dd58405ca901428ae9ae618e44e9418db838a20",
+ "help/en/administration/settings.md": "157d88a8af755ddc0a27ffad3556eed7dfe4caa9af7f3f9d853d057c611aa1d4",
"help/en/administration/updates.md": "a0ec3d0929602c59935836b5e03e35679b86058bc482dcb37475f892262401be",
- "help/en/administration/users.md": "018541f3fae298feb40f0c162bf813b2ef0ee4e782c7067dc5c4efb207177db4",
+ "help/en/administration/users.md": "e9ef5d433e6c8dde5540826ffa14f36588bc703c30f8af14035b28bc89795eef",
"help/en/api/README.md": "660c017b0480b988a5e9a31a3e2b8a412999364bd5d901a9684acf3cf1a1d2bb",
"help/en/api/authentication.md": "23ef6699d3082373dfff77253a79ac5179c0088d3f69e1d1145c8cc7e05efa25",
"help/en/api/documents.md": "266d2cf298bfffd62a02289b97bc01be508d6dcb71d0a8b0b3bf840afa5307c1",
"help/en/api/errors.md": "4c8ca63333fa082aa56cff33c1ad3659bc8030524e490a2f43d122ac4ef68309",
- "help/en/content/README.md": "b88e329102be722abbf1b8a9e99d90ad960e79ec73fe03b1854276c92d5fc094",
+ "help/en/content/README.md": "7c871512fea7f1bf635d5a816e322161dedbd8c158d520cd0385467e8dadd1ff",
"help/en/content/blocks.md": "34657f0a7ab977bf78d5b7645bf80a0755f40830bab4d4620ca7f39ea5992210",
- "help/en/content/catalog.md": "d4139c69df31e32b4c37308f96d539020d989f952f75b9f601565303cf2aee48",
+ "help/en/content/bulk-editor.md": "c99d5eb5058d6714f0281b84bfdf9020fc63ef27519c095af5f92fa2d5e96b44",
+ "help/en/content/catalog.md": "99a6e5c3e17ac0c7f2e04cbde4f790334f687b3aebed5815be5006ab361e530a",
"help/en/content/content-model-tools.md": "fc50f8c334a129d3ead4a58503a7659abc2b1fdea7c9d277feff1e3ba4bb7b6b",
"help/en/content/content-studio.md": "194fe41a1eefdf7da3c9a47b8539ed3ed9d785d2a75816a39da6d2784ec40925",
"help/en/content/directories.md": "cfadf2361ead3bed9b63435041af8c91e24ec8b492906f0d9b976047edc123fb",
- "help/en/content/documents.md": "369712175c276d241ab5545ff35c2df56e62d0445c4506ff6b7610d9def035b0",
+ "help/en/content/documents.md": "2831a54d7c9e02b89231c48c406475dff64721e48ce76d3bd92b768043422333",
"help/en/content/navigation.md": "18f6e033c5c01eecbd7a3bc4b7c557f272f0039c811ea6f4ec2354206b0a5f21",
"help/en/content/presentations.md": "f255470ae47453d2e458b1829316c0e1e8e7fae73c9a1c1190d89f522b78d871",
- "help/en/content/public-site.md": "ab639977029d10f8a88679b524c771ad6437c49e4e061b8f95a4ade0188efcc4",
+ "help/en/content/public-site.md": "619cf5d38d49f6dc1c54836d4e27853da03a82f3404b69ce7e0c395a3222ec45",
"help/en/content/requests.md": "71aea0d1fa6dc9b6f6dd41f1c7a4d80af93c0b5e18341dc26f59d1f0c156604b",
"help/en/content/rubrics.md": "bd69370ac19ab0aaf6d4c1cba615ae21f57cc3e241ecb6706f23a69a794fb3c0",
"help/en/content/templates.md": "f91c141dfee841a1af8321625788cecb9dabaef75901e188127815b6d5b5ce6b",
"help/en/content/themes.md": "b502abddb9114cc6cfb990e75c34fbf970c4e9c95940f27bddbd5fec80747b0c",
"help/en/content/twig-components.md": "5fee2a73c795f96168ae8bcccbc4dabcad3c82a0adce69a2e2add878dafa033a",
"help/en/core/README.md": "ce0c4d0757cec5786cd79fdeb8a839250a947d87e2b5a5905f7a8010db78df6e",
- "help/en/core/auth.md": "1fc1e444627669e1c2d0b5b15e363bd69dbfd18085783695229015213a9a0cc5",
+ "help/en/core/auth.md": "4317b5a6cea85bd347275609ff082f1a3fe6ade060b8c5d251db29c09c18ea8a",
"help/en/core/bootstrap.md": "e2c7b022ccf6bf9dd2e888d3cde42bea82d36be382d8d0cbd508d3facee43f7b",
"help/en/core/controllers.md": "968107531f9bd1a714a62d9f390704f29136fb531f1b72a36eaa72cb0cb76952",
"help/en/core/permissions.md": "6e6f1d5d1c20c85f6e3d71aa3f4a7de8e822ca08358aae38981bc7f7082b13ec",
@@ -673,7 +730,7 @@
"help/en/fields/README.md": "46c4fb2b44f1fef2f25ed2be3c730dd1d4e1aa0f48950e6069c3772acdcc5b17",
"help/en/fields/development.md": "4a953779ec8f08a79e235bd658d58ebc69f5758e2d8c55d49d5bc074e5aa0a41",
"help/en/fields/operations.md": "7f3e2e991df10e5bc8bee9bc7251b9bd96e5137aaffc5142401f80afadd752aa",
- "help/en/fields/settings.md": "577d87c57c76fd959e8eeb6a9e25060ff82d43846eecc5a02f95a700872743d5",
+ "help/en/fields/settings.md": "c319d6fd35f50658a901a498ee13fba3ba83af774bb4e9ece0a8c1abda0ce233",
"help/en/fields/storage.md": "2e8d0faf13e79f508e6f91e78c3b988811d3c39379c1fa79de441e06a44ff64d",
"help/en/fields/templates.md": "634dfc6e4f14b3beb5c84cdfaf5d2371535c51dd464638474ae5b67a4dba0f8a",
"help/en/fields/types.md": "db8451912c4910fe0bc416cdfcf23f16a8978dbfe83f481f887e2fd3f3832bb0",
@@ -712,22 +769,25 @@
"help/en/hooks/lifecycle.md": "ec82cd9ccb2bc48e9054ec1876c40552859da4ead45129f920026f821f84e87f",
"help/en/installation/README.md": "a122a89fc4a910064f02fc906a0fdf3a9098147f9ed2f98a75185ed66d190f29",
"help/en/installation/admin-directory.md": "26a7b2198078f8ea11dba7fa6a0699cf35c66e78fc88279c82012e6a01f59a38",
- "help/en/media/README.md": "cb9abeaed976e18cd7b294f7c078b7cfbda339e0022853d3656c7a29b7fed13e",
- "help/en/modules/README.md": "52a6ba0fc3d163c4912b28021b272977f47a3f0120a906f8e8c614f143950a47",
+ "help/en/media/README.md": "1f346b26bd6cb0f7238204ed0cb1d56cea9f6bac7f96e06d062fc8d01226d702",
+ "help/en/media/analyzer.md": "d49175369396da1cc3d50ec4cbc7684f36971021532c648375999e37f90a4f20",
+ "help/en/modules/README.md": "fac8da620ec1f087bef3c7cc3a4178d95747ccece3524ee6c53ba6c3a65b4a21",
"help/en/modules/antispam.md": "1808f910d530f7068e60e2a9306c15ae5b69cccc30ee3e492f35cd535004f65d",
"help/en/modules/banners.md": "b6046d0094b0554c31b56dd15ea299e247f5f3dc13c8ca8fce5714bb6c3193cd",
"help/en/modules/benchmark.md": "e7b9d233abd386db41413f45c79639a3bebfc37241bdbab461028e87a5615f87",
- "help/en/modules/cache-warmup.md": "9404771e435f1130fa6812ba7c444e21933f1e47487ba7f1e96e8992db1d224a",
- "help/en/modules/comments.md": "854896934b2d93d6527f9ede94e85b5e9aecbc282fdaeb9572f810c7dd773dba",
- "help/en/modules/commerce.md": "38ae79ce7675efae05a55c9425a1f61ad966556cc8cbccf3355087d0a9d6e96b",
+ "help/en/modules/cache-warmup.md": "d92183948e03dd4f9a18308d36df7d5ba57e7e87f268b5f3f1de38ed99c518dc",
+ "help/en/modules/comments.md": "55f45f748f32fbd36233c43574e212f3fa3fdd1ce8eb819f9d1cafb53215ed97",
+ "help/en/modules/commerce.md": "d916b293c7bfb3567fee02f5d9f15de0d5329dde60d5c5d43f24bce660860156",
"help/en/modules/commerceml.md": "610f6b2f9abbeeac604da0408192ae52dae7d6f3fb09e0d321e14d1cc190b808",
"help/en/modules/contacts.md": "3d4d7b109a7a7bf20ceda0cb0da65634131a837c7d39c4a1433f317c3bad3512",
"help/en/modules/content-packages.md": "4b89df6d05fa75e484e38e404d53fa7ecc6b61aa6930fbf74cf9b6611bfbf532",
"help/en/modules/contributions.md": "ec283e61f09d6008a7208fced495a2748685c50bbfe22b384f458cf338e63125",
+ "help/en/modules/crossposting.md": "7b8fc0b89c90e27c8e90431221cfbf7eca4c3cd2b5495a0c8ed5d76906dc1daa",
"help/en/modules/dashboard-widgets.md": "363ebd63b5d28c23f4be2e3cded9e690db78cb0b79c459217eced1151e2b6a8f",
"help/en/modules/demo-site.md": "d8ccb9d14f664b905c89d81fd046116d1b6fb45f2c0105ff2876d5c19b16f57e",
"help/en/modules/document-import.md": "cf0726b5cf95b6549ae6732ea37ce127ef3a1fe3b70109d83d74f5f48e4cf0f7",
- "help/en/modules/experiments.md": "226ab03a0bc93dcb1bfbb0ca8df6df7caabf82c949fc653b72e9fff7cd812c5b",
+ "help/en/modules/environment-comparison.md": "6922835a63bbddbde19d12058082a11dd4a4d37fecb05532178935386ba3fa01",
+ "help/en/modules/experiments.md": "dc22f38fa9803460ba0db1ff930d85a18a4ac634c173fd99136970bf0363701e",
"help/en/modules/faq.md": "647e30e267ac260742a20cb264ae9882c907fb056068a4339c88795792c17344",
"help/en/modules/file-security.md": "48f6c59bb95a8065163aceaad99471128e9be5bcb5f2d96512ad64223e580067",
"help/en/modules/files.md": "91a51a8b16b0b89ab97ce110eb1ab1882b4319b40412ec3941521942b1a7621c",
@@ -745,10 +805,12 @@
"help/en/modules/oauth-providers.md": "9bde340e64c98b9100d322db465a1180b5aecc60ff7222bf1a0bfb4f1daec015",
"help/en/modules/operations.md": "56c39f40464f75aefeb58d185082fe8d351ed77aae7b7eaf2800ac698095930b",
"help/en/modules/packages.md": "4977df2fc7c614f79df9d9c4aaf23d48cc74dea0463fe3a66b123e80de7bb277",
- "help/en/modules/personal-tools.md": "90967b72fc40e8e98b6088c098c1ab362d057d802daa3a1635f7587de5cc7971",
+ "help/en/modules/personal-tools.md": "ba5bac493e1d561c8b035c87f85b6799d44392527b9e37e9bb6001de7c4a6512",
"help/en/modules/polls.md": "a8f86b04024cfcf490e9ee2f5dc2e4293ec088cdcc48dce11c074b02310c1180",
- "help/en/modules/popups.md": "46a2d6171349d186cfd18af984c7a65dc1184f62406a700767233f3176e789ea",
- "help/en/modules/ratings.md": "37fdf968a33dab9224ede4f71bf093a8d9121613574961341fc0e436a2bd321a",
+ "help/en/modules/popups.md": "c261b0cc6ad92dacca72e240676701e531a32a75f65f3399c3a7acc0a27a98f2",
+ "help/en/modules/public-widgets.md": "ff19a83e4914d067d163ed8f40ad38c40e935ed4b7c64a64aad51b3d66736ce5",
+ "help/en/modules/quiz.md": "7d869a92c4d9b05fc3cbec652ac95ed8c9aa7f84f307becb3b1a582293295145",
+ "help/en/modules/ratings.md": "bbe6a3ed5ec767ff6f1224e48fab1cae3e9a0ec1c3e55543a6fd56385d26da7b",
"help/en/modules/related.md": "863982d9102efb874dbd362107bee773780b7c319a78b544a79008dd74fc64a3",
"help/en/modules/reliable-events.md": "7069a39f950f0e5688b09633c840e3be73b0b4c244b89115016e357aeac393c8",
"help/en/modules/repository.md": "1f835de827a64b04d6c00a18c060fbd6c414a7367daf8f10e9b6c6106dcaacb2",
@@ -756,10 +818,10 @@
"help/en/modules/rss.md": "22958cb500ddfcd83201086b36e43365d51f9f125b8663ec38e2e30eded4d0ae",
"help/en/modules/scheduler.md": "fc0c34af054e0081c6ad8cb1abddcff014c0a6eb77178c111fb0b15e0585c75f",
"help/en/modules/search-analytics.md": "3e21c935d76171a5a74cba9fc2904092d2d30062918c2f7ff1988aae0e499264",
- "help/en/modules/search.md": "973ff0a67f7ccece663d74c2a92c177869ac3fdd15484aa8c2d602c4fc5b039b",
+ "help/en/modules/search.md": "6bd582bc687436d99d292655ab4f9c3e3726c53a5dcc7d9dd94744545d22daf0",
"help/en/modules/seo-audit.md": "e18adcb79847fb5a1cedc8cfff03b5938eac1c2e2d22816ecc5e5b02b48b95d3",
"help/en/modules/site-readiness.md": "dbccccf0633f0e72d32cc8a2b0de319dea576f28b67f0d9c2907106c97fef1c1",
- "help/en/modules/smsc-auth.md": "789c352d0d9efa5d1c4d88f88b508d925b08518704326613ce35cadd1bb87fb1",
+ "help/en/modules/smsc-auth.md": "d66bdd5cb748db83b565e7cbc8150bd38099de778e94c9c4cb0ff1d065703479",
"help/en/modules/system-health.md": "f43c3745ee1437f392724d35299d208dd73ff344a3efff60273cc7b23c6fa731",
"help/en/modules/traffic-analytics.md": "5ed8a48a4d05350d8dced3db8fadcedbf32a2bf80147da39872a0f591ca8ce84",
"help/en/modules/tutorial.md": "2e6bcf3e7de1799fadddbe5b5dd56de613c91baf2a4d6c45232eb2144279780c",
@@ -767,7 +829,7 @@
"help/fields/README.md": "01d359b4ebeac9401be857443c4c16aee73933cd7d6307e0a25c2e3db6f98d5a",
"help/fields/development.md": "4b3de5adc867d34dab7d3a658eefd4deb0622b9c62f1a4fa5a6b0f24ecb264cc",
"help/fields/operations.md": "658f5ba5ff96cc99192d5486275d2ce9f98555cd8c8d43aed9f8f08a14bf5ce1",
- "help/fields/settings.md": "cba0acfc0fd93818e2e13c100026bb46643d4e579964ba9ab6d50fe7675599aa",
+ "help/fields/settings.md": "7e1bf3424f01208608285c48b10f563718e85b51786de26507113eecbf7a81c8",
"help/fields/storage.md": "502a8b0ab9c22b5e023f71f94cd0960bf00506c9cc2368ad72f54c354595c116",
"help/fields/templates.md": "7538e7df6ee2e7535a106c97c6a3d980678a0f148132d530bfcada9fcad4be7b",
"help/fields/types.md": "3197b168942ad3bdad5bf645cdaf4d54765f52307b6947041a7a255f5225bb60",
@@ -806,22 +868,25 @@
"help/hooks/lifecycle.md": "0d73b7eea62dbc1cc5f3a07449f465105ad8a477adf85b22d2adbc53529b81d2",
"help/installation/README.md": "6a9c434bbe81f493ad3b07ad83fd8c8a8739423f67f3e657b5a9a3dba0d2738a",
"help/installation/admin-directory.md": "fcb31d8bad1c18dd7e5c6843dc4f7b8c4139dbceaa670a7c4e0c060479f5ef9d",
- "help/media/README.md": "2693af05de4dc54b280427607dfa5824e3098944b93ba9b92f76715060b9864d",
- "help/modules/README.md": "a232a6e666b9ceea49a140b1a9d896cdf9e777581c6dc6ce287967e97c0bdbcb",
+ "help/media/README.md": "9a8027ffa29ad342e194868890174fbdf59b5dbbbd7ef39db9f1cf79888b2070",
+ "help/media/analyzer.md": "a057f3e95842d8d5168f9d456be656c91dc2382c26ce9f205bb620a902132ad4",
+ "help/modules/README.md": "01f2d804dbc841e849e41fc07e9d86d5118adc30a3da98a39672200c2ae17d65",
"help/modules/antispam.md": "ddcb858c6c80ee140addbdcd0e27ae3f7900100f1745ee006edabf52d0955fff",
"help/modules/banners.md": "e8faa2a923c5f5c39a0b7caf80a511d03fb680bd2604ddc59ec0362a244ee77f",
"help/modules/benchmark.md": "6c31f16fc3f083f29c65398c38b78609a3d94da168d30a93825af8ee9650eb0d",
- "help/modules/cache-warmup.md": "3f3ac8252b0f808ccba046daa69fde3bbb438b35252a16fa47255f5624e0f19b",
- "help/modules/comments.md": "a9b9a4ff122af3a2842b2e85d007973af935a07ce721f933ddaabe1d07e0e1a9",
- "help/modules/commerce.md": "de7b8fd3c27516044060ebfd96152f428a35851f2dfee62fb4edd10ee09f2ff0",
+ "help/modules/cache-warmup.md": "56c05ec252b44a1a0d1c4b09efa90cf9d450b0b138787903c898f56b377b8749",
+ "help/modules/comments.md": "04bcdea5aa7740e3749b51dcc9fc2954e98b22298d3e4fcdcc9865d94e1d0376",
+ "help/modules/commerce.md": "7fac85f0cea873bc57baa79c5bc57bd4d5bdb11af291d105e01785ab84f3cedc",
"help/modules/commerceml.md": "60a0a5c541b560b5a6a4ed8213d9145caace68c15be534af13f5f817eb5251ba",
"help/modules/contacts.md": "8df21307a300a335aaf243cb42a107829114ac031da128cfdfc6f4b94452dd3a",
"help/modules/content-packages.md": "8dde0ebc897b7891a6afadb6491f4797bef26622918addab67f0f4ebfd719678",
"help/modules/contributions.md": "3213f68af10e1b6a200aa61a3aaa9dad270da7ccd675b43bf7cc1ded90b55e60",
+ "help/modules/crossposting.md": "d6d0922c8d48d3f35418a00227a96d9343de024ecbc8affc1712c0a223f4547d",
"help/modules/dashboard-widgets.md": "db967aa0dc13d9c72631e219b6b3769ffc350211eb0ed86a467e5a3baa1462d0",
"help/modules/demo-site.md": "6dcb58f90c00d921ab1ab097424ea27845079d810f026a128f3ff9ea190982cd",
"help/modules/document-import.md": "579d5270328a962c0d171cfebef07a9709153c2a992ca22b8f07637dfc2b3c91",
- "help/modules/experiments.md": "923c3656188192e0cfde640d20c5e0a4aa6add4840e5dc0b747583b105e14256",
+ "help/modules/environment-comparison.md": "ad50d177174276ad57b12df588e54da45c7da946d352786a7d025f9f17f16666",
+ "help/modules/experiments.md": "54401edcc2a81e6cd1bc65e0365df3f76aca153b8062a94c0fe22113ea05d8c4",
"help/modules/faq.md": "ac536c5fdb5269f54f55475319d351c27993c37609769c92025a2e00be5c8c0e",
"help/modules/file-security.md": "5e8fc01b5c1f8b73f117f1ecb305e2ee642db92edbbe932cfb416b16c7ff705d",
"help/modules/files.md": "86305ab6e33640990d36f03ea39ba319d2984aba0bd7f300cb035ef497e94aaf",
@@ -839,10 +904,12 @@
"help/modules/oauth-providers.md": "834009cf17629433a998486f29331f09b285902b9076f1afd2eaaf9ea5492f6a",
"help/modules/operations.md": "07cb9879b636d2c2d54fef0774498a608d855f0328c7d536b0fa71a123abfa48",
"help/modules/packages.md": "9ec909565ec66d39489cf2a89d36d31c0e67408088fe864697d2089ac21b5131",
- "help/modules/personal-tools.md": "3d31c43946003ab61818d8c580a5a44baa6bbd48037de33de7c88a0d51c5aa3a",
+ "help/modules/personal-tools.md": "ab458ebeba45a5c5c22d70a23dcc69cada4426afc224a442867352b0893f206b",
"help/modules/polls.md": "4d13eabeb2a546ff036c8095cecd3e8a6781ecc0de7446b27c4b26b152397ee8",
- "help/modules/popups.md": "f95ab2440beafdce8801aebae32070e3b4d4f04148bcc9e95a0aa3231ac96411",
- "help/modules/ratings.md": "e4c8da2672ccec5ce085c507919fd016ef204427ce919f1a9c2b1c0146fe7c8c",
+ "help/modules/popups.md": "606fade21c6a62351f6c880e636b0fcb29a12f091ee165d7fbaa430df16deae5",
+ "help/modules/public-widgets.md": "148e424b5fdfed849ed9f9e53d0d3e6138af67373f6e8548c4fae37782f87536",
+ "help/modules/quiz.md": "003b69bccacf650b3aa761a6feb86b1dd778e8d5d2356131b11a10da1879f569",
+ "help/modules/ratings.md": "606686cb0584e49c7c74267c1be9bf37cdd35616d3f37787d314b1a0303f7c59",
"help/modules/related.md": "5500f2aa6a7c95367e439565b14037d2b73ef4218ea0a824088b3f32979c8979",
"help/modules/reliable-events.md": "983074f9490bc5897acd0373e8c1c748a127ba54ea1248a4e3675caddfe7e4a5",
"help/modules/repository.md": "e371ac47aaf81408242408d795df6cfdf62cbaffa232192cc4cff7dfb5e6c5ff",
@@ -850,10 +917,10 @@
"help/modules/rss.md": "0f8fe5fa5bd4991b432068a5a520d4a45d41dd6a2c6011f7f293f74c8d9c1588",
"help/modules/scheduler.md": "a39cf392ce9cf5af63e92063b95aea63979a24b27218a4b090b94834ef90b536",
"help/modules/search-analytics.md": "0444e0dacabe408358bcdfda4b6b2a475095e8b1c0ffc1361ff58c4db0576d35",
- "help/modules/search.md": "c1a130e487de27719a8171590e69fef6bf9e85136ae4d3ab862a380826c62e55",
+ "help/modules/search.md": "3dd37c32598c12654dd4ab97ec0c50d42ffc5083485ed37be0f135296af23afe",
"help/modules/seo-audit.md": "b0fb78eda0e83c0711b7717fcc730e7bc0cb86c6d692f21aa749cc4975f0ee27",
"help/modules/site-readiness.md": "2c7f845ece693ef14f23ea2b3b226f38ebfed305fc67bf842fae971f0e12255a",
- "help/modules/smsc-auth.md": "57a5c3686d7267c166edc858deb7144af4d3002eb6b9d01d8f2ceea5a9877e00",
+ "help/modules/smsc-auth.md": "13b844d102adb451d154ee9aff9b44d8b5faaac67c4491d73c832962f9a194d2",
"help/modules/system-health.md": "671d44d89f0d3ada4fcaa4ef3d8a7662a6c77dea6c0cd567d8f3e923d29e12a5",
"help/modules/traffic-analytics.md": "12f966acc6ffdf73e2d40682c6db203f8dc3918ba5461a78607c1d783ed54d02",
"help/modules/tutorial.md": "4239eef8d793b7bb799c901c821b229e456c7602ac694c0e3ffc5028b4eb57c8",
@@ -862,26 +929,26 @@
"license.txt": "b8093fa95967d0f6024a5334bc3119c694aba6f51be2fce66be6939f68c39e93",
"recovery.php": "2ecded66156c70919f9e83451ede4bbc1a5d5e5636e9362b2317ef05f733004f",
"setup/.htaccess": "a25c35a118024ed8b958455ccb123a5f899ad4f1103977e53d50f94b5499c7ea",
- "setup/Installer.php": "44d515370518a276696b6fed8e342bf5488720d486c27304c41ae152e7967a5a",
+ "setup/Installer.php": "a5e6e39f1983198b27ae32777a6b2fe4b85326e72ddeae6b50091cceade84e18",
"setup/Localization.php": "e6de0faeaa493fc317907099df2ab58c76f7b643ac70ea233deaa5bcb86d79db",
"setup/PackageExtractor.php": "57cb5473905992333936d7984221e5188cd72756d6e48206a42d96e8ab59442d",
"setup/assets/installer.css": "79e43dc7123f37206429e8535d92c5069c53231402c67b63ea9481bbea60ab42",
"setup/assets/installer.js": "892a982b872390fea21455562353408da906114b973ccbfc3a3cce06465ab1e8",
- "setup/core-migrations.php": "65d30c41652f5e6a61e70c05a198c784b1062560e607bb5f158b876a5b0c4e20",
- "setup/index.php": "63bff35919aa2f4cc9ac817b92020d01d5e8a8d6ec387071e0d1ece1edaedc15",
+ "setup/core-migrations.php": "c747a8a9289f27385310cd8189e7b618b7b78b0ddcc22c1d283425a5ee4a962b",
+ "setup/index.php": "cdbb99ab89035afb665d4a288c87633dc0749a75cf64a0bbf00e5ec8470fef36",
"setup/language/en.php": "963dd284ee244e6d006dede8522c1118dc0909974dcd24d477fd06b7e1965fa1",
"setup/language/ru.php": "8522b13c4f147804538eaa857585296db811c736e1361e6b403daecea05f34f8",
"setup/recovery.php": "359ae9b79508a382bdde175824b18a5bdb0fd69ddb7776c7d18ac9eb826d127a",
- "setup/schema.sql": "5c496281fe216cefb416477ebd9e3fb1d11b5ec3236b857dcda0a2bbe57a1930",
+ "setup/schema.sql": "f3a291d2dacebf1b1141254bd899bb522f20ff8c5c9ef5b76e04c324e0de6d73",
"storage/.htaccess": "ca761a92f2b6eb47feffcf200a8fd846e7fdd8abe065008d29beff0319ca3496",
"system/App/Common/AdminAssets.php": "dcd58f19fda48263b2912a10dfdc24e3f12967683649c4f614a8d54c62d51b86",
"system/App/Common/AdminLocation.php": "d2729b0d627ddbdeb7f0c4b110664ed949f373946f80929c51688391c64352de",
- "system/App/Common/ApiTokenRepository.php": "2d750efef3e5f8624e3f307a6a8074886d983f324d74d6455eb3ed0061bb57a4",
- "system/App/Common/AuditLog.php": "2961c0545d395e42d21119e1a8beafc0c3ffb3015ee67dd20edac4d1f302082e",
- "system/App/Common/Auth.php": "886b33e077babf3b8d9fc4c14bb4535ee12aed8a34799e16e4f73ab657c6cbba",
+ "system/App/Common/ApiTokenRepository.php": "0795e1add3723708240949b7aeada364fbeadd74366884b57e9142efcfaf617c",
+ "system/App/Common/AuditLog.php": "4e2dfceba55fd653d071261766c9051322a03a994034677463782ca0d09f3f87",
+ "system/App/Common/Auth.php": "647421cae2ec8bbf273d687ac1fda134c7bcc28db4977e01f5896c79e7c2c83d",
"system/App/Common/Auth/IdentityLinker.php": "7da4d902405bb4ead2278e5bc3578cd0318422fe82318bec94257ed44d5ba98c",
"system/App/Common/Auth/PublicUserNames.php": "0345d1f452e0a9accaa9b98eea71f27a428692a5b4f2ad225a10ad8bcf777684",
- "system/App/Common/Auth/PublicUserProvider.php": "5661296372762ad2b3a4297d4ce76f171c58ec4343ab585b71f58b856bdad96f",
+ "system/App/Common/Auth/PublicUserProvider.php": "163449ae80d412a605fc60380e97107b8710d6e14d06baf042d9e63d35d75c29",
"system/App/Common/Cache.php": "bb322246cbfa12cbcdd67c16a24c55715ad67b31d356b4f18091c0aa1d00eb9a",
"system/App/Common/CacheKey.php": "47400cd90d1880d061995bfea585b56210e18a870607d9b1cf7f0eeaccf15032",
"system/App/Common/CompiledModuleRegistry.php": "9ab055fa759f4041944bb94bfc2e28361986a09b742210981928bd6ee15f758e",
@@ -890,7 +957,7 @@
"system/App/Common/CoreUpdate/PatchPackage.php": "2e54a4c7e10c56f2cc77afecb97f75d69742696982d0aaf554c35f4d7469ed52",
"system/App/Common/CoreUpdate/ReleaseState.php": "8917d093677b05b3dc0b4ee97e8b26d18f9a98af78a3f87123fd7779d024af41",
"system/App/Common/CoreUpdate/UpdateJob.php": "60edfe53acfaaf55898488d889a0abf62d226fdbfe17740059eec5cb2e6b3173",
- "system/App/Common/CoreUpdate/UpdateRepository.php": "adb226ce961f920ab97cf195e277c9e60a93ab846bde0e34492ba66b53caae16",
+ "system/App/Common/CoreUpdate/UpdateRepository.php": "b8fbc3e0852b0d3d8be7b65a4513d12487dc3a42fd67c6f14330c7d5d85edc09",
"system/App/Common/CsvLogWriter.php": "9deaa3e2bd85eec300c65e89e22549f48aa9e2850ad50b2ee8826f8d4fa53aa1",
"system/App/Common/DatabaseConfiguration.php": "3eec09e9a0d9302761ca6b9ebfcb47b01aaded1bb7ed5834b1d55cac806918d3",
"system/App/Common/DatabaseSchema.php": "a71320db73eace5f630f2106d402565702c88bebae8056aced6daf922a78ab88",
@@ -934,13 +1001,13 @@
"system/App/Common/ModuleTagRegistry.php": "9e68b64303825a25ef4f71f31a7adedee9d2752e4d1d06162605da1dc510a6a5",
"system/App/Common/Navigation.php": "1a1b0a3552d941dc0fc59c334ab705e86a73ee96ee42871dc958012bec1d81f6",
"system/App/Common/NotFoundLog.php": "3b1cdeefd05ae250e90d1a05dd9e1bc0ba2cb0c2cbb89d504fe009151f20452a",
- "system/App/Common/OutboundHttpClient.php": "5d1182b75cbb507a962fab64c11ca3922826bd9810dfbbf3903589edc686e9ca",
+ "system/App/Common/OutboundHttpClient.php": "1be0216c2147b35a329e18d78911e7c5aa2cc225141b749ccba8c1bd9222a26d",
"system/App/Common/PackageModuleRuntime.php": "5ad492b9053bcea4d3bd4398b11fb2d976272e2036d379bdc24c19dd5fe7486f",
"system/App/Common/Permission.php": "8e2241bca829de0104741dc2518860cd15489866dc310437e07aeab2bf0f0355",
"system/App/Common/Proxy.php": "707564208ec8c24ac2ffb5bf41cba34f1b39059ce6bda31a69aaf4b116d864e2",
"system/App/Common/PublicAsset.php": "06f9ae414f7336206073e07597669991098114c396e80748c654c82b370a39c4",
- "system/App/Common/PublicAuthSettings.php": "d73f2ee75141e055be0968d190ad11190a0b1275cdc0330670274b46b8206f07",
- "system/App/Common/PublicBootstrap.php": "1208a8797bbe695d4607fa804f654402883bd47f926e0a39fa8766928c16e509",
+ "system/App/Common/PublicAuthSettings.php": "a3dd7d0bef9ab608c1e99b161d30962cceeacb4babf37bc24c26511d2d433b3d",
+ "system/App/Common/PublicBootstrap.php": "b22aa593a13d32ea6382b8ec342a5cfd79a9986b627730eb77e6fec4aaca85cd",
"system/App/Common/PublicConfiguration.php": "1daf6c26de04277f8618be4e25453aa479de9f7dfc09ba770d405eb7f9454760",
"system/App/Common/PublicModuleRuntime.php": "5aafede8a2c0cf35023419a024566ca453676ea2dd9274a4d5ca99faa9273d15",
"system/App/Common/PublicRouteRegistry.php": "6898abe0018f2630807f9697306ecfa2d63482f38832ba556b15eea21fa14222",
@@ -952,15 +1019,17 @@
"system/App/Common/Registry.php": "7b4ddbb3f96a7ad54a8d43e151cb595e598d3620b368d21721927ce9d54e1ea3",
"system/App/Common/ResponseSecurityHeaders.php": "b159a7105d3c1fb3ffdefbbc5997741d7b0f83bfb26fabcac96f61b53969364f",
"system/App/Common/Router.php": "4b0dd3fd9f732177070ce3326b691a8decfbe698aa0d8cf687a18f6c02b73d91",
- "system/App/Common/RuntimeConstantSchema.php": "08daf898ed9bfa12940adf8ddcd3e0dac811d28de8b798770afc42cbd20f1125",
+ "system/App/Common/RuntimeConstantSchema.php": "1ea1a029a29e4b0284d047f6ee6ec97dd50f4b42556e909a1a03481a4a380105",
"system/App/Common/RuntimeConstants.php": "decb1277dada75ee2b5c7d531f064db7ffecef5b3ad71d306111b2a45121d34f",
- "system/App/Common/RuntimeDirectoryGuard.php": "adc9ae97a5e5ae494e3b58073f195426daf2915bdae02c4e3e07312df272fa6b",
+ "system/App/Common/RuntimeDirectoryGuard.php": "2263f100530f7b0a7790f698581dff14181d4e2a917c12ad1ea888e5df1f59b2",
"system/App/Common/Session.php": "4a870a109c75ca941bebfd798d64b1396dde7d56ec060d9491f7d71b70a13deb",
"system/App/Common/Session/SessionDB.php": "6340cd88d5ce61ca39601347275547293a0b857cdd3978a4293eaa71076f83db",
"system/App/Common/Session/SessionFiles.php": "9be6009241d0cf6f2f909ddc6881a3dc3cf1de0aefd5ef6103de8032c997dbf0",
"system/App/Common/Session/SessionNative.php": "3ca6de1038e0b26e03e0797e9b1dc321ec383d85ad058503509d6b369d88168f",
"system/App/Common/Settings.php": "d739b499a2d3c893f387cf3f5033815b863edf08414b1565063fb9d5e7d53f0e",
"system/App/Common/SettingsRegistry.php": "0a24cf4e55e48d05a8af09ac00bbcbcc1179385254af8fd914e754964a1362b8",
+ "system/App/Common/SignedEventProof.php": "732c3b27f360dcbadcef405cac3d2cec5827e02cc789dc203001627750efcec8",
+ "system/App/Common/SiteOrigin.php": "d0471ed37ff0c8e08b4ab9e12138e793996d6bfe0a467ab020e82e301c773d19",
"system/App/Common/StoredPhpRuntime.php": "2bd4fa83c970cfa0b8002b11cf36bd0def7b37ea19c025f7c6b2f37f0de38286",
"system/App/Common/SystemTables.php": "85e95425b64d35bd8a3a5d4ddb14c1367ecbaa64ff6aaf4378055a1019895806",
"system/App/Common/Template.php": "5a0cacde5059fa9918321e6baa71a09a754a024055dedffae161486c51902f45",
@@ -975,7 +1044,7 @@
"system/App/Content/CatalogMenuRepository.php": "d2b384255fb9e67264f071064dafd645913a73ee640e559d600b1671455443eb",
"system/App/Content/CatalogTables.php": "5abd93b17142ea5c57a0726c8c6e3dcaf896790cf4ba31ea69be19a828ac9517",
"system/App/Content/ContactsTables.php": "d0042c761b854903b483e1b3a30d6014c596eef1a03c40cdbedae4fecb3c25d8",
- "system/App/Content/ContentPlacementMap.php": "b4328ef770c98ab8f93d395d2d13ca5ff54d94a2679977ed2615e4d33c50d55d",
+ "system/App/Content/ContentPlacementMap.php": "55950a599eb5385e2d81833815f0e2c08bdd06c61450565052ec1c19d38e00fe",
"system/App/Content/ContentTables.php": "a63105d8f3859921a9c1d17a4b8c69d3950ff0294de144814bd2b4768d236fde",
"system/App/Content/ContentTagDependencies.php": "e96882109203f4db60559cc324100ce5596c8f8a65571ab53b8b86cdd3d89fa9",
"system/App/Content/Directories/DirectoryRepository.php": "47d4f7a91841ff437c4448aa71f6a2b38c621dcf5a1204bd2ff4948f3ad671c1",
@@ -992,7 +1061,7 @@
"system/App/Content/Documents/DocumentMediaFinalization.php": "5ea218f79f835a4fc25da0199aab87137e620b60c31d8e2f587a1b911b3af6b1",
"system/App/Content/Documents/DocumentMediaFinalizer.php": "785487028e221726c6bc15662f83ed985701a8e5d21e9fc9605e816ef4c835b7",
"system/App/Content/Documents/DocumentMediaPath.php": "23b40c98d3cf9a73df3b7f7083b58b60dd80b8bda71e3e3a6354342cc72322a8",
- "system/App/Content/Documents/DocumentMutationService.php": "52e8f539cb62a3d787bdbae9e2df5d8d21bf75a39fa46c1d25545884b2b022ae",
+ "system/App/Content/Documents/DocumentMutationService.php": "5ad32bacb4ad5c2b2760db613be291f154ea3882695c2aa05607b1c5bc80f25f",
"system/App/Content/Documents/DocumentPickerRepository.php": "0e8efb5b42aadd74725213b8302b53b5147d7e0eb2e83d301a5f073bb0c13142",
"system/App/Content/Documents/DocumentRevisionPayload.php": "c7f83350de98b6d98531508eafecc4a2b5a0551c7f2ba77a9e5b954fd1287ea0",
"system/App/Content/Documents/DocumentRubricCodeRunner.php": "a9c04196b76ab91c7b1f8b53afbd45fc6727805c953fb5fe5ff36b69846d389f",
@@ -1023,8 +1092,8 @@
"system/App/Content/Fields/FieldType.php": "47979aaa49b773e2a00288ffccb746218b58ece8fa6d178a90d0cc9c853055d9",
"system/App/Content/Fields/FieldValidationException.php": "1a1d6d5278d6f8ff697e5afe75e0a6f59db2b12121c93b786fd87f8b81287717",
"system/App/Content/Fields/FieldValidator.php": "5408849670818b379a66d5db9b7aa0d94ebbd8438d7788124f62cd221dae5561",
- "system/App/Content/Fields/FieldValueCodec.php": "66b6981228683dd9b6c8bd850fe2fe84de5ac3101bf9abbbb91664a7edda5f2f",
- "system/App/Content/Fields/HtmlSanitizer.php": "a716694280998f65bdfd6adef26c0d0b7e2f912413fa531a0b2070a09f6cfee0",
+ "system/App/Content/Fields/FieldValueCodec.php": "5868e9aaa11a8aa2c4dde33e8b358861b4a5a49f6ff235c1d0e22b836dc3df55",
+ "system/App/Content/Fields/HtmlSanitizer.php": "003ddd83bc6b3c89e1ccdbfe4abf94e013c4a6b1272cf29c1ed36790f3ac7919",
"system/App/Content/Fields/MediaFieldValue.php": "5821060785f859b414a448d4998a9e7b40df69d536574f0fbe600f1d7611ea35",
"system/App/Content/Fields/PublicFieldRuntime.php": "9abd8e5dd43c56b27dcbf87d258cd9764ae1d67e95a397a63a6c6516f7a417f8",
"system/App/Content/Fields/PublicFieldTemplateContext.php": "785d6757710dee59d8d30756917235bb4f49eb5bd743c01d2365c05d74bf0a5a",
@@ -1112,48 +1181,48 @@
"system/App/Content/Requests/RequestRuntimeValue.php": "9f0b9eeec1bf32cee8c13e1298e6b64c5a59f51c05d86b798523125a91ea8274",
"system/App/Content/Requests/RequestTieBreakerAdvisor.php": "bd547d4dd74c45246e3a49bfef3320964d723c520fce3339ea5884b89aabd08f",
"system/App/Content/Requests/RequestViewPreview.php": "ab80344f456d50aef43716572179b411a60af47523a71bbd45d317cc5967e899",
- "system/App/Content/Revisions/JsonRevisionStore.php": "46b07200bd19bf0fe1d177e47ad84ed4de531b6271ebbccc80a9ff40c44b538f",
+ "system/App/Content/Revisions/JsonRevisionStore.php": "e38e56c1fe8dc1ed3e8e6918971a9cbe6dc98cf00d74bb0eb41c9298bb5f0063",
"system/App/Content/Rubrics/FieldSetMerge.php": "15ae21c53a11a3c40f59abe3b117c640506def0355964216ad7350f8cf8e66d5",
"system/App/Content/Rubrics/FieldSetRegistry.php": "a9df395474b9a28cdd1dd5dba40fe49e485835218afe472c414b9696094b9a70",
"system/App/Content/Rubrics/RubricFieldMutationService.php": "3fec278925d14f7ec2efed63ba51cd91def333220ca4e18f3a42a202a8806674",
"system/App/Content/Rubrics/RubricMutationService.php": "e3190ef1ddd94bdaf077148ce84c5758b2a32683369730a2b847dbbd0d72a74c",
"system/App/Content/Templates/TemplateMutationService.php": "8c7e52202454e35eb0c8176325cc23ba760ac40ff0430cbba5e1446c83cf7a87",
- "system/App/Frontend/Auth/AuthService.php": "58a551f0c372194ffc2cca3e12f1e9a8ab743d07682f6b2c086ec1f7bc77ad54",
- "system/App/Frontend/Auth/Controller.php": "968a682faaad88e76f127b7381a183ee393ba367a51e40cd17395bd69d4fb4e2",
- "system/App/Frontend/Auth/Feature.php": "60ff394cbf95ea3ca3f35476a6eb2bc4016fe472be85cd11ebac117635a54440",
- "system/App/Frontend/Auth/FormTemplateRepository.php": "97882ee4b46e0c4e31493a44831564409b5a64c096363aaf812f181d13abae64",
+ "system/App/Frontend/Auth/AuthService.php": "1cef24cffd7773f3783ec96479b8e7daa1808b03a34dfc8da37b84e6e09144b8",
+ "system/App/Frontend/Auth/Controller.php": "04793123f0d4bef77141e3f8471d454ac5b4d2b17dce4630eca40da0e2f0b576",
+ "system/App/Frontend/Auth/Feature.php": "dbaeac564886c7949e0e47c85fc5496c25221d880c4f03cee40cc5e15d042a1c",
+ "system/App/Frontend/Auth/FormTemplateRepository.php": "bcd8797e63cb67803aef2267a2c62e3ad368b5fd947057a768adbb1288ee9281",
"system/App/Frontend/Auth/OAuth/HttpClient.php": "b09acf92b312bd05ca78500fccaac3b77d36a1046d64d3615a00d60af4e3594f",
"system/App/Frontend/Auth/OAuth/IdentityRepository.php": "35ab143e0d536185125c685f17f5f4bb0ba0cc72daba62552ef6f82370e38ec1",
- "system/App/Frontend/Auth/OAuth/OAuthFlow.php": "842e9c9bea61578bdf124dc8bd1921e5c505349822a95e5812bf09e2710f2278",
+ "system/App/Frontend/Auth/OAuth/OAuthFlow.php": "f7a08104f75de4ee81f753c8e935c321dc5afb08b76062ec9de4cf6a4ba9fb50",
"system/App/Frontend/Auth/OAuth/OAuthService.php": "c310a2a6756425a4b2875b12c048b0476dd5b424e89561ac1fa73aebfb3cf045",
"system/App/Frontend/Auth/OAuth/ProviderInterface.php": "c99525fd51a1bebc24c189f52f1a08bcef087b98ffa960d1b378deb68022d9ba",
"system/App/Frontend/Auth/OAuth/ProviderRegistry.php": "e0ff4bc12ef2349d4f914299c78715438d9fbd44ab98e00937534786baa07800",
"system/App/Frontend/Auth/Phone/ChallengeRepository.php": "1e53d355aaf0adcc8e10a2b1b50e638916fd688c62a7ed6a4bd9c161c14a6390",
"system/App/Frontend/Auth/Phone/Controller.php": "bb07bfb74a89742c2dbeeb7edf79f02ae43ef6a252d02a3bb7c3c78144cf280d",
- "system/App/Frontend/Auth/Phone/PhoneAuthService.php": "816a29b7102b8dd58d3c46d4e563f83beda0397b037bc17377f1f8d4fc8545b0",
+ "system/App/Frontend/Auth/Phone/PhoneAuthService.php": "783b671cb6b6f80eb4ecbd7bec86d417dd7030c7768ba01f742600e4a6b55a89",
"system/App/Frontend/Auth/Phone/ProviderInterface.php": "55107c8f6a89bea01b91314dfe523b684bccf5bf9f1a3c8f047fd3a509aa6d00",
"system/App/Frontend/Auth/Phone/ProviderRegistry.php": "fbeb488c9b63843085b680500ecafd61389a29f55e0d76692550939e378d2f16",
"system/App/Frontend/Auth/ProfileRepository.php": "9cd7be35b048faf407a925e6369a5895b8bfafe6cf756eb3c4321ea4979a9af6",
"system/App/Frontend/Auth/Registration/CheckoutRegistrationGateInterface.php": "6ce038a47e21b594a47bee16075dbf102775b493efd5f2304fa8f80341d34bec",
- "system/App/Frontend/Auth/Registration/EmailRegistrationGate.php": "52617ab06e53ac64c3168fac48260c3c8382d7eb2bb9dbc280942f7fb3bfaedc",
+ "system/App/Frontend/Auth/Registration/EmailRegistrationGate.php": "ce6dcad98a944aade0fd9a80444c183b4f29bc50e1f119aa3d1d72bdfc3fa732",
"system/App/Frontend/Auth/Registration/RegistrationGateInterface.php": "99e73d0d6db972bb5b2c2a7a21dd50823a9bcef7d05937c525d0e7096775aedd",
"system/App/Frontend/Auth/Registration/RegistrationGateRegistry.php": "bc7c8546780daacd23243d16778062384f043661674956d1a5a47a8b6440eb44",
- "system/App/Frontend/Auth/Renderer.php": "2a14b5593495e1b587b79ebc7715a4bd37784a104030837e10b056bfed63ea3a",
+ "system/App/Frontend/Auth/Renderer.php": "94ed24082c9170c6f7ad09d1b59565c8b4251947979b6502f426d8adfff13efc",
"system/App/Frontend/Auth/Tags.php": "92fc1c466e720be36a0adce5a735e47c94bf88d9a3e70ba9d62196ef63e639f5",
"system/App/Frontend/Auth/TokenRepository.php": "5e09b154d4747bfb3d2795a9b449ae4aefffe47508edef92d1a7b392c0371207",
- "system/App/Frontend/Auth/UserRepository.php": "21bfe56cb9f2f74ab9c58947cac9e8132159afddc0900d7d7136e919c3482bac",
+ "system/App/Frontend/Auth/UserRepository.php": "07a35cb3a82201465360b7f75e4be1534c88d53789ad2a5b1ef617be97a060e3",
"system/App/Frontend/Auth/assets/auth.css": "a16949511a17462d9157945f2ceccb445254b34243e9e368796dd3137aac49c8",
"system/App/Frontend/Auth/assets/auth.js": "840c7322fc21f9a8dd61af8cd16e0ceed36d6beaeac45d948bedbcb87b6012c4",
- "system/App/Frontend/Auth/view/login.twig": "bbe2c12ce95f16cb2b2a07f945c8b8798e9386e9e3cbf16ddf5d0a3ca3944016",
+ "system/App/Frontend/Auth/view/login.twig": "1f33ca2d7b99d9ad60a82deb5e3904b7b1be1ef6a2c6c021ee565523ee0fe074",
"system/App/Frontend/Auth/view/message.twig": "4e9a660af7d0deae9424a07550816c401902e75279414b11657e0eddf573deea",
"system/App/Frontend/Auth/view/oauth.twig": "7ccb2c7ae36a378586334887c32fda96909cb6fa235601f1f697d4c8049af648",
"system/App/Frontend/Auth/view/oauth_connections.twig": "e2d845ce9d906ca12d3f642e92ede1aa415203f7dc2ac472006f40e80eb8bf27",
"system/App/Frontend/Auth/view/overview.twig": "97ad0cd5f72f63b6c92139f7cba54041840131975fdca417352dacf7f64ddb68",
"system/App/Frontend/Auth/view/panel.twig": "3e7237263702462969b937254b6e2d4268599352f801ed4681db7b1aab07f508",
"system/App/Frontend/Auth/view/password.twig": "099d7c1e48649faba57eb50df9bd9a091c79dad12e9c1fee9b38c3f2e025ed80",
- "system/App/Frontend/Auth/view/phone.twig": "969628667cd4d518987c1b9bb1632e70f44de6c9373e7e92b5ef8d94584066fd",
- "system/App/Frontend/Auth/view/profile.twig": "bd2e46b731ac0e3454c91c746a81c20690bea613803363aa58f4a6ae50b494eb",
- "system/App/Frontend/Auth/view/register.twig": "1f97ce555e5aafbcf2b4f6942e3603e798a7ee2b5c3dcf197fb5afba44978810",
+ "system/App/Frontend/Auth/view/phone.twig": "8119ebc00ef866b80eadb559ce71b4d1c6511fc88523e41e7d3ac693db10dbdf",
+ "system/App/Frontend/Auth/view/profile.twig": "71032aeeebc80036301181932c90ee004d9440bbc64b1b3f79ba03c0e3037a87",
+ "system/App/Frontend/Auth/view/register.twig": "92f78ab66ba8c16e0b7c3727ac80ae239e01f696399b72049f19a1087d3f3cc9",
"system/App/Frontend/Auth/view/remember.twig": "fb170509256e4ecf13ebe5f64cae8cbd6ad8ef143abe645f4bc1f269e0d8a0fe",
"system/App/Frontend/Auth/view/reset.twig": "5dff5378aa0e2203fd67fe9f1dd61586ee51e3d3f6138011b9d2b5dec4da31aa",
"system/App/Frontend/BlockRenderer.php": "1d23d7ff85ba1052f896e204d1885f99ec2c0f6382e01d5d1903d69fe661305b",
@@ -1185,7 +1254,7 @@
"system/App/Frontend/Feeds/FeedPresets.php": "bff8edea9f095a63fa2c127ee6afb35c5a3ce4434ca309e9a8a7dd047ba16428",
"system/App/Frontend/Feeds/Generator.php": "4234369a293bad237fe0d36dd3c78da616d03ce37070ac72988893f796773da9",
"system/App/Frontend/Feeds/PathController.php": "faf72ea5ba08256c8566a5ee9a73adfcabd59ef0f510c108a6003b659659635b",
- "system/App/Frontend/Feeds/Repository.php": "1f5188ade6ea32e13861598647319202c44c632393a50a5ec55fc96279b2b189",
+ "system/App/Frontend/Feeds/Repository.php": "3d36c493b3714780ed078537ecc8788c7f403a6a6eebb022128bd3e9b3e6dfa1",
"system/App/Frontend/Feeds/Schema.php": "a4603347d631e6a748e0b245901f952736754e4e5e73c96289ed17a1998f5a31",
"system/App/Frontend/Feeds/Service.php": "3d0f3badbc07a9d47e5902c106be270a24a71e2d64a636ca909b2393bdeb59f7",
"system/App/Frontend/FieldEndpoint.php": "0bb0200a52169ecb77498df32d6ee3053324844cfa2e9200d6b3b819dd4c6aa8",
@@ -1196,16 +1265,16 @@
"system/App/Frontend/Media/ThumbnailGateway.php": "556d46b0a6d8f1a289eb76f2ea2828f7b9c3b16b33934d3888201327f82dff61",
"system/App/Frontend/Media/ThumbnailPresetPolicy.php": "59a6e2ffadc2f8fef3bae4ea11a32a230a6c8cfe22e008e0347505460281baf0",
"system/App/Frontend/Media/ThumbnailPresetScanner.php": "d972f234a36e66679eff7cf6256a6adf35a51f9c6a9f3a2b23781d0118e4dba4",
- "system/App/Frontend/Media/ThumbnailStorage.php": "594c1cd2fb24dbff8ff92d6b450b20080270c0fe7d04efc6f47022344a890b48",
- "system/App/Frontend/Media/ThumbnailUrl.php": "a84292ca6f3cf2976f1098027fbb1792854e1d4a8dde5c068f73e025a5d1fa11",
- "system/App/Frontend/Media/WatermarkService.php": "99d2a1c95d907aca7374b48dfe51413885923943909f3507ef030f87b156f215",
+ "system/App/Frontend/Media/ThumbnailStorage.php": "c7e15a7b91989b668e28a655df45d6ac6c6c6e3db9b67fbeca88b087b4c65c2c",
+ "system/App/Frontend/Media/ThumbnailUrl.php": "0fc3e35b535ffaa475e85cce6ae8b6a4cee1fd6fbcba67d55adc7648330bf43b",
+ "system/App/Frontend/Media/WatermarkService.php": "69136f8e840587a1929e267b5a074c7708fe11d66d0898e334e9f4cca1265afa",
"system/App/Frontend/MetaGenerator.php": "7809c2e95bb893bac356e228867043f9b03c3dfa19e8fbc64db1b82241738473",
"system/App/Frontend/ModuleTagRenderer.php": "0b41289126478a1aeda6cf7119f8f3d5f89b43bb7684c92ab5447d5dab408795",
"system/App/Frontend/NavigationRenderer.php": "d176186b06d56832e640a8b3d53ccad4aff04e3834b261d83670d675271e4d00",
"system/App/Frontend/NavigationRepository.php": "3714ca40102621191837fbed7511873327250ecb186c54bb0cce89781bdb0db1",
"system/App/Frontend/PageComponentRenderer.php": "4176d2748b73b1c7cb72963cf67cfafd66246d93119728d9d688e6a48b882485",
"system/App/Frontend/PageShellRenderer.php": "e87c2ca686fbf6fd721a35656e752aaf590633a196c93715f75d36ddd78245fb",
- "system/App/Frontend/PageTemplateRepository.php": "07af7abf99d0faf9909767685fb392ebc2acbf03aa8172a7701e5001d66d863b",
+ "system/App/Frontend/PageTemplateRepository.php": "58f73d71e6bb394f725aee0201f436236214acca343dc75bacdcfa752f3e8caf",
"system/App/Frontend/PageTemplateResolver.php": "1af594b212cd4e30d5de361415a8e238493995d8bf955df9291e40169afe621c",
"system/App/Frontend/PaginationRenderer.php": "27dda732ec0547a389c4843a77b59090014c5cf0339dbebee51abf4fd0bc7ed6",
"system/App/Frontend/PublicAvatar.php": "5a7afe665f25fbf4bc09a7861b9b84e98f8c294adbe9b047455e5deacda508f9",
@@ -1226,10 +1295,10 @@
"system/App/Frontend/PublicRedirectResponder.php": "67b0915e9820fb5d0f4270d86ea39d99502acc49c86997aef7fe0d9ef3fe7b60",
"system/App/Frontend/PublicRequestApi.php": "803113eaeaf272d423ba39331e0dfa25a540251aab4961d2b796a6734215ed37",
"system/App/Frontend/PublicSettings.php": "e70b9a478cefe4eb9f55ba0cde37ed14e270be345d08773e8a6b736be3bef321",
- "system/App/Frontend/QuickEdit/PublicQuickEdit.php": "97e6a1498886b74b0a21338732b238f185ea80bedd06a84cba0c70e9aad3fd8b",
+ "system/App/Frontend/QuickEdit/PublicQuickEdit.php": "11e2c721e676d3ddba73c6f8cbe11ac9a9ad15acfd4e97ddfd88ba7f8f43dfd7",
"system/App/Frontend/RequestFieldRenderer.php": "01d6e96d630727f740874334e7ffbdfbdc076d896a6d8a390723c8aaaec41c97",
"system/App/Frontend/RequestItemContext.php": "28f70292d7feeb77b88246d1d3299ff54447afc1aa6c525211835a4cfd51ebb4",
- "system/App/Frontend/RequestItemRenderer.php": "a941b0ec8eb558792499fb0b9ea5b2ff049a59ddb0b61c3f364aa62fe959fd52",
+ "system/App/Frontend/RequestItemRenderer.php": "6426d63609073d85938dbaef0f77935d856a57eca225503d812e31f07ab98790",
"system/App/Frontend/RequestListReadModel.php": "7eedb83e42382cada17e60484108702a52f8a890b59d93cd921e194025af6064",
"system/App/Frontend/RequestListRenderer.php": "b042f3961c9609a24eaf2b012dd62840ad183d938bf6312b32731c236ea07ef1",
"system/App/Frontend/RequestRenderer.php": "99145390cbfe803388786dcf6de60cb4f384224955681e7f855e4b7ef19355b1",
@@ -1246,11 +1315,12 @@
"system/App/Frontend/ThemePageShellRenderer.php": "483e2cf8ef91099b5ff3b3c1d70aa3a4d2ddf354add2bff650ec523150384ea9",
"system/App/Frontend/ThemeSettings.php": "77509ac00183373005f2456a58abf2c8608d6677751f7540d8cb8f5db36284a4",
"system/App/Frontend/ThemeSettingsTags.php": "13fa6b59c8518dca33f6b3482e0f9a00c14a248d430756f62a9b0c5175346fab",
- "system/App/Frontend/view/content/list.twig": "34bcf0e7afbdfc53f02c5629f98f5551c7a80d3121dad70e513fbd0c7466d75c",
+ "system/App/Frontend/view/content/list.twig": "60db68391fa334c46694d3d646a0458e661e147770feb86e7be174b62e1f1f65",
"system/App/Functions/custom.php": "173e6aef242ae4899d8b0d39f41b8235f7b38d75a5017954cdd6287f43c36dc4",
"system/App/Helpers/Arr.php": "b7e5c439521da8ee1f85d978e561e9466da94d70f5172620deb94677fc964aaf",
"system/App/Helpers/Cookie.php": "f6648c6e0366528c5f04d77ad35cf59f71c4eac2e4c092da1d59ac332b648b5f",
"system/App/Helpers/Crypt.php": "45d4f4b441bc0ad0e160a3d1461095cee28a7372d6ee15fbfd0a4b1ba1e5c6f5",
+ "system/App/Helpers/Csv.php": "860a13c22958a728caea746fbeca1355d0825e124d7f83000b0f5f45a7b82775",
"system/App/Helpers/Date.php": "2ed2f352f52316484be9f915c73f90357d89aaf6945a398dcea1bed136c2c454",
"system/App/Helpers/Debug.php": "d495a96e844ed9109ec8eb71227e5f02155f61b08b719793d8be16a543f3c106",
"system/App/Helpers/Dir.php": "0791ed320ab894e2c768d16768c227e9c68bbc627723eae289f587551037fb66",
@@ -1269,17 +1339,18 @@
"system/App/Helpers/SearchText.php": "1747521adb640161c6f4df648134c8349769e3cd7ddbc726118af81f1a4dcbf0",
"system/App/Helpers/Secure.php": "99a5a170cd574e5b6a6c3b433c5b8bac92407fba62088c93e893e215f18162a3",
"system/App/Helpers/SoftDelete.php": "9b85f227bbbc12e4bddd9bcf211b477044041b87bf94d1a422f80d46a10c3ccd",
+ "system/App/Helpers/SplitTest.php": "d0c875c264df66509b53693dccae8d9f482b069dfe98eb5820481077f3c4508c",
"system/App/Helpers/Str.php": "7eddedb821b476f5284573171899a97ab653b23fc2777cbef780a802a1e9aac2",
"system/App/Helpers/TagParser.php": "7cf90d3af459df482aba5594873bd6807f9944288061d06934668e4bb9c18540",
- "system/App/Helpers/Url.php": "418ed3e2682f9097b62d495769864843acc2a9650a90a98d24542acdfdb0946f",
+ "system/App/Helpers/Url.php": "9a5936995f171b83ef6b254f64bac00296333ff2289e155ae2f6b589eadabe7c",
"system/App/Helpers/Valid.php": "d5ebfabf53755ae3e66acade5dcaebd9ca0f5f151f988e1fa0a51d3dba9a0983",
"system/App/Helpers/Zip.php": "cf34358f6908b026e745bb94e5355b4376d46d31d3dfe78cabbf118c04f745a8",
- "system/bootstrap.php": "2c72cc44f36c9250612b30f8f73efd510b47a5497a71b8a18658627e82e9bb59",
+ "system/bootstrap.php": "01287f2ec1724095accdb87968e69f19cc438c732544e8160d39ab2a994bebad",
"system/distribution.json": "c498272f17ce6f0fbd79401fb264089d6380799a0a102c7f6e5c2fa2149439f7",
"system/language/ru/lang.xml": "7d46cc9822f064a1af4d6528ccfe2dd4a9cc318912e327fd807befd2ca3dfd11",
"system/preload.php": "66bfb1aaf36ba85945b729b09a37e96ead0be1cc2749ebd9abd4b9da4f25ba0e",
"system/public.php": "3f72b5bf44bc0ba5ba6fb6b3adc2e2f9d5e9902d9cdfa3d7b748f4aebd179b87",
- "system/release.php": "e49c5a7ff2bd517746dc5f3a173014739abeb085b3fc0b4a413c568ff7543549",
+ "system/release.php": "e9aeb913c895912f8dae625b0311fb38cd871c20232eede2948e934ba4bff656",
"system/vendor/Captcha/fonts/palatino_linotype_bold.png": "38b6a1d4a4bd1d0c056205119c5e24176913ac0d898371f53a0339952a319365",
"system/vendor/Captcha/fonts/perpetua_bold.png": "55dbbe97dae128dea47b5e8d640414b3d813119c854c688037a20a581ec8fdc4",
"system/vendor/Captcha/fonts/times_bold.png": "d3d32ce1f418e3c3c3b1afe3b6acabadb36207bc12368f5e86420cf1a529ff8f",
@@ -1863,7 +1934,7 @@
"templates/public/index.php": "c57a4bb3eb5ae6c0394cc748a14dc7f703a9d819333f181f0edffffa680100bc",
"templates/public/templates/.htaccess": "ef94d4c2ac2a038b6c2ae673d9573333a0a20f7fac9e2d75af11c6c387a157a3",
"templates/public/theme.json": "4fb596d58dbda7f58c26c4f3640c56d6f6981f402ffbd368229adddc23683690",
- "tmp/.htaccess": "6b817083ef9d947002e5ffe1e216de9b1ecd9bba813f0d8493b25dab83001699",
+ "tmp/.htaccess": "ca761a92f2b6eb47feffcf200a8fd846e7fdd8abe065008d29beff0319ca3496",
"uploads/.htaccess": "90cd571b4c9f09a63732254fbcdca92cc7da8560a6e5b4d9ec7e58ac40e528bf",
"uploads/index.php": "e91434fe4986c22a2bba7ceda8e59d1aa2c9f943353035c83939cfd4f423fdd8",
"robots.txt": "d8119db904b34c2aab74cc2b6a09d13119f7c19add8b51ffbf4717eba65e8218"
@@ -1893,6 +1964,8 @@
"adminx/Support/Twig/AdminLocaleExtension.php": "core",
"adminx/Support/Twig/AdminLocaleNodeVisitor.php": "core",
"adminx/Support/Twig/AdminTextNode.php": "core",
+ "adminx/Support/ViewOverrideEditor.php": "core",
+ "adminx/Support/WorkItemContext.php": "core",
"adminx/assets/css/adminkit.css": "core",
"adminx/assets/fonts/NunitoSans-Bold.woff2": "core",
"adminx/assets/fonts/NunitoSans-ExtraBold.woff2": "core",
@@ -2014,6 +2087,7 @@
"adminx/modules/Auth/language/ru/runtime.xml": "core",
"adminx/modules/Auth/module.php": "core",
"adminx/modules/Auth/view/login.twig": "core",
+ "adminx/modules/Auth/view/password.twig": "core",
"adminx/modules/Blocks/Controller.php": "core",
"adminx/modules/Blocks/Model.php": "core",
"adminx/modules/Blocks/Revisions.php": "core",
@@ -2068,12 +2142,16 @@
"adminx/modules/Console/module.php": "core",
"adminx/modules/Console/view/index.twig": "core",
"adminx/modules/Customers/Controller.php": "core",
+ "adminx/modules/Customers/CustomerCenter.php": "core",
+ "adminx/modules/Customers/GlobalSearchProvider.php": "core",
"adminx/modules/Customers/Model.php": "core",
"adminx/modules/Customers/assets/customers.css": "core",
"adminx/modules/Customers/assets/customers.js": "core",
+ "adminx/modules/Customers/language/en/center.xml": "core",
"adminx/modules/Customers/language/en/client.xml": "core",
"adminx/modules/Customers/language/en/interface.xml": "core",
"adminx/modules/Customers/language/en/runtime.xml": "core",
+ "adminx/modules/Customers/language/ru/center.xml": "core",
"adminx/modules/Customers/language/ru/client.xml": "core",
"adminx/modules/Customers/language/ru/interface.xml": "core",
"adminx/modules/Customers/language/ru/runtime.xml": "core",
@@ -2083,7 +2161,10 @@
"adminx/modules/Customers/migrations/004_materialize_public_auth_schema.sql": "core",
"adminx/modules/Customers/migrations/005_checkout_registration.sql": "core",
"adminx/modules/Customers/migrations/006_phone_identity.php": "core",
+ "adminx/modules/Customers/migrations/007_customer_center.php": "core",
"adminx/modules/Customers/module.php": "core",
+ "adminx/modules/Customers/view/customer-center-detail.twig": "core",
+ "adminx/modules/Customers/view/customer-center.twig": "core",
"adminx/modules/Customers/view/index.twig": "core",
"adminx/modules/Dashboard/Controller.php": "core",
"adminx/modules/Dashboard/Widgets.php": "core",
@@ -2122,21 +2203,29 @@
"adminx/modules/Directories/Model.php": "core",
"adminx/modules/Directories/assets/directories.css": "core",
"adminx/modules/Directories/assets/directories.js": "core",
+ "adminx/modules/Directories/language/en/client.xml": "core",
+ "adminx/modules/Directories/language/en/interface.xml": "core",
+ "adminx/modules/Directories/language/ru/client.xml": "core",
+ "adminx/modules/Directories/language/ru/interface.xml": "core",
"adminx/modules/Directories/migrations/001_create_directories.sql": "core",
"adminx/modules/Directories/module.php": "core",
"adminx/modules/Directories/view/index.twig": "core",
+ "adminx/modules/Documents/BulkEditor.php": "core",
"adminx/modules/Documents/Controller.php": "core",
"adminx/modules/Documents/DocumentHookRunner.php": "core",
+ "adminx/modules/Documents/DocumentMediaReplacement.php": "core",
"adminx/modules/Documents/EditConflict.php": "core",
"adminx/modules/Documents/Model.php": "core",
"adminx/modules/Documents/Revisions.php": "core",
"adminx/modules/Documents/assets/documents.css": "core",
"adminx/modules/Documents/assets/documents.js": "core",
"adminx/modules/Documents/assets/redirects.js": "core",
+ "adminx/modules/Documents/language/en/bulk-editor.xml": "core",
"adminx/modules/Documents/language/en/client.xml": "core",
"adminx/modules/Documents/language/en/interface.xml": "core",
"adminx/modules/Documents/language/en/runtime.xml": "core",
"adminx/modules/Documents/language/en/zz-interface.xml": "core",
+ "adminx/modules/Documents/language/ru/bulk-editor.xml": "core",
"adminx/modules/Documents/language/ru/client.xml": "core",
"adminx/modules/Documents/language/ru/interface.xml": "core",
"adminx/modules/Documents/language/ru/runtime.xml": "core",
@@ -2160,6 +2249,7 @@
"adminx/modules/Documents/module.php": "core",
"adminx/modules/Documents/view/_product_panels.twig": "core",
"adminx/modules/Documents/view/api.twig": "core",
+ "adminx/modules/Documents/view/bulk-editor.twig": "core",
"adminx/modules/Documents/view/edit.twig": "core",
"adminx/modules/Documents/view/index.twig": "core",
"adminx/modules/Documents/view/redirects.twig": "core",
@@ -2179,18 +2269,23 @@
"adminx/modules/Events/view/index.twig": "core",
"adminx/modules/GlobalSearch/Controller.php": "core",
"adminx/modules/GlobalSearch/Model.php": "core",
+ "adminx/modules/GlobalSearch/language/en/interface.xml": "core",
+ "adminx/modules/GlobalSearch/language/ru/interface.xml": "core",
"adminx/modules/GlobalSearch/module.php": "core",
"adminx/modules/Groups/Controller.php": "core",
"adminx/modules/Groups/Model.php": "core",
+ "adminx/modules/Groups/PermissionSimulator.php": "core",
"adminx/modules/Groups/Setup.php": "core",
"adminx/modules/Groups/assets/groups.css": "core",
"adminx/modules/Groups/assets/groups.js": "core",
"adminx/modules/Groups/language/en/client.xml": "core",
"adminx/modules/Groups/language/en/interface.xml": "core",
"adminx/modules/Groups/language/en/runtime.xml": "core",
+ "adminx/modules/Groups/language/en/simulator.xml": "core",
"adminx/modules/Groups/language/ru/client.xml": "core",
"adminx/modules/Groups/language/ru/interface.xml": "core",
"adminx/modules/Groups/language/ru/runtime.xml": "core",
+ "adminx/modules/Groups/language/ru/simulator.xml": "core",
"adminx/modules/Groups/migrations/001_register_public_debug_permission.sql": "core",
"adminx/modules/Groups/migrations/002_remove_observer_role.sql": "core",
"adminx/modules/Groups/migrations/003_seed_default_roles.sql": "core",
@@ -2199,25 +2294,39 @@
"adminx/modules/Groups/migrations/006_normalize_control_panel_permission.sql": "core",
"adminx/modules/Groups/module.php": "core",
"adminx/modules/Groups/view/list.twig": "core",
+ "adminx/modules/Groups/view/simulator.twig": "core",
"adminx/modules/Media/Controller.php": "core",
+ "adminx/modules/Media/GlobalSearchProvider.php": "core",
"adminx/modules/Media/ImagePresets.php": "core",
+ "adminx/modules/Media/MediaAudit.php": "core",
+ "adminx/modules/Media/MediaSearchIndex.php": "core",
+ "adminx/modules/Media/MediaTrash.php": "core",
+ "adminx/modules/Media/MediaUsageIndex.php": "core",
"adminx/modules/Media/Model.php": "core",
"adminx/modules/Media/assets/media.css": "core",
"adminx/modules/Media/assets/media.js": "core",
+ "adminx/modules/Media/language/en/analyzer.xml": "core",
"adminx/modules/Media/language/en/client.xml": "core",
+ "adminx/modules/Media/language/en/improvements.xml": "core",
"adminx/modules/Media/language/en/interface.xml": "core",
"adminx/modules/Media/language/en/runtime.xml": "core",
+ "adminx/modules/Media/language/ru/analyzer.xml": "core",
"adminx/modules/Media/language/ru/client.xml": "core",
+ "adminx/modules/Media/language/ru/improvements.xml": "core",
"adminx/modules/Media/language/ru/interface.xml": "core",
"adminx/modules/Media/language/ru/runtime.xml": "core",
"adminx/modules/Media/migrations/001_image_presets.sql": "core",
+ "adminx/modules/Media/migrations/002_media_search_index.sql": "core",
"adminx/modules/Media/module.php": "core",
+ "adminx/modules/Media/view/audit.twig": "core",
"adminx/modules/Media/view/file.twig": "core",
"adminx/modules/Media/view/index.twig": "core",
+ "adminx/modules/Media/view/trash.twig": "core",
"adminx/modules/Modules/Controller.php": "core",
"adminx/modules/Modules/ModuleArchiveInstaller.php": "core",
"adminx/modules/Modules/ModuleRepository.php": "core",
"adminx/modules/Modules/NativeModuleAdapter.php": "core",
+ "adminx/modules/Modules/NotificationProvider.php": "core",
"adminx/modules/Modules/assets/modules.css": "core",
"adminx/modules/Modules/assets/modules.js": "core",
"adminx/modules/Modules/language/en/client.xml": "core",
@@ -2230,6 +2339,7 @@
"adminx/modules/Modules/view/index.twig": "core",
"adminx/modules/Navigation/Controller.php": "core",
"adminx/modules/Navigation/Model.php": "core",
+ "adminx/modules/Navigation/Revisions.php": "core",
"adminx/modules/Navigation/assets/navigation.css": "core",
"adminx/modules/Navigation/assets/navigation.js": "core",
"adminx/modules/Navigation/language/en/client.xml": "core",
@@ -2239,12 +2349,14 @@
"adminx/modules/Navigation/language/ru/interface.xml": "core",
"adminx/modules/Navigation/language/ru/runtime.xml": "core",
"adminx/modules/Navigation/migrations/001_create_navigation_tables.sql": "core",
+ "adminx/modules/Navigation/migrations/002_navigation_revisions.sql": "core",
"adminx/modules/Navigation/module.php": "core",
"adminx/modules/Navigation/view/index.twig": "core",
"adminx/modules/PublicSite/Controller.php": "core",
"adminx/modules/PublicSite/Model.php": "core",
"adminx/modules/PublicSite/PresentationModel.php": "core",
"adminx/modules/PublicSite/PresentationsController.php": "core",
+ "adminx/modules/PublicSite/PublicViewTemplates.php": "core",
"adminx/modules/PublicSite/assets/presentations.css": "core",
"adminx/modules/PublicSite/assets/presentations.js": "core",
"adminx/modules/PublicSite/assets/public-site.css": "core",
@@ -2263,6 +2375,7 @@
"adminx/modules/PublicSite/view/presentations.twig": "core",
"adminx/modules/Requests/Controller.php": "core",
"adminx/modules/Requests/Model.php": "core",
+ "adminx/modules/Requests/Revisions.php": "core",
"adminx/modules/Requests/assets/requests.css": "core",
"adminx/modules/Requests/assets/requests.js": "core",
"adminx/modules/Requests/language/en/client.xml": "core",
@@ -2284,6 +2397,7 @@
"adminx/modules/Requests/migrations/011_order_tiebreaker.php": "core",
"adminx/modules/Requests/migrations/012_condition_value_sources.php": "core",
"adminx/modules/Requests/migrations/013_sort_rules.php": "core",
+ "adminx/modules/Requests/migrations/014_request_revisions.sql": "core",
"adminx/modules/Requests/module.php": "core",
"adminx/modules/Requests/view/edit.twig": "core",
"adminx/modules/Requests/view/index.twig": "core",
@@ -2366,6 +2480,7 @@
"adminx/modules/Settings/migrations/004_seed_core_display_defaults.sql": "core",
"adminx/modules/Settings/migrations/005_order_system_navigation.php": "core",
"adminx/modules/Settings/migrations/006_create_admin_saved_views.sql": "core",
+ "adminx/modules/Settings/migrations/007_public_site_url.sql": "core",
"adminx/modules/Settings/module.php": "core",
"adminx/modules/Settings/view/index.twig": "core",
"adminx/modules/Templates/Controller.php": "core",
@@ -2390,6 +2505,8 @@
"adminx/modules/Themes/Revisions.php": "core",
"adminx/modules/Themes/assets/themes.css": "core",
"adminx/modules/Themes/assets/themes.js": "core",
+ "adminx/modules/Themes/assets/view-overrides.css": "core",
+ "adminx/modules/Themes/assets/view-overrides.js": "core",
"adminx/modules/Themes/language/en/client.xml": "core",
"adminx/modules/Themes/language/en/interface.xml": "core",
"adminx/modules/Themes/language/en/runtime.xml": "core",
@@ -2400,7 +2517,9 @@
"adminx/modules/Themes/migrations/002_place_theme_navigation.php": "core",
"adminx/modules/Themes/module.php": "core",
"adminx/modules/Themes/view/index.twig": "core",
+ "adminx/modules/Themes/view/view-overrides.twig": "core",
"adminx/modules/Updates/Controller.php": "core",
+ "adminx/modules/Updates/NotificationProvider.php": "core",
"adminx/modules/Updates/assets/updates.css": "core",
"adminx/modules/Updates/assets/updates.js": "core",
"adminx/modules/Updates/language/en/client.xml": "core",
@@ -2413,6 +2532,7 @@
"adminx/modules/Updates/view/index.twig": "core",
"adminx/modules/Users/Controller.php": "core",
"adminx/modules/Users/Model.php": "core",
+ "adminx/modules/Users/NotificationProvider.php": "core",
"adminx/modules/Users/assets/users.css": "core",
"adminx/modules/Users/assets/users.js": "core",
"adminx/modules/Users/language/en/client.xml": "core",
@@ -2423,6 +2543,8 @@
"adminx/modules/Users/language/ru/runtime.xml": "core",
"adminx/modules/Users/migrations/001_normalize_public_session_activity.sql": "core",
"adminx/modules/Users/migrations/002_harden_public_remember_tokens.php": "core",
+ "adminx/modules/Users/migrations/003_system_user_security.php": "core",
+ "adminx/modules/Users/migrations/004_system_session_expiry.php": "core",
"adminx/modules/Users/module.php": "core",
"adminx/modules/Users/view/list.twig": "core",
"adminx/view/404.twig": "core",
@@ -2438,8 +2560,10 @@
"help/administration/README.md": "core",
"help/administration/console.md": "core",
"help/administration/content-and-system-tools.md": "core",
+ "help/administration/customer-center.md": "core",
"help/administration/dashboard.md": "core",
"help/administration/operations.md": "core",
+ "help/administration/permission-simulator.md": "core",
"help/administration/search-and-activity.md": "core",
"help/administration/settings.md": "core",
"help/administration/updates.md": "core",
@@ -2450,6 +2574,7 @@
"help/api/errors.md": "core",
"help/content/README.md": "core",
"help/content/blocks.md": "core",
+ "help/content/bulk-editor.md": "core",
"help/content/catalog.md": "core",
"help/content/content-model-tools.md": "core",
"help/content/content-studio.md": "core",
@@ -2484,8 +2609,10 @@
"help/en/README.md": "core",
"help/en/administration/README.md": "core",
"help/en/administration/console.md": "core",
+ "help/en/administration/customer-center.md": "core",
"help/en/administration/dashboard.md": "core",
"help/en/administration/operations.md": "core",
+ "help/en/administration/permission-simulator.md": "core",
"help/en/administration/search-and-activity.md": "core",
"help/en/administration/settings.md": "core",
"help/en/administration/updates.md": "core",
@@ -2496,6 +2623,7 @@
"help/en/api/errors.md": "core",
"help/en/content/README.md": "core",
"help/en/content/blocks.md": "core",
+ "help/en/content/bulk-editor.md": "core",
"help/en/content/catalog.md": "core",
"help/en/content/content-model-tools.md": "core",
"help/en/content/content-studio.md": "core",
@@ -2570,6 +2698,7 @@
"help/en/installation/README.md": "core",
"help/en/installation/admin-directory.md": "core",
"help/en/media/README.md": "core",
+ "help/en/media/analyzer.md": "core",
"help/en/modules/README.md": "core",
"help/en/modules/antispam.md": "core",
"help/en/modules/banners.md": "core",
@@ -2581,9 +2710,11 @@
"help/en/modules/contacts.md": "core",
"help/en/modules/content-packages.md": "core",
"help/en/modules/contributions.md": "core",
+ "help/en/modules/crossposting.md": "core",
"help/en/modules/dashboard-widgets.md": "core",
"help/en/modules/demo-site.md": "core",
"help/en/modules/document-import.md": "core",
+ "help/en/modules/environment-comparison.md": "core",
"help/en/modules/experiments.md": "core",
"help/en/modules/faq.md": "core",
"help/en/modules/file-security.md": "core",
@@ -2605,6 +2736,8 @@
"help/en/modules/personal-tools.md": "core",
"help/en/modules/polls.md": "core",
"help/en/modules/popups.md": "core",
+ "help/en/modules/public-widgets.md": "core",
+ "help/en/modules/quiz.md": "core",
"help/en/modules/ratings.md": "core",
"help/en/modules/related.md": "core",
"help/en/modules/reliable-events.md": "core",
@@ -2664,6 +2797,7 @@
"help/installation/README.md": "core",
"help/installation/admin-directory.md": "core",
"help/media/README.md": "core",
+ "help/media/analyzer.md": "core",
"help/modules/README.md": "core",
"help/modules/antispam.md": "core",
"help/modules/banners.md": "core",
@@ -2675,9 +2809,11 @@
"help/modules/contacts.md": "core",
"help/modules/content-packages.md": "core",
"help/modules/contributions.md": "core",
+ "help/modules/crossposting.md": "core",
"help/modules/dashboard-widgets.md": "core",
"help/modules/demo-site.md": "core",
"help/modules/document-import.md": "core",
+ "help/modules/environment-comparison.md": "core",
"help/modules/experiments.md": "core",
"help/modules/faq.md": "core",
"help/modules/file-security.md": "core",
@@ -2699,6 +2835,8 @@
"help/modules/personal-tools.md": "core",
"help/modules/polls.md": "core",
"help/modules/popups.md": "core",
+ "help/modules/public-widgets.md": "core",
+ "help/modules/quiz.md": "core",
"help/modules/ratings.md": "core",
"help/modules/related.md": "core",
"help/modules/reliable-events.md": "core",
@@ -2818,6 +2956,8 @@
"system/App/Common/Session/SessionNative.php": "core",
"system/App/Common/Settings.php": "core",
"system/App/Common/SettingsRegistry.php": "core",
+ "system/App/Common/SignedEventProof.php": "core",
+ "system/App/Common/SiteOrigin.php": "core",
"system/App/Common/StoredPhpRuntime.php": "core",
"system/App/Common/SystemTables.php": "core",
"system/App/Common/Template.php": "core",
@@ -3108,6 +3248,7 @@
"system/App/Helpers/Arr.php": "core",
"system/App/Helpers/Cookie.php": "core",
"system/App/Helpers/Crypt.php": "core",
+ "system/App/Helpers/Csv.php": "core",
"system/App/Helpers/Date.php": "core",
"system/App/Helpers/Debug.php": "core",
"system/App/Helpers/Dir.php": "core",
@@ -3126,6 +3267,7 @@
"system/App/Helpers/SearchText.php": "core",
"system/App/Helpers/Secure.php": "core",
"system/App/Helpers/SoftDelete.php": "core",
+ "system/App/Helpers/SplitTest.php": "core",
"system/App/Helpers/Str.php": "core",
"system/App/Helpers/TagParser.php": "core",
"system/App/Helpers/Url.php": "core",
diff --git a/README.md b/README.md
index b50e09b..1f23829 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# AVE.cms
-**AVE.cms 3.3 build 0.35** — модульная система управления сайтами на PHP.
+**AVE.cms 3.3 build 0.37** — модульная система управления сайтами на PHP.
Она подходит для проектов, в которых структуру содержимого нужно собирать из
собственных рубрик, полей, документов, запросов, блоков и шаблонов, не
привязываясь к заранее заданному типу сайта.
diff --git a/adminx/Support/GlobalSearchRegistry.php b/adminx/Support/GlobalSearchRegistry.php
index 3e1bd51..313ac7e 100644
--- a/adminx/Support/GlobalSearchRegistry.php
+++ b/adminx/Support/GlobalSearchRegistry.php
@@ -17,6 +17,7 @@
defined('BASEPATH') || die('Direct access to this location is not allowed.');
use App\Common\Permission;
+ use App\Common\Language;
/**
* Реестр провайдеров административного поиска.
@@ -140,7 +141,7 @@
return array(
'type' => self::code(isset($row['type']) ? $row['type'] : $providerCode),
- 'group' => self::text(isset($row['group']) ? $row['group'] : 'Результаты', 80),
+ 'group' => Language::translateSource(self::text(isset($row['group']) ? $row['group'] : 'Результаты', 80)),
'title' => $title,
'subtitle' => self::text(isset($row['subtitle']) ? $row['subtitle'] : '', 300),
'url' => $url,
diff --git a/adminx/Support/SectionHelp.php b/adminx/Support/SectionHelp.php
index 96dcf46..ff86803 100644
--- a/adminx/Support/SectionHelp.php
+++ b/adminx/Support/SectionHelp.php
@@ -83,6 +83,7 @@
self::item('#^/public-site/presentations$#', 'Представления', 'Создаёт повторно используемое оформление карточек, списков, слайдеров и других результатов.', array('Черновик проверяется на реальном материале и не меняет публичный сайт.', 'Публикация фиксирует версию, а назначение выбирает место и режим применения.', 'Представление меняет внешний вид готовых данных, но не заменяет рубрику, запрос, блок или модуль.'), 'Для совместимости каждое новое назначение начинает работу в режиме «Текущий вывод».', 'content/public-site'),
self::item('#^/public-site/map$#', 'Визуальная карта сайта', 'Показывает деревья меню, связанные страницы и опубликованные документы вне навигации.', array('Уровни строятся из действующих пунктов навигации.', 'Ссылка документа открывает его штатный редактор.', 'Документ вне меню может использоваться запросом, каталогом или прямой ссылкой.'), 'Карта является обзором и ничего не публикует.', 'content/public-site'),
self::item('#^/public-site/placements$#', 'Размещения компонентов', 'Показывает, в каких сохранённых шаблонах используются блоки, подборки, навигации и модульные теги.', array('Вкладка «Размещения» показывает каждое найденное место отдельно.', 'Вкладка «Где используется» объединяет одинаковые компоненты и показывает число связей.', 'Кнопки справа открывают конкретный исходный шаблон и конкретный подключённый компонент.'), 'Карта предназначена для поиска связей и ничего не меняет на публичном сайте.', 'content/public-site'),
+ self::item('#^/public-site/templates$#', 'Шаблоны публичного сайта', 'Редактирует общие файловые Twig-компоненты активной темы.', array('Список материалов имеет системный резерв.', 'Оболочка страницы и остальные компоненты темы редактируются без поиска файла вручную.', 'Сохранение проверяет Twig, создаёт ревизию и очищает публичный кеш.'), 'Шаблоны рубрик, запросов и блоков остаются в собственных разделах.', 'content/public-site'),
self::item('#^/public-site(?:/.*)?$#', 'Публичный сайт', 'Показывает, из каких базовых компонентов собирается сайт и где используется каждый из них.', array('Раздел является картой и не дублирует редакторы шаблонов, рубрик, запросов, блоков и меню.', 'Представления — дополнительный способ оформить уже подготовленные данные.', 'Диагностика сообщает только о явных пробелах в обязательных настройках.'), 'Начните со вкладки «Структура», а содержимое меняйте в штатном редакторе нужного компонента.', 'content/public-site'),
self::item('#^/catalog/products/shipping$#', 'Доставка и упаковка', 'Показывает готовность товарных данных к расчёту доставки и позволяет редактировать грузовые места без открытия документа.', array('Каждое грузовое место хранит количество, вес и три габарита.', 'Расчёт включается отдельно и использует только полностью заполненную упаковку.', 'Фильтр помогает быстро найти товары без размеров или с выключенным расчётом.'), 'Вес и размеры указываются для одного грузового места; количество умножает итоговые показатели.'),
@@ -91,6 +92,7 @@
self::item('#^/catalog/variant-groups(?:/.*)?$#', 'Группы вариантов', 'Объединяет отдельные товары с собственными URL и артикулами в одну карточку публичного листинга.', array('Основной вариант представляет группу до выбора цвета или исполнения.', 'Порядок вариантов определяет порядок переключателей на публичной карточке.', 'Выключенный вариант остаётся документом, но не предлагается покупателю.'), 'Каждый вариант должен сохранять собственные цену, остаток, URL и артикул.'),
self::item('#^/catalog/card-templates$#', 'Карточки товаров', 'Управляет Twig-разметкой и CSS товарной карточки отдельно для разных мест публичного сайта.', array('Черновик можно проверять на живых данных товара без публикации.', 'Контексты назначают представление главной странице, каталогу и другим листингам.', 'Ревизии сохраняют историю черновиков и опубликованных версий.'), 'Публичный сайт меняется только после публикации представления и включения нативного режима нужного контекста.'),
self::item('#^/catalog/filter-templates$#', 'Шаблоны фильтров', 'Управляет Twig-разметкой, CSS и клиентским поведением фасетов товарного каталога.', array('Алгоритм выборки остаётся в каталоге, а шаблон отвечает за представление.', 'Черновик можно проверить до публикации.', 'Теги шаблона выводят название фильтра, варианты и рассчитанные количества товаров.'), 'После публикации проверьте выбор, сброс и повторное применение нескольких фильтров.'),
+ self::item('#^/catalog/public-templates$#', 'Публичные шаблоны товаров', 'Редактирует разметку страницы товара, вариантов, рекомендаций и комплектов в активной теме.', array('Если override отсутствует, редактор показывает резервный шаблон модуля.', 'Первое сохранение создаёт файл в активной теме и подключает пространство products_public.', 'Список данных под редактором объясняет доступные Twig-переменные и вставляет их в код.'), 'Сохранение меняет публичный сайт сразу; предыдущие версии остаются в ревизиях темы.', 'content/catalog'),
self::item('#^/catalog/\d+/\d+$#', 'Конструктор каталога', 'Связывает поле типа catalog с деревом разделов, документами, полями и публичными фильтрами.', array('Разделы задают структуру каталога и набор доступных полей.', 'Условия фильтров определяют SQL-ограничения публичной выборки.', 'Порядок полей и фильтров меняется перетаскиванием и сохраняется сразу.'), 'Изменения структуры влияют на редактор документов и публичный каталог.'),
self::item('#^/catalog#', 'Каталог', 'Управляет структурами каталогов, товарным индексом, фильтрами и связью с документами.', array('Каждый каталог создаётся для конкретного поля рубрики типа catalog.', 'Товары являются документами и не дублируются в отдельной основной таблице.', 'Для вариантов одного товара используются группы вариантов.'), 'Начинайте с выбора каталога, затем настраивайте разделы, поля и фильтры.', 'content/catalog'),
@@ -103,16 +105,21 @@
self::item('#^/navigation#', 'Навигация', 'Создаёт меню сайта: шаблоны уровней, пункты, вложенность, условия показа и связи с документами.', array('Каждая навигация имеет собственный тег для вставки в шаблон.', 'Пункты можно сортировать и переносить между уровнями.', 'Связанный документ позволяет не вводить URL вручную.'), 'После изменения структуры очищается кеш соответствующей навигации.', 'content/navigation'),
self::item('#^/requests#', 'Запросы', 'Формирует выборки документов по рубрикам и полям, а затем выводит их через шаблоны элементов и списка.', array('Условия определяют, какие документы попадут в результат.', 'Основной и постраничный шаблоны отвечают только за представление.', 'External/AJAX-флаги разрешают прямой вызов запроса и требуют осторожности.'), 'Проверяйте запрос после изменения условий: он может использоваться сразу в нескольких страницах.', 'content/requests'),
self::item('#^/media#', 'Медиа и файлы', 'Управляет файлами в uploads: загрузкой, папками, изображениями, превью и конвертацией WebP.', array('Сетка и список показывают одни и те же физические файлы.', 'Редактор изображений создаёт производные файлы для crop и resize.', 'При удалении исходника удаляются его превью и связанная WebP-копия.'), 'Не размещайте служебные PHP-файлы в uploads; раздел предназначен только для пользовательских медиа.', 'media'),
+ self::item('#^/certificates(?:/.*)?$#', 'Сертификаты', 'Хранит документы соответствия и связывает их с товарами или другими материалами.', array('Срок действия помогает заранее находить документы, которые требуют проверки.', 'Файл выбирается из медиатеки и остаётся доступен независимо от карточки связи.', 'Связанные товары используют один сертификат без дублирования файла.'), 'Истёкший срок снимает отметку о действующем сертификате, но сам товар автоматически не удаляет.'),
+ self::item('#^/ipra(?:/.*)?$#', 'ИПРА', 'Управляет программами реабилитации и связанными назначениями для работы с клиентами.', array('Запись связывается с пользователем сайта и хранит рабочие сроки.', 'Статус отражает текущий этап обработки, а не публичность документа.', 'Перед изменением назначения проверьте связанные обращения и заказы.'), 'Медицинские и персональные данные должны быть доступны только ролям, которым они необходимы.'),
+ self::item('#^/registrations(?:/.*)?$#', 'Регистрационные удостоверения', 'Ведёт реестр РУ и связи с товарами, чтобы показывать актуальный признак регистрации.', array('Один номер можно связать с несколькими товарами.', 'Дата окончания используется для контроля актуальности отметки.', 'Файл удостоверения выбирается из общей медиатеки.'), 'Окончание срока убирает признак действующего РУ; доступность товара определяется отдельно.'),
+ self::item('#^/service(?:/.*)?$#', 'Сервисное обслуживание', 'Хранит сервисные обращения, сроки, ответственных и историю работ по оборудованию.', array('Карточка объединяет клиента, оборудование и текущее состояние обращения.', 'Смена статуса фиксирует этап работы и остаётся в истории.', 'Сроки помогают находить просроченные обращения.'), 'Не удаляйте завершённые обращения, если история нужна для гарантийного обслуживания.'),
+ self::item('#^/system/release-assistant(?:/.*)?$#', 'Помощник выпуска', 'Проверяет состав локального релиза, версии модулей, миграции и готовность архивов перед ручной публикацией.', array('Предварительная проверка ничего не публикует и не меняет рабочий сайт.', 'В отчёте отдельно показаны изменённые файлы, таблицы и версии модулей.', 'Сборку запускают только после устранения ошибок проверки.'), 'Раздел предназначен для владельца исходного проекта и не включается в обычную публичную сборку.'),
self::item('#^/system/orders#', 'Заказы и корзина', 'Обрабатывает заказы, состояния оплаты и доставки, шаблоны корзины и брошенные сессии покупателей.', array('Карточка заказа фиксирует товары, цены и выбранные варианты на момент оформления.', 'Способы оплаты настраиваются во вкладке «Оплата», реквизиты провайдеров — во вкладке «Gateways».', 'Брошенные корзины очищаются по сроку хранения и доступны для диагностики.'), 'Отмена и возврат могут влиять на платёжный шлюз — проверяйте итоговый статус операции.'),
- self::item('#^/system/customers#', 'Пользователи сайта', 'Управляет публичными аккаунтами, регистрацией, OAuth-гейтами и полями профиля.', array('Email-регистрация, восстановление доступа и создание аккаунта после заказа входят в ядро.', 'Дополнительные поля независимо подключаются к регистрации и личному кабинету.', 'Подключённые OAuth-гейты открывают ту же публичную сессию, что и обычная форма входа.', 'Отключение аккаунта запрещает вход, но сохраняет связанные данные.'), 'Email остаётся основным идентификатором; дополнительные способы входа поставляются отдельными модулями.'),
+ self::item('#^/system/customers#', 'Пользователи сайта', 'Управляет публичными аккаунтами, регистрацией, OAuth-гейтами и полями профиля.', array('Регистрацию можно разрешить по email, телефону или обоими способами.', 'Телефонный аккаунт не требует email; адрес можно добавить и подтвердить позже.', 'Дополнительные поля независимо подключаются к регистрации и личному кабинету.', 'Подключённые OAuth-гейты открывают ту же публичную сессию, что и обычная форма входа.', 'Отключение аккаунта запрещает вход, но сохраняет связанные данные.'), 'Для регистрации по телефону установите и настройте SMS-провайдер; без него телефонная форма не показывается.'),
self::item('#^/content/contacts/forms/\d+$#', 'Конструктор формы', 'Настраивает поля, шаблон формы, получателей, письмо и поведение после отправки.', array('Теги полей доступны в шаблоне формы и письма.', 'Получатели задаются по одному на строку.', 'История обращений хранит отправленные значения и ответы менеджеров.'), 'После изменения шаблона отправьте тестовое обращение и проверьте письмо.'),
self::item('#^/content/contacts#', 'Формы и обращения', 'Управляет публичными формами обратной связи и журналом сообщений посетителей.', array('Форма состоит из полей, шаблонов и почтовых настроек.', 'История позволяет менять статус обращения и отвечать посетителю.', 'Копирование формы создаёт независимый набор настроек.'), 'Проверяйте адреса получателей и настройки системной почты перед публикацией формы.'),
self::item('#^/content/rss#', 'RSS-каналы', 'Публикует документы выбранной рубрики в XML-ленте по настраиваемому адресу /rss/{alias}.', array('Заголовок и описание можно брать из полей рубрики.', 'Количество элементов ограничивает размер выдаваемой ленты.', 'Префикс /rss/ зарезервирован и не может использоваться документами.'), 'После изменения алиаса обновите внешние подписки и проверьте XML из списка.'),
self::item('#^/content/feeds#', 'Товарные фиды', 'Формирует управляемые XML/YML-выгрузки товаров для партнеров и торговых площадок.', array('Категории определяют товарную выборку, исключения применяются после дочерних разделов.', 'Поля XML и характеристики связываются с индексом каталога или полями товарной рубрики.', 'Предпросмотр не меняет кеш, а пересоздание атомарно публикует новый файл.'), 'Не меняйте закрепленные legacy URL у действующих партнеров; редактируйте связанную конфигурацию фида.'),
self::item('#^/content/price-import#', 'Импорт цен', 'Обновляет цены товаров из XLSX после обязательного предварительного просмотра изменений.', array('Сначала загрузите файл или получите его по настроенной HTTPS-ссылке.', 'Выберите лист и сформируйте предварительный просмотр.', 'Применение изменяет только подтверждённые строки и записывает результат в историю.'), 'Не применяйте импорт, если предварительный просмотр показывает неожиданные товары или пустые цены.'),
- self::item('#^/users#', 'Пользователи', 'Управляет сотрудниками, которые могут входить в панель управления, их ролями и активностью.', array('Роль определяет доступные разделы и действия.', 'Отключённый пользователь не может войти, но сохраняется в журнале действий.', 'Нельзя отключить или удалить собственную активную учётную запись.'), 'Публичные аккаунты находятся в отдельном разделе «Пользователи сайта».', 'administration/users'),
+ self::item('#^/users#', 'Пользователи', 'Управляет сотрудниками, которые могут входить в панель управления, их ролями, паролями и активными сессиями.', array('Роль определяет доступные разделы и действия.', 'Во вкладке «Сессии и входы» видны устройства, IP и неудачные попытки входа.', 'Временный пароль можно потребовать сменить при следующем входе.', 'Отключение учётной записи завершает все её активные сессии.', 'Нельзя отключить или удалить собственную активную учётную запись.'), 'Публичные аккаунты находятся в отдельном разделе «Пользователи сайта».', 'administration/users'),
self::item('#^/roles#', 'Роли и права', 'Определяет набор разрешений для администраторов и разграничивает доступ к функциям системы.', array('Права сгруппированы по модулям и назначаются роли целиком.', 'Системная роль admin всегда имеет полный доступ.', 'Роль с назначенными пользователями нельзя удалить.'), 'После изменения роли права применяются при следующей проверке доступа пользователя.'),
self::item('#^/settings/main$#', 'Основные настройки', 'Управляет публичным доступом, параметрами сайта, почты, документов и вывода.', array('Режим разработки возвращает посетителям временную страницу 503 и закрывает динамические маршруты от индексации.', 'Сотрудник с отдельным правом продолжает видеть документы, модули и API.', 'Поля сгруппированы по назначению, а тип значения проверяется перед сохранением.', 'Секреты устанавливаемых модулей не должны храниться в общих настройках.'), 'Перед открытием сайта переключите публичный доступ и проверьте страницу в отдельном браузере без авторизации.'),
self::item('#^/settings/interface$#', 'Настройка интерфейса', 'Определяет порядок и видимость пунктов левого меню и виджетов дашборда.', array('Перетаскивание меняет порядок только для панели управления.', 'Скрытие пункта не отменяет право роли и не блокирует прямой URL.', 'Виджеты установленных модулей появляются в списке автоматически.'), 'Доступ к функциям всегда ограничивайте через роли и права, а не только через видимость меню.'),
@@ -127,25 +134,25 @@
self::item('#^/events#', 'Системные события', 'Объединяет аудит действий, ошибки, SQL-журнал, 404 и статистику внешних переходов.', array('Цвет и состояние помогают отличать успешные операции, предупреждения и ошибки.', 'Переходы группируются по посетителю, странице входа и источнику; открытые IP и произвольные query-параметры не сохраняются.', 'Фильтры и CSV-экспорт работают отдельно для каждого источника.'), 'Очистка журнала необратима и не исправляет причину ошибки.'),
self::item('#^/security/ip-blocks#', 'IP-блокировки', 'Управляет ручными блокировками адресов, а автоматические ограничения выполняет RateLimiter.', array('Блокировка может быть постоянной или иметь дату окончания.', 'Причина видна администраторам и записывается в аудит.', 'Разблокировка возвращает доступ сразу.'), 'Не блокируйте адрес reverse proxy без проверки реального клиентского IP.'),
self::item('#^/database#', 'База данных', 'Показывает рабочие таблицы AVE.cms, выполняет обслуживание, применяет миграции ядра и управляет полными резервными копиями.', array('OPTIMIZE применяется только к выбранной таблице или ко всей рабочей схеме после подтверждения.', 'Применение миграций не восстанавливает данные: это отдельная операция развития структуры ядра.', 'Новые дампы используют {{prefix}}, поэтому могут восстанавливаться с другим dbpref.', 'Перед восстановлением система проверяет файл и автоматически создаёт страховочную копию.'), 'Восстановление полностью заменяет таблицы текущей установки; рабочую копию дополнительно храните вне сервера.', 'database'),
- self::item('#^/kanban$#', 'Канбан', 'Организует личные рабочие карточки по колонкам и показывает доску на дашборде.', array('Карточки и порядок сохраняются без перезагрузки.', 'Колонки можно настроить под собственный процесс.', 'Каждый сотрудник работает со своей доской.'), 'Не используйте канбан как журнал системных ошибок: для них предназначены события и Todo.'),
+ self::item('#^/kanban$#', 'Канбан', 'Организует рабочие карточки по колонкам и показывает доску на дашборде.', array('Карточки и порядок сохраняются без перезагрузки.', 'Колонки можно настроить под собственный процесс.', 'Карточке можно назначить ответственного, срок и связанный документ.', 'Командная карточка видна коллегам, а назначенная отдельно появляется у ответственного.'), 'Колонки принадлежат владельцу доски: назначенный сотрудник видит карточку в общем списке, но не перестраивает чужую доску.'),
self::item('#^/notes$#', 'Заметки', 'Хранит личные текстовые заметки сотрудника и закрепляет важные записи на дашборде.', array('Заметки видны только их владельцу.', 'Закрепление влияет на порядок выдачи.', 'Быстрое создание доступно из шапки, если вклад модуля включён.'), 'Не храните в заметках пароли, токены и другие секреты.'),
self::item('#^/reminders$#', 'Напоминания', 'Хранит личные задачи с датой и выводит просроченные пункты в общем колокольчике.', array('Срок определяет состояние напоминания.', 'Выполнение сохраняется сразу.', 'Просроченный счётчик формируется отдельно для текущего сотрудника.'), 'Удаление напоминания необратимо; выполненный пункт можно вернуть в работу.'),
self::item('#^/notfound$#', 'Ошибки 404', 'Показывает несуществующие публичные адреса и помогает создать документ или редирект.', array('Сначала проверьте источник переходов и частоту запроса.', 'Для старого адреса существующей страницы создайте постоянный редирект.', 'Случайные сканирующие URL можно удалить из журнала без создания страницы.'), 'Редирект должен вести на действительно соответствующий документ, а не всегда на главную.'),
self::item('#^/seo-audit$#', 'SEO-аудит', 'Проверяет документы на технические и редакционные проблемы, влияющие на поисковое представление.', array('Фильтры помогают сначала разобрать критичные и массовые проблемы.', 'Оценка документа складывается из нескольких независимых проверок.', 'Исправления выполняются в редакторе документа и проявляются после повторного аудита.'), 'Автоматическая оценка является подсказкой и не заменяет проверку содержания страницы.', 'modules/seo-audit'),
- self::item('#^/todo$#', 'Todo', 'Хранит личный список замечаний и следующих действий для текущего администратора.', array('Задачу можно создать из выпадающего списка в шапке на любой странице панели управления.', 'Чекбокс сразу сохраняет состояние без перезагрузки.', 'Каждый пользователь видит только собственные задачи.'), 'Удаление задачи необратимо; выполненные пункты можно вернуть в работу обычным чекбоксом.'),
+ self::item('#^/todo$#', 'Todo', 'Хранит рабочие задачи сотрудников со сроками и связями с документами.', array('Задачу можно создать из выпадающего списка в шапке на любой странице панели управления.', 'Ответственный видит назначенную задачу и может отметить её выполненной.', 'Режим «Команда» открывает задачу всем сотрудникам с правом просмотра Todo.', 'Связанный документ открывается прямо из строки задачи.'), 'Изменять и удалять задачу может её создатель; выполнение доступно создателю и ответственному.'),
self::item('#^/modules/search#', 'Поиск по сайту', 'Индексирует опубликованные документы и формирует обычную страницу результатов и JSON для живого поиска.', array('Области позволяют отдельно искать по товарам, новостям, статьям и другим наборам рубрик.', 'Алгоритм определяет разбор строки и вес точного совпадения, заголовка и содержимого.', 'Штатный HTML можно заменить шаблонами модуля или существующим запросом документов.'), 'После изменения рубрик или индексируемых полей выполните полную переиндексацию.', 'modules/search'),
self::item('#^/modules/commerceml#', 'Обмен с 1С', 'Принимает CommerceML по защищённому адресу и сопоставляет товары 1С с документами товарной рубрики.', array('Для каждой интеграции создайте отдельный профиль с логином, паролем и рубрикой.', 'Поля внешнего ID, артикула, цены и остатка выбираются из полей назначенной рубрики.', 'Пробный XML можно загрузить из списка профилей и проверить результат в журнале обменов.'), 'Создание неизвестных товаров выключено по умолчанию: сначала проверьте сопоставление на существующих документах.'),
- self::item('#^/modules/experiments#', 'A/B-тесты', 'Распределяет посетителей между вариантами и собирает показы и конверсии без смешивания вариантов в общем кеше.', array('Код эксперимента используется в шаблонном теге, API и атрибутах отслеживания конверсии.', 'Вес вариантов задаёт распределение внутри выбранного охвата аудитории.', 'Черновик не участвует в публичном выводе; перед запуском проверьте каждый вариант.'), 'Изменение цены штатным вариантом влияет только на представление и не меняет сумму заказа.'),
+ self::item('#^/modules/experiments#', 'A/B-тесты', 'Распределяет посетителей между вариантами и проверяет, достаточно ли данных для вывода.', array('Код эксперимента используется в шаблонном теге, API и атрибутах отслеживания конверсии.', 'Вес вариантов задаёт распределение внутри выбранного охвата аудитории.', 'Минимум показов защищает от слишком раннего выбора победителя.', 'После набора выборки панель показывает погрешность, достоверность и устойчивый вариант.'), 'Не останавливайте тест по одному проценту конверсии: дождитесь состояния с достоверным результатом.'),
self::item('#^/modules/popups#', 'Всплывающие окна', 'Управляет кампаниями поп-апов, условиями показа, A/B-вариантами и собранными заявками.', array('Сценарий определяет момент показа: задержку, прокрутку или попытку ухода.', 'Пути включения и исключения принимают по одному шаблону на строку; символ * заменяет произвольную часть.', 'HTML вариантов контролируется проектом, а заявки обрабатываются на отдельной вкладке.'), 'Проверьте кампанию на тестовом URL и мобильном экране до включения автоматической вставки.'),
- self::item('#^/modules/reviews#', 'Отзывы', 'Собирает оценки и отзывы к документам, позволяет модерировать публикацию и отвечать от имени компании.', array('Состояние определяет, попадёт ли отзыв в публичный список.', 'Признак подтверждённой покупки устанавливается только после проверки заказа.', 'Ответ компании сохраняется вместе с отзывом и выводится его публичным шаблоном.'), 'Удаление отзыва необратимо; спорный материал безопаснее сначала отклонить.', 'modules/reviews'),
+ self::item('#^/modules/reviews#', 'Отзывы', 'Собирает оценки и отзывы к документам, позволяет модерировать публикацию и отвечать от имени компании.', array('Состояние определяет, попадёт ли отзыв в публичный список.', 'Признак подтверждённой покупки устанавливается только после проверки заказа.', 'Выберите несколько строк, чтобы опубликовать, отклонить, вернуть на модерацию или удалить их одним действием.', 'Ответ компании сохраняется вместе с отзывом и выводится его публичным шаблоном.'), 'Удаление отзыва необратимо; спорный материал безопаснее сначала отклонить.', 'modules/reviews'),
self::item('#^/modules/scheduler#', 'Планировщик', 'Собирает фоновые задачи установленных модулей в единый реестр, запускает их по расписанию и хранит журнал.', array('Защищённый URL добавляется в планировщик хостинга с интервалом в одну минуту.', 'Cron-выражение и активность каждой задачи меняются прямо в таблице.', 'Ручной запуск использует тот же обработчик и попадает в общий журнал.'), 'После смены секретного URL обновите задание на хостинге: старый адрес сразу перестанет работать.'),
self::item('#^/modules/search-analytics#', 'Поисковые запросы', 'Показывает реальные поисковые фразы посетителей, частоту запросов и случаи пустой выдачи.', array('Фильтр по области разделяет спрос по новостям, товарам, статьям и другим настроенным областям.', 'Состояние и заметка позволяют отмечать разобранные запросы и планировать новый контент.', 'Показатель «Результатов сейчас» помогает проверить, исправлена ли нулевая выдача.'), 'Очистка истории удаляет аналитические данные, но не затрагивает поисковый индекс.'),
self::item('#^/modules/system-health#', 'Мониторинг здоровья', 'Проверяет доступность базы данных, диска, фоновых задач и заданных внешних HTTPS-сервисов.', array('Текущий снимок показывает независимый результат каждой инфраструктурной проверки.', 'История помогает отличить разовый сбой от повторяющейся проблемы.', 'Для внешнего сервиса задаются ожидаемый HTTP-статус и ограниченный таймаут.'), 'Мониторинг фиксирует рабочее состояние, но не заменяет приёмочный чек-лист перед запуском сайта.'),
self::item('#^/modules/traffic-analytics#', 'Источники трафика', 'Группирует входящие переходы по UTM-меткам, источникам, кампаниям и посадочным страницам.', array('Период и фильтры одинаково применяются к сводке, таблицам и CSV-экспорту.', 'UTM-конструктор собирает ссылку в браузере и не сохраняет введённые значения.', 'Один вход посетителя на ту же страницу за день агрегируется без хранения IP.'), 'Перед очисткой выбранного периода выгрузите CSV, если данные нужны для отчётности.'),
self::item('#^/modules/antispam#', 'Антиспам', 'Настраивает профили защиты публичных форм и показывает журнал отклонённых отправок.', array('Профиль объединяет лимиты, проверку скрытого поля и анализ содержимого для конкретной формы.', 'Журнал объясняет, какое правило остановило запрос, и помогает скорректировать чувствительность.', 'Доверенные исключения применяйте только к контролируемым интеграциям.'), 'Не ослабляйте общий профиль из-за одного ложного срабатывания: создайте отдельный профиль для нужной формы.'),
self::item('#^/modules/interactions#', 'Взаимодействия', 'Хранит общий журнал оценок, реакций и голосов, который используют прикладные модули.', array('Канал определяет допустимые действия и типы объектов.', 'Агрегаты ускоряют публичный вывод счётчиков и рейтингов.', 'Пересчёт восстанавливает агрегаты из исходного журнала действий.'), 'Обычно этот раздел не вставляется в шаблон напрямую: публичный интерфейс предоставляют рейтинги, опросы и комментарии.'),
- self::item('#^/modules/ratings#', 'Рейтинги', 'Добавляет на документы и другие разрешённые объекты настраиваемую шкалу оценок.', array('Документы включают страницы, товары, новости и статьи, построенные на рубриках.', 'Тег [mod_rating] использует текущий документ; явная цель задаётся типом и ID.', 'Кнопки тегов вставляют доступные значения в HTML-шаблон рейтинга.'), 'Голоса и итоговые значения хранятся в модуле «Взаимодействия».'),
- self::item('#^/modules/comments#', 'Комментарии', 'Управляет древовидными обсуждениями, премодерацией, антиспамом и публичными шаблонами.', array('Разрешите только те типы объектов, на которых действительно нужны обсуждения.', 'Шаблоны списка, комментария и формы имеют собственные наборы тегов.', 'Публикация, скрытие и отметка спама выполняются из общего журнала.'), 'Оценка комментариев использует отдельный канал модуля «Взаимодействия».'),
+ self::item('#^/modules/ratings#', 'Рейтинги', 'Добавляет на документы и другие разрешённые объекты настраиваемую шкалу оценок.', array('Документы включают страницы, товары, новости и статьи, построенные на рубриках.', 'Тег [mod_rating] использует текущий документ; явная цель задаётся типом и ID.', 'Список голосов позволяет удалить ошибочную оценку или сбросить рейтинг объекта.', 'После модерации среднее значение пересчитывается автоматически.'), 'Удаление голосов необратимо и записывается в аудит; сам документ при этом не изменяется.'),
+ self::item('#^/modules/comments#', 'Комментарии', 'Управляет древовидными обсуждениями, премодерацией, антиспамом и публичными шаблонами.', array('Разрешите только те типы объектов, на которых действительно нужны обсуждения.', 'Шаблоны списка, комментария и формы имеют собственные наборы тегов.', 'Публикация, скрытие и отметка спама выполняются из общего журнала.', 'Выбор строк позволяет обработать до 500 комментариев одним массовым действием.'), 'Оценка комментариев использует отдельный канал модуля «Взаимодействия».'),
self::item('#^/modules/polls#', 'Опросы', 'Создаёт одиночные и множественные голосования с расписанием, доступом и управляемыми результатами.', array('Для публикации вставьте [mod_poll:ID] в документ, блок или шаблон.', 'Архив опросов доступен по настраиваемому публичному URL.', 'Шаблоны опроса, варианта, результата и архива имеют разные наборы тегов.'), 'Удаление опроса также удаляет варианты ответа и собранные голоса.'),
self::item('#^/modules/galleries#', 'Галереи', 'Собирает изображения медиатеки в упорядоченные сетки и слайдеры с собственными публичными URL.', array('Файлы остаются в медиатеке; галерея хранит только связи, подписи и порядок.', 'Тег [mod_gallery:ID] выводит коллекцию в документе, блоке или шаблоне.', 'Отдельные шаблоны управляют оболочкой галереи и разметкой одного изображения.'), 'Удаление галереи не удаляет исходные файлы и созданные для них превью.'),
self::item('#^/modules/banners#', 'Баннеры', 'Управляет рекламными местами, ротацией изображений, расписанием и внутренней статистикой переходов.', array('Стабильный код места используется в теге [mod_banner:КОД].', 'Вес влияет только на стратегию «По весу»; равномерная ротация выбирает материал с меньшим числом показов.', 'Изображения выбираются из общей медиатеки и не удаляются вместе с баннером.'), 'Нулевой лимит означает отсутствие ограничения; сброс статистики необратим.'),
diff --git a/adminx/Support/SensitiveRoutes.php b/adminx/Support/SensitiveRoutes.php
index d4bdc56..96decf8 100644
--- a/adminx/Support/SensitiveRoutes.php
+++ b/adminx/Support/SensitiveRoutes.php
@@ -26,6 +26,7 @@
'core.update' => 'Установка подписанного обновления ядра',
'stored_php.execute' => 'Выполнение сохранённого PHP-кода',
'stored_php.write' => 'Сохранение PHP-кода, исполняемого runtime',
+ 'stored_html.write' => 'Сохранение HTML форм и разметки, исполняемых в публичной странице',
'theme_assets.write' => 'Изменение исполняемых CSS/JavaScript и файлов публичной темы',
'legacy_migration.write' => 'Изменение реквизитов исходной системы',
'legacy_migration.execute' => 'Очистка стартовых данных и миграция старой AVE.cms',
@@ -86,6 +87,12 @@
'POST /modules/legacy-migration/runs/{id}/rollback' => array('legacy_migration.execute', 'run_legacy_migration'),
'POST /modules/legacy-migration/runs/{id}/files' => array('legacy_migration.execute', 'run_legacy_migration'),
'POST /database/backup/restore' => array('database.restore', 'manage_database'),
+ 'POST /modules/popups/{id}' => array('stored_html.write', 'manage_popup_code'),
+ 'POST /modules/popups/{id}/delete' => array('stored_html.write', 'manage_popup_code'),
+ 'POST /modules/popups/settings' => array('stored_html.write', 'manage_popup_code'),
+ 'POST /modules/experiments/{id}' => array('stored_html.write', 'manage_experiment_code'),
+ 'POST /modules/experiments/{id}/delete' => array('stored_html.write', 'manage_experiment_code'),
+ 'POST /modules/experiments/settings' => array('stored_html.write', 'manage_experiment_code'),
);
public static function validate(array $route)
diff --git a/adminx/Support/ViewOverrideEditor.php b/adminx/Support/ViewOverrideEditor.php
new file mode 100644
index 0000000..0809695
--- /dev/null
+++ b/adminx/Support/ViewOverrideEditor.php
@@ -0,0 +1,196 @@
+
+ | @copyright 2007-2026 (c) AVE.cms
+ | @link https://ave-cms.ru
+ | @version 3.3
+ */
+
+ namespace App\Adminx\Support;
+
+ defined('BASEPATH') || die('Direct access to this location is not allowed.');
+
+ use App\Common\Twig;
+ use App\Adminx\Themes\Model;
+ use App\Frontend\ThemeAssets;
+ use App\Helpers\Json;
+
+ /** Safe editor for a fixed set of public Twig view overrides. */
+ class ViewOverrideEditor
+ {
+ protected $namespace;
+ protected $fallbackRoot;
+ protected $fallbackPrefix;
+ protected $definitions;
+
+ public function __construct($namespace, $fallbackRoot, $fallbackPrefix, array $definitions)
+ {
+ $namespace = trim((string) $namespace);
+ if (!preg_match('/^[A-Za-z][A-Za-z0-9_]{0,63}$/', $namespace)) {
+ throw new \InvalidArgumentException('Некорректное пространство публичных шаблонов');
+ }
+
+ $this->namespace = $namespace;
+ $this->fallbackRoot = rtrim(str_replace('\\', '/', (string) $fallbackRoot), '/');
+ $this->fallbackPrefix = trim(str_replace('\\', '/', (string) $fallbackPrefix), '/');
+ $this->definitions = $this->normalizeDefinitions($definitions);
+ }
+
+ public function all()
+ {
+ $out = array();
+ foreach ($this->definitions as $code => $definition) {
+ $out[] = $this->describe($code, $definition);
+ }
+
+ return $out;
+ }
+
+ public function one($code)
+ {
+ $code = trim((string) $code);
+ if ($code === '' || !isset($this->definitions[$code])) {
+ $code = (string) key($this->definitions);
+ }
+
+ return $this->describe($code, $this->definitions[$code], true);
+ }
+
+ public function save($code, $content, $authorId, $action = 'public-view')
+ {
+ $this->assertCode($code);
+ $item = $this->one($code);
+ $syntax = $this->lint($content, $code);
+ if (empty($syntax['ok'])) {
+ throw new \InvalidArgumentException($syntax['message']);
+ }
+
+ Model::saveFile($item['theme'], $item['theme_path'], (string) $content, (int) $authorId, $action);
+ $this->ensureNamespace($item['theme'], (int) $authorId);
+ return $this->one($item['code']);
+ }
+
+ public function deleteOverride($code, $authorId)
+ {
+ $this->assertCode($code);
+ $item = $this->one($code);
+ if (empty($item['has_fallback'])) {
+ throw new \RuntimeException('Для этого шаблона нет резервной версии');
+ }
+
+ if (empty($item['has_theme_file'])) {
+ throw new \RuntimeException('Переопределение темы не найдено');
+ }
+
+ Model::deletePath($item['theme'], $item['theme_path'], (int) $authorId);
+ return $this->one($item['code']);
+ }
+
+ public function lint($content, $code = 'template')
+ {
+ $content = (string) $content;
+ if (trim($content) === '') {
+ return array('ok' => false, 'message' => 'Twig-шаблон не может быть пустым');
+ }
+
+ try {
+ Twig::twig()->createTemplate($content, 'public_view_' . preg_replace('/[^a-z0-9_]/i', '_', (string) $code));
+ } catch (\Throwable $e) {
+ return array('ok' => false, 'message' => 'Ошибка Twig: ' . $e->getMessage());
+ }
+
+ return array('ok' => true, 'message' => 'Twig-синтаксис корректен');
+ }
+
+ protected function describe($code, array $definition, $includeContent = false)
+ {
+ $theme = ThemeAssets::currentTheme();
+ $themePath = 'views/' . $this->namespace . '/' . $definition['file'];
+ $themeFile = BASEPATH . '/templates/' . $theme . '/' . $themePath;
+ $fallbackFile = $this->fallbackRoot !== '' ? $this->fallbackRoot . '/' . $definition['file'] : '';
+ $manifest = ThemeAssets::manifest($theme);
+ $namespaceEnabled = in_array($this->namespace, isset($manifest['view_overrides']) ? $manifest['view_overrides'] : array(), true);
+ $hasThemeFile = is_file($themeFile) && is_readable($themeFile);
+ $hasFallback = $fallbackFile !== '' && is_file($fallbackFile) && is_readable($fallbackFile);
+ $activeOverride = $namespaceEnabled && $hasThemeFile;
+ $source = $activeOverride ? 'theme' : ($hasThemeFile ? 'theme_disabled' : ($hasFallback ? 'fallback' : 'missing'));
+ $item = array_merge($definition, array(
+ 'code' => $code,
+ 'namespace' => $this->namespace,
+ 'theme' => $theme,
+ 'theme_path' => $themePath,
+ 'fallback_path' => $this->fallbackPrefix !== '' ? $this->fallbackPrefix . '/' . $definition['file'] : '',
+ 'has_theme_file' => $hasThemeFile,
+ 'has_fallback' => $hasFallback,
+ 'can_delete_override' => $hasThemeFile && $hasFallback,
+ 'namespace_enabled' => $namespaceEnabled,
+ 'active_override' => $activeOverride,
+ 'source' => $source,
+ 'source_label' => $activeOverride ? 'Активная тема' : ($hasThemeFile ? 'Файл темы отключён' : ($hasFallback ? 'Резерв компонента' : 'Файл отсутствует')),
+ 'modified_label' => $hasThemeFile ? date('d.m.Y H:i', (int) filemtime($themeFile)) : ($hasFallback ? date('d.m.Y H:i', (int) filemtime($fallbackFile)) : ''),
+ ));
+
+ if ($includeContent) {
+ $sourceFile = $hasThemeFile ? $themeFile : $fallbackFile;
+ $item['content'] = $sourceFile !== '' && is_file($sourceFile) ? (string) file_get_contents($sourceFile) : '';
+ $item['fallback_content'] = $hasFallback ? (string) file_get_contents($fallbackFile) : '';
+ }
+
+ return $item;
+ }
+
+ protected function ensureNamespace($theme, $authorId)
+ {
+ $manifest = ThemeAssets::manifest($theme);
+ $overrides = isset($manifest['view_overrides']) && is_array($manifest['view_overrides'])
+ ? $manifest['view_overrides']
+ : array();
+ if (in_array($this->namespace, $overrides, true)) { return; }
+
+ $overrides[] = $this->namespace;
+ $manifest['view_overrides'] = array_values(array_unique($overrides));
+ Model::saveFile(
+ $theme,
+ ThemeAssets::MANIFEST,
+ Json::encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n",
+ (int) $authorId,
+ 'public-view-namespace'
+ );
+ }
+
+ protected function assertCode($code)
+ {
+ if (!isset($this->definitions[trim((string) $code)])) {
+ throw new \InvalidArgumentException('Публичный шаблон не найден');
+ }
+ }
+
+ protected function normalizeDefinitions(array $definitions)
+ {
+ $out = array();
+ foreach ($definitions as $code => $definition) {
+ $code = trim((string) $code);
+ $file = isset($definition['file']) ? ThemeAssets::normalizePath($definition['file']) : '';
+ if (!preg_match('/^[a-z][a-z0-9_-]{0,63}$/', $code) || $file === '' || substr($file, -5) !== '.twig') {
+ throw new \InvalidArgumentException('Некорректное описание публичного шаблона');
+ }
+
+ $definition['file'] = $file;
+ $definition['title'] = isset($definition['title']) ? (string) $definition['title'] : $code;
+ $definition['description'] = isset($definition['description']) ? (string) $definition['description'] : '';
+ $definition['icon'] = isset($definition['icon']) ? (string) $definition['icon'] : 'ti ti-template';
+ $definition['group'] = isset($definition['group']) ? (string) $definition['group'] : '';
+ $definition['variables'] = isset($definition['variables']) && is_array($definition['variables']) ? $definition['variables'] : array();
+ $out[$code] = $definition;
+ }
+
+ if (!$out) { throw new \InvalidArgumentException('Реестр публичных шаблонов пуст'); }
+ return $out;
+ }
+ }
diff --git a/adminx/Support/WorkItemContext.php b/adminx/Support/WorkItemContext.php
new file mode 100644
index 0000000..1c236aa
--- /dev/null
+++ b/adminx/Support/WorkItemContext.php
@@ -0,0 +1,117 @@
+
+ | @copyright 2007-2026 (c) AVE.cms
+ | @link https://ave-cms.ru
+ | @version 3.3
+ */
+
+ namespace App\Adminx\Support;
+
+ defined('BASEPATH') || die('Direct access to this location is not allowed.');
+
+ use App\Common\SystemTables;
+ use App\Common\Permission;
+ use App\Content\ContentTables;
+ use App\Content\Documents\DocumentPickerRepository;
+ use DB;
+
+ /** Shared assignee and document context for panel work items. */
+ class WorkItemContext
+ {
+ public static function users()
+ {
+ $rows = DB::query(
+ 'SELECT id,name,email FROM ' . SystemTables::table('users')
+ . ' WHERE is_active=1 ORDER BY name,email,id'
+ )->getAll();
+ $result = array();
+ foreach ($rows ?: array() as $row) {
+ $result[] = array(
+ 'id' => (int) $row['id'],
+ 'name' => trim((string) $row['name']) !== '' ? (string) $row['name'] : (string) $row['email'],
+ 'email' => (string) $row['email'],
+ );
+ }
+
+ return $result;
+ }
+
+ public static function assignee($userId)
+ {
+ $userId = max(0, (int) $userId);
+ if ($userId < 1) { return 0; }
+ return (int) DB::query(
+ 'SELECT id FROM ' . SystemTables::table('users') . ' WHERE id=%i AND is_active=1 LIMIT 1',
+ $userId
+ )->getValue();
+ }
+
+ public static function documents($query, $limit = 20)
+ {
+ if (!Permission::check('view_documents')) { return array(); }
+ return (new DocumentPickerRepository())->search($query, array(), $limit);
+ }
+
+ public static function target($type, $id)
+ {
+ if (!Permission::check('view_documents')) { return array('', 0); }
+ $type = strtolower(trim((string) $type));
+ $id = max(0, (int) $id);
+ if ($type !== 'document' || $id < 1) { return array('', 0); }
+ $exists = (int) DB::query(
+ 'SELECT Id FROM ' . ContentTables::table('documents') . ' WHERE Id=%i AND document_deleted!=%s LIMIT 1',
+ $id,
+ '1'
+ )->getValue();
+ return $exists > 0 ? array('document', $exists) : array('', 0);
+ }
+
+ public static function decorateTargets(array &$items)
+ {
+ if (!Permission::check('view_documents')) { return; }
+ $ids = array();
+ foreach ($items as $item) {
+ if (isset($item['target_type'], $item['target_id']) && $item['target_type'] === 'document' && (int) $item['target_id'] > 0) {
+ $ids[(int) $item['target_id']] = (int) $item['target_id'];
+ }
+ }
+
+ $documents = array();
+ if ($ids) {
+ $rows = DB::query(
+ 'SELECT Id,document_title,document_alias FROM ' . ContentTables::table('documents')
+ . ' WHERE Id IN (' . implode(',', $ids) . ') AND document_deleted!=%s',
+ '1'
+ )->getAll();
+ foreach ($rows ?: array() as $row) { $documents[(int) $row['Id']] = $row; }
+ }
+
+ foreach ($items as &$item) {
+ $item['target_title'] = '';
+ $item['target_alias'] = '';
+ $item['target_url'] = '';
+ $id = isset($item['target_id']) ? (int) $item['target_id'] : 0;
+ if (!isset($documents[$id])) { continue; }
+ $item['target_title'] = htmlspecialchars_decode((string) $documents[$id]['document_title'], ENT_QUOTES);
+ $item['target_alias'] = (string) $documents[$id]['document_alias'];
+ $item['target_url'] = rtrim(ADMINX_BASE, '/') . '/documents/' . $id . '/edit';
+ }
+
+ unset($item);
+ }
+
+ public static function dueAt($value)
+ {
+ $value = trim((string) $value);
+ if ($value === '') { return 0; }
+ $timestamp = strtotime($value);
+ return $timestamp === false ? 0 : max(0, (int) $timestamp);
+ }
+ }
diff --git a/adminx/assets/js/adminx.js b/adminx/assets/js/adminx.js
index f332fe0..1fe7019 100644
--- a/adminx/assets/js/adminx.js
+++ b/adminx/assets/js/adminx.js
@@ -575,6 +575,8 @@
// cancelLabel, onConfirm });
// ------------------------------------------------------------------ //
Adminx.Confirm = {
+ active: null,
+
ICONS: {
info: ['info', 'ti-info-circle'],
success: ['success', 'ti-circle-check'],
@@ -584,6 +586,11 @@
open: function (cfg) {
cfg = cfg || {};
+ if (this.active) {
+ this.active.focus();
+ return false;
+ }
+
var kind = this.ICONS[cfg.kind] ? cfg.kind : 'warning';
var ic = this.ICONS[kind];
@@ -615,21 +622,46 @@
requestAnimationFrame(function () { overlay.classList.add('show'); });
var self = this;
- var close = function () {
+ var previousFocus = document.activeElement;
+ var confirmButton = modal.querySelector('[data-ok]');
+ var settled = false;
+ var finish = function (confirmed) {
+ if (settled) { return; }
+ settled = true;
+ document.removeEventListener('keydown', onKey, true);
+ self.active = null;
overlay.classList.remove('show');
- setTimeout(function () { overlay.remove(); document.removeEventListener('keydown', onKey); }, 180);
+ setTimeout(function () {
+ overlay.remove();
+ if (!confirmed && previousFocus && document.contains(previousFocus)) {
+ previousFocus.focus();
+ }
+ }, 180);
+ if (confirmed && typeof cfg.onConfirm === 'function') {
+ cfg.onConfirm();
+ }
+ };
+ var onKey = function (e) {
+ if (e.key !== 'Escape' && e.key !== 'Enter') { return; }
+ e.preventDefault();
+ e.stopPropagation();
+ if (typeof e.stopImmediatePropagation === 'function') { e.stopImmediatePropagation(); }
+ finish(e.key === 'Enter');
};
- var onKey = function (e) { if (e.key === 'Escape') { close(); } };
overlay.addEventListener('click', function (e) {
- if (e.target === overlay || e.target.closest('[data-cancel]')) { close(); return; }
+ if (e.target === overlay || e.target.closest('[data-cancel]')) { finish(false); return; }
if (e.target.closest('[data-ok]')) {
- close();
- if (typeof cfg.onConfirm === 'function') { cfg.onConfirm(); }
+ finish(true);
}
});
- document.addEventListener('keydown', onKey);
- modal.querySelector('[data-ok]').focus();
+ document.addEventListener('keydown', onKey, true);
+ this.active = {
+ focus: function () { confirmButton.focus(); },
+ close: function () { finish(false); }
+ };
+ confirmButton.focus();
+ return true;
}
};
diff --git a/adminx/index.php b/adminx/index.php
index 8d77577..ac24ebc 100644
--- a/adminx/index.php
+++ b/adminx/index.php
@@ -172,6 +172,18 @@
$authUser && Auth::ensureBrowserToken();
$canAdmin = $authUser !== null && Permission::checkAcp('admin_panel');
+ $forcePasswordPath = in_array($requestPath, array('/account/password', '/logout', '/locale'), true);
+ if ($canAdmin && !empty($authUser['must_change_password']) && !$forcePasswordPath) {
+ if (Request::isAjax()) {
+ Response::json(array(
+ 'success' => false,
+ 'message' => 'Сначала смените временный пароль.',
+ 'redirect' => ADMINX_BASE . '/account/password',
+ ), 428);
+ }
+
+ Request::redirect(ADMINX_BASE . '/account/password');
+ }
//-- Пункты меню для layout: фильтр по правам + активный пункт + абсолютный href.
$navFlat = [];
diff --git a/adminx/modules/Auth/Controller.php b/adminx/modules/Auth/Controller.php
index b8abdb7..e9a4af0 100644
--- a/adminx/modules/Auth/Controller.php
+++ b/adminx/modules/Auth/Controller.php
@@ -57,6 +57,16 @@
$login = Request::postStr('login');
$password = (string) Request::post('password', '');
$remember = Request::postBool('remember', false);
+ $identityKey = 'admin-login-user:' . hash('sha256', mb_strtolower(trim($login), 'UTF-8'));
+ $ipKey = 'admin-login-ip:' . Request::ip();
+ if (RateLimiter::tooManyAttempts($identityKey, 5) || RateLimiter::tooManyAttempts($ipKey, 20)) {
+ $this->auditLoginFailure($login, 'rate_limit');
+ $wait = max(RateLimiter::availableIn($identityKey), RateLimiter::availableIn($ipKey));
+ return $this->render('@auth/login.twig', array(
+ 'error' => 'Слишком много попыток входа. Повторите через ' . max(1, $wait) . ' сек.',
+ 'login_prev' => $login,
+ ));
+ }
//-- Современный Auth API (SystemTables users: email/password_hash/role).
//-- Вход по email или логину; запоминание — по флажку.
@@ -68,19 +78,20 @@
$result = Auth::attempt($login, $password, $options);
if (is_array($result)) {
- Session::regenerateCsrf();
- $this->redirect($this->base() . '/');
- return null;
+ return $this->loginCompleted($result, $identityKey, $ipKey);
}
//-- Legacy-пароль (перенесённые пользователи, md5(md5(pass+salt))):
//-- проверяем и молча перехешируем в bcrypt при первом входе.
- if ($this->legacyLogin($login, $password, $options)) {
- Session::regenerateCsrf();
- $this->redirect($this->base() . '/');
- return null;
+ $legacyUser = $this->legacyLogin($login, $password, $options);
+ if (is_array($legacyUser)) {
+ return $this->loginCompleted($legacyUser, $identityKey, $ipKey);
}
+ RateLimiter::hit($identityKey, 600);
+ RateLimiter::hit($ipKey, 600);
+ $this->auditLoginFailure($login, isset($result) ? (string) $result : 'failed');
+
$messages = [
1 => AdminLocale::text('auth_err_required', 'Введите логин или email и пароль.'),
2 => AdminLocale::text('auth_err_invalid', 'Неверный логин или пароль.'),
@@ -96,6 +107,61 @@
]);
}
+ /** GET /account/password — mandatory temporary-password replacement. */
+ public function passwordForm(array $params = array())
+ {
+ $user = Auth::user();
+ if (!$user) { $this->redirect($this->base() . '/login'); return null; }
+
+ return $this->render('@auth/password.twig', array(
+ 'error' => '',
+ 'user' => $user,
+ ));
+ }
+
+ /** POST /account/password — finish a forced password change. */
+ public function changePassword(array $params = array())
+ {
+ $user = Auth::user();
+ if (!$user) { $this->redirect($this->base() . '/login'); return null; }
+ try {
+ $this->verifyCsrf();
+ } catch (\RuntimeException $e) {
+ return $this->render('@auth/password.twig', array(
+ 'error' => 'Сессия устарела, обновите страницу и попробуйте снова.', 'user' => $user,
+ ));
+ }
+
+ $current = (string) Request::post('current_password', '');
+ $password = (string) Request::post('password', '');
+ $confirm = (string) Request::post('password_confirm', '');
+ $error = '';
+ if (!password_verify($current, (string) $user['password_hash'])) {
+ $error = 'Текущий пароль указан неверно.';
+ } elseif (mb_strlen($password, 'UTF-8') < 8) {
+ $error = 'Новый пароль должен содержать не меньше 8 символов.';
+ } elseif (!hash_equals($password, $confirm)) {
+ $error = 'Новые пароли не совпадают.';
+ } elseif (password_verify($password, (string) $user['password_hash'])) {
+ $error = 'Новый пароль должен отличаться от временного.';
+ }
+
+ if ($error !== '') {
+ return $this->render('@auth/password.twig', array('error' => $error, 'user' => $user));
+ }
+
+ \App\Adminx\Users\Model::completePasswordChange((int) $user['id'], $password);
+ AuditLog::record('auth.password_changed', array(
+ 'actor_id' => (int) $user['id'],
+ 'actor_name' => isset($user['name']) ? (string) $user['name'] : '',
+ 'target_type' => 'user',
+ 'target_id' => (int) $user['id'],
+ ));
+ Session::regenerateCsrf();
+ $this->redirect($this->base() . '/');
+ return null;
+ }
+
/** POST /locale — смена только языка интерфейса Adminx. */
public function language(array $params = array())
{
@@ -181,7 +247,36 @@
$arr['password_hash'] = $hash;
Auth::login($arr, $options);
- return true;
+ return $arr;
+ }
+
+ protected function loginCompleted(array $user, $identityKey, $ipKey)
+ {
+ RateLimiter::clear($identityKey);
+ RateLimiter::clear($ipKey);
+ \App\Adminx\Users\Model::recordSuccessfulLogin((int) $user['id']);
+ AuditLog::record('auth.login_succeeded', array(
+ 'actor_id' => (int) $user['id'],
+ 'actor_name' => isset($user['name']) ? (string) $user['name'] : '',
+ 'target_type' => 'user',
+ 'target_id' => (int) $user['id'],
+ ));
+ Session::regenerateCsrf();
+ $this->redirect($this->base() . (!empty($user['must_change_password']) ? '/account/password' : '/'));
+ return null;
+ }
+
+ protected function auditLoginFailure($identifier, $reason)
+ {
+ $user = \App\Adminx\Users\Model::findByIdentifier((string) $identifier);
+ AuditLog::record('auth.login_failed', array(
+ 'target_type' => 'user',
+ 'target_id' => $user ? (int) $user->id : null,
+ 'meta' => array(
+ 'identifier' => mb_substr(trim((string) $identifier), 0, 190, 'UTF-8'),
+ 'reason' => (string) $reason,
+ ),
+ ));
}
/** POST /logout — выход (ajax + CSRF). */
diff --git a/adminx/modules/Auth/language/en/interface.xml b/adminx/modules/Auth/language/en/interface.xml
index 603190d..4bb807e 100644
--- a/adminx/modules/Auth/language/en/interface.xml
+++ b/adminx/modules/Auth/language/en/interface.xml
@@ -13,4 +13,13 @@
{{ lang.auth_temp_password_for|default('Для') }} {{ user.name|default(user.email) }}. {{ lang.auth_temp_password_intro|default('После смены откроется панель управления.') }}
+{{ customer.user.email ?: 'Email не указан' }}{% if customer.user.phone %} · {{ customer.user.phone }}{% endif %}
Последние покупки пользователя
Связанные аккаунты и подтверждения
Сообщения контактных форм по email
Сопоставлены по email или телефону
Сопоставлены по email или телефону
Внутренняя информация, покупатель её не видит
{{ note.note }}
{{ note.author_name ?: 'Система' }} · {{ note.created_at|date('d.m.Y H:i') }}Аккаунт, покупки, обращения и интересы человека собраны в одной карточке.
Откройте карточку, чтобы увидеть всю историю взаимодействия.
| Покупатель | Заказы | Активность | Сегменты | Действия |
|---|---|---|---|---|
{{ (customer.firstname|first ~ customer.lastname|first)|upper ?: '#' }} {{ (customer.firstname ~ ' ' ~ customer.lastname)|trim ?: customer.user_name }}{{ customer.email ?: customer.phone }} · #{{ customer.id }} | {{ customer.orders_count }} заказов{{ customer.orders_total|number_format(0,'.',' ') }} ₽ | {{ customer.last_order_at ? customer.last_order_at|date('d.m.Y') : 'Покупок нет' }}Вход: {{ customer.last_visit ? customer.last_visit|date('d.m.Y') : 'не входил' }} | {% for code in customer.segment_codes %}{{ center_segments[code] }}{% endfor %} | |
Покупатели не найденыИзмените поисковый запрос или сегмент. | ||||
Публичные аккаунты, профили и способы входа
Посетители, зарегистрированные на сайте, их контакты и доступ к личному кабинету.
| ID | Пользователь | Контакты | Компания | Регистрация | Статус | {% if can_manage %}Действия | {% endif %}
|---|
| ID и документ | Рубрика | Было | Станет | Результат |
|---|
{{ is_new ? (catalog_mode ? 'Заполните основные данные. Характеристики, варианты и доставка откроются после первого сохранения.' : 'Создание базовой карточки документа.') : 'ID ' ~ document.Id ~ ', ' ~ (document.state_label|admin_trans) ~ ', изменён: ' ~ document.changed_label }}
{{ field.rubric_field_description }}
{% endif %} + {% if field.rubric_field_description_html %}{{ pagination.from }}-{{ pagination.to }} из {{ pagination.total }} в текущем наборе.