homebridge-config-ui-x 4.78.2-beta.6 → 4.78.2-beta.7

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 (138) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/package.json +1 -1
  3. package/public/3rdpartylicenses.txt +132 -132
  4. package/public/assets/hap-icons/{airpurifier.svg → air-purifier.svg} +11 -11
  5. package/public/assets/hap-icons/{filtermaintenance.svg → filter-maintenance.svg} +1 -1
  6. package/public/{chunk-CBI6QSZV.js → chunk-24HGAFIA.js} +1 -1
  7. package/public/chunk-335BVUT7.js +1 -0
  8. package/public/chunk-3FIZ5SHA.js +1 -0
  9. package/public/chunk-3K6K2EED.js +2 -0
  10. package/public/{chunk-DAG2QHQS.js → chunk-4SCDQJ67.js} +1 -1
  11. package/public/chunk-5MYMUS7R.js +3 -0
  12. package/public/chunk-5QYOJ5G7.js +1 -0
  13. package/public/chunk-5SOTFW4L.js +1 -0
  14. package/public/{chunk-NK2NFLKG.js → chunk-5XE7ACAJ.js} +16 -16
  15. package/public/chunk-7UNMO36V.js +1 -0
  16. package/public/chunk-CHQMUTDZ.js +4 -0
  17. package/public/chunk-CIJ7JUI4.js +1 -0
  18. package/public/chunk-DFK6HAB2.js +1 -0
  19. package/public/chunk-F3ERQJVG.js +1 -0
  20. package/public/chunk-FSQU6S5U.js +1 -0
  21. package/public/chunk-G7MJKB2I.js +1 -0
  22. package/public/chunk-GMZYTKA7.js +1 -0
  23. package/public/chunk-GW2DVJRQ.js +1 -0
  24. package/public/chunk-HDDSK4T6.js +1 -0
  25. package/public/chunk-HDIZOXS3.js +1 -0
  26. package/public/chunk-HVYATWTL.js +1 -0
  27. package/public/chunk-IN7NZAFJ.js +1 -0
  28. package/public/chunk-J4CE5VUG.js +1 -0
  29. package/public/chunk-J6YDFLQQ.js +1 -0
  30. package/public/chunk-JKFIZ5HO.js +1 -0
  31. package/public/chunk-JL52RNPX.js +1 -0
  32. package/public/chunk-KX4HFAMS.js +1 -0
  33. package/public/chunk-KZXWMOV5.js +1 -0
  34. package/public/chunk-M7Q25OA7.js +12 -0
  35. package/public/chunk-N2BRDQMV.js +1 -0
  36. package/public/chunk-NFOOVJXR.js +23 -0
  37. package/public/chunk-NHCHG3Z6.js +1 -0
  38. package/public/chunk-NJPGGFP6.js +1 -0
  39. package/public/{chunk-XG2LZ5YY.js → chunk-OCUYP77B.js} +1 -1
  40. package/public/{chunk-4BJSFL2Y.js → chunk-OFS35DEJ.js} +1 -1
  41. package/public/chunk-OQR4JGQQ.js +1 -0
  42. package/public/{chunk-Y2PNA6DE.js → chunk-PBJK6VW5.js} +1 -1
  43. package/public/chunk-RCXJKKFJ.js +1 -0
  44. package/public/chunk-RDHSN5YP.js +1 -0
  45. package/public/chunk-RPGBJBQM.js +1 -0
  46. package/public/chunk-RTYG6XT7.js +1 -0
  47. package/public/chunk-SRAPPW2T.js +4 -0
  48. package/public/chunk-TQNKRJOX.js +1 -0
  49. package/public/chunk-TTFPDSBH.js +20 -0
  50. package/public/chunk-UJKWN6WW.js +1 -0
  51. package/public/{chunk-YTSL4WKW.js → chunk-UQYCFN3T.js} +1 -1
  52. package/public/chunk-V5SJINUD.js +1 -0
  53. package/public/chunk-WBSGPRW6.js +1 -0
  54. package/public/chunk-WIKVE33G.js +1 -0
  55. package/public/chunk-YO4OJGZL.js +1 -0
  56. package/public/chunk-ZYZKPRJW.js +5 -0
  57. package/public/index.html +1 -1
  58. package/public/main-HK64V7MI.js +1 -0
  59. package/public/chunk-3M3LYAQE.js +0 -12
  60. package/public/chunk-43J7JFEW.js +0 -1
  61. package/public/chunk-44IGDA63.js +0 -20
  62. package/public/chunk-4FDYN46N.js +0 -1
  63. package/public/chunk-4LHJMVSY.js +0 -1
  64. package/public/chunk-57UTMJGE.js +0 -1
  65. package/public/chunk-5NA3TF4F.js +0 -1
  66. package/public/chunk-5PDHMX7W.js +0 -1
  67. package/public/chunk-5YNLNGZ5.js +0 -1
  68. package/public/chunk-5ZWZPDTW.js +0 -1
  69. package/public/chunk-64G2XLCY.js +0 -1
  70. package/public/chunk-6YHH6GRK.js +0 -1
  71. package/public/chunk-7FD3EC7J.js +0 -1
  72. package/public/chunk-7L7SQDYV.js +0 -1
  73. package/public/chunk-7SQ4IUHG.js +0 -1
  74. package/public/chunk-7ZUABUGF.js +0 -1
  75. package/public/chunk-AAGRUQ3L.js +0 -1
  76. package/public/chunk-AGMUQTYT.js +0 -1
  77. package/public/chunk-AY7YHLF5.js +0 -1
  78. package/public/chunk-D5KUP2IN.js +0 -1
  79. package/public/chunk-EC45LZRT.js +0 -1
  80. package/public/chunk-FLUPYWZS.js +0 -1
  81. package/public/chunk-GDATHGOO.js +0 -1
  82. package/public/chunk-HIS7LSRI.js +0 -1
  83. package/public/chunk-HZX4WF3S.js +0 -1
  84. package/public/chunk-I2QUQBAW.js +0 -4
  85. package/public/chunk-IW6XEFCM.js +0 -1
  86. package/public/chunk-JSIQOSLL.js +0 -1
  87. package/public/chunk-LT5CMZDW.js +0 -1
  88. package/public/chunk-LUXCCQQL.js +0 -1
  89. package/public/chunk-M2VSSHSQ.js +0 -1
  90. package/public/chunk-MDLOSX7S.js +0 -1
  91. package/public/chunk-MPYT6HUF.js +0 -6
  92. package/public/chunk-MQRLDXY4.js +0 -2
  93. package/public/chunk-MRYFWEYJ.js +0 -1
  94. package/public/chunk-MTSRP6CH.js +0 -1
  95. package/public/chunk-NN56KM2H.js +0 -1
  96. package/public/chunk-O4LE6SSC.js +0 -1
  97. package/public/chunk-OTZLBFXM.js +0 -1
  98. package/public/chunk-OVZ7RBX7.js +0 -1
  99. package/public/chunk-OXZSZ7EG.js +0 -1
  100. package/public/chunk-PIECQSRV.js +0 -1
  101. package/public/chunk-QMYZYVHJ.js +0 -1
  102. package/public/chunk-RMRSUZQP.js +0 -1
  103. package/public/chunk-RZN5G7GN.js +0 -1
  104. package/public/chunk-SDNVGLAU.js +0 -1
  105. package/public/chunk-SZYNXHCU.js +0 -1
  106. package/public/chunk-T3KR6EXW.js +0 -1
  107. package/public/chunk-TPD36M27.js +0 -1
  108. package/public/chunk-TSIY6PJJ.js +0 -1
  109. package/public/chunk-TXPBA7PT.js +0 -1
  110. package/public/chunk-UATHJCGZ.js +0 -1
  111. package/public/chunk-V4DPW5O4.js +0 -1
  112. package/public/chunk-VRXWQ576.js +0 -1
  113. package/public/chunk-XOOLTRP4.js +0 -5
  114. package/public/chunk-XV2ZQK64.js +0 -1
  115. package/public/chunk-YLKV5TBR.js +0 -23
  116. package/public/chunk-ZSGWVVUL.js +0 -1
  117. package/public/main-BLZ4VGMT.js +0 -1
  118. /package/public/assets/hap-icons/{airquality.svg → air-quality-sensor.svg} +0 -0
  119. /package/public/assets/hap-icons/{co2-sensor.svg → carbon-dioxide-sensor.svg} +0 -0
  120. /package/public/assets/hap-icons/{co-sensor.svg → carbon-monoxide-sensor.svg} +0 -0
  121. /package/public/assets/hap-icons/{contactsensor-closed.svg → contact-sensor-closed.svg} +0 -0
  122. /package/public/assets/hap-icons/{contactsensor-open.svg → contact-sensor-open.svg} +0 -0
  123. /package/public/assets/hap-icons/{garagedoor.svg → garage-door.svg} +0 -0
  124. /package/public/assets/hap-icons/{humidity.svg → humidity-sensor.svg} +0 -0
  125. /package/public/assets/hap-icons/{leaksensor.svg → leak-sensor.svg} +0 -0
  126. /package/public/assets/hap-icons/{lightbulb.svg → light-bulb.svg} +0 -0
  127. /package/public/assets/hap-icons/{light.svg → light-sensor.svg} +0 -0
  128. /package/public/assets/hap-icons/{motionsensor.svg → motion-sensor.svg} +0 -0
  129. /package/public/assets/hap-icons/{occupancysensor.svg → occupancy-sensor.svg} +0 -0
  130. /package/public/assets/hap-icons/{securitysystem-active.svg → security-system-active.svg} +0 -0
  131. /package/public/assets/hap-icons/{securitysystem-off.svg → security-system-off.svg} +0 -0
  132. /package/public/assets/hap-icons/{securitysystem-triggered.svg → security-system-triggered.svg} +0 -0
  133. /package/public/assets/hap-icons/{smokesensor.svg → smoke-sensor.svg} +0 -0
  134. /package/public/assets/hap-icons/{statelessprogrammableswitch.svg → stateless-programmable-switch.svg} +0 -0
  135. /package/public/assets/hap-icons/{valve-waterfaucet.svg → valve-faucet.svg} +0 -0
  136. /package/public/assets/hap-icons/{valve-showerhead.svg → valve-shower-head.svg} +0 -0
  137. /package/public/assets/hap-icons/{windowcovering-closed.svg → window-covering-closed.svg} +0 -0
  138. /package/public/assets/hap-icons/{windowcovering-open.svg → window-covering-open.svg} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  All notable changes to `homebridge-config-ui-x` will be documented in this file. This project tries to adhere to [Semantic Versioning](http://semver.org/).
4
4
 
5
- ## v4.79.0 (2025-07-06)
5
+ ## v4.79.0 (2025-07-07)
6
6
 
7
7
  ### ⚠️ Upcoming Deprecations:
8
8
 
@@ -37,6 +37,14 @@ All notable changes to `homebridge-config-ui-x` will be documented in this file.
37
37
  - add plugin search button, hide bar by default
38
38
  - add tab in plugins showing plugin analytics in `iframe`
39
39
 
40
+ ### Other Changes
41
+
42
+ - code cleanup inside angular module files
43
+ - refactor ui types into interface files
44
+ - rename hap icon files for consistency
45
+ - rename accessory type component files for consistency
46
+ - angular-wide code refactoring and cleanup
47
+
40
48
  ### Homebridge Dependencies
41
49
 
42
50
  - `@homebridge/hap-client` @ `v3.1.0`
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "homebridge-config-ui-x",
3
3
  "displayName": "Homebridge UI",
4
- "version": "4.78.2-beta.6",
4
+ "version": "4.78.2-beta.7",
5
5
  "description": "A web based management, configuration and control platform for Homebridge.",
6
6
  "author": "oznu <dev@oz.nu>",
7
7
  "license": "MIT",
@@ -233,6 +233,84 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
233
233
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
234
234
  SOFTWARE.
235
235
 
236
+ --------------------------------------------------------------------------------
237
+ Package: ng-inline-svg-2
238
+ License: "MIT"
239
+
240
+ The MIT License (MIT)
241
+
242
+ Copyright (c) 2016 Eugene Cheung
243
+
244
+ Permission is hereby granted, free of charge, to any person obtaining a copy
245
+ of this software and associated documentation files (the "Software"), to deal
246
+ in the Software without restriction, including without limitation the rights
247
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
248
+ copies of the Software, and to permit persons to whom the Software is
249
+ furnished to do so, subject to the following conditions:
250
+
251
+ The above copyright notice and this permission notice shall be included in
252
+ all copies or substantial portions of the Software.
253
+
254
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
255
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
256
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
257
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
258
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
259
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
260
+ THE SOFTWARE.
261
+
262
+ --------------------------------------------------------------------------------
263
+ Package: nouislider
264
+ License: "MIT"
265
+
266
+ MIT License
267
+
268
+ Copyright (c) 2019 Léon Gersen
269
+
270
+ Permission is hereby granted, free of charge, to any person obtaining a copy
271
+ of this software and associated documentation files (the "Software"), to deal
272
+ in the Software without restriction, including without limitation the rights
273
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
274
+ copies of the Software, and to permit persons to whom the Software is
275
+ furnished to do so, subject to the following conditions:
276
+
277
+ The above copyright notice and this permission notice shall be included in all
278
+ copies or substantial portions of the Software.
279
+
280
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
281
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
282
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
283
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
284
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
285
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
286
+ SOFTWARE.
287
+
288
+ --------------------------------------------------------------------------------
289
+ Package: ng2-nouislider
290
+ License: "MIT"
291
+
292
+ MIT License
293
+
294
+ Copyright (c) 2017-2019 Tomasz Bak https://www.tomaszbak.com/
295
+
296
+ Permission is hereby granted, free of charge, to any person obtaining a copy
297
+ of this software and associated documentation files (the "Software"), to deal
298
+ in the Software without restriction, including without limitation the rights
299
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
300
+ copies of the Software, and to permit persons to whom the Software is
301
+ furnished to do so, subject to the following conditions:
302
+
303
+ The above copyright notice and this permission notice shall be included in all
304
+ copies or substantial portions of the Software.
305
+
306
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
307
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
308
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
309
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
310
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
311
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
312
+ SOFTWARE.
313
+
236
314
  --------------------------------------------------------------------------------
237
315
  Package: @kurkle/color
238
316
  License: "MIT"
@@ -378,97 +456,19 @@ Package: dragula
378
456
  License: "MIT"
379
457
 
380
458
 
381
- --------------------------------------------------------------------------------
382
- Package: @homebridge/hap-client
383
- License: "MIT"
384
-
385
- MIT License
386
-
387
- Copyright (c) 2023-2025 Homebridge
388
- Copyright (c) 2020-2023 oznu <dev@oz.nu>
389
-
390
- Permission is hereby granted, free of charge, to any person obtaining a copy
391
- of this software and associated documentation files (the "Software"), to deal
392
- in the Software without restriction, including without limitation the rights
393
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
394
- copies of the Software, and to permit persons to whom the Software is
395
- furnished to do so, subject to the following conditions:
396
-
397
- The above copyright notice and this permission notice shall be included in all
398
- copies or substantial portions of the Software.
399
-
400
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
401
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
402
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
403
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
404
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
405
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
406
- SOFTWARE.
407
-
408
459
  --------------------------------------------------------------------------------
409
460
  Package: ng2-dragula
410
461
  License: "MIT"
411
462
 
412
463
 
413
464
  --------------------------------------------------------------------------------
414
- Package: ng-inline-svg-2
415
- License: "MIT"
416
-
417
- The MIT License (MIT)
418
-
419
- Copyright (c) 2016 Eugene Cheung
420
-
421
- Permission is hereby granted, free of charge, to any person obtaining a copy
422
- of this software and associated documentation files (the "Software"), to deal
423
- in the Software without restriction, including without limitation the rights
424
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
425
- copies of the Software, and to permit persons to whom the Software is
426
- furnished to do so, subject to the following conditions:
427
-
428
- The above copyright notice and this permission notice shall be included in
429
- all copies or substantial portions of the Software.
430
-
431
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
432
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
433
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
434
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
435
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
436
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
437
- THE SOFTWARE.
438
-
439
- --------------------------------------------------------------------------------
440
- Package: nouislider
441
- License: "MIT"
442
-
443
- MIT License
444
-
445
- Copyright (c) 2019 Léon Gersen
446
-
447
- Permission is hereby granted, free of charge, to any person obtaining a copy
448
- of this software and associated documentation files (the "Software"), to deal
449
- in the Software without restriction, including without limitation the rights
450
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
451
- copies of the Software, and to permit persons to whom the Software is
452
- furnished to do so, subject to the following conditions:
453
-
454
- The above copyright notice and this permission notice shall be included in all
455
- copies or substantial portions of the Software.
456
-
457
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
458
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
459
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
460
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
461
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
462
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
463
- SOFTWARE.
464
-
465
- --------------------------------------------------------------------------------
466
- Package: ng2-nouislider
465
+ Package: @homebridge/hap-client
467
466
  License: "MIT"
468
467
 
469
468
  MIT License
470
469
 
471
- Copyright (c) 2017-2019 Tomasz Bak https://www.tomaszbak.com/
470
+ Copyright (c) 2023-2025 Homebridge
471
+ Copyright (c) 2020-2023 oznu <dev@oz.nu>
472
472
 
473
473
  Permission is hereby granted, free of charge, to any person obtaining a copy
474
474
  of this software and associated documentation files (the "Software"), to deal
@@ -809,6 +809,31 @@ Package: ngx-monaco-editor-v2
809
809
  License: "MIT"
810
810
 
811
811
 
812
+ --------------------------------------------------------------------------------
813
+ Package: mobile-detect
814
+ License: "MIT"
815
+
816
+ The MIT License (MIT)
817
+
818
+ Copyright (c) 2013 Heinrich Goebl
819
+
820
+ Permission is hereby granted, free of charge, to any person obtaining a copy
821
+ of this software and associated documentation files (the "Software"), to deal
822
+ in the Software without restriction, including without limitation the rights
823
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
824
+ copies of the Software, and to permit persons to whom the Software is
825
+ furnished to do so, subject to the following conditions:
826
+
827
+ The above copyright notice and this permission notice shall be included in
828
+ all copies or substantial portions of the Software.
829
+
830
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
831
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
832
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
833
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
834
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
835
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
836
+ THE SOFTWARE.
812
837
  --------------------------------------------------------------------------------
813
838
  Package: prismjs
814
839
  License: "MIT"
@@ -894,31 +919,6 @@ Package: ngx-md
894
919
  License: "MIT"
895
920
 
896
921
 
897
- --------------------------------------------------------------------------------
898
- Package: mobile-detect
899
- License: "MIT"
900
-
901
- The MIT License (MIT)
902
-
903
- Copyright (c) 2013 Heinrich Goebl
904
-
905
- Permission is hereby granted, free of charge, to any person obtaining a copy
906
- of this software and associated documentation files (the "Software"), to deal
907
- in the Software without restriction, including without limitation the rights
908
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
909
- copies of the Software, and to permit persons to whom the Software is
910
- furnished to do so, subject to the following conditions:
911
-
912
- The above copyright notice and this permission notice shall be included in
913
- all copies or substantial portions of the Software.
914
-
915
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
916
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
917
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
918
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
919
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
920
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
921
- THE SOFTWARE.
922
922
  --------------------------------------------------------------------------------
923
923
  Package: file-saver
924
924
  License: "MIT"
@@ -1161,32 +1161,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1161
1161
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1162
1162
  THE SOFTWARE.
1163
1163
 
1164
- --------------------------------------------------------------------------------
1165
- Package: @angular/router
1166
- License: "MIT"
1167
-
1168
- The MIT License
1169
-
1170
- Copyright (c) 2010-2025 Google LLC. https://angular.dev/license
1171
-
1172
- Permission is hereby granted, free of charge, to any person obtaining a copy
1173
- of this software and associated documentation files (the "Software"), to deal
1174
- in the Software without restriction, including without limitation the rights
1175
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1176
- copies of the Software, and to permit persons to whom the Software is
1177
- furnished to do so, subject to the following conditions:
1178
-
1179
- The above copyright notice and this permission notice shall be included in
1180
- all copies or substantial portions of the Software.
1181
-
1182
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1183
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1184
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1185
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1186
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1187
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1188
- THE SOFTWARE.
1189
-
1190
1164
  --------------------------------------------------------------------------------
1191
1165
  Package: engine.io-parser
1192
1166
  License: "MIT"
@@ -1345,6 +1319,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1345
1319
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1346
1320
  SOFTWARE.
1347
1321
 
1322
+ --------------------------------------------------------------------------------
1323
+ Package: @angular/router
1324
+ License: "MIT"
1325
+
1326
+ The MIT License
1327
+
1328
+ Copyright (c) 2010-2025 Google LLC. https://angular.dev/license
1329
+
1330
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1331
+ of this software and associated documentation files (the "Software"), to deal
1332
+ in the Software without restriction, including without limitation the rights
1333
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1334
+ copies of the Software, and to permit persons to whom the Software is
1335
+ furnished to do so, subject to the following conditions:
1336
+
1337
+ The above copyright notice and this permission notice shall be included in
1338
+ all copies or substantial portions of the Software.
1339
+
1340
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1341
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1342
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1343
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1344
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1345
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1346
+ THE SOFTWARE.
1347
+
1348
1348
  --------------------------------------------------------------------------------
1349
1349
  Package: dayjs
1350
1350
  License: "MIT"
@@ -8,11 +8,11 @@
8
8
  xmlns:xlink="http://www.w3.org/1999/xlink"
9
9
  >
10
10
  <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
- <g id="airpurifier" transform="translate(7.000000, 5.000000)">
11
+ <g id="air-purifier" transform="translate(7.000000, 5.000000)">
12
12
  <path
13
13
  d="M-4.26325641e-14,6.22067087 C4.02953795,8.50225516 12.4315562,9.67933849 25.2060547,9.75192087 C32.8391014,9.79529045 51.5791554,2.41088415 63.7714844,0.357389618 C69.2464736,-0.564736121 76.8610569,0.297568567 86.6152344,2.94430368"
14
14
  id="Line"
15
- class="airpurifier_off_grey"
15
+ class="air-purifier_off_grey"
16
16
  stroke="#5BC8FA"
17
17
  stroke-width="10"
18
18
  stroke-linecap="square"
@@ -20,7 +20,7 @@
20
20
  <path
21
21
  d="M-4.26325641e-14,30.2206709 C4.02953795,32.5022552 12.4315562,33.6793385 25.2060547,33.7519209 C32.8391014,33.7952905 51.5791554,26.4108841 63.7714844,24.3573896 C69.2464736,23.4352639 76.8610569,24.2975686 86.6152344,26.9443037"
22
22
  id="Line"
23
- class="airpurifier_off_grey"
23
+ class="air-purifier_off_grey"
24
24
  stroke="#91DBFB"
25
25
  stroke-width="10"
26
26
  stroke-linecap="square"
@@ -28,23 +28,23 @@
28
28
  <path
29
29
  d="M-4.26325641e-14,54.2206709 C4.02953795,56.5022552 12.4315562,57.6793385 25.2060547,57.7519209 C32.8391014,57.7952905 51.5791554,50.4108841 63.7714844,48.3573896 C69.2464736,47.4352639 76.8610569,48.2975686 86.6152344,50.9443037"
30
30
  id="Line"
31
- class="airpurifier_off_grey"
31
+ class="air-purifier_off_grey"
32
32
  stroke="#C8EAFE"
33
33
  stroke-width="10"
34
34
  stroke-linecap="square"
35
35
  />
36
36
  <polygon
37
37
  id="Path"
38
- class="airpurifier_off_grey"
38
+ class="air-purifier_off_grey"
39
39
  fill="#C7C5CB"
40
40
  points="17.2333685 76.7914641 70.0374945 76.7914641 73.9430133 79.2866885 76.8250853 84.9649087 87.1832833 114.139252 87.1832833 140.017181 85.5385126 142.175202 83.1303576 143.984565 5.21741581 143.984565 2.85966936 142.750318 1.09613307 140.017181 1.09613307 114.139252 10.9193128 84.9649087 14.372682 79.2866885"
41
41
  />
42
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="46" y="84" width="17" height="5" />
43
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="46" y="94" width="20" height="5" />
44
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="46" y="103" width="22" height="5" />
45
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="20" y="103" width="22" height="5" />
46
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="22" y="94" width="20" height="5" />
47
- <rect class="rectangle airpurifier_off_lgrey" fill="#e0e0e0" x="25" y="84" width="17" height="5" />
42
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="46" y="84" width="17" height="5" />
43
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="46" y="94" width="20" height="5" />
44
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="46" y="103" width="22" height="5" />
45
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="20" y="103" width="22" height="5" />
46
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="22" y="94" width="20" height="5" />
47
+ <rect class="rectangle air-purifier_off_lgrey" fill="#e0e0e0" x="25" y="84" width="17" height="5" />
48
48
  </g>
49
49
  </g>
50
50
  </svg>
@@ -9,7 +9,7 @@
9
9
  preserveAspectRatio="xMidYMid meet"
10
10
  >
11
11
  <g transform="scale(1, 0.75) translate(0, -40)">
12
- <g id="airpurifier">
12
+ <g id="filter-maintenance">
13
13
  <polygon
14
14
  id="Path"
15
15
  fill="#808080"
@@ -1 +1 @@
1
- import{a as _,b as D}from"./chunk-Y2PNA6DE.js";import{m as c,n as S}from"./chunk-XG2LZ5YY.js";import{f as x}from"./chunk-SRP6QX5M.js";import{C as v,g as O,ga as h,h as a,ha as E,ja as y,ka as l,la as f,nb as I,r as p,va as j,w as d,x as T,z as w}from"./chunk-SKZUTSHE.js";var g=new y("JWT_OPTIONS"),m=(()=>{class r{constructor(e=null){this.tokenGetter=e&&e.tokenGetter||function(){}}urlBase64Decode(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:{t+="==";break}case 3:{t+="=";break}default:throw new Error("Illegal base64url string!")}return this.b64DecodeUnicode(t)}b64decode(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o="";if(e=String(e).replace(/=+$/,""),e.length%4===1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(let i=0,s,n,b=0;n=e.charAt(b++);~n&&(s=i%4?s*64+n:n,i++%4)?o+=String.fromCharCode(255&s>>(-2*i&6)):0)n=t.indexOf(n);return o}b64DecodeUnicode(e){return decodeURIComponent(Array.prototype.map.call(this.b64decode(e),t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join(""))}decodeToken(e=this.tokenGetter()){return e instanceof Promise?e.then(t=>this._decodeToken(t)):this._decodeToken(e)}_decodeToken(e){if(!e||e==="")return null;let t=e.split(".");if(t.length!==3)throw new Error("The inspected token doesn't appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.");let o=this.urlBase64Decode(t[1]);if(!o)throw new Error("Cannot decode the token.");return JSON.parse(o)}getTokenExpirationDate(e=this.tokenGetter()){return e instanceof Promise?e.then(t=>this._getTokenExpirationDate(t)):this._getTokenExpirationDate(e)}_getTokenExpirationDate(e){let t;if(t=this.decodeToken(e),!t||!t.hasOwnProperty("exp"))return null;let o=new Date(0);return o.setUTCSeconds(t.exp),o}isTokenExpired(e=this.tokenGetter(),t){return e instanceof Promise?e.then(o=>this._isTokenExpired(o,t)):this._isTokenExpired(e,t)}_isTokenExpired(e,t){if(!e||e==="")return!0;let o=this.getTokenExpirationDate(e);return t=t||0,o===null?!1:!(o.valueOf()>new Date().valueOf()+t*1e3)}getAuthScheme(e,t){return typeof e=="function"?e(t):e}}return r.\u0275fac=function(e){return new(e||r)(l(g))},r.\u0275prov=h({token:r,factory:r.\u0275fac}),r})(),$=r=>r instanceof Promise?v(()=>r):p(r),R=(()=>{class r{constructor(e,t,o){this.jwtHelper=t,this.document=o,this.standardPorts=["80","443"],this.tokenGetter=e.tokenGetter,this.headerName=e.headerName||"Authorization",this.authScheme=e.authScheme||e.authScheme===""?e.authScheme:"Bearer ",this.allowedDomains=e.allowedDomains||[],this.disallowedRoutes=e.disallowedRoutes||[],this.throwNoTokenError=e.throwNoTokenError||!1,this.skipWhenExpired=e.skipWhenExpired}isAllowedDomain(e){let t=new URL(e.url,this.document.location.origin);if(t.host===this.document.location.host)return!0;let o=`${t.hostname}${t.port&&!this.standardPorts.includes(t.port)?":"+t.port:""}`;return this.allowedDomains.findIndex(i=>typeof i=="string"?i===o:i instanceof RegExp?i.test(o):!1)>-1}isDisallowedRoute(e){let t=new URL(e.url,this.document.location.origin);return this.disallowedRoutes.findIndex(o=>{if(typeof o=="string"){let i=new URL(o,this.document.location.origin);return i.hostname===t.hostname&&i.pathname===t.pathname}return o instanceof RegExp?o.test(e.url):!1})>-1}handleInterception(e,t,o){let i=this.jwtHelper.getAuthScheme(this.authScheme,t);if(!e&&this.throwNoTokenError)throw new Error("Could not get token from tokenGetter function.");let s=p(!1);return this.skipWhenExpired&&(s=e?$(this.jwtHelper.isTokenExpired(e)):p(!0)),e?s.pipe(T(n=>n&&this.skipWhenExpired?t.clone():t.clone({setHeaders:{[this.headerName]:`${i}${e}`}})),w(n=>o.handle(n))):o.handle(t)}intercept(e,t){if(!this.isAllowedDomain(e)||this.isDisallowedRoute(e))return t.handle(e);let o=this.tokenGetter(e);return $(o).pipe(w(i=>this.handleInterception(i,e,t)))}}return r.\u0275fac=function(e){return new(e||r)(l(g),l(m),l(j))},r.\u0275prov=h({token:r,factory:r.\u0275fac}),r})(),F=(()=>{class r{constructor(e){if(e)throw new Error("JwtModule is already loaded. It should only be imported in your application's main module.")}static forRoot(e){return{ngModule:r,providers:[{provide:x,useClass:R,multi:!0},e.jwtOptionsProvider||{provide:g,useValue:e.config},m]}}}return r.\u0275fac=function(e){return new(e||r)(l(r,12))},r.\u0275mod=I({type:r}),r.\u0275inj=E({}),r})();var k=O(_(),1);var q=(()=>{class r{$api=f(S);$jwtHelper=f(m);$settings=f(D);token;user={};logoutTimer;constructor(){this.loadToken()}login(e){return a(this,null,function*(){let t=yield d(this.$api.post("/auth/login",e));if(!this.validateToken(t.access_token))throw new Error("Invalid username or password.");window.localStorage.setItem(c.jwt.tokenKey,t.access_token),yield this.$settings.getAppSettings()})}noauth(){return a(this,null,function*(){let e=yield d(this.$api.post("/auth/noauth",{}));if(this.validateToken(e.access_token))window.localStorage.setItem(c.jwt.tokenKey,e.access_token),yield this.$settings.getAppSettings();else throw new Error("Invalid username or password.")})}logout(){this.user=null,this.token=null,window.localStorage.removeItem(c.jwt.tokenKey),window.location.reload()}loadToken(){return a(this,null,function*(){this.$settings.settingsLoaded||(yield d(this.$settings.onSettingsLoaded));let e=window.localStorage.getItem(c.jwt.tokenKey);e&&this.validateToken(e)})}validateToken(e){try{return this.$jwtHelper.isTokenExpired(e,this.$settings.serverTimeOffset)&&this.logout(),this.user=this.$jwtHelper.decodeToken(e),this.token=e,this.setLogoutTimer(),!0}catch{return window.localStorage.removeItem(c.jwt.tokenKey),this.token=null,!1}}checkToken(){return a(this,null,function*(){try{return yield d(this.$api.get("/auth/check"))}catch(e){e.status===401&&(console.error("Current token is not valid"),this.logout())}})}setLogoutTimer(){if(clearTimeout(this.logoutTimer),!this.$jwtHelper.isTokenExpired(this.token,this.$settings.serverTimeOffset)){let t=(0,k.default)(this.$jwtHelper.getTokenExpirationDate(this.token)).diff((0,k.default)().add(this.$settings.serverTimeOffset,"s"),"millisecond");t<=2147483647&&(this.logoutTimer=setTimeout(()=>a(this,null,function*(){this.$settings.formAuth===!1?(yield this.noauth(),window.location.reload()):this.logout()}),t))}}isLoggedIn(){return this.$settings.env.instanceId!==this.user.instanceId?(console.error("Token does not match instance"),!1):this.user&&this.token&&!this.$jwtHelper.isTokenExpired(this.token,this.$settings.serverTimeOffset)}static \u0275fac=function(t){return new(t||r)};static \u0275prov=h({token:r,factory:r.\u0275fac})}return r})();export{F as a,q as b};
1
+ import{a as _,b as D}from"./chunk-PBJK6VW5.js";import{m as c,n as S}from"./chunk-OCUYP77B.js";import{f as x}from"./chunk-SRP6QX5M.js";import{C as v,g as O,ga as h,h as a,ha as E,ja as y,ka as l,la as f,nb as I,r as p,va as j,w as d,x as T,z as w}from"./chunk-SKZUTSHE.js";var g=new y("JWT_OPTIONS"),m=(()=>{class r{constructor(e=null){this.tokenGetter=e&&e.tokenGetter||function(){}}urlBase64Decode(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:{t+="==";break}case 3:{t+="=";break}default:throw new Error("Illegal base64url string!")}return this.b64DecodeUnicode(t)}b64decode(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o="";if(e=String(e).replace(/=+$/,""),e.length%4===1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(let i=0,s,n,b=0;n=e.charAt(b++);~n&&(s=i%4?s*64+n:n,i++%4)?o+=String.fromCharCode(255&s>>(-2*i&6)):0)n=t.indexOf(n);return o}b64DecodeUnicode(e){return decodeURIComponent(Array.prototype.map.call(this.b64decode(e),t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join(""))}decodeToken(e=this.tokenGetter()){return e instanceof Promise?e.then(t=>this._decodeToken(t)):this._decodeToken(e)}_decodeToken(e){if(!e||e==="")return null;let t=e.split(".");if(t.length!==3)throw new Error("The inspected token doesn't appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.");let o=this.urlBase64Decode(t[1]);if(!o)throw new Error("Cannot decode the token.");return JSON.parse(o)}getTokenExpirationDate(e=this.tokenGetter()){return e instanceof Promise?e.then(t=>this._getTokenExpirationDate(t)):this._getTokenExpirationDate(e)}_getTokenExpirationDate(e){let t;if(t=this.decodeToken(e),!t||!t.hasOwnProperty("exp"))return null;let o=new Date(0);return o.setUTCSeconds(t.exp),o}isTokenExpired(e=this.tokenGetter(),t){return e instanceof Promise?e.then(o=>this._isTokenExpired(o,t)):this._isTokenExpired(e,t)}_isTokenExpired(e,t){if(!e||e==="")return!0;let o=this.getTokenExpirationDate(e);return t=t||0,o===null?!1:!(o.valueOf()>new Date().valueOf()+t*1e3)}getAuthScheme(e,t){return typeof e=="function"?e(t):e}}return r.\u0275fac=function(e){return new(e||r)(l(g))},r.\u0275prov=h({token:r,factory:r.\u0275fac}),r})(),$=r=>r instanceof Promise?v(()=>r):p(r),R=(()=>{class r{constructor(e,t,o){this.jwtHelper=t,this.document=o,this.standardPorts=["80","443"],this.tokenGetter=e.tokenGetter,this.headerName=e.headerName||"Authorization",this.authScheme=e.authScheme||e.authScheme===""?e.authScheme:"Bearer ",this.allowedDomains=e.allowedDomains||[],this.disallowedRoutes=e.disallowedRoutes||[],this.throwNoTokenError=e.throwNoTokenError||!1,this.skipWhenExpired=e.skipWhenExpired}isAllowedDomain(e){let t=new URL(e.url,this.document.location.origin);if(t.host===this.document.location.host)return!0;let o=`${t.hostname}${t.port&&!this.standardPorts.includes(t.port)?":"+t.port:""}`;return this.allowedDomains.findIndex(i=>typeof i=="string"?i===o:i instanceof RegExp?i.test(o):!1)>-1}isDisallowedRoute(e){let t=new URL(e.url,this.document.location.origin);return this.disallowedRoutes.findIndex(o=>{if(typeof o=="string"){let i=new URL(o,this.document.location.origin);return i.hostname===t.hostname&&i.pathname===t.pathname}return o instanceof RegExp?o.test(e.url):!1})>-1}handleInterception(e,t,o){let i=this.jwtHelper.getAuthScheme(this.authScheme,t);if(!e&&this.throwNoTokenError)throw new Error("Could not get token from tokenGetter function.");let s=p(!1);return this.skipWhenExpired&&(s=e?$(this.jwtHelper.isTokenExpired(e)):p(!0)),e?s.pipe(T(n=>n&&this.skipWhenExpired?t.clone():t.clone({setHeaders:{[this.headerName]:`${i}${e}`}})),w(n=>o.handle(n))):o.handle(t)}intercept(e,t){if(!this.isAllowedDomain(e)||this.isDisallowedRoute(e))return t.handle(e);let o=this.tokenGetter(e);return $(o).pipe(w(i=>this.handleInterception(i,e,t)))}}return r.\u0275fac=function(e){return new(e||r)(l(g),l(m),l(j))},r.\u0275prov=h({token:r,factory:r.\u0275fac}),r})(),F=(()=>{class r{constructor(e){if(e)throw new Error("JwtModule is already loaded. It should only be imported in your application's main module.")}static forRoot(e){return{ngModule:r,providers:[{provide:x,useClass:R,multi:!0},e.jwtOptionsProvider||{provide:g,useValue:e.config},m]}}}return r.\u0275fac=function(e){return new(e||r)(l(r,12))},r.\u0275mod=I({type:r}),r.\u0275inj=E({}),r})();var k=O(_(),1);var q=(()=>{class r{$api=f(S);$jwtHelper=f(m);$settings=f(D);token;user={};logoutTimer;constructor(){this.loadToken()}login(e){return a(this,null,function*(){let t=yield d(this.$api.post("/auth/login",e));if(!this.validateToken(t.access_token))throw new Error("Invalid username or password.");window.localStorage.setItem(c.jwt.tokenKey,t.access_token),yield this.$settings.getAppSettings()})}noauth(){return a(this,null,function*(){let e=yield d(this.$api.post("/auth/noauth",{}));if(this.validateToken(e.access_token))window.localStorage.setItem(c.jwt.tokenKey,e.access_token),yield this.$settings.getAppSettings();else throw new Error("Invalid username or password.")})}logout(){this.user=null,this.token=null,window.localStorage.removeItem(c.jwt.tokenKey),window.location.reload()}loadToken(){return a(this,null,function*(){this.$settings.settingsLoaded||(yield d(this.$settings.onSettingsLoaded));let e=window.localStorage.getItem(c.jwt.tokenKey);e&&this.validateToken(e)})}checkToken(){return a(this,null,function*(){try{return yield d(this.$api.get("/auth/check"))}catch(e){e.status===401&&(console.error("Current token is not valid"),this.logout())}})}isLoggedIn(){return this.$settings.env.instanceId!==this.user.instanceId?(console.error("Token does not match instance"),!1):this.user&&this.token&&!this.$jwtHelper.isTokenExpired(this.token,this.$settings.serverTimeOffset)}validateToken(e){try{return this.$jwtHelper.isTokenExpired(e,this.$settings.serverTimeOffset)&&this.logout(),this.user=this.$jwtHelper.decodeToken(e),this.token=e,this.setLogoutTimer(),!0}catch{return window.localStorage.removeItem(c.jwt.tokenKey),this.token=null,!1}}setLogoutTimer(){if(clearTimeout(this.logoutTimer),!this.$jwtHelper.isTokenExpired(this.token,this.$settings.serverTimeOffset)){let t=(0,k.default)(this.$jwtHelper.getTokenExpirationDate(this.token)).diff((0,k.default)().add(this.$settings.serverTimeOffset,"s"),"millisecond");t<=2147483647&&(this.logoutTimer=setTimeout(()=>a(this,null,function*(){this.$settings.formAuth===!1?(yield this.noauth(),window.location.reload()):this.logout()}),t))}}static \u0275fac=function(t){return new(t||r)};static \u0275prov=h({token:r,factory:r.\u0275fac})}return r})();export{F as a,q as b};
@@ -0,0 +1 @@
1
+ import{g as i}from"./chunk-X7PVYZAE.js";import"./chunk-SRP6QX5M.js";import{ha as t,nb as e}from"./chunk-SKZUTSHE.js";var d=[{path:"",redirectTo:"/",pathMatch:"full"},{path:"docker",loadChildren:()=>import("./chunk-DFK6HAB2.js").then(o=>o.DockerModule)},{path:"linux",loadChildren:()=>import("./chunk-YO4OJGZL.js").then(o=>o.LinuxModule)},{path:"terminal",loadChildren:()=>import("./chunk-HVYATWTL.js").then(o=>o.TerminalModule)}],l=(()=>{class o{static \u0275fac=function(r){return new(r||o)};static \u0275mod=e({type:o});static \u0275inj=t({imports:[i.forChild(d),i]})}return o})();var p=(()=>{class o{static \u0275fac=function(r){return new(r||o)};static \u0275mod=e({type:o});static \u0275inj=t({imports:[l]})}return o})();export{p as PlatformToolsModule};
@@ -0,0 +1 @@
1
+ import{A,c as R,d as b,e as O,f as T,g as N,j as w,m as q,p as z,q as H,w as D,x as G,z as Q}from"./chunk-T252YJXA.js";import{b as K}from"./chunk-24HGAFIA.js";import{d as U}from"./chunk-X7PVYZAE.js";import{b as J}from"./chunk-PBJK6VW5.js";import{m as W}from"./chunk-OCUYP77B.js";import{b as j}from"./chunk-LXXELGX4.js";import"./chunk-SRP6QX5M.js";import{Bc as l,Cc as d,Ib as u,Jb as c,M as I,Mc as C,Ob as m,Oc as V,Pb as r,Qb as a,Rb as s,Xa as x,Yb as E,Zb as F,ab as i,cd as P,ec as v,fc as M,fd as B,h as y,kc as g,la as p,lc as h,mb as k,mc as L,td as $,w as S,xc as f}from"./chunk-SKZUTSHE.js";var Y=["password"],Z=["username"],ee=["otp"],te=e=>({background:e}),ie=e=>({anim:e}),X=e=>({"is-invalid":e});function ne(e,_){if(e&1&&(r(0,"div",8)(1,"span",12),s(2,"i",13),a(),s(3,"input",14,0),l(5,"translate"),a(),r(6,"div",8)(7,"span",12),s(8,"i",15),a(),s(9,"input",16,1),l(11,"translate"),a()),e&2){let n=F();i(3),m("placeholder",d(5,4,"users.label_username"))("ngClass",f(8,X,n.form.controls.username.dirty&&n.form.controls.username.errors)),i(6),m("placeholder",d(11,6,"users.label_password"))("ngClass",f(10,X,n.form.controls.password.dirty&&n.form.controls.password.errors))}}function oe(e,_){e&1&&(r(0,"div",8)(1,"span",12),s(2,"i",17),a(),s(3,"input",18,2),l(5,"translate"),a()),e&2&&(i(3),m("placeholder",d(5,1,"login.label_2fa_code")))}function ae(e,_){e&1&&(r(0,"div",9)(1,"div",12),s(2,"i",19),a(),r(3,"div",20)(4,"div",21),g(5),l(6,"translate"),a(),s(7,"div",22),l(8,"translate"),a()()),e&2&&(i(5),h(d(6,2,"login.invalid_credentials")),i(2),m("innerHTML",d(8,4,"login.invalid_credentials_2"),x))}function re(e,_){e&1&&(r(0,"div",9)(1,"div",12),s(2,"i",19),a(),r(3,"div",20)(4,"div",21),g(5),l(6,"translate"),a(),s(7,"div",22),l(8,"translate"),a()()),e&2&&(i(5),h(d(6,2,"login.invalid_code")),i(2),m("innerHTML",d(8,4,"login.invalid_credentials_2"),x))}var _e=(()=>{class e{$auth=p(K);$cdr=p(V);$router=p(U);$settings=p(J);targetRoute;passwordInput=C("password");usernameInput=C("username");otpInput=C("otp");backgroundStyle;invalidCredentials=!1;invalid2faCode=!1;twoFactorCodeRequired=!1;inProgress=!1;form;ngOnInit(){this.form=new N({username:new w(""),password:new w("")}),this.form.valueChanges.pipe(I(500)).subscribe(n=>{let o=this.passwordInput()?.nativeElement.value;o&&o!==n.password&&this.form.controls.password.setValue(o)}),this.targetRoute=window.sessionStorage.getItem("target_route")||"",this.setBackground()}ngAfterViewChecked(){this.$cdr.detectChanges()}onSubmit(){return y(this,null,function*(){this.invalidCredentials=!1,this.invalid2faCode=!1,this.inProgress=!0,document.getElementById("submit-button")?.blur();let n=this.passwordInput()?.nativeElement.value;n&&n!==this.form.get("password").value&&this.form.controls.password.setValue(n);let o=this.usernameInput()?.nativeElement.value;if(o&&o!==this.form.get("username").value&&this.form.controls.username.setValue(o),this.twoFactorCodeRequired){let t=this.otpInput()?.nativeElement.value;t&&t!==this.form.get("otp").value&&this.form.controls.username.setValue(t)}try{yield this.$auth.login(this.form.getRawValue()),this.$router.navigateByUrl(this.targetRoute),window.sessionStorage.removeItem("target_route")}catch(t){t.status===412?(this.form.controls.otp?(this.form.controls.otp.setErrors(["Invalid Code"]),this.invalid2faCode=!0):this.form.addControl("otp",new w("",[b.required,b.minLength(6),b.maxLength(6)])),this.twoFactorCodeRequired=!0,setTimeout(()=>{document.getElementById("form-ota").focus()},100)):this.invalidCredentials=!0}this.inProgress=!1})}setBackground(){return y(this,null,function*(){if(this.$settings.settingsLoaded||(yield S(this.$settings.onSettingsLoaded)),this.$settings.env.customWallpaperHash){let n=`${W.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`;this.backgroundStyle=`url('${n}') center/cover`}})}static \u0275fac=function(o){return new(o||e)};static \u0275cmp=k({type:e,selectors:[["ng-component"]],viewQuery:function(o,t){o&1&&(v(t.passwordInput,Y,5),v(t.usernameInput,Z,5),v(t.otpInput,ee,5)),o&2&&M(3)},decls:15,vars:18,consts:[["username",""],["password",""],["otp",""],[1,"login-container","gradient","d-flex","align-items-start","justify-content-center",3,"ngStyle","ngClass"],[1,"w-100","login-card","d-flex","py-4","flex-column"],["ngSrc","/assets/homebridge-color-round.svg","alt","Homebridge Logo","height","100","width","100","priority","true",1,"homebridge-logo","mx-auto","my-3"],["novalidate","",3,"ngSubmit","formGroup"],[1,"mb-4","text-center"],[1,"input-group","mb-4"],[1,"input-group","no-border","mb-4"],[1,"text-center"],["tabindex","3","id","submit-button","type","submit",1,"btn","btn-primary","mb-2",3,"disabled"],[1,"input-group-text","custom-input"],[1,"fas","fa-fw","fa-user","primary-text","fa-lg"],["formControlName","username","type","text","id","form-username","autofocus","","autocomplete","username","autocapitalize","none","tabindex","1","required","",1,"form-control","custom-input",3,"placeholder","ngClass"],[1,"fas","fa-fw","fa-lock","primary-text","fa-lg"],["formControlName","password","type","password","id","form-pass","autocomplete","current-password","tabindex","2","required","",1,"form-control","custom-input",3,"placeholder","ngClass"],[1,"fas","fa-fw","fa-key","primary-text","fa-lg"],["formControlName","otp","type","text","id","form-ota","autofocus","","autocomplete","one-time-code","autocapitalize","none","inputmode","numeric","pattern","[0-9]*","tabindex","1",1,"form-control","custom-input",3,"placeholder"],[1,"fas","fa-fw","fa-exclamation-triangle","pink-text","fa-lg"],[1,"form-control","custom-input"],[1,"small","grey-text","fw-semibold"],[1,"small","grey-text",3,"innerHTML"]],template:function(o,t){o&1&&(r(0,"div",3)(1,"div",4),s(2,"img",5),r(3,"form",6),E("ngSubmit",function(){return t.onSubmit()}),r(4,"h4",7),g(5),l(6,"translate"),a(),u(7,ne,12,12),u(8,oe,6,3,"div",8),u(9,ae,9,6,"div",9),u(10,re,9,6,"div",9),r(11,"div",10)(12,"button",11),g(13),l(14,"translate"),a()()()()()),o&2&&(m("ngStyle",f(14,te,t.backgroundStyle))("ngClass",f(16,ie,!t.backgroundStyle)),i(3),m("formGroup",t.form),i(2),h(d(6,10,"setup.welcome_to_homebridge")),i(2),c(t.twoFactorCodeRequired?-1:7),i(),c(t.twoFactorCodeRequired?8:-1),i(),c(t.invalidCredentials?9:-1),i(),c(t.invalid2faCode?10:-1),i(2),m("disabled",t.form.invalid),i(),L(" ",d(14,12,"form.label_continue")," "))},dependencies:[B,Q,q,R,O,T,D,G,A,z,H,P,j,$],styles:["body{overflow:scroll!important} body.dark-mode .login-card{background-color:#2b2b2b;color:#fff}.login-container[_ngcontent-%COMP%]{z-index:-1;padding-top:2em;padding-bottom:2em;min-height:100%;background-size:300% 300%}.anim[_ngcontent-%COMP%]{-webkit-animation:_ngcontent-%COMP%_gradient 20s ease infinite;-moz-animation:gradient 20s ease infinite;-o-animation:gradient 20s ease infinite;animation:_ngcontent-%COMP%_gradient 20s ease infinite}@keyframes _ngcontent-%COMP%_gradient{0%{background-position:0 50%}50%{background-position:100% 50%}to{background-position:0 50%}}.login-card[_ngcontent-%COMP%]{max-width:550px;border-radius:1rem;padding-right:25px;padding-left:25px;background-color:#ffffffe6}.login-card[_ngcontent-%COMP%] .form-control[_ngcontent-%COMP%]:focus{background-color:inherit!important}@media screen and (max-width: 575px){.login-card[_ngcontent-%COMP%]{margin-left:1em;margin-right:1em}}.homebridge-logo[_ngcontent-%COMP%]{margin-bottom:10px}"]})}return e})();export{_e as LoginComponent};
@@ -0,0 +1,2 @@
1
+ import{A as Z,c as G,d as k,e as j,f as D,g as K,j as $,m as A,p as J,q as Q,w as X,z as Y}from"./chunk-T252YJXA.js";import{a as ae}from"./chunk-OFS35DEJ.js";import{b as oe}from"./chunk-24HGAFIA.js";import{b as re}from"./chunk-PBJK6VW5.js";import{k as ie,m as U,n as ne}from"./chunk-OCUYP77B.js";import{a as ee,b as te}from"./chunk-LXXELGX4.js";import{l as q}from"./chunk-SRP6QX5M.js";import{Bc as a,Cc as s,Hb as M,Ib as z,Jb as T,Ob as m,Pb as o,Qb as r,Rb as u,Vb as I,Xa as W,Yb as x,Zb as _,ab as n,cd as H,fd as N,h as S,hc as O,kc as l,la as w,lc as f,mb as V,mc as g,ra as C,sa as b,td as R,w as h,wc as L,xc as B,yc as E}from"./chunk-SKZUTSHE.js";var pe=t=>({background:t}),de=t=>({anim:t}),ce=t=>({"progress-bar-animated":t}),me=()=>["restoring","restarting","restore-complete"],P=(t,d)=>({"is-valid":t,"is-invalid":d});function ue(t,d){if(t&1){let e=I();o(0,"div",5)(1,"h4",6),l(2),a(3,"translate"),r(),u(4,"div",7),a(5,"translate"),o(6,"button",8),x("click",function(){C(e);let i=_();return b(i.onClickGettingStarted())}),l(7),a(8,"translate"),r(),o(9,"a",9),x("click",function(){C(e);let i=_();return b(i.onClickRestoreBackup())}),l(10),a(11,"translate"),r()()}t&2&&(n(2),f(s(3,4,"setup.welcome_to_homebridge")),n(2),m("innerHTML",s(5,6,"setup.intro"),W),n(3),g(" ",s(8,8,"setup.button_get_started")," "),n(3),f(s(11,10,"setup_wizard_restore")))}function ge(t,d){if(t&1){let e=I();o(0,"div",5)(1,"h4",6),l(2),a(3,"translate"),r(),o(4,"div",10),l(5),a(6,"translate"),r(),o(7,"div",11)(8,"form",12),x("ngSubmit",function(){C(e);let i=_();return b(i.createFirstUser())}),o(9,"div",13)(10,"span",14),u(11,"i",15),r(),u(12,"input",16),a(13,"translate"),r(),o(14,"div",13)(15,"span",14),u(16,"i",17),r(),u(17,"input",18),a(18,"translate"),r(),o(19,"div",13)(20,"span",14),u(21,"i",17),r(),u(22,"input",19),a(23,"translate"),r(),o(24,"div",20)(25,"button",21),x("click",function(){C(e);let i=_();return b(i.onClickCancelRestore())}),l(26),a(27,"translate"),r(),o(28,"button",22),l(29),a(30,"translate"),r()()()()()}if(t&2){let e=_();n(2),f(s(3,16,"setup.create_account")),n(3),f(s(6,18,"setup_wizard_create_info")),n(3),m("formGroup",e.createUserForm),n(4),m("readonly",e.loading)("ngClass",E(30,P,e.createUserForm.controls.username.dirty&&e.createUserForm.controls.username.valid,e.createUserForm.controls.username.dirty&&e.createUserForm.controls.username.invalid))("placeholder",s(13,20,"users.label_username")),n(5),m("readonly",e.loading)("ngClass",E(33,P,e.createUserForm.controls.password.dirty&&e.createUserForm.controls.password.valid,e.createUserForm.controls.password.dirty&&e.createUserForm.controls.password.errors))("placeholder",s(18,22,"users.label_password")),n(5),m("readonly",e.loading)("ngClass",E(36,P,e.createUserForm.controls.passwordConfirm.dirty&&e.createUserForm.controls.passwordConfirm.valid,e.createUserForm.controls.passwordConfirm.dirty&&e.createUserForm.controls.passwordConfirm.errors))("placeholder",s(23,24,"users.label_confirm_password")),n(3),m("disabled",e.restoreUploading),n(),g(" ",s(27,26,"form.button_back")," "),n(2),m("disabled",e.createUserForm.invalid||e.loading),n(),g(" ",s(30,28,"form.label_continue")," ")}}function _e(t,d){t&1&&(u(0,"i",25),l(1),a(2,"translate")),t&2&&(n(),g(" ",s(2,1,"backup.label_uploading")," "))}function fe(t,d){t&1&&(l(0),a(1,"translate")),t&2&&g(" ",s(1,1,"form.label_continue")," ")}function he(t,d){if(t&1){let e=I();o(0,"div",5)(1,"h4",6),l(2),a(3,"translate"),r(),o(4,"div",10),l(5),a(6,"translate"),r(),o(7,"input",23),x("change",function(i){C(e);let F=_();return b(F.handleRestoreFileInput(i.target.files))}),r(),o(8,"div",20)(9,"button",21),x("click",function(){C(e);let i=_();return b(i.onClickCancelRestore())}),l(10),a(11,"translate"),r(),o(12,"button",24),x("click",function(){C(e);let i=_();return b(i.onRestoreBackupClick())}),z(13,_e,3,3)(14,fe,2,3),r()()()}if(t&2){let e=_();n(2),f(s(3,6,"setup_wizard_restore")),n(3),f(s(6,8,"backup.restore_help_one")),n(4),m("disabled",e.restoreUploading),n(),g(" ",s(11,10,"form.button_back")," "),n(2),m("disabled",e.restoreUploading||!e.selectedFile),n(),T(e.restoreUploading?13:14)}}function we(t,d){t&1&&(l(0),a(1,"translate")),t&2&&g(" ",s(1,1,"setup_wizard_restoring")," ")}function Ce(t,d){t&1&&(l(0),a(1,"translate")),t&2&&g(" ",s(1,1,"setup_wizard_starting")," ")}function be(t,d){t&1&&(l(0),a(1,"translate")),t&2&&g(" ",s(1,1,"setup_wizard_complete")," ")}function xe(t,d){t&1&&(o(0,"a",27),l(1),a(2,"translate"),r()),t&2&&(n(),g(" ",s(2,1,"form.label_continue")," "))}function ve(t,d){if(t&1&&(o(0,"div",5)(1,"h4",6),z(2,we,2,3)(3,Ce,2,3)(4,be,2,3),r(),u(5,"div",26),z(6,xe,3,3,"a",27),r()),t&2){let e=_();n(2),T(e.step==="restoring"?2:e.step==="restarting"?3:e.step==="restore-complete"?4:-1),n(4),T(e.step==="restore-complete"?6:-1)}}function ye(t,d){t&1&&(o(0,"div",5)(1,"h4",28),l(2),a(3,"translate"),r(),o(4,"div",10),l(5),a(6,"translate"),r(),o(7,"a",29),l(8),a(9,"translate"),r()()),t&2&&(n(2),f(s(3,3,"setup_wizard_complete_title")),n(3),f(s(6,5,"setup_wizard_completed")),n(3),g(" ",s(9,7,"form.label_continue")," "))}var He=(()=>{class t{$api=w(ne);$auth=w(oe);$settings=w(re);$title=w(q);$toastr=w(ie);$translate=w(ee);$ws=w(ae);io;step="welcome";backgroundStyle;progress=1;restoreInProgress=!1;restoreStarted=!1;restoreFailed=!1;loading=!1;selectedFile;restoreUploading=!1;createUserForm=new K({username:new $("",[k.required]),password:new $("",[k.compose([k.required,k.minLength(4)])]),passwordConfirm:new $("",[k.required])},this.matchPassword);ngOnInit(){return S(this,null,function*(){this.$title.setTitle(this.$translate.instant("setup_wizard_page_title")),yield this.setBackground()})}onClickGettingStarted(){this.step="create-account",this.progress=50}onClickRestoreBackup(){this.step="restore-backup",this.progress=20}onClickCancelRestore(){this.selectedFile=null,this.step="welcome",this.progress=1}createFirstUser(){return S(this,null,function*(){this.loading=!0,this.progress=75;let e=this.createUserForm.getRawValue();e.name=e.username;try{yield h(this.$api.post("/setup-wizard/create-first-user",e)),this.$settings.env.setupWizardComplete=!0,this.progress=100,this.loading=!1,yield this.$auth.login({username:e.username,password:e.password}),this.step="setup-complete"}catch(p){this.loading=!1,this.progress=50,console.error(p),this.$toastr.error(p.message,this.$translate.instant("toast.title_error"))}})}handleRestoreFileInput(e){e.length?(this.selectedFile=e[0],this.progress=40):(delete this.selectedFile,this.progress=20)}onRestoreBackupClick(){return S(this,null,function*(){this.restoreUploading=!0,this.step="restoring",this.progress=60;try{let e=yield h(this.$api.get("/setup-wizard/get-setup-wizard-token"));window.localStorage.setItem(U.jwt.tokenKey,e.access_token),this.$auth.token=e.access_token,this.progress=65;let p=new FormData;p.append("restoreArchive",this.selectedFile,this.selectedFile.name),yield h(this.$api.post("/backup/restore",p)),this.progress=70,this.io=this.$ws.connectToNamespace("backup");let i=document.getElementById("output");this.io.socket.on("stdout",c=>{c.split(`
2
+ \r`).forEach(v=>{if(v&&!/^[⠇⠏⠋⠙⠹⠸]+$/.test(v)){let y=document.createElement("div"),le=/\x1B\[(\d{1,2}(;\d{1,2})?)?[mGK]/g;y.innerHTML=v.replace(le,""),v.includes("[0;31m")?y.classList.add("red-text"):v.includes("[0;32m")?y.classList.add("green-text"):v.includes("[0;33m")?y.classList.add("orange-text"):v.includes("[0;36m")&&y.classList.add("cyan-text"),i.appendChild(y),i.scrollTop=i.scrollHeight}})}),this.restoreStarted=!0,this.restoreInProgress=!0,this.progress=75,yield h(this.io.request("do-restore")),this.progress=80,this.restoreInProgress=!1,yield h(this.$api.put("/backup/restart",{})),this.step="restarting",this.progress=85,window.localStorage.removeItem(U.jwt.tokenKey),this.$auth.token=null;let F=document.createElement("div");F.classList.add("orange-text"),F.innerHTML="Starting Homebridge, please wait...",i.appendChild(F),i.scrollTop=i.scrollHeight,yield new Promise(c=>setTimeout(c,3e3)),this.progress=88,yield new Promise(c=>setTimeout(c,3e3)),this.progress=91,yield new Promise(c=>setTimeout(c,3e3)),this.progress=94,yield new Promise(c=>setTimeout(c,3e3)),this.progress=97,yield new Promise(c=>setTimeout(c,3e3)),this.progress=99;let se=setInterval(()=>S(this,null,function*(){try{yield h(this.$api.get("/auth/settings")),clearInterval(se),this.progress=100,this.restoreUploading=!1,this.step="restore-complete"}catch{}}),1e3)}catch(e){console.error(e),this.restoreUploading=!1,this.restoreFailed=!0,this.progress=20,this.step="restore-backup",this.$toastr.error(e.message,this.$translate.instant("toast.title_error"))}finally{this.io&&this.io.end()}})}setBackground(){return S(this,null,function*(){if(this.$settings.settingsLoaded||(yield h(this.$settings.onSettingsLoaded)),this.$settings.env.customWallpaperHash){let e=`${U.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`;this.backgroundStyle=`url('${e}') center/cover`}})}matchPassword(e){let p=e.get("password").value,i=e.get("passwordConfirm").value;if(p!==i)e.get("passwordConfirm").setErrors({matchPassword:!0});else return null}static \u0275fac=function(p){return new(p||t)};static \u0275cmp=V({type:t,selectors:[["ng-component"]],decls:10,vars:14,consts:[[1,"setup-container","gradient","d-flex","align-items-start","justify-content-center",3,"ngStyle","ngClass"],[1,"w-100","setup-card","d-flex","py-4","flex-column"],["ngSrc","/assets/homebridge-color-round.svg","alt","Homebridge Logo","height","100","width","100","priority","true",1,"homebridge-logo","mx-auto","my-3"],[1,"progress","w-100","my-4"],["role","progressbar","aria-valuemin","0","aria-valuemax","100",1,"progress-bar","progress-bar-striped","bg-success",3,"ngClass"],[1,"w-100","d-flex","flex-column","align-items-center","mb-2"],[1,"mb-3","text-center"],[1,"mb-4","small","grey-text","text-center",3,"innerHTML"],["type","button",1,"btn","btn-lg","btn-primary","mb-4",3,"click"],["href","javascript:void(0)",1,"grey-text",3,"click"],[1,"mb-4","small","grey-text","text-center"],[1,"w-100"],["novalidate","",3,"ngSubmit","formGroup"],[1,"input-group","mb-4"],[1,"input-group-text","custom-input"],[1,"fas","fa-fw","fa-user","primary-text","fa-lg"],["formControlName","username","type","text","id","form-username","autocomplete","username","autocapitalize","none","tabindex","1","required","",1,"form-control","custom-input",3,"readonly","ngClass","placeholder"],[1,"fas","fa-fw","fa-lock","primary-text","fa-lg"],["formControlName","password","type","password","id","form-pass","autocomplete","new-password","tabindex","2","required","",1,"form-control","custom-input",3,"readonly","ngClass","placeholder"],["formControlName","passwordConfirm","type","password","id","form-pass-confirm","autocomplete","new-password","tabindex","2","required","",1,"form-control","custom-input",3,"readonly","ngClass","placeholder"],[1,"mt-3","w-100","d-flex","justify-content-between"],["type","button",1,"btn","btn-elegant","ms-0",3,"click","disabled"],["type","submit",1,"btn","btn-primary",3,"disabled"],["type","file","id","restoreFileUpload","accept","application/gzip, .gz",1,"form-control","custom-input","mb-3",3,"change"],["type","button",1,"btn","btn-primary","me-0",3,"click","disabled"],[1,"fas","fa-fw","fa-spinner","fa-pulse"],["id","output",1,"font-monospace","small","alert","alert-info","w-100","text-start","mt-1","mb-0"],["href","/login",1,"btn","btn-lg","btn-primary","mt-4"],[1,"mb-3"],["href","/",1,"btn","btn-lg","btn-primary"]],template:function(p,i){p&1&&(o(0,"div",0)(1,"div",1),u(2,"img",2),o(3,"div",3),u(4,"div",4),r(),z(5,ue,12,12,"div",5)(6,ge,31,39,"div",5)(7,he,15,12,"div",5)(8,ve,7,2,"div",5)(9,ye,10,9,"div",5),r()()),p&2&&(m("ngStyle",B(7,pe,i.backgroundStyle))("ngClass",B(9,de,!i.backgroundStyle)),n(4),O("width",i.progress+"%"),m("ngClass",B(11,ce,i.loading||i.restoreUploading)),M("aria-valuenow",i.progress),n(),T(i.step==="welcome"?5:i.step==="create-account"?6:i.step==="restore-backup"?7:L(13,me).includes(i.step)?8:i.step==="setup-complete"?9:-1))},dependencies:[H,te,R,Y,A,G,j,D,X,Z,J,Q,N],styles:["body{overflow:scroll!important} body.dark-mode .setup-card{background-color:#2b2b2b;color:#fff}.setup-container[_ngcontent-%COMP%]{z-index:-1;padding-top:2em;padding-bottom:2em;min-height:100%;background-size:300% 300%}.anim[_ngcontent-%COMP%]{-webkit-animation:_ngcontent-%COMP%_gradient 20s ease infinite;-moz-animation:gradient 20s ease infinite;-o-animation:gradient 20s ease infinite;animation:_ngcontent-%COMP%_gradient 20s ease infinite}@keyframes _ngcontent-%COMP%_gradient{0%{background-position:0 50%}50%{background-position:100% 50%}to{background-position:0 50%}}.setup-card[_ngcontent-%COMP%]{max-width:550px;border-radius:1rem;padding-right:25px;padding-left:25px;background-color:#ffffffe6}.setup-card[_ngcontent-%COMP%] .form-control[_ngcontent-%COMP%]:focus{background-color:inherit!important}@media screen and (max-width: 575px){.setup-card[_ngcontent-%COMP%]{margin-left:1em;margin-right:1em}}.homebridge-logo[_ngcontent-%COMP%]{margin-bottom:10px}.progress[_ngcontent-%COMP%]{background-color:#ddd}#output[_ngcontent-%COMP%]{height:200px;overflow-y:scroll;white-space:pre-wrap}"]})}return t})();export{He as SetupWizardComponent};
@@ -1,4 +1,4 @@
1
- import{a as S,b as O,c as U}from"./chunk-UD6SVFW2.js";import{a as g}from"./chunk-4BJSFL2Y.js";import{M as w,e as x,g as h,ga as E,la as L,n as R}from"./chunk-SKZUTSHE.js";var F=x((v,b)=>{(function(a,l){typeof define=="function"&&define.amd?define([],l):typeof v<"u"?l():(l(),a.FileSaver={})})(v,function(){"use strict";function a(e,t){return typeof t>"u"?t={autoBom:!1}:typeof t!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),t={autoBom:!t}),t.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e}function l(e,t,n){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){r(i.response,t,n)},i.onerror=function(){console.error("could not download file")},i.send()}function d(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch{}return 200<=t.status&&299>=t.status}function c(e){try{e.dispatchEvent(new MouseEvent("click"))}catch{var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var s=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:void 0,m=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),r=s.saveAs||(typeof window!="object"||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(e,t,n){var i=s.URL||s.webkitURL,o=document.createElement("a");t=t||e.name||"download",o.download=t,o.rel="noopener",typeof e=="string"?(o.href=e,o.origin===location.origin?c(o):d(o.href)?l(e,t,n):c(o,o.target="_blank")):(o.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(o.href)},4e4),setTimeout(function(){c(o)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,n){if(t=t||e.name||"download",typeof e!="string")navigator.msSaveOrOpenBlob(a(e,n),t);else if(d(e))l(e,t,n);else{var i=document.createElement("a");i.href=e,i.target="_blank",setTimeout(function(){c(i)})}}:function(e,t,n,i){if(i=i||open("","_blank"),i&&(i.document.title=i.document.body.innerText="downloading..."),typeof e=="string")return l(e,t,n);var o=e.type==="application/octet-stream",z=/constructor/i.test(s.HTMLElement)||s.safari,y=/CriOS\/[\d]+/.test(navigator.userAgent);if((y||o&&z||m)&&typeof FileReader<"u"){var u=new FileReader;u.onloadend=function(){var f=u.result;f=y?f:f.replace(/^data:[^;]*;/,"data:attachment/file;"),i?i.location.href=f:location=f,i=null},u.readAsDataURL(e)}else{var A=s.URL||s.webkitURL,p=A.createObjectURL(e);i?i.location=p:location.href=p,i=null,setTimeout(function(){A.revokeObjectURL(p)},4e4)}});s.saveAs=r.saveAs=r,typeof b<"u"&&(b.exports=r)})});var k=h(S(),1),j=h(O(),1),T=h(U(),1);var W=(()=>{class a{$ws=L(g);term;io;fitAddon;webLinksAddon;resize;elementResize;pluginName;constructor(){}startTerminal(d,c={},s,m){this.pluginName=m,this.elementResize=s,this.io=this.$ws.connectToNamespace("log"),this.term=new k.Terminal(c),setTimeout(()=>{this.term.loadAddon(this.fitAddon),this.term.loadAddon(this.webLinksAddon)}),this.fitAddon=new j.FitAddon,this.webLinksAddon=new T.WebLinksAddon,this.resize=new R,this.term.open(d.nativeElement),setTimeout(()=>{this.fitAddon.activate(this.term),this.fitAddon.fit()}),this.io.connected.subscribe(()=>{this.term.reset(),this.io.socket.emit("tail-log",{cols:this.term.cols,rows:this.term.rows})}),this.io.socket.on("disconnect",()=>{this.term.write(`
1
+ import{a as S,b as O,c as U}from"./chunk-UD6SVFW2.js";import{a as g}from"./chunk-OFS35DEJ.js";import{M as w,e as x,g as h,ga as E,la as L,n as R}from"./chunk-SKZUTSHE.js";var F=x((v,b)=>{(function(a,l){typeof define=="function"&&define.amd?define([],l):typeof v<"u"?l():(l(),a.FileSaver={})})(v,function(){"use strict";function a(e,t){return typeof t>"u"?t={autoBom:!1}:typeof t!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),t={autoBom:!t}),t.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e}function l(e,t,n){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){r(i.response,t,n)},i.onerror=function(){console.error("could not download file")},i.send()}function d(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch{}return 200<=t.status&&299>=t.status}function c(e){try{e.dispatchEvent(new MouseEvent("click"))}catch{var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var s=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:void 0,m=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),r=s.saveAs||(typeof window!="object"||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(e,t,n){var i=s.URL||s.webkitURL,o=document.createElement("a");t=t||e.name||"download",o.download=t,o.rel="noopener",typeof e=="string"?(o.href=e,o.origin===location.origin?c(o):d(o.href)?l(e,t,n):c(o,o.target="_blank")):(o.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(o.href)},4e4),setTimeout(function(){c(o)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,n){if(t=t||e.name||"download",typeof e!="string")navigator.msSaveOrOpenBlob(a(e,n),t);else if(d(e))l(e,t,n);else{var i=document.createElement("a");i.href=e,i.target="_blank",setTimeout(function(){c(i)})}}:function(e,t,n,i){if(i=i||open("","_blank"),i&&(i.document.title=i.document.body.innerText="downloading..."),typeof e=="string")return l(e,t,n);var o=e.type==="application/octet-stream",z=/constructor/i.test(s.HTMLElement)||s.safari,y=/CriOS\/[\d]+/.test(navigator.userAgent);if((y||o&&z||m)&&typeof FileReader<"u"){var u=new FileReader;u.onloadend=function(){var f=u.result;f=y?f:f.replace(/^data:[^;]*;/,"data:attachment/file;"),i?i.location.href=f:location=f,i=null},u.readAsDataURL(e)}else{var A=s.URL||s.webkitURL,p=A.createObjectURL(e);i?i.location=p:location.href=p,i=null,setTimeout(function(){A.revokeObjectURL(p)},4e4)}});s.saveAs=r.saveAs=r,typeof b<"u"&&(b.exports=r)})});var k=h(S(),1),j=h(O(),1),T=h(U(),1);var W=(()=>{class a{$ws=L(g);io;fitAddon;webLinksAddon;resize;elementResize;pluginName;term;startTerminal(d,c={},s,m){this.pluginName=m,this.elementResize=s,this.io=this.$ws.connectToNamespace("log"),this.term=new k.Terminal(c),setTimeout(()=>{this.term.loadAddon(this.fitAddon),this.term.loadAddon(this.webLinksAddon)}),this.fitAddon=new j.FitAddon,this.webLinksAddon=new T.WebLinksAddon,this.resize=new R,this.term.open(d.nativeElement),setTimeout(()=>{this.fitAddon.activate(this.term),this.fitAddon.fit()}),this.io.connected.subscribe(()=>{this.term.reset(),this.io.socket.emit("tail-log",{cols:this.term.cols,rows:this.term.rows})}),this.io.socket.on("disconnect",()=>{this.term.write(`
2
2
  \r
3
3
  \rWebsocket failed to connect. Is the server running?
4
4
  \r