iobroker.eos-admin 7.9.68 → 7.9.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v54.js +1 -0
  2. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v55.js +1 -0
  3. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v56.js +1 -0
  4. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v57.js +1 -0
  5. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v58.js +1 -2
  6. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v59.js +1 -2
  7. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v60.js +1 -2
  8. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v61.js +1 -2
  9. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v62.js +1 -0
  10. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v63.js +1 -0
  11. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v64.js +1 -0
  12. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v65.js +1 -0
  13. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v66.js +1 -0
  14. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v67.js +1 -2
  15. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v68.js +1 -0
  16. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v69.js +1 -0
  17. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v70.js +2 -0
  18. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf.js +2 -2
  19. package/adminWww/assets/Adapters-B5_jQ7DE-v54.js +1 -0
  20. package/adminWww/assets/Adapters-B5_jQ7DE-v55.js +1 -0
  21. package/adminWww/assets/Adapters-B5_jQ7DE-v56.js +1 -0
  22. package/adminWww/assets/Adapters-B5_jQ7DE-v57.js +1 -0
  23. package/adminWww/assets/Adapters-B5_jQ7DE-v58.js +1 -2
  24. package/adminWww/assets/Adapters-B5_jQ7DE-v59.js +1 -2
  25. package/adminWww/assets/Adapters-B5_jQ7DE-v60.js +1 -9
  26. package/adminWww/assets/Adapters-B5_jQ7DE-v61.js +1 -9
  27. package/adminWww/assets/Adapters-B5_jQ7DE-v62.js +1 -0
  28. package/adminWww/assets/Adapters-B5_jQ7DE-v63.js +1 -0
  29. package/adminWww/assets/Adapters-B5_jQ7DE-v64.js +1 -0
  30. package/adminWww/assets/Adapters-B5_jQ7DE-v65.js +1 -0
  31. package/adminWww/assets/Adapters-B5_jQ7DE-v66.js +1 -0
  32. package/adminWww/assets/Adapters-B5_jQ7DE-v67.js +1 -9
  33. package/adminWww/assets/Adapters-B5_jQ7DE-v68.js +1 -0
  34. package/adminWww/assets/Adapters-B5_jQ7DE-v69.js +1 -0
  35. package/adminWww/assets/Adapters-B5_jQ7DE-v70.js +9 -0
  36. package/adminWww/assets/Adapters-B5_jQ7DE.js +9 -2
  37. package/adminWww/assets/Config-hHK2UzGP-v54.js +1 -0
  38. package/adminWww/assets/Config-hHK2UzGP-v55.js +1 -0
  39. package/adminWww/assets/Config-hHK2UzGP-v56.js +1 -0
  40. package/adminWww/assets/Config-hHK2UzGP-v57.js +1 -0
  41. package/adminWww/assets/Config-hHK2UzGP-v58.js +1 -1
  42. package/adminWww/assets/Config-hHK2UzGP-v59.js +1 -1
  43. package/adminWww/assets/Config-hHK2UzGP-v60.js +1 -1
  44. package/adminWww/assets/Config-hHK2UzGP-v61.js +1 -1
  45. package/adminWww/assets/Config-hHK2UzGP-v62.js +1 -0
  46. package/adminWww/assets/Config-hHK2UzGP-v63.js +1 -0
  47. package/adminWww/assets/Config-hHK2UzGP-v64.js +1 -0
  48. package/adminWww/assets/Config-hHK2UzGP-v65.js +1 -0
  49. package/adminWww/assets/Config-hHK2UzGP-v66.js +1 -0
  50. package/adminWww/assets/Config-hHK2UzGP-v67.js +1 -1
  51. package/adminWww/assets/Config-hHK2UzGP-v68.js +1 -0
  52. package/adminWww/assets/Config-hHK2UzGP-v69.js +1 -0
  53. package/adminWww/assets/Config-hHK2UzGP-v70.js +1 -0
  54. package/adminWww/assets/Config-hHK2UzGP.js +1 -2
  55. package/adminWww/assets/CustomTab-B0wqoazH-v54.js +1 -0
  56. package/adminWww/assets/CustomTab-B0wqoazH-v55.js +1 -0
  57. package/adminWww/assets/CustomTab-B0wqoazH-v56.js +1 -0
  58. package/adminWww/assets/CustomTab-B0wqoazH-v57.js +1 -0
  59. package/adminWww/assets/CustomTab-B0wqoazH-v58.js +1 -1
  60. package/adminWww/assets/CustomTab-B0wqoazH-v59.js +1 -1
  61. package/adminWww/assets/CustomTab-B0wqoazH-v60.js +1 -1
  62. package/adminWww/assets/CustomTab-B0wqoazH-v61.js +1 -1
  63. package/adminWww/assets/CustomTab-B0wqoazH-v62.js +1 -0
  64. package/adminWww/assets/CustomTab-B0wqoazH-v63.js +1 -0
  65. package/adminWww/assets/CustomTab-B0wqoazH-v64.js +1 -0
  66. package/adminWww/assets/CustomTab-B0wqoazH-v65.js +1 -0
  67. package/adminWww/assets/CustomTab-B0wqoazH-v66.js +1 -0
  68. package/adminWww/assets/CustomTab-B0wqoazH-v67.js +1 -1
  69. package/adminWww/assets/CustomTab-B0wqoazH-v68.js +1 -0
  70. package/adminWww/assets/CustomTab-B0wqoazH-v69.js +1 -0
  71. package/adminWww/assets/CustomTab-B0wqoazH-v70.js +1 -0
  72. package/adminWww/assets/CustomTab-B0wqoazH.js +1 -2
  73. package/adminWww/assets/DeviceManager-BFmQeYQ1-v54.js +1 -0
  74. package/adminWww/assets/DeviceManager-BFmQeYQ1-v55.js +1 -0
  75. package/adminWww/assets/DeviceManager-BFmQeYQ1-v56.js +1 -0
  76. package/adminWww/assets/DeviceManager-BFmQeYQ1-v57.js +1 -0
  77. package/adminWww/assets/DeviceManager-BFmQeYQ1-v58.js +1 -1
  78. package/adminWww/assets/DeviceManager-BFmQeYQ1-v59.js +1 -1
  79. package/adminWww/assets/DeviceManager-BFmQeYQ1-v60.js +1 -1
  80. package/adminWww/assets/DeviceManager-BFmQeYQ1-v61.js +1 -1
  81. package/adminWww/assets/DeviceManager-BFmQeYQ1-v62.js +1 -0
  82. package/adminWww/assets/DeviceManager-BFmQeYQ1-v63.js +1 -0
  83. package/adminWww/assets/DeviceManager-BFmQeYQ1-v64.js +1 -0
  84. package/adminWww/assets/DeviceManager-BFmQeYQ1-v65.js +1 -0
  85. package/adminWww/assets/DeviceManager-BFmQeYQ1-v66.js +1 -0
  86. package/adminWww/assets/DeviceManager-BFmQeYQ1-v67.js +1 -1
  87. package/adminWww/assets/DeviceManager-BFmQeYQ1-v68.js +1 -0
  88. package/adminWww/assets/DeviceManager-BFmQeYQ1-v69.js +1 -0
  89. package/adminWww/assets/DeviceManager-BFmQeYQ1-v70.js +1 -0
  90. package/adminWww/assets/DeviceManager-BFmQeYQ1.js +1 -2
  91. package/adminWww/assets/EasyMode-B1d9Vdc4-v54.js +1 -0
  92. package/adminWww/assets/EasyMode-B1d9Vdc4-v55.js +1 -0
  93. package/adminWww/assets/EasyMode-B1d9Vdc4-v56.js +1 -0
  94. package/adminWww/assets/EasyMode-B1d9Vdc4-v57.js +1 -0
  95. package/adminWww/assets/EasyMode-B1d9Vdc4-v58.js +1 -1
  96. package/adminWww/assets/EasyMode-B1d9Vdc4-v59.js +1 -1
  97. package/adminWww/assets/EasyMode-B1d9Vdc4-v60.js +1 -1
  98. package/adminWww/assets/EasyMode-B1d9Vdc4-v61.js +1 -1
  99. package/adminWww/assets/EasyMode-B1d9Vdc4-v62.js +1 -0
  100. package/adminWww/assets/EasyMode-B1d9Vdc4-v63.js +1 -0
  101. package/adminWww/assets/EasyMode-B1d9Vdc4-v64.js +1 -0
  102. package/adminWww/assets/EasyMode-B1d9Vdc4-v65.js +1 -0
  103. package/adminWww/assets/EasyMode-B1d9Vdc4-v66.js +1 -0
  104. package/adminWww/assets/EasyMode-B1d9Vdc4-v67.js +1 -1
  105. package/adminWww/assets/EasyMode-B1d9Vdc4-v68.js +1 -0
  106. package/adminWww/assets/EasyMode-B1d9Vdc4-v69.js +1 -0
  107. package/adminWww/assets/EasyMode-B1d9Vdc4-v70.js +1 -0
  108. package/adminWww/assets/EasyMode-B1d9Vdc4.js +1 -2
  109. package/adminWww/assets/Enums-DbWYxKOo-v54.js +1 -0
  110. package/adminWww/assets/Enums-DbWYxKOo-v55.js +1 -0
  111. package/adminWww/assets/Enums-DbWYxKOo-v56.js +1 -0
  112. package/adminWww/assets/Enums-DbWYxKOo-v57.js +1 -0
  113. package/adminWww/assets/Enums-DbWYxKOo-v58.js +1 -91
  114. package/adminWww/assets/Enums-DbWYxKOo-v59.js +1 -91
  115. package/adminWww/assets/Enums-DbWYxKOo-v60.js +1 -91
  116. package/adminWww/assets/Enums-DbWYxKOo-v61.js +1 -91
  117. package/adminWww/assets/Enums-DbWYxKOo-v62.js +1 -0
  118. package/adminWww/assets/Enums-DbWYxKOo-v63.js +1 -0
  119. package/adminWww/assets/Enums-DbWYxKOo-v64.js +1 -0
  120. package/adminWww/assets/Enums-DbWYxKOo-v65.js +1 -0
  121. package/adminWww/assets/Enums-DbWYxKOo-v66.js +1 -0
  122. package/adminWww/assets/Enums-DbWYxKOo-v67.js +1 -91
  123. package/adminWww/assets/Enums-DbWYxKOo-v68.js +1 -0
  124. package/adminWww/assets/Enums-DbWYxKOo-v69.js +1 -0
  125. package/adminWww/assets/Enums-DbWYxKOo-v70.js +91 -0
  126. package/adminWww/assets/Enums-DbWYxKOo.js +91 -2
  127. package/adminWww/assets/Fields-CX3rKuWb-v54.js +1 -0
  128. package/adminWww/assets/Fields-CX3rKuWb-v55.js +1 -0
  129. package/adminWww/assets/Fields-CX3rKuWb-v56.js +1 -0
  130. package/adminWww/assets/Fields-CX3rKuWb-v57.js +1 -0
  131. package/adminWww/assets/Fields-CX3rKuWb-v58.js +1 -1
  132. package/adminWww/assets/Fields-CX3rKuWb-v59.js +1 -1
  133. package/adminWww/assets/Fields-CX3rKuWb-v60.js +1 -1
  134. package/adminWww/assets/Fields-CX3rKuWb-v61.js +1 -1
  135. package/adminWww/assets/Fields-CX3rKuWb-v62.js +1 -0
  136. package/adminWww/assets/Fields-CX3rKuWb-v63.js +1 -0
  137. package/adminWww/assets/Fields-CX3rKuWb-v64.js +1 -0
  138. package/adminWww/assets/Fields-CX3rKuWb-v65.js +1 -0
  139. package/adminWww/assets/Fields-CX3rKuWb-v66.js +1 -0
  140. package/adminWww/assets/Fields-CX3rKuWb-v67.js +1 -1
  141. package/adminWww/assets/Fields-CX3rKuWb-v68.js +1 -0
  142. package/adminWww/assets/Fields-CX3rKuWb-v69.js +1 -0
  143. package/adminWww/assets/Fields-CX3rKuWb-v70.js +1 -0
  144. package/adminWww/assets/Fields-CX3rKuWb.js +1 -2
  145. package/adminWww/assets/Files-Cd2HOzIE-v54.js +1 -0
  146. package/adminWww/assets/Files-Cd2HOzIE-v55.js +1 -0
  147. package/adminWww/assets/Files-Cd2HOzIE-v56.js +1 -0
  148. package/adminWww/assets/Files-Cd2HOzIE-v57.js +1 -0
  149. package/adminWww/assets/Files-Cd2HOzIE-v58.js +1 -1
  150. package/adminWww/assets/Files-Cd2HOzIE-v59.js +1 -1
  151. package/adminWww/assets/Files-Cd2HOzIE-v60.js +1 -1
  152. package/adminWww/assets/Files-Cd2HOzIE-v61.js +1 -1
  153. package/adminWww/assets/Files-Cd2HOzIE-v62.js +1 -0
  154. package/adminWww/assets/Files-Cd2HOzIE-v63.js +1 -0
  155. package/adminWww/assets/Files-Cd2HOzIE-v64.js +1 -0
  156. package/adminWww/assets/Files-Cd2HOzIE-v65.js +1 -0
  157. package/adminWww/assets/Files-Cd2HOzIE-v66.js +1 -0
  158. package/adminWww/assets/Files-Cd2HOzIE-v67.js +1 -1
  159. package/adminWww/assets/Files-Cd2HOzIE-v68.js +1 -0
  160. package/adminWww/assets/Files-Cd2HOzIE-v69.js +1 -0
  161. package/adminWww/assets/Files-Cd2HOzIE-v70.js +1 -0
  162. package/adminWww/assets/Files-Cd2HOzIE.js +1 -2
  163. package/adminWww/assets/Hosts-Bg8QzW5i-v54.js +1 -0
  164. package/adminWww/assets/Hosts-Bg8QzW5i-v55.js +1 -0
  165. package/adminWww/assets/Hosts-Bg8QzW5i-v56.js +1 -0
  166. package/adminWww/assets/Hosts-Bg8QzW5i-v57.js +1 -0
  167. package/adminWww/assets/Hosts-Bg8QzW5i-v58.js +1 -121
  168. package/adminWww/assets/Hosts-Bg8QzW5i-v59.js +1 -121
  169. package/adminWww/assets/Hosts-Bg8QzW5i-v60.js +1 -121
  170. package/adminWww/assets/Hosts-Bg8QzW5i-v61.js +1 -121
  171. package/adminWww/assets/Hosts-Bg8QzW5i-v62.js +1 -0
  172. package/adminWww/assets/Hosts-Bg8QzW5i-v63.js +1 -0
  173. package/adminWww/assets/Hosts-Bg8QzW5i-v64.js +1 -0
  174. package/adminWww/assets/Hosts-Bg8QzW5i-v65.js +1 -0
  175. package/adminWww/assets/Hosts-Bg8QzW5i-v66.js +1 -0
  176. package/adminWww/assets/Hosts-Bg8QzW5i-v67.js +1 -121
  177. package/adminWww/assets/Hosts-Bg8QzW5i-v68.js +1 -0
  178. package/adminWww/assets/Hosts-Bg8QzW5i-v69.js +1 -0
  179. package/adminWww/assets/Hosts-Bg8QzW5i-v70.js +121 -0
  180. package/adminWww/assets/Hosts-Bg8QzW5i.js +121 -2
  181. package/adminWww/assets/Instances-YdaGnS5a-v54.js +1 -0
  182. package/adminWww/assets/Instances-YdaGnS5a-v55.js +1 -0
  183. package/adminWww/assets/Instances-YdaGnS5a-v56.js +1 -0
  184. package/adminWww/assets/Instances-YdaGnS5a-v57.js +1 -0
  185. package/adminWww/assets/Instances-YdaGnS5a-v58.js +1 -2
  186. package/adminWww/assets/Instances-YdaGnS5a-v59.js +1 -2
  187. package/adminWww/assets/Instances-YdaGnS5a-v60.js +1 -2
  188. package/adminWww/assets/Instances-YdaGnS5a-v61.js +1 -2
  189. package/adminWww/assets/Instances-YdaGnS5a-v62.js +1 -0
  190. package/adminWww/assets/Instances-YdaGnS5a-v63.js +1 -0
  191. package/adminWww/assets/Instances-YdaGnS5a-v64.js +1 -0
  192. package/adminWww/assets/Instances-YdaGnS5a-v65.js +1 -0
  193. package/adminWww/assets/Instances-YdaGnS5a-v66.js +1 -0
  194. package/adminWww/assets/Instances-YdaGnS5a-v67.js +1 -2
  195. package/adminWww/assets/Instances-YdaGnS5a-v68.js +1 -0
  196. package/adminWww/assets/Instances-YdaGnS5a-v69.js +1 -0
  197. package/adminWww/assets/Instances-YdaGnS5a-v70.js +2 -0
  198. package/adminWww/assets/Instances-YdaGnS5a.js +2 -2
  199. package/adminWww/assets/Intro-DkwRiz1n-v54.js +1 -0
  200. package/adminWww/assets/Intro-DkwRiz1n-v55.js +1 -0
  201. package/adminWww/assets/Intro-DkwRiz1n-v56.js +1 -0
  202. package/adminWww/assets/Intro-DkwRiz1n-v57.js +1 -0
  203. package/adminWww/assets/Intro-DkwRiz1n-v58.js +1 -2
  204. package/adminWww/assets/Intro-DkwRiz1n-v59.js +1 -2
  205. package/adminWww/assets/Intro-DkwRiz1n-v60.js +1 -2
  206. package/adminWww/assets/Intro-DkwRiz1n-v61.js +1 -2
  207. package/adminWww/assets/Intro-DkwRiz1n-v62.js +1 -0
  208. package/adminWww/assets/Intro-DkwRiz1n-v63.js +1 -0
  209. package/adminWww/assets/Intro-DkwRiz1n-v64.js +1 -0
  210. package/adminWww/assets/Intro-DkwRiz1n-v65.js +1 -0
  211. package/adminWww/assets/Intro-DkwRiz1n-v66.js +1 -0
  212. package/adminWww/assets/Intro-DkwRiz1n-v67.js +1 -2
  213. package/adminWww/assets/Intro-DkwRiz1n-v68.js +1 -0
  214. package/adminWww/assets/Intro-DkwRiz1n-v69.js +1 -0
  215. package/adminWww/assets/Intro-DkwRiz1n-v70.js +2 -0
  216. package/adminWww/assets/Intro-DkwRiz1n.js +2 -2
  217. package/adminWww/assets/Living Room-C7AE21A_.js +1 -1
  218. package/adminWww/assets/Logs-CsVPSLJH-v54.js +1 -0
  219. package/adminWww/assets/Logs-CsVPSLJH-v55.js +1 -0
  220. package/adminWww/assets/Logs-CsVPSLJH-v56.js +1 -0
  221. package/adminWww/assets/Logs-CsVPSLJH-v57.js +1 -0
  222. package/adminWww/assets/Logs-CsVPSLJH-v58.js +1 -1
  223. package/adminWww/assets/Logs-CsVPSLJH-v59.js +1 -1
  224. package/adminWww/assets/Logs-CsVPSLJH-v60.js +1 -1
  225. package/adminWww/assets/Logs-CsVPSLJH-v61.js +1 -1
  226. package/adminWww/assets/Logs-CsVPSLJH-v62.js +1 -0
  227. package/adminWww/assets/Logs-CsVPSLJH-v63.js +1 -0
  228. package/adminWww/assets/Logs-CsVPSLJH-v64.js +1 -0
  229. package/adminWww/assets/Logs-CsVPSLJH-v65.js +1 -0
  230. package/adminWww/assets/Logs-CsVPSLJH-v66.js +1 -0
  231. package/adminWww/assets/Logs-CsVPSLJH-v67.js +1 -1
  232. package/adminWww/assets/Logs-CsVPSLJH-v68.js +1 -0
  233. package/adminWww/assets/Logs-CsVPSLJH-v69.js +1 -0
  234. package/adminWww/assets/Logs-CsVPSLJH-v70.js +1 -0
  235. package/adminWww/assets/Logs-CsVPSLJH.js +1 -2
  236. package/adminWww/assets/Objects-DPan0bzw-v54.js +1 -1
  237. package/adminWww/assets/Objects-DPan0bzw-v55.js +1 -1
  238. package/adminWww/assets/Objects-DPan0bzw-v56.js +1 -1
  239. package/adminWww/assets/Objects-DPan0bzw-v57.js +1 -1
  240. package/adminWww/assets/Objects-DPan0bzw-v58.js +1 -1
  241. package/adminWww/assets/Objects-DPan0bzw-v59.js +1 -1
  242. package/adminWww/assets/Objects-DPan0bzw-v60.js +1 -1
  243. package/adminWww/assets/Objects-DPan0bzw-v61.js +1 -878
  244. package/adminWww/assets/Objects-DPan0bzw-v62.js +1 -0
  245. package/adminWww/assets/Objects-DPan0bzw-v63.js +1 -0
  246. package/adminWww/assets/Objects-DPan0bzw-v64.js +1 -0
  247. package/adminWww/assets/Objects-DPan0bzw-v65.js +1 -0
  248. package/adminWww/assets/Objects-DPan0bzw-v66.js +1 -0
  249. package/adminWww/assets/Objects-DPan0bzw-v67.js +1 -878
  250. package/adminWww/assets/Objects-DPan0bzw-v68.js +1 -0
  251. package/adminWww/assets/Objects-DPan0bzw-v69.js +1 -0
  252. package/adminWww/assets/Objects-DPan0bzw-v70.js +878 -0
  253. package/adminWww/assets/Objects-DPan0bzw.js +878 -2
  254. package/adminWww/assets/Rear Wall-BNvjPc7z.js +1 -1
  255. package/adminWww/assets/Storeroom-DVXZ_Y0f.js +1 -1
  256. package/adminWww/assets/Tv-GicrNRwV.js +1 -1
  257. package/adminWww/assets/Users-BgnBRgwU-v54.js +1 -0
  258. package/adminWww/assets/Users-BgnBRgwU-v55.js +1 -0
  259. package/adminWww/assets/Users-BgnBRgwU-v56.js +1 -0
  260. package/adminWww/assets/Users-BgnBRgwU-v57.js +1 -0
  261. package/adminWww/assets/Users-BgnBRgwU-v58.js +1 -1
  262. package/adminWww/assets/Users-BgnBRgwU-v59.js +1 -1
  263. package/adminWww/assets/Users-BgnBRgwU-v60.js +1 -1
  264. package/adminWww/assets/Users-BgnBRgwU-v61.js +1 -1
  265. package/adminWww/assets/Users-BgnBRgwU-v62.js +1 -0
  266. package/adminWww/assets/Users-BgnBRgwU-v63.js +1 -0
  267. package/adminWww/assets/Users-BgnBRgwU-v64.js +1 -0
  268. package/adminWww/assets/Users-BgnBRgwU-v65.js +1 -0
  269. package/adminWww/assets/Users-BgnBRgwU-v66.js +1 -0
  270. package/adminWww/assets/Users-BgnBRgwU-v67.js +1 -1
  271. package/adminWww/assets/Users-BgnBRgwU-v68.js +1 -0
  272. package/adminWww/assets/Users-BgnBRgwU-v69.js +1 -0
  273. package/adminWww/assets/Users-BgnBRgwU-v70.js +1 -0
  274. package/adminWww/assets/Users-BgnBRgwU.js +1 -2
  275. package/adminWww/assets/bootstrap-COulQZax-v54.js +1 -1
  276. package/adminWww/assets/bootstrap-COulQZax-v55.js +1 -1
  277. package/adminWww/assets/bootstrap-COulQZax-v56.js +1 -1
  278. package/adminWww/assets/bootstrap-COulQZax-v57.js +1 -1
  279. package/adminWww/assets/bootstrap-COulQZax-v58.js +1 -1
  280. package/adminWww/assets/bootstrap-COulQZax-v59.js +1 -1
  281. package/adminWww/assets/bootstrap-COulQZax-v60.js +1 -1
  282. package/adminWww/assets/bootstrap-COulQZax-v61.js +1 -1
  283. package/adminWww/assets/bootstrap-COulQZax-v62.js +1 -0
  284. package/adminWww/assets/bootstrap-COulQZax-v63.js +1 -0
  285. package/adminWww/assets/bootstrap-COulQZax-v64.js +1 -0
  286. package/adminWww/assets/bootstrap-COulQZax-v65.js +1 -0
  287. package/adminWww/assets/bootstrap-COulQZax-v66.js +1 -0
  288. package/adminWww/assets/bootstrap-COulQZax-v67.js +1 -1
  289. package/adminWww/assets/bootstrap-COulQZax-v68.js +1 -317
  290. package/adminWww/assets/bootstrap-COulQZax-v69.js +1 -0
  291. package/adminWww/assets/bootstrap-COulQZax-v70.js +317 -0
  292. package/adminWww/assets/bootstrap-COulQZax.js +2 -1
  293. package/adminWww/assets/hostInit-OBG53iVO.js +1 -1
  294. package/adminWww/assets/hostInit-v54.js +1 -1
  295. package/adminWww/assets/hostInit-v55.js +1 -1
  296. package/adminWww/assets/hostInit-v56.js +1 -1
  297. package/adminWww/assets/hostInit-v57.js +1 -1
  298. package/adminWww/assets/hostInit-v58.js +1 -1
  299. package/adminWww/assets/hostInit-v59.js +1 -1
  300. package/adminWww/assets/hostInit-v60.js +1 -1
  301. package/adminWww/assets/hostInit-v61.js +1 -2
  302. package/adminWww/assets/hostInit-v62.js +1 -0
  303. package/adminWww/assets/hostInit-v63.js +1 -0
  304. package/adminWww/assets/hostInit-v64.js +1 -0
  305. package/adminWww/assets/hostInit-v65.js +1 -0
  306. package/adminWww/assets/hostInit-v66.js +1 -0
  307. package/adminWww/assets/hostInit-v67.js +1 -0
  308. package/adminWww/assets/hostInit-v68.js +1 -0
  309. package/adminWww/assets/hostInit-v69.js +1 -0
  310. package/adminWww/assets/hostInit-v70.js +2 -0
  311. package/adminWww/assets/index-CQZugZ1z-v54.js +1 -0
  312. package/adminWww/assets/index-CQZugZ1z-v55.js +1 -1
  313. package/adminWww/assets/index-CQZugZ1z-v56.js +1 -1
  314. package/adminWww/assets/index-CQZugZ1z-v57.js +1 -1
  315. package/adminWww/assets/index-CQZugZ1z-v58.js +1 -1
  316. package/adminWww/assets/index-CQZugZ1z-v59.js +1 -1
  317. package/adminWww/assets/index-CQZugZ1z-v60.js +1 -2
  318. package/adminWww/assets/index-CQZugZ1z-v61.js +1 -2
  319. package/adminWww/assets/index-CQZugZ1z-v62.js +1 -0
  320. package/adminWww/assets/index-CQZugZ1z-v63.js +1 -0
  321. package/adminWww/assets/index-CQZugZ1z-v64.js +1 -0
  322. package/adminWww/assets/index-CQZugZ1z-v65.js +1 -0
  323. package/adminWww/assets/index-CQZugZ1z-v66.js +1 -0
  324. package/adminWww/assets/index-CQZugZ1z-v67.js +1 -1
  325. package/adminWww/assets/index-CQZugZ1z-v68.js +1 -2
  326. package/adminWww/assets/index-CQZugZ1z-v69.js +1 -0
  327. package/adminWww/assets/index-CQZugZ1z-v70.js +2 -0
  328. package/adminWww/assets/index-CQZugZ1z.js +1 -1
  329. package/adminWww/assets/index-D2ymscJA-v54.js +1 -1
  330. package/adminWww/assets/index-D2ymscJA-v55.js +1 -1
  331. package/adminWww/assets/index-D2ymscJA-v56.js +1 -1
  332. package/adminWww/assets/index-D2ymscJA-v57.js +1 -1
  333. package/adminWww/assets/index-D2ymscJA-v58.js +1 -1
  334. package/adminWww/assets/index-D2ymscJA-v59.js +1 -1
  335. package/adminWww/assets/index-D2ymscJA-v60.js +1 -1
  336. package/adminWww/assets/index-D2ymscJA-v61.js +1 -950
  337. package/adminWww/assets/index-D2ymscJA-v62.js +1 -0
  338. package/adminWww/assets/index-D2ymscJA-v63.js +1 -0
  339. package/adminWww/assets/index-D2ymscJA-v64.js +1 -0
  340. package/adminWww/assets/index-D2ymscJA-v65.js +1 -0
  341. package/adminWww/assets/index-D2ymscJA-v66.js +1 -0
  342. package/adminWww/assets/index-D2ymscJA-v67.js +1 -0
  343. package/adminWww/assets/index-D2ymscJA-v68.js +1 -0
  344. package/adminWww/assets/index-D2ymscJA-v69.js +1 -0
  345. package/adminWww/assets/index-D2ymscJA-v70.js +950 -0
  346. package/adminWww/assets/index-D2ymscJA.js +950 -2
  347. package/adminWww/css/eos-branding.css +23 -296
  348. package/adminWww/index.html +13 -13
  349. package/adminWww/js/eos-assistant.js +1 -1
  350. package/adminWww/js/eos-branding.js +77 -212
  351. package/adminWww/js/eos-console-quiet.js +4 -60
  352. package/adminWww/js/eos-objects-state-tools.js +1 -1
  353. package/adminWww/js/eos-performance-guard.js +1 -1
  354. package/adminWww/js/eos-policy-client.js +188 -0
  355. package/adminWww/js/eos-role-ui.js +27 -30
  356. package/adminWww/js/eos-runtime-fixes.js +1 -1
  357. package/adminWww/js/eos-security-ui.js +30 -23
  358. package/adminWww/js/eos-toolbar-ghost-cleanup.js +102 -0
  359. package/adminWww/mf-manifest.json +1 -1
  360. package/adminWww/remoteEntry-v54.js +1 -1
  361. package/adminWww/remoteEntry-v55.js +1 -1
  362. package/adminWww/remoteEntry-v56.js +1 -1
  363. package/adminWww/remoteEntry-v57.js +1 -1
  364. package/adminWww/remoteEntry-v58.js +1 -1
  365. package/adminWww/remoteEntry-v59.js +1 -1
  366. package/adminWww/remoteEntry-v60.js +1 -1
  367. package/adminWww/remoteEntry-v61.js +1 -2
  368. package/adminWww/remoteEntry-v62.js +1 -0
  369. package/adminWww/remoteEntry-v63.js +1 -0
  370. package/adminWww/remoteEntry-v64.js +1 -0
  371. package/adminWww/remoteEntry-v65.js +1 -0
  372. package/adminWww/remoteEntry-v66.js +1 -0
  373. package/adminWww/remoteEntry-v67.js +1 -0
  374. package/adminWww/remoteEntry-v68.js +1 -0
  375. package/adminWww/remoteEntry-v69.js +1 -0
  376. package/adminWww/remoteEntry-v70.js +2 -0
  377. package/adminWww/remoteEntry.js +1 -1
  378. package/build/lib/web.js +19 -17
  379. package/build/main.js +56 -7
  380. package/io-package.json +10 -5
  381. package/package.json +6 -5
  382. package/tools/nexowatt-validate-package.cjs +6 -100
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./assets/emotion-react.browser.esm-DrKG52pD.js","./assets/iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js","./assets/_commonjsHelpers-CE1G-McA.js","./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js","./assets/emotion-cache.browser.esm-BgJfNZJN.js","./assets/extends-CF3RwP-h.js","./assets/emotion-use-insertion-effect-with-fallbacks.browser.esm-D9zECpgL.js","./assets/emotion-serialize.esm-Q4o_CgeF.js","./assets/emotion-styled.browser.esm-DOdpWCne.js","./assets/iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BywLg1Xe.js","./assets/index-D2ymscJA-v70.js","./assets/createTheme-DFX8CY6F.js","./assets/blue-CagzI6CQ.js","./assets/sdk-C-e-e2gd.js","./assets/iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js","./assets/Google-Cq8JZDSn.js","./assets/index-DcK0RDrH.js","./assets/pl-Dib-_u5L.js","./assets/iobroker_admin__loadShare__react_mf_2_dropzone__loadShare__-CwjnV48g.js","./assets/useTheme-CUNq4tF-.js","./assets/defaultTheme-Cx_JJUAa.js","./assets/useTheme-Bl-M1DYp.js","./assets/index-bCuipom1.js","./assets/iobroker_admin__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-LFZoiUTt.js","./assets/iobroker_admin__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__-CpA7pnS5.js","./assets/index-mSK_krgD.js","./assets/index-8HslT92O.js","./assets/_commonjs-dynamic-modules-TDtrdbi3.js","./assets/___vite-browser-external_commonjs-proxy-DMh1aSo_.js","./assets/iobroker_admin__loadShare__react_mf_2_dom__loadShare__-CVeAXnkk.js","./assets/ext-language_tools-ylAoucDh.js","./assets/preload-helper-BDBacUwf.js","./assets/index-jy_3EbfW.js","./assets/DefaultPropsProvider-BiXBMQYQ.js","./assets/createSvgIcon-CfRgdNUH.js","./assets/index-8JYjTPhv.js","./assets/amber-D7aVlNg3.js","./assets/TextField-CqVU6uzA.js","./assets/assertThisInitialized-B0aQ9eG_.js","./assets/ThemeProvider-BOFFjWAF.js","./assets/index-uASdmaE6.js","./assets/index-Cqq5gIUF.js","./assets/setYear-3ufv5yRD.js","./assets/en-US-DBFJNIH6.js","./assets/isSameWeek-DzRXk46v.js","./assets/locale-CLe3aX4T.js","./assets/leaflet-src-B651YTWC.js","./assets/geosearch.module-BA4ww39P.js","./assets/iobroker_admin__loadShare__leaflet__loadShare__-CNUAG3AH.js","./assets/index-4wMOc304.js","./assets/index-C_anklzA.js","./assets/ace-DEUjyTIn.js","./assets/index-D2Em8S_O.js","./assets/index-CXZCHHB6.js","./assets/index-CkI9667U.js"])))=>i.map(i=>d[i]);
2
+ import{i as m,a as p}from"./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js";import s from"./assets/virtualExposes-BIHI7g3E.js";import{_ as a}from"./assets/preload-helper-BDBacUwf.js";const n={"@emotion/react":async()=>await a(()=>import("./assets/emotion-react.browser.esm-DrKG52pD.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url),"@emotion/styled":async()=>await a(()=>import("./assets/emotion-styled.browser.esm-DOdpWCne.js"),__vite__mapDeps([8,5,9,3,7,6,1,2]),import.meta.url),"@iobroker/adapter-react-v5":async()=>await a(()=>import("./assets/index-D2ymscJA-v70.js"),__vite__mapDeps([10,11,12,1,2,3,13,14,15,16,17,18,19,20,21,9]),import.meta.url),"@iobroker/dm-gui-components":async()=>await a(()=>import("./assets/index-bCuipom1.js"),__vite__mapDeps([22,1,2,3,14,23,24]),import.meta.url),"@iobroker/json-config":async()=>await a(()=>import("./assets/index-mSK_krgD.js"),__vite__mapDeps([25,1,2,3,26,27,28,14,23,29,12,15,16,30,18,31]),import.meta.url),"@mui/icons-material":async()=>await a(()=>import("./assets/index-jy_3EbfW.js"),__vite__mapDeps([32,33,2,3,7,9,1,34,11,12,20]),import.meta.url),"@mui/material":async()=>await a(()=>import("./assets/index-8JYjTPhv.js"),__vite__mapDeps([35,11,12,1,2,3,36,34,33,7,9,20,37,21,38,19,5,29,16,39,4]),import.meta.url),"@mui/x-date-pickers":async()=>await a(()=>import("./assets/index-uASdmaE6.js"),__vite__mapDeps([40,1,2,3,33,7,9,34,11,12,20,5,37,21,38,19,29,16]),import.meta.url),"date-fns":async()=>await a(()=>import("./assets/index-Cqq5gIUF.js"),__vite__mapDeps([41,42,43,44]),import.meta.url),"date-fns/locale":async()=>await a(()=>import("./assets/locale-CLe3aX4T.js"),__vite__mapDeps([45,43,44]),import.meta.url),leaflet:async()=>await a(()=>import("./assets/leaflet-src-B651YTWC.js").then(t=>t.l),__vite__mapDeps([46,2]),import.meta.url),"leaflet-geosearch":async()=>await a(()=>import("./assets/geosearch.module-BA4ww39P.js"),__vite__mapDeps([47,48,3]),import.meta.url),react:async()=>await a(()=>import("./assets/index-4wMOc304.js").then(t=>t.i),__vite__mapDeps([49,2]),import.meta.url),"react-ace":async()=>await a(()=>import("./assets/index-C_anklzA.js").then(t=>t.i),__vite__mapDeps([50,51,16,2,1,3]),import.meta.url),"react-dom":async()=>await a(()=>import("./assets/index-D2Em8S_O.js").then(t=>t.i),__vite__mapDeps([52,2,1,3]),import.meta.url),"react-dropzone":async()=>await a(()=>import("./assets/index-CXZCHHB6.js"),__vite__mapDeps([53,1,2,3,16]),import.meta.url),semver:async()=>await a(()=>import("./assets/index-CkI9667U.js").then(t=>t.i),__vite__mapDeps([54,2]),import.meta.url)},o={"@emotion/react":{name:"@emotion/react",version:"11.14.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@emotion/react"].loaded=!0;const{"@emotion/react":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@emotion/styled":{name:"@emotion/styled",version:"11.14.1",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@emotion/styled"].loaded=!0;const{"@emotion/styled":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@iobroker/adapter-react-v5":{name:"@iobroker/adapter-react-v5",version:"8.2.9",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@iobroker/adapter-react-v5"].loaded=!0;const{"@iobroker/adapter-react-v5":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@iobroker/dm-gui-components":{name:"@iobroker/dm-gui-components",version:"9.1.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@iobroker/dm-gui-components"].loaded=!0;const{"@iobroker/dm-gui-components":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@iobroker/json-config":{name:"@iobroker/json-config",version:"8.4.7",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@iobroker/json-config"].loaded=!0;const{"@iobroker/json-config":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@mui/icons-material":{name:"@mui/icons-material",version:"6.5.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@mui/icons-material"].loaded=!0;const{"@mui/icons-material":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@mui/material":{name:"@mui/material",version:"6.5.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@mui/material"].loaded=!0;const{"@mui/material":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"@mui/x-date-pickers":{name:"@mui/x-date-pickers",version:"7.29.4",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["@mui/x-date-pickers"].loaded=!0;const{"@mui/x-date-pickers":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"date-fns":{name:"date-fns",version:"4.1.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["date-fns"].loaded=!0;const{"date-fns":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"date-fns/locale":{name:"date-fns/locale",version:"4.1.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["date-fns/locale"].loaded=!0;const{"date-fns/locale":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},leaflet:{name:"leaflet",version:"1.9.4",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o.leaflet.loaded=!0;const{leaflet:e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"leaflet-geosearch":{name:"leaflet-geosearch",version:"4.2.2",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["leaflet-geosearch"].loaded=!0;const{"leaflet-geosearch":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},react:{name:"react",version:"18.3.1",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o.react.loaded=!0;const{react:e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"react-ace":{name:"react-ace",version:"13.0.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["react-ace"].loaded=!0;const{"react-ace":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"react-dom":{name:"react-dom",version:"18.3.1",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["react-dom"].loaded=!0;const{"react-dom":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"react-dropzone":{name:"react-dropzone",version:"15.0.0",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o["react-dropzone"].loaded=!0;const{"react-dropzone":e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},semver:{name:"semver",version:"7.7.4",scope:["default"],loaded:!1,from:"iobroker_admin",async get(){o.semver.loaded=!0;const{semver:e}=n,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}}},f=[],u={},l="default",d="iobroker_admin";async function y(e={},t=[]){const r=m({name:d,remotes:f,shared:o,plugins:[],shareStrategy:"version-first"});var i=u[l];if(i||(i=u[l]={from:d}),!(t.indexOf(i)>=0)){t.push(i),r.initShareScopeMap("default",e);try{await Promise.all(await r.initializeSharing("default",{strategy:"version-first",from:"build",initScope:t}))}catch(c){console.error(c)}return p.initResolve(r),r}}function b(e){if(!(e in s))throw new Error(`Module ${e} does not exist in container.`);return s[e]().then(t=>()=>t)}export{b as get,y as init};
@@ -1 +1 @@
1
- export { get, init } from "./remoteEntry-v60.js";
1
+ export * from "./remoteEntry-v70.js";
package/build/lib/web.js CHANGED
@@ -895,23 +895,10 @@ class Web {
895
895
  const sendSecuritySession = (req, res) => {
896
896
  void this.sendEosSecuritySession(req, res).catch(e => {
897
897
  this.adapter.log.warn(`Cannot read EOS security session: ${e instanceof Error ? e.message : e}`);
898
- res.status(200).json({
899
- user: null,
900
- groups: [],
901
- groupNames: [],
902
- adminGroups: ['system.group.administrator'],
903
- installerGroups: this.getEosInstallerGroups(),
904
- endUserGroups: this.getEosEndUserGroups(),
905
- role: 'enduser',
906
- isAdministrator: false,
907
- isEosAdminGroup: false,
908
- isInstaller: false,
909
- isEndUser: true,
910
- isAdmin: false,
911
- hideLegacyAdminForNonAdmins: true,
912
- hideLegacyAdminFromNonAdmins: true,
913
- restrictProtectedAdapterControls: true,
914
- protectedAdapters: this.getEosProtectedAdapterNames(),
898
+ res.status(503).json({
899
+ error: 'EOS security context temporarily unavailable',
900
+ transient: true,
901
+ role: 'unknown',
915
902
  });
916
903
  });
917
904
  };
@@ -1141,6 +1128,21 @@ class Web {
1141
1128
  this.server.app.get('/empty.html', (_req, res) => {
1142
1129
  res.status(200).send('');
1143
1130
  });
1131
+ // Stability release: entrypoints and module-federation manifests must always
1132
+ // revalidate. Hashed leaf assets remain cacheable through express.static.
1133
+ this.server.app.use((req, res, next) => {
1134
+ const pathName = req.path || req.url.split('?')[0];
1135
+ if (pathName === '/'
1136
+ || pathName === '/index.html'
1137
+ || pathName === '/mf-manifest.json'
1138
+ || /^\/remoteEntry(?:-v\d+)?\.js$/.test(pathName)
1139
+ || /^\/assets\/(?:hostInit|index-CQZugZ1z)-[^/]+\.js$/.test(pathName)) {
1140
+ res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
1141
+ res.setHeader('Pragma', 'no-cache');
1142
+ res.setHeader('Expires', '0');
1143
+ }
1144
+ next();
1145
+ });
1144
1146
  this.server.app.get('/index.html', async (_req, res) => {
1145
1147
  this.indexHTML ||= await this.prepareIndex('/index.html');
1146
1148
  res.header('Content-Type', 'text/html');
package/build/main.js CHANGED
@@ -216,8 +216,11 @@ class Admin extends adapter_core_1.Adapter {
216
216
  delete objects[id];
217
217
  }
218
218
  }
219
- if (id === LEGACY_ADMIN_INSTANCE_ID || id === 'system.adapter.admin' || id.match(/^system\.adapter\./)) {
220
- this.scheduleEosSecurityGuard(`object change: ${id}`);
219
+ if (id.startsWith('system.adapter.')) {
220
+ const { adapter } = this.parseAdapterObjectId(id);
221
+ if (this.getProtectedAdapterNames().includes(adapter)) {
222
+ this.scheduleEosSecurityGuard(`protected object change: ${id}`);
223
+ }
221
224
  }
222
225
  // TODO Build in some threshold of messages
223
226
  socket?.objectChange(id, obj);
@@ -769,9 +772,15 @@ class Admin extends adapter_core_1.Adapter {
769
772
  if (!obj) {
770
773
  return false;
771
774
  }
775
+ const native = (obj.native ||= {});
776
+ let changed = false;
777
+ if (native._nexowattEosAclManaged !== true) {
778
+ native._nexowattEosAclManaged = true;
779
+ native._nexowattEosAclPrevious = obj.acl ? JSON.stringify(obj.acl) : null;
780
+ changed = true;
781
+ }
772
782
  const targetAcl = this.getAdminOnlyAcl();
773
783
  const acl = (obj.acl ||= {});
774
- let changed = false;
775
784
  if (acl.owner !== targetAcl.owner) {
776
785
  acl.owner = targetAcl.owner;
777
786
  changed = true;
@@ -789,14 +798,51 @@ class Admin extends adapter_core_1.Adapter {
789
798
  }
790
799
  return changed;
791
800
  }
801
+ async restoreObjectAclManagedByEos(id) {
802
+ const obj = await this.getForeignObjectAsync(id);
803
+ const native = obj?.native;
804
+ if (!obj || !native || native._nexowattEosAclManaged !== true) {
805
+ return false;
806
+ }
807
+ const targetAcl = this.getAdminOnlyAcl();
808
+ const currentAcl = obj.acl;
809
+ const stillManaged = !!currentAcl
810
+ && currentAcl.owner === targetAcl.owner
811
+ && currentAcl.ownerGroup === targetAcl.ownerGroup
812
+ && currentAcl.object === targetAcl.object;
813
+ const previous = native._nexowattEosAclPrevious;
814
+ if (stillManaged) {
815
+ if (typeof previous === 'string' && previous) {
816
+ try {
817
+ obj.acl = JSON.parse(previous);
818
+ }
819
+ catch {
820
+ delete obj.acl;
821
+ }
822
+ }
823
+ else {
824
+ delete obj.acl;
825
+ }
826
+ }
827
+ delete native._nexowattEosAclManaged;
828
+ delete native._nexowattEosAclPrevious;
829
+ await this.setForeignObjectAsync(id, obj);
830
+ return true;
831
+ }
792
832
  getLegacyAdminAclObjectIds() {
793
833
  return ['system.adapter.admin', LEGACY_ADMIN_INSTANCE_ID];
794
834
  }
795
835
  async ensureLegacyAdminVisibleOnlyToAdmins() {
836
+ let changed = false;
796
837
  if (!this.shouldHideLegacyAdminFromNonAdmins()) {
838
+ for (const id of this.getLegacyAdminAclObjectIds()) {
839
+ changed = (await this.restoreObjectAclManagedByEos(id)) || changed;
840
+ }
841
+ if (changed) {
842
+ this.log.info('EOS ACL guard restored legacy admin visibility because the restriction is disabled');
843
+ }
797
844
  return;
798
845
  }
799
- let changed = false;
800
846
  for (const id of this.getLegacyAdminAclObjectIds()) {
801
847
  changed = (await this.ensureObjectAdminOnlyAcl(id)) || changed;
802
848
  }
@@ -1047,8 +1093,8 @@ class Admin extends adapter_core_1.Adapter {
1047
1093
  await this.ensureLegacyAdminLocked();
1048
1094
  await this.ensureLegacyAdminVisibleOnlyToAdmins();
1049
1095
  if (!this.eosDeleteLockRepairFinished) {
1050
- this.eosDeleteLockRepairFinished = true;
1051
1096
  await this.repairStaleAdapterDeleteLocks();
1097
+ this.eosDeleteLockRepairFinished = true;
1052
1098
  }
1053
1099
  if (this.config.eosProtectAdapterDeletion !== false) {
1054
1100
  for (const adapter of this.getProtectedAdapterNames()) {
@@ -1064,12 +1110,15 @@ class Admin extends adapter_core_1.Adapter {
1064
1110
  }
1065
1111
  }
1066
1112
  startEosSecurityGuard() {
1067
- this.subscribeForeignObjects('system.adapter.*');
1113
+ for (const adapter of this.getProtectedAdapterNames()) {
1114
+ this.subscribeForeignObjects(`system.adapter.${adapter}`);
1115
+ this.subscribeForeignObjects(`system.adapter.${adapter}.*`);
1116
+ }
1068
1117
  void this.enforceEosSecurity('startup');
1069
1118
  if (!this.eosSecurityTimer) {
1070
1119
  this.eosSecurityTimer = setInterval(() => {
1071
1120
  void this.enforceEosSecurity('periodic');
1072
- }, 30000);
1121
+ }, 300000);
1073
1122
  }
1074
1123
  }
1075
1124
  async createUpdateInfo() {
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "eos-admin",
4
- "version": "7.9.68",
4
+ "version": "7.9.70",
5
5
  "titleLang": {
6
6
  "en": "NexoWatt EOS Admin",
7
7
  "de": "NexoWatt EOS Admin",
@@ -222,6 +222,11 @@
222
222
  "pl": "Poprawka usuwania usług/modułów: skrypty DOM security nie przechwytują kliknięć kosza, stare blokady są naprawiane i chronione pozostają tylko adaptery rdzeniowe EOS.",
223
223
  "uk": "Виправлення видалення служб/модулів: DOM security більше не перехоплює кліки кошика, старі блокування виправляються, захищені лише основні адаптери EOS.",
224
224
  "zh-cn": "服务/模块删除硬修复:DOM security 脚本不再拦截垃圾桶点击,会修复旧删除锁,仅 EOS 核心适配器受保护。"
225
+ },
226
+ "7.9.70": {
227
+ "en": "Stability consolidation: one coherent frontend runtime, resilient role policy loading, reversible EOS ACL handling, native datapoint semantics and hardened update caching.",
228
+ "de": "Stabilitätskonsolidierung: eine einheitliche Frontend-Laufzeit, robuste Rollenabfrage, reversible EOS-ACLs, native Datenpunktlogik und abgesicherter Update-Cache.",
229
+ "nl": "Stabiliteitsconsolidatie: één consistente frontend-runtime, robuuste rolcontrole, herstelbare EOS-ACLs, native datapuntlogica en veiligere updatecache."
225
230
  }
226
231
  },
227
232
  "desc": {
@@ -259,7 +264,7 @@
259
264
  "icon": "admin.svg",
260
265
  "messagebox": true,
261
266
  "enabled": true,
262
- "extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.68/admin/admin.svg",
267
+ "extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.70/admin/admin.svg",
263
268
  "keywords": [
264
269
  "NexoWatt",
265
270
  "EOS",
@@ -270,7 +275,7 @@
270
275
  "licensed"
271
276
  ],
272
277
  "compact": true,
273
- "readme": "https://unpkg.com/iobroker.eos-admin@7.9.68/README.md",
278
+ "readme": "https://unpkg.com/iobroker.eos-admin@7.9.70/README.md",
274
279
  "authors": [
275
280
  "bluefox <bluefox@ccu.io>",
276
281
  "hobbyquaker <hq@ccu.io>"
@@ -339,7 +344,7 @@
339
344
  "nondeletable": false,
340
345
  "allowAdapterUpdate": true,
341
346
  "allowAdapterDelete": false,
342
- "meta": "https://unpkg.com/iobroker.eos-admin@7.9.68/io-package.json",
347
+ "meta": "https://unpkg.com/iobroker.eos-admin@7.9.70/io-package.json",
343
348
  "npmPackage": "iobroker.eos-admin",
344
349
  "packetName": "iobroker.eos-admin"
345
350
  },
@@ -1018,5 +1023,5 @@
1018
1023
  }
1019
1024
  }
1020
1025
  },
1021
- "version": "7.9.68"
1026
+ "version": "7.9.58"
1022
1027
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iobroker.eos-admin",
3
- "description": "NexoWatt EOS Admin interface with reliable repository update mapping and technical log preservation.",
4
- "version": "7.9.68",
3
+ "description": "NexoWatt EOS Admin consolidated stability release with a single coherent frontend runtime",
4
+ "version": "7.9.70",
5
5
  "contributors": [
6
6
  "bluefox <dogafox@gmail.com>",
7
7
  "apollon77",
@@ -34,7 +34,7 @@
34
34
  "@iobroker/ws-server": "^4.4.1",
35
35
  "ajv": "^8.20.0",
36
36
  "archiver": "^7.0.1",
37
- "axios": "^1.18.0",
37
+ "axios": "^1.17.0",
38
38
  "body-parser": "^2.2.2",
39
39
  "compression": "^1.8.1",
40
40
  "cookie-parser": "^1.4.7",
@@ -114,7 +114,7 @@
114
114
  "test:integration": "mocha test/integration --exit && npm run test:gui && npm run test:rule && npm run test:unit",
115
115
  "test:rule": "mocha test/rule --exit",
116
116
  "test:gui": "mocha test/*.gui.js --exit",
117
- "prepublishOnly": "npm run check:eos-package",
117
+ "prepublishOnly": "npm run check:eos-package && npm run check:eos-stability",
118
118
  "build": "npm run build:frontend && npm run build:backend",
119
119
  "build:backend": "tsc -p tsconfig.build.json && tsx tasks.mts --backend-i18n",
120
120
  "build:frontend": "tsx tasks.mts",
@@ -137,7 +137,8 @@
137
137
  "check:eos-package": "node tools/nexowatt-validate-package.cjs",
138
138
  "nexowatt:repo-entry": "node tools/nexowatt-generate-repo-entry.cjs",
139
139
  "nexowatt:patch-repo": "node tools/nexowatt-patch-repo.cjs",
140
- "nexowatt:repair-update": "node tools/nexowatt-repair-eos-admin-update.cjs"
140
+ "nexowatt:repair-update": "node tools/nexowatt-repair-eos-admin-update.cjs",
141
+ "check:eos-stability": "node tools/nexowatt-stability-check.cjs && node tools/nexowatt-frontend-graph-check.cjs && node tools/nexowatt-policy-selftest.cjs"
141
142
  },
142
143
  "author": "NexoWatt",
143
144
  "private": false,
@@ -13,23 +13,11 @@ const exists = file => fs.existsSync(path.join(root, file));
13
13
  const pkg = readJson('package.json');
14
14
  const io = readJson('io-package.json');
15
15
 
16
- const srcPkg = readJson('src-admin/package.json');
17
- const srcLock = readJson('src-admin/package-lock.json');
18
- const srcVersion = readJson('src-admin/src/version.json');
19
- const buildInfo = readJson('NEXOWATT_EOS_BUILD_INFO.json');
20
- const cacheTag = String(pkg.version).split('.').pop();
21
-
22
16
  if (pkg.name !== 'iobroker.eos-admin') fail(`package.json name must be iobroker.eos-admin, got ${pkg.name}`);
23
17
  if (pkg.private !== false) fail('package.json private must be false for npm publishing');
24
18
  if (pkg.version !== io.common.version) fail(`package.json and io-package.json versions differ: ${pkg.version} vs ${io.common.version}`);
25
19
  if (io.common.name !== 'eos-admin') fail(`io-package common.name must be eos-admin, got ${io.common.name}`);
26
20
 
27
- if (srcPkg.version !== pkg.version) fail(`src-admin/package.json version differs: ${srcPkg.version} vs ${pkg.version}`);
28
- if (srcLock.version !== pkg.version || srcLock.packages?.['']?.version !== pkg.version) fail('src-admin/package-lock.json top-level version is stale');
29
- if (srcVersion.version !== pkg.version) fail(`src-admin/src/version.json version differs: ${srcVersion.version} vs ${pkg.version}`);
30
- if (buildInfo.version !== pkg.version) fail(`NEXOWATT_EOS_BUILD_INFO.json version differs: ${buildInfo.version} vs ${pkg.version}`);
31
- if (!String(buildInfo.uiVersion || '').startsWith(`v${cacheTag}-`)) fail(`build info uiVersion must start with v${cacheTag}-, got ${buildInfo.uiVersion}`);
32
-
33
21
  if (io.common.packetName !== 'iobroker.eos-admin') fail(`io-package common.packetName must be iobroker.eos-admin, got ${io.common.packetName}`);
34
22
  if (io.common.npmPackage !== 'iobroker.eos-admin') fail(`io-package common.npmPackage must be iobroker.eos-admin, got ${io.common.npmPackage}`);
35
23
  if (io.native.port !== 8091 && io.native.port !== 8081) fail(`unexpected default port ${io.native.port}`);
@@ -49,11 +37,7 @@ for (const [field, expected] of Object.entries({
49
37
  for (const file of [
50
38
  'adminWww/index.html',
51
39
  'adminWww/js/eos-branding.js',
52
- 'adminWww/js/eos-adapter-surface-cleanup.js',
53
40
  'adminWww/css/eos-branding.css',
54
- 'src-admin/public/js/eos-branding.js',
55
- 'src-admin/public/js/eos-adapter-surface-cleanup.js',
56
- 'src-admin/public/css/eos-branding.css',
57
41
  'adminWww/img/eos/nexowatt-192.png',
58
42
  'admin/admin.svg',
59
43
  'LICENSE',
@@ -68,40 +52,6 @@ const refs = [...index.matchAll(/(?:src|href)="\.\/([^"?#]+)(?:\?[^"#]*)?"/g)].m
68
52
  const missing = refs.filter(ref => !exists(path.join('adminWww', ref)));
69
53
  if (missing.length) fail(`adminWww/index.html references missing files:\n${missing.join('\n')}`);
70
54
 
71
-
72
- const adminIndex = fs.readFileSync(path.join(root, 'adminWww/index.html'), 'utf8');
73
- const sourceIndex = fs.readFileSync(path.join(root, 'src-admin/index.html'), 'utf8');
74
- if (!adminIndex.includes('no-cache, no-store, must-revalidate') || !sourceIndex.includes('no-cache, no-store, must-revalidate')) fail('index files must disable stale HTML caching');
75
- for (const asset of [
76
- 'eos-console-quiet.js', 'eos-branding.css', 'eos-branding.js',
77
- 'eos-adapter-surface-cleanup.js', 'eos-security-ui.js', 'eos-role-ui.js',
78
- 'eos-assistant.js', 'eos-objects-state-tools.js'
79
- ]) {
80
- const escaped = asset.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
81
- if (!new RegExp(`${escaped}\\?v=${cacheTag}(?:["'])`).test(adminIndex)) fail(`adminWww/index.html cache tag is stale for ${asset}`);
82
- if (!new RegExp(`${escaped}\\?v=${cacheTag}(?:["'])`).test(sourceIndex)) fail(`src-admin/index.html cache tag is stale for ${asset}`);
83
- }
84
- for (const entry of ['hostInit-v61.js', 'index-CQZugZ1z-v68.js']) {
85
- const escaped = entry.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
86
- if (!new RegExp(`${escaped}\\?v=${cacheTag}(?:["'])`).test(adminIndex)) fail(`adminWww/index.html entry cache tag is stale for ${entry}`);
87
- }
88
-
89
- for (const file of ['eos-branding.js', 'eos-adapter-surface-cleanup.js', 'eos-console-quiet.js', 'eos-security-ui.js', 'eos-role-ui.js', 'eos-assistant.js', 'eos-objects-state-tools.js']) {
90
- const deployed = fs.readFileSync(path.join(root, 'adminWww/js', file));
91
- const source = fs.readFileSync(path.join(root, 'src-admin/public/js', file));
92
- if (!deployed.equals(source)) fail(`source/deployed script drift: ${file}`);
93
- }
94
- if (!fs.readFileSync(path.join(root, 'adminWww/css/eos-branding.css')).equals(fs.readFileSync(path.join(root, 'src-admin/public/css/eos-branding.css')))) {
95
- fail('source/deployed eos-branding.css drift');
96
- }
97
-
98
- for (let version = 54; version <= 60; version += 1) {
99
- for (const file of [`Objects-DPan0bzw-v${version}.js`, `index-D2ymscJA-v${version}.js`]) {
100
- const stat = fs.statSync(path.join(root, 'adminWww/assets', file));
101
- if (stat.size > 256) fail(`${file} must be a compatibility shim, got ${stat.size} bytes`);
102
- }
103
- }
104
-
105
55
  const bootstrapFiles = fs.readdirSync(path.join(root, 'adminWww/assets')).filter(f => /^bootstrap-.*\.js$/.test(f));
106
56
  if (!bootstrapFiles.length) fail('missing bootstrap bundle');
107
57
  const bootstrap = bootstrapFiles.map(f => fs.readFileSync(path.join(root, 'adminWww/assets', f), 'utf8')).join('\n');
@@ -116,57 +66,13 @@ if (index.includes('eos-hard-logout.js')) fail('adminWww/index.html must not loa
116
66
  if (!branding.includes('isAdapterConfigSurface')) fail('eos-branding.js lacks native adapter config safe-mode detection');
117
67
  if (!branding.includes('Adapter UIs must remain 100% functional')) fail('eos-branding.js lacks native adapter config interaction guard');
118
68
  if (!branding.includes('v38: All native Admin dialogs') || !branding.includes('ensurePopupCompatibility')) fail('eos-branding.js lacks v38 popup compatibility guard');
119
-
120
- if (!branding.includes('eos-native-drawer-header-hidden') || !branding.includes("header.setAttribute('inert', '')")) fail('eos-branding.js lacks the native drawer-header guard');
121
- if (!branding.includes('removeStrayNativeDrawerHeaders') || !branding.includes('a[href=\"/#easy\"]')) fail('eos-branding.js lacks structural native drawer-header cleanup');
122
- if (!branding.includes('ensureStandaloneNavToggle')) fail('eos-branding.js lacks the independent EOS navigation toggle');
123
- const activeGraph = [
124
- fs.readFileSync(path.join(root, 'adminWww/assets/index-CQZugZ1z-v68.js'), 'utf8'),
125
- fs.readFileSync(path.join(root, 'adminWww/assets/bootstrap-COulQZax-v68.js'), 'utf8'),
126
- fs.readFileSync(path.join(root, 'adminWww/remoteEntry-v61.js'), 'utf8'),
127
- ].join('\n');
128
- if (/bootstrap-COulQZax-v61\.js|(?:AdapterUpdateDialog|Adapters|Config|CustomTab|DeviceManager|EasyMode|Enums|Fields|Files|Hosts|Instances|Intro|Logs|Objects|Users)-[^\"']+-v61\.js/.test(activeGraph)) fail('active v67 frontend graph still imports a v61 application runtime/route chunk');
129
-
130
- const drawerSource = fs.readFileSync(path.join(root, 'src-admin/src/components/Drawer.tsx'), 'utf8');
131
- const activeBootstrap = fs.readFileSync(path.join(root, 'adminWww/assets/bootstrap-COulQZax-v68.js'), 'utf8');
132
- const brandingCss = fs.readFileSync(path.join(root, 'adminWww/css/eos-branding.css'), 'utf8');
133
- if (!drawerSource.includes('if (!this.isSwipeable())') || !drawerSource.includes('return null;')) fail('Drawer.tsx still renders the native desktop drawer header');
134
- if (!activeBootstrap.includes('getHeader(){if(!this.isSwipeable())return null;')) fail('active bootstrap still renders the native desktop drawer header');
135
- if (!brandingCss.includes('a[href=\"/#easy\"]') || !brandingCss.includes('data-eos-native-drawer-header-hidden')) fail('branding CSS lacks structural native drawer-header fallback');
136
-
137
- const appSource = fs.readFileSync(path.join(root, 'src-admin/src/App.tsx'), 'utf8');
138
- if (!branding.includes('eos-primary-brand') || !branding.includes('toolbar.firstElementChild')) fail('branding lacks robust primary EOS brand insertion');
139
- if (!branding.includes('removeNativeTopLeftGhost') || !branding.includes('a[href=\"/#easy\"]')) fail('branding lacks exact native toolbar ghost removal');
140
- if (!brandingCss.includes('data-eos-primary-brand') || !brandingCss.includes('v7.9.68: exact native desktop toolbar ghost removal')) fail('branding CSS lacks primary-brand/exact-toolbar safeguards');
141
- if (!activeBootstrap.includes('getHeader(){if(!this.isSwipeable())return null;')) fail('fresh v68 bootstrap still renders desktop Drawer.getHeader()');
142
- if (!appSource.includes('{small && (') || !appSource.includes('{small &&\n this.state.drawerState')) fail('App.tsx still renders native desktop toolbar identity controls');
143
- if (!activeBootstrap.includes('children:[e&&jsxRuntimeExports.jsx(')) fail('v68 bootstrap still renders native desktop MenuIcon');
144
- if (!activeBootstrap.includes('this.renderLoggedUser(),e&&this.state.drawerState')) fail('v68 bootstrap still renders the native desktop compact identity block');
145
- if (!activeBootstrap.includes('const version$b=\"7.9.68\"')) fail('v68 bootstrap frontend version marker is stale');
146
-
147
- for (const file of [
148
- 'AdapterUpdateDialog-BMg84Hpf-v67.js', 'Adapters-B5_jQ7DE-v67.js', 'Config-hHK2UzGP-v67.js',
149
- 'CustomTab-B0wqoazH-v67.js', 'DeviceManager-BFmQeYQ1-v67.js', 'EasyMode-B1d9Vdc4-v67.js',
150
- 'Enums-DbWYxKOo-v67.js', 'Fields-CX3rKuWb-v67.js', 'Files-Cd2HOzIE-v67.js',
151
- 'Hosts-Bg8QzW5i-v67.js', 'Instances-YdaGnS5a-v67.js', 'Intro-DkwRiz1n-v67.js',
152
- 'Logs-CsVPSLJH-v67.js', 'Objects-DPan0bzw-v67.js', 'Users-BgnBRgwU-v67.js',
153
- ]) {
154
- if (!exists(path.join('adminWww/assets', file))) fail(`missing compatible route chunk: ${file}`);
155
- const chunk = fs.readFileSync(path.join(root, 'adminWww/assets', file), 'utf8');
156
- if (chunk.includes('bootstrap-COulQZax-v61.js')) fail(`${file} still imports bootstrap-v61`);
157
- }
158
-
159
- const activeAdapterReact = fs.readFileSync(path.join(root, 'adminWww/assets/index-D2ymscJA-v61.js'), 'utf8');
160
- const activeObjects = fs.readFileSync(path.join(root, 'adminWww/assets/Objects-DPan0bzw-v67.js'), 'utf8');
161
- const activeAdapters = fs.readFileSync(path.join(root, 'adminWww/assets/Adapters-B5_jQ7DE-v67.js'), 'utf8');
162
- for (const marker of ['eos-object-value-cell', 'data-eos-object-writable']) {
163
- if (!activeAdapterReact.includes(marker)) fail(`active ObjectBrowser bundle lacks required marker: ${marker}`);
164
- }
165
- for (const marker of ['Cannot write state', 'common.write=false', 'enableStateValueEdit']) {
166
- if (!activeObjects.includes(marker)) fail(`active Objects bundle lacks native write-semantics marker: ${marker}`);
167
- }
168
- if (!activeAdapters.includes('install-specific-version')) fail('active Adapters bundle lacks the expert specific-version action');
169
69
  const mainBuild = fs.readFileSync(path.join(root, 'build/main.js'), 'utf8');
170
70
  if (!mainBuild.includes('v37 BackItUp/runtime-adapter compatibility')) fail('build/main.js lacks v37 BackItUp compatibility guard');
171
71
 
72
+
73
+ const srcPkg = readJson('src-admin/package.json');
74
+ const srcVersion = readJson('src-admin/src/version.json');
75
+ if (srcPkg.version !== pkg.version || srcVersion.version !== pkg.version) fail('src-admin versions must match package.json');
76
+ if (!index.includes('hostInit-v70.js?v=70') || !index.includes('index-CQZugZ1z-v70.js?v=70')) fail('adminWww/index.html must load the v70 runtime');
77
+
172
78
  console.log('[NexoWatt EOS package validation] OK');