@matter-server/dashboard 1.0.0 → 1.1.0
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.
- package/dist/esm/components/dialogs/acl/acl-actions.d.ts +12 -0
- package/dist/esm/components/dialogs/acl/acl-actions.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/acl-actions.js +56 -0
- package/dist/esm/components/dialogs/acl/acl-actions.js.map +6 -0
- package/dist/esm/components/dialogs/acl/model.d.ts +2 -2
- package/dist/esm/components/dialogs/acl/model.d.ts.map +1 -1
- package/dist/esm/components/dialogs/acl/model.js +11 -15
- package/dist/esm/components/dialogs/acl/model.js.map +1 -1
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts +43 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js +353 -0
- package/dist/esm/components/dialogs/acl/node-acl-add-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts +8 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js +15 -0
- package/dist/esm/components/dialogs/acl/show-node-acl-add-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/binding/binding-actions.d.ts +17 -0
- package/dist/esm/components/dialogs/binding/binding-actions.d.ts.map +1 -0
- package/dist/esm/components/dialogs/binding/binding-actions.js +135 -0
- package/dist/esm/components/dialogs/binding/binding-actions.js.map +6 -0
- package/dist/esm/components/dialogs/binding/model.d.ts +1 -1
- package/dist/esm/components/dialogs/binding/model.d.ts.map +1 -1
- package/dist/esm/components/dialogs/binding/model.js +8 -3
- package/dist/esm/components/dialogs/binding/model.js.map +1 -1
- package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts +16 -24
- package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js +210 -332
- package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts +37 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js +387 -0
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts +35 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js +254 -0
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/index.d.ts +2 -0
- package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/index.js +2 -0
- package/dist/esm/pages/cluster-commands/index.js.map +1 -1
- package/dist/esm/pages/components/node-details.d.ts +0 -1
- package/dist/esm/pages/components/node-details.d.ts.map +1 -1
- package/dist/esm/pages/components/node-details.js +2 -18
- package/dist/esm/pages/components/node-details.js.map +1 -1
- package/dist/esm/pages/components/server-details.js +3 -3
- package/dist/esm/pages/components/server-details.js.map +1 -1
- package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-cluster-view.js +2 -1
- package/dist/esm/pages/matter-cluster-view.js.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.d.ts +3 -3
- package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-endpoint-view.js +13 -10
- package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
- package/dist/esm/pages/matter-node-view.js +2 -2
- package/dist/esm/pages/matter-node-view.js.map +1 -1
- package/dist/esm/pages/network/network-utils.d.ts +1 -5
- package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
- package/dist/esm/pages/network/network-utils.js +1 -11
- package/dist/esm/pages/network/network-utils.js.map +1 -1
- package/dist/esm/util/access-control.d.ts +54 -0
- package/dist/esm/util/access-control.d.ts.map +1 -0
- package/dist/esm/util/access-control.js +100 -0
- package/dist/esm/util/access-control.js.map +6 -0
- package/dist/esm/util/binding.d.ts +54 -0
- package/dist/esm/util/binding.d.ts.map +1 -0
- package/dist/esm/util/binding.js +113 -0
- package/dist/esm/util/binding.js.map +6 -0
- package/dist/esm/util/endpoints.d.ts +9 -0
- package/dist/esm/util/endpoints.d.ts.map +1 -0
- package/dist/esm/util/endpoints.js +18 -0
- package/dist/esm/util/endpoints.js.map +6 -0
- package/dist/esm/util/node-name.d.ts +12 -0
- package/dist/esm/util/node-name.d.ts.map +1 -0
- package/dist/esm/util/node-name.js +15 -0
- package/dist/esm/util/node-name.js.map +6 -0
- package/dist/web/js/{attribute-write-dialog-W7xpCE2E.js → attribute-write-dialog-CqqdRniU.js} +1 -1
- package/dist/web/js/{command-invoke-dialog-BAqAAdJw.js → command-invoke-dialog-BuvBOrdC.js} +1 -1
- package/dist/web/js/{commission-node-dialog-BTzCGgdy.js → commission-node-dialog-nVZp3go0.js} +5 -5
- package/dist/web/js/{commission-node-existing-B2M2hyDh.js → commission-node-existing-Cx3Ahk2t.js} +2 -2
- package/dist/web/js/{commission-node-thread-djdz2dXW.js → commission-node-thread-CI8mWWPs.js} +2 -2
- package/dist/web/js/{commission-node-wifi-DxAYNS1A.js → commission-node-wifi-lUX4LK2R.js} +2 -2
- package/dist/web/js/{dialog-box-tHvPVxDN.js → dialog-box-bAdbnf-T.js} +1 -1
- package/dist/web/js/{fire_event-BleYfTLc.js → fire_event-tWhqPfdz.js} +1 -1
- package/dist/web/js/main.js +1 -1
- package/dist/web/js/{matter-dashboard-app-CVi_GDky.js → matter-dashboard-app-CONA_608.js} +1485 -390
- package/dist/web/js/node-acl-add-dialog-DlR-sF-b.js +320 -0
- package/dist/web/js/node-binding-dialog-DhnX_86M.js +267 -0
- package/dist/web/js/{node-label-dialog-DVZSjsXU.js → node-label-dialog-T3nPG-Qy.js} +1 -1
- package/dist/web/js/{settings-dialog-BG5MgZcO.js → settings-dialog-DrHzJtsi.js} +1 -1
- package/package.json +4 -4
- package/src/components/dialogs/acl/acl-actions.ts +71 -0
- package/src/components/dialogs/acl/model.ts +18 -17
- package/src/components/dialogs/acl/node-acl-add-dialog.ts +350 -0
- package/src/components/dialogs/acl/show-node-acl-add-dialog.ts +14 -0
- package/src/components/dialogs/binding/binding-actions.ts +201 -0
- package/src/components/dialogs/binding/model.ts +11 -4
- package/src/components/dialogs/binding/node-binding-dialog.ts +221 -399
- package/src/pages/cluster-commands/clusters/access-control-commands.ts +407 -0
- package/src/pages/cluster-commands/clusters/binding-commands.ts +273 -0
- package/src/pages/cluster-commands/index.ts +2 -0
- package/src/pages/components/node-details.ts +2 -21
- package/src/pages/components/server-details.ts +3 -3
- package/src/pages/matter-cluster-view.ts +4 -1
- package/src/pages/matter-endpoint-view.ts +16 -10
- package/src/pages/matter-node-view.ts +2 -2
- package/src/pages/network/network-utils.ts +1 -18
- package/src/util/access-control.ts +135 -0
- package/src/util/binding.ts +182 -0
- package/src/util/endpoints.ts +17 -0
- package/src/util/node-name.ts +18 -0
- package/dist/web/js/node-binding-dialog-B9IdqHrZ.js +0 -624
|
@@ -234,7 +234,7 @@ function c$5({
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
// Material Design Icons v7.4.47
|
|
237
|
-
var mdiAccessPoint="M4.93,4.93C3.12,6.74 2,9.24 2,12C2,14.76 3.12,17.26 4.93,19.07L6.34,17.66C4.89,16.22 4,14.22 4,12C4,9.79 4.89,7.78 6.34,6.34L4.93,4.93M19.07,4.93L17.66,6.34C19.11,7.78 20,9.79 20,12C20,14.22 19.11,16.22 17.66,17.66L19.07,19.07C20.88,17.26 22,14.76 22,12C22,9.24 20.88,6.74 19.07,4.93M7.76,7.76C6.67,8.85 6,10.35 6,12C6,13.65 6.67,15.15 7.76,16.24L9.17,14.83C8.45,14.11 8,13.11 8,12C8,10.89 8.45,9.89 9.17,9.17L7.76,7.76M16.24,7.76L14.83,9.17C15.55,9.89 16,10.89 16,12C16,13.11 15.55,14.11 14.83,14.83L16.24,16.24C17.33,15.15 18,13.65 18,12C18,10.35 17.33,8.85 16.24,7.76M12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12A2,2 0 0,0 12,10Z";var mdiAirConditioner="M6.59,0.66C8.93,-1.15 11.47,1.06 12.04,4.5C12.47,4.5 12.89,4.62 13.27,4.84C13.79,4.24 14.25,3.42 14.07,2.5C13.65,0.35 16.06,-1.39 18.35,1.58C20.16,3.92 17.95,6.46 14.5,7.03C14.5,7.46 14.39,7.89 14.16,8.27C14.76,8.78 15.58,9.24 16.5,9.06C18.63,8.64 20.38,11.04 17.41,13.34C15.07,15.15 12.53,12.94 11.96,9.5C11.53,9.5 11.11,9.37 10.74,9.15C10.22,9.75 9.75,10.58 9.93,11.5C10.35,13.64 7.94,15.39 5.65,12.42C3.83,10.07 6.05,7.53 9.5,6.97C9.5,6.54 9.63,6.12 9.85,5.74C9.25,5.23 8.43,4.76 7.5,4.94C5.37,5.36 3.62,2.96 6.59,0.66M5,16H7A2,2 0 0,1 9,18V24H7V22H5V24H3V18A2,2 0 0,1 5,16M5,18V20H7V18H5M12.93,16H15L12.07,24H10L12.93,16M18,16H21V18H18V22H21V24H18A2,2 0 0,1 16,22V18A2,2 0 0,1 18,16Z";var mdiAirFilter="M19,18.31V20A2,2 0 0,1 17,22H7A2,2 0 0,1 5,20V16.3C4.54,16.12 3.95,16 3,16A1,1 0 0,1 2,15A1,1 0 0,1 3,14C3.82,14 4.47,14.08 5,14.21V12.3C4.54,12.12 3.95,12 3,12A1,1 0 0,1 2,11A1,1 0 0,1 3,10C3.82,10 4.47,10.08 5,10.21V8.3C4.54,8.12 3.95,8 3,8A1,1 0 0,1 2,7A1,1 0 0,1 3,6C3.82,6 4.47,6.08 5,6.21V4A2,2 0 0,1 7,2H17A2,2 0 0,1 19,4V6.16C20.78,6.47 21.54,7.13 21.71,7.29C22.1,7.68 22.1,8.32 21.71,8.71C21.32,9.1 20.8,9.09 20.29,8.71V8.71C20.29,8.71 19.25,8 17,8C15.74,8 14.91,8.41 13.95,8.9C12.91,9.41 11.74,10 10,10C9.64,10 9.31,10 9,9.96V7.95C9.3,8 9.63,8 10,8C11.26,8 12.09,7.59 13.05,7.11C14.09,6.59 15.27,6 17,6V4H7V20H17V18C18.5,18 18.97,18.29 19,18.31M17,10C15.27,10 14.09,10.59 13.05,11.11C12.09,11.59 11.26,12 10,12C9.63,12 9.3,12 9,11.95V13.96C9.31,14 9.64,14 10,14C11.74,14 12.91,13.41 13.95,12.9C14.91,12.42 15.74,12 17,12C19.25,12 20.29,12.71 20.29,12.71V12.71C20.8,13.1 21.32,13.1 21.71,12.71C22.1,12.32 22.1,11.69 21.71,11.29C21.5,11.08 20.25,10 17,10M17,14C15.27,14 14.09,14.59 13.05,15.11C12.09,15.59 11.26,16 10,16C9.63,16 9.3,16 9,15.95V17.96C9.31,18 9.64,18 10,18C11.74,18 12.91,17.41 13.95,16.9C14.91,16.42 15.74,16 17,16C19.25,16 20.29,16.71 20.29,16.71V16.71C20.8,17.1 21.32,17.1 21.71,16.71C22.1,16.32 22.1,15.69 21.71,15.29C21.5,15.08 20.25,14 17,14Z";var mdiAirPurifier="M11,9A4,4 0 0,1 15,13A4,4 0 0,1 11,17A4,4 0 0,1 7,13A4,4 0 0,1 11,9M11,11A2,2 0 0,0 9,13A2,2 0 0,0 11,15A2,2 0 0,0 13,13A2,2 0 0,0 11,11M7,4H14A4,4 0 0,1 18,8V9H16V8A2,2 0 0,0 14,6H7A2,2 0 0,0 5,8V20H16V18H18V22H3V8A4,4 0 0,1 7,4M16,11C18.5,11 18.5,9 21,9V11C18.5,11 18.5,13 16,13V11M16,15C18.5,15 18.5,13 21,13V15C18.5,15 18.5,17 16,17V15Z";var mdiAlertCircleOutline="M11,15H13V17H11V15M11,7H13V13H11V7M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20Z";var mdiArrowDown="M11,4H13V16L18.5,10.5L19.92,11.92L12,19.84L4.08,11.92L5.5,10.5L11,16V4Z";var mdiArrowLeft="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z";var mdiArrowRight="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z";var mdiArrowUp="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z";var mdiBell="M21,19V20H3V19L5,17V11C5,7.9 7.03,5.17 10,4.29C10,4.19 10,4.1 10,4A2,2 0 0,1 12,2A2,2 0 0,1 14,4C14,4.1 14,4.19 14,4.29C16.97,5.17 19,7.9 19,11V17L21,19M14,21A2,2 0 0,1 12,23A2,2 0 0,1 10,21";var mdiBlindsHorizontal="M20 19V3H4V19H2V21H22V19H20M16 9H18V11H16V9M14 11H6V9H14V11M18 7H16V5H18V7M14 5V7H6V5H14M6 19V13H14V14.82C13.55 15.14 13.25 15.66 13.25 16.25C13.25 17.22 14.03 18 15 18S16.75 17.22 16.75 16.25C16.75 15.66 16.45 15.13 16 14.82V13H18V19H6Z";var mdiBrightnessAuto="M14.3,16L13.6,14H10.4L9.7,16H7.8L11,7H13L16.2,16H14.3M20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31L23.31,12L20,8.69M10.85,12.65H13.15L12,9L10.85,12.65Z";var mdiBrightnessPercent="M20.04,8.71V4H15.34L12,0.69L8.71,4H4V8.71L0.69,12L4,15.34V20.04H8.71L12,23.35L15.34,20.04H20.04V15.34L23.35,12L20.04,8.71M8.83,7.05C9.81,7.05 10.6,7.84 10.6,8.83A1.77,1.77 0 0,1 8.83,10.6C7.84,10.6 7.05,9.81 7.05,8.83C7.05,7.84 7.84,7.05 8.83,7.05M15.22,17C14.24,17 13.45,16.2 13.45,15.22A1.77,1.77 0 0,1 15.22,13.45C16.2,13.45 17,14.24 17,15.22A1.78,1.78 0 0,1 15.22,17M8.5,17.03L7,15.53L15.53,7L17.03,8.5L8.5,17.03Z";var mdiCamera="M4,4H7L9,2H15L17,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z";var mdiCast="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z";var mdiCctv="M6.03 12.03L8.03 15.5L5.5 18.68L2 12.62L6.03 12.03M17 18V15.29C17.88 14.9 18.5 14.03 18.5 13C18.5 12.43 18.3 11.9 17.97 11.5L19.94 10.35C20.95 9.76 21.3 8.47 20.71 7.46L19.33 5.06C18.74 4.05 17.45 3.7 16.44 4.28L8.31 9C7.36 9.53 7.03 10.75 7.58 11.71L9.08 14.31C9.63 15.26 10.86 15.59 11.81 15.04L13.69 13.96C13.94 14.55 14.41 15.03 15 15.29V18C15 19.1 15.9 20 17 20H22V18H17Z";var mdiChatProcessing="M12,3C17.5,3 22,6.58 22,11C22,15.42 17.5,19 12,19C10.76,19 9.57,18.82 8.47,18.5C5.55,21 2,21 2,21C4.33,18.67 4.7,17.1 4.75,16.5C3.05,15.07 2,13.13 2,11C2,6.58 6.5,3 12,3M17,12V10H15V12H17M13,12V10H11V12H13M9,12V10H7V12H9Z";var mdiChevronDown="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z";var mdiChevronRight="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z";var mdiChip="M6,4H18V5H21V7H18V9H21V11H18V13H21V15H18V17H21V19H18V20H6V19H3V17H6V15H3V13H6V11H3V9H6V7H3V5H6V4M11,15V18H12V15H11M13,15V18H14V15H13M15,15V18H16V15H15Z";var mdiCircleMedium="M12,8A4,4 0 0,0 8,12A4,4 0 0,0 12,16A4,4 0 0,0 16,12A4,4 0 0,0 12,8Z";var mdiClose="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z";var mdiCog="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z";var mdiContentSaveOutline="M17 3H5C3.89 3 3 3.9 3 5V19C3 20.1 3.89 21 5 21H19C20.1 21 21 20.1 21 19V7L17 3M19 19H5V5H16.17L19 7.83V19M12 12C10.34 12 9 13.34 9 15S10.34 18 12 18 15 16.66 15 15 13.66 12 12 12M6 6H15V10H6V6Z";var mdiCrown="M5 16L3 5L8.5 10L12 4L15.5 10L21 5L19 16H5M19 19C19 19.6 18.6 20 18 20H6C5.4 20 5 19.6 5 19V18H19V19Z";var mdiDishwasher="M18,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V4A2,2 0 0,0 18,2M10,4A1,1 0 0,1 11,5A1,1 0 0,1 10,6A1,1 0 0,1 9,5A1,1 0 0,1 10,4M7,4A1,1 0 0,1 8,5A1,1 0 0,1 7,6A1,1 0 0,1 6,5A1,1 0 0,1 7,4M18,20H6V8H18V20M14.67,15.33C14.69,16.03 14.41,16.71 13.91,17.21C12.86,18.26 11.15,18.27 10.09,17.21C9.59,16.71 9.31,16.03 9.33,15.33C9.4,14.62 9.63,13.94 10,13.33C10.37,12.5 10.81,11.73 11.33,11L12,10C13.79,12.59 14.67,14.36 14.67,15.33";var mdiDoorOpen="M12,3C10.89,3 10,3.89 10,5H3V19H2V21H22V19H21V5C21,3.89 20.11,3 19,3H12M12,5H19V19H12V5M5,11H7V13H5V11Z";var mdiDoorbell="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M16 2H8C6.9 2 6 2.9 6 4V20C6 21.1 6.9 22 8 22H16C17.1 22 18 21.1 18 20V4C18 2.9 17.1 2 16 2M16 20H8V4H16V20Z";var mdiDoorbellVideo="M14 15C14 16.11 13.11 17 12 17S10 16.11 10 15 10.9 13 12 13 14 13.9 14 15M18 4V20C18 21.1 17.11 22 16 22H8C6.9 22 6 21.11 6 20V4C6 2.9 6.9 2 8 2H16C17.11 2 18 2.9 18 4M10.5 7C10.5 7.83 11.17 8.5 12 8.5S13.5 7.83 13.5 7 12.83 5.5 12 5.5 10.5 6.17 10.5 7M16 10H8V20H16V10Z";var mdiEthernet="M7,15H9V18H11V15H13V18H15V15H17V18H19V9H15V6H9V9H5V18H7V15M4.38,3H19.63C20.94,3 22,4.06 22,5.38V19.63A2.37,2.37 0 0,1 19.63,22H4.38C3.06,22 2,20.94 2,19.63V5.38C2,4.06 3.06,3 4.38,3Z";var mdiEvStation="M19.77,7.23L19.78,7.22L16.06,3.5L15,4.56L17.11,6.67C16.17,7.03 15.5,7.93 15.5,9A2.5,2.5 0 0,0 18,11.5C18.36,11.5 18.69,11.42 19,11.29V18.5A1,1 0 0,1 18,19.5A1,1 0 0,1 17,18.5V14A2,2 0 0,0 15,12H14V5A2,2 0 0,0 12,3H6A2,2 0 0,0 4,5V21H14V13.5H15.5V18.5A2.5,2.5 0 0,0 18,21A2.5,2.5 0 0,0 20.5,18.5V9C20.5,8.31 20.22,7.68 19.77,7.23M18,10A1,1 0 0,1 17,9A1,1 0 0,1 18,8A1,1 0 0,1 19,9A1,1 0 0,1 18,10M8,18V13.5H6L10,6V11H12L8,18Z";var mdiEye="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z";var mdiEyeOff="M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z";var mdiFan="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12.5,2C17,2 17.11,5.57 14.75,6.75C13.76,7.24 13.32,8.29 13.13,9.22C13.61,9.42 14.03,9.73 14.35,10.13C18.05,8.13 22.03,8.92 22.03,12.5C22.03,17 18.46,17.1 17.28,14.73C16.78,13.74 15.72,13.3 14.79,13.11C14.59,13.59 14.28,14 13.88,14.34C15.87,18.03 15.08,22 11.5,22C7,22 6.91,18.42 9.27,17.24C10.25,16.75 10.69,15.71 10.89,14.79C10.4,14.59 9.97,14.27 9.65,13.87C5.96,15.85 2,15.07 2,11.5C2,7 5.56,6.89 6.74,9.26C7.24,10.25 8.29,10.68 9.22,10.87C9.41,10.39 9.73,9.97 10.14,9.65C8.15,5.96 8.94,2 12.5,2Z";var mdiFile="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z";var mdiFitToScreen="M17 4H20C21.1 4 22 4.9 22 6V8H20V6H17V4M4 8V6H7V4H4C2.9 4 2 4.9 2 6V8H4M20 16V18H17V20H20C21.1 20 22 19.1 22 18V16H20M7 18H4V16H2V18C2 19.1 2.9 20 4 20H7V18M18 8H6V16H18V8Z";var mdiFridge="M7,2H17A2,2 0 0,1 19,4V9H5V4A2,2 0 0,1 7,2M19,19A2,2 0 0,1 17,21V22H15V21H9V22H7V21A2,2 0 0,1 5,19V10H19V19M8,5V7H10V5H8M8,12V15H10V12H8Z";var mdiGauge="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12C20,14.4 19,16.5 17.3,18C15.9,16.7 14,16 12,16C10,16 8.2,16.7 6.7,18C5,16.5 4,14.4 4,12A8,8 0 0,1 12,4M14,5.89C13.62,5.9 13.26,6.15 13.1,6.54L11.81,9.77L11.71,10C11,10.13 10.41,10.6 10.14,11.26C9.73,12.29 10.23,13.45 11.26,13.86C12.29,14.27 13.45,13.77 13.86,12.74C14.12,12.08 14,11.32 13.57,10.76L13.67,10.5L14.96,7.29L14.97,7.26C15.17,6.75 14.92,6.17 14.41,5.96C14.28,5.91 14.15,5.89 14,5.89M10,6A1,1 0 0,0 9,7A1,1 0 0,0 10,8A1,1 0 0,0 11,7A1,1 0 0,0 10,6M7,9A1,1 0 0,0 6,10A1,1 0 0,0 7,11A1,1 0 0,0 8,10A1,1 0 0,0 7,9M17,9A1,1 0 0,0 16,10A1,1 0 0,0 17,11A1,1 0 0,0 18,10A1,1 0 0,0 17,9Z";var mdiGraphOutline="M19.5 17C19.36 17 19.24 17 19.11 17.04L17.5 13.8C17.95 13.35 18.25 12.71 18.25 12C18.25 10.62 17.13 9.5 15.75 9.5C15.61 9.5 15.5 9.5 15.35 9.54L13.74 6.3C14.21 5.84 14.5 5.21 14.5 4.5C14.5 3.12 13.38 2 12 2S9.5 3.12 9.5 4.5C9.5 5.2 9.79 5.84 10.26 6.29L8.65 9.54C8.5 9.5 8.39 9.5 8.25 9.5C6.87 9.5 5.75 10.62 5.75 12C5.75 12.71 6.04 13.34 6.5 13.79L4.89 17.04C4.76 17 4.64 17 4.5 17C3.12 17 2 18.12 2 19.5C2 20.88 3.12 22 4.5 22S7 20.88 7 19.5C7 18.8 6.71 18.16 6.24 17.71L7.86 14.46C8 14.5 8.12 14.5 8.25 14.5C8.38 14.5 8.5 14.5 8.63 14.46L10.26 17.71C9.79 18.16 9.5 18.8 9.5 19.5C9.5 20.88 10.62 22 12 22S14.5 20.88 14.5 19.5C14.5 18.12 13.38 17 12 17C11.87 17 11.74 17 11.61 17.04L10 13.8C10.45 13.35 10.75 12.71 10.75 12C10.75 11.3 10.46 10.67 10 10.21L11.61 6.96C11.74 7 11.87 7 12 7C12.13 7 12.26 7 12.39 6.96L14 10.21C13.54 10.66 13.25 11.3 13.25 12C13.25 13.38 14.37 14.5 15.75 14.5C15.88 14.5 16 14.5 16.13 14.46L17.76 17.71C17.29 18.16 17 18.8 17 19.5C17 20.88 18.12 22 19.5 22S22 20.88 22 19.5C22 18.12 20.88 17 19.5 17M4.5 20.5C3.95 20.5 3.5 20.05 3.5 19.5S3.95 18.5 4.5 18.5 5.5 18.95 5.5 19.5 5.05 20.5 4.5 20.5M13 19.5C13 20.05 12.55 20.5 12 20.5S11 20.05 11 19.5 11.45 18.5 12 18.5 13 18.95 13 19.5M7.25 12C7.25 11.45 7.7 11 8.25 11S9.25 11.45 9.25 12 8.8 13 8.25 13 7.25 12.55 7.25 12M11 4.5C11 3.95 11.45 3.5 12 3.5S13 3.95 13 4.5 12.55 5.5 12 5.5 11 5.05 11 4.5M14.75 12C14.75 11.45 15.2 11 15.75 11S16.75 11.45 16.75 12 16.3 13 15.75 13 14.75 12.55 14.75 12M19.5 20.5C18.95 20.5 18.5 20.05 18.5 19.5S18.95 18.5 19.5 18.5 20.5 18.95 20.5 19.5 20.05 20.5 19.5 20.5Z";var mdiHeatPump="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M12.75 7.08C13.57 7.2 14.32 7.5 14.95 8L12.75 10.19V7.08M11.25 7.08V10.19L9.05 8C9.68 7.5 10.43 7.2 11.25 7.08M8 9.05L10.19 11.25H7.08C7.2 10.43 7.5 9.68 8 9.05M7.08 12.75H10.19L8 14.95C7.5 14.32 7.2 13.57 7.08 12.75M11.25 16.92C10.43 16.8 9.68 16.5 9.05 16L11.25 13.81V16.92M12 13C11.45 13 11 12.55 11 12S11.45 11 12 11 13 11.45 13 12 12.55 13 12 13M12.75 16.92V13.81L14.95 16C14.32 16.5 13.57 16.8 12.75 16.92M16 14.95L13.81 12.75H16.92C16.8 13.57 16.5 14.32 16 14.95M13.81 11.25L16 9.05C16.5 9.69 16.8 10.44 16.92 11.25H13.81Z";var mdiHelp="M10,19H13V22H10V19M12,2C17.35,2.22 19.68,7.62 16.5,11.67C15.67,12.67 14.33,13.33 13.67,14.17C13,15 13,16 13,17H10C10,15.33 10,13.92 10.67,12.92C11.33,11.92 12.67,11.33 13.5,10.67C15.92,8.43 15.32,5.26 12,5A3,3 0 0,0 9,8H6A6,6 0 0,1 12,2Z";var mdiHome="M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z";var mdiLeaf="M17,8C8,10 5.9,16.17 3.82,21.34L5.71,22L6.66,19.7C7.14,19.87 7.64,20 8,20C19,20 22,3 22,3C21,5 14,5.25 9,6.25C4,7.25 2,11.5 2,13.5C2,15.5 3.75,17.25 3.75,17.25C7,8 17,8 17,8Z";var mdiLightbulb="M12,2A7,7 0 0,0 5,9C5,11.38 6.19,13.47 8,14.74V17A1,1 0 0,0 9,18H15A1,1 0 0,0 16,17V14.74C17.81,13.47 19,11.38 19,9A7,7 0 0,0 12,2M9,21A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21V20H9V21Z";var mdiLink="M3.9,12C3.9,10.29 5.29,8.9 7,8.9H11V7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12M8,13H16V11H8V13M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.71 18.71,15.1 17,15.1H13V17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7Z";var mdiLinkVariantOff="M2,5.27L3.28,4L20,20.72L18.73,22L13.9,17.17L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L12.5,15.76L10.88,14.15C10.87,14.39 10.77,14.64 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C8.12,13.77 7.63,12.37 7.72,11L2,5.27M12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.79,8.97L9.38,7.55L12.71,4.22M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.2,10.54 16.61,12.5 16.06,14.23L14.28,12.46C14.23,11.78 13.94,11.11 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z";var mdiLoading="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z";var mdiLock="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z";var mdiLogout="M17 7L15.59 8.41L18.17 11H8V13H18.17L15.59 15.58L17 17L22 12M4 5H12V3H4C2.9 3 2 3.9 2 5V19C2 20.1 2.9 21 4 21H12V19H4V5Z";var mdiMagnifyMinus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M5,8V10H13V8H5Z";var mdiMagnifyPlus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M8,5V8H5V10H8V13H10V10H13V8H10V5H8Z";var mdiMeterElectric="M12 2C7.04 2 3 6.04 3 11C3 14.91 5.5 18.24 9 19.47V22H11V19.94C11.33 20 11.66 20 12 20S12.67 20 13 19.94V22H15V19.47C18.5 18.23 21 14.9 21 11C21 6.04 16.96 2 12 2M14.25 14L11.25 17L9.75 15.5L11 14.25L9.75 13L12.75 10L14.25 11.5L13 12.75L14.25 14M16 9H8V7H16V9Z";var mdiMicrowave="M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H16V17H4V7M19,7A1,1 0 0,1 20,8A1,1 0 0,1 19,9A1,1 0 0,1 18,8A1,1 0 0,1 19,7M13,9V15H15V9H13M19,11A1,1 0 0,1 20,12A1,1 0 0,1 19,13A1,1 0 0,1 18,12A1,1 0 0,1 19,11Z";var mdiMinus="M19,13H5V11H19V13Z";var mdiMotionSensor="M10,0.2C9,0.2 8.2,1 8.2,2C8.2,3 9,3.8 10,3.8C11,3.8 11.8,3 11.8,2C11.8,1 11,0.2 10,0.2M15.67,1A7.33,7.33 0 0,0 23,8.33V7A6,6 0 0,1 17,1H15.67M18.33,1C18.33,3.58 20.42,5.67 23,5.67V4.33C21.16,4.33 19.67,2.84 19.67,1H18.33M21,1A2,2 0 0,0 23,3V1H21M7.92,4.03C7.75,4.03 7.58,4.06 7.42,4.11L2,5.8V11H3.8V7.33L5.91,6.67L2,22H3.8L6.67,13.89L9,17V22H10.8V15.59L8.31,11.05L9.04,8.18L10.12,10H15V8.2H11.38L9.38,4.87C9.08,4.37 8.54,4.03 7.92,4.03Z";var mdiPause="M14,19H18V5H14M6,19H10V5H6V19Z";var mdiPencil="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z";var mdiPlay="M8,5.14V19.14L19,12.14L8,5.14Z";var mdiPlus="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z";var mdiPowerPlug="M16,7V3H14V7H10V3H8V7H8C7,7 6,8 6,9V14.5L9.5,18V21H14.5V18L18,14.5V9C18,8 17,7 16,7Z";var mdiPump="M2 21V15H3.5C3.18 14.06 3 13.05 3 12C3 7.03 7.03 3 12 3H22V9H20.5C20.82 9.94 21 10.95 21 12C21 16.97 16.97 21 12 21H2M5 12C5 13.28 5.34 14.47 5.94 15.5L9.4 13.5C9.15 13.06 9 12.55 9 12C9 11.35 9.21 10.75 9.56 10.26L6.3 7.93C5.5 9.08 5 10.5 5 12M12 19C14.59 19 16.85 17.59 18.06 15.5L14.6 13.5C14.08 14.4 13.11 15 12 15L11.71 15L11.33 18.97L12 19M12 9C13.21 9 14.26 9.72 14.73 10.76L18.37 9.1C17.27 6.68 14.83 5 12 5V9M12 11C11.45 11 11 11.45 11 12C11 12.55 11.45 13 12 13C12.55 13 13 12.55 13 12C13 11.45 12.55 11 12 11Z";var mdiRefresh="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z";var mdiRemote="M12,0C8.96,0 6.21,1.23 4.22,3.22L5.63,4.63C7.26,3 9.5,2 12,2C14.5,2 16.74,3 18.36,4.64L19.77,3.23C17.79,1.23 15.04,0 12,0M7.05,6.05L8.46,7.46C9.37,6.56 10.62,6 12,6C13.38,6 14.63,6.56 15.54,7.46L16.95,6.05C15.68,4.78 13.93,4 12,4C10.07,4 8.32,4.78 7.05,6.05M12,15A2,2 0 0,1 10,13A2,2 0 0,1 12,11A2,2 0 0,1 14,13A2,2 0 0,1 12,15M15,9H9A1,1 0 0,0 8,10V22A1,1 0 0,0 9,23H15A1,1 0 0,0 16,22V10A1,1 0 0,0 15,9Z";var mdiRobotVacuum="M12,2C14.65,2 17.19,3.06 19.07,4.93L17.65,6.35C16.15,4.85 14.12,4 12,4C9.88,4 7.84,4.84 6.35,6.35L4.93,4.93C6.81,3.06 9.35,2 12,2M3.66,6.5L5.11,7.94C4.39,9.17 4,10.57 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,10.57 19.61,9.17 18.88,7.94L20.34,6.5C21.42,8.12 22,10.04 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,10.04 2.58,8.12 3.66,6.5M12,6A6,6 0 0,1 18,12C18,13.59 17.37,15.12 16.24,16.24L14.83,14.83C14.08,15.58 13.06,16 12,16C10.94,16 9.92,15.58 9.17,14.83L7.76,16.24C6.63,15.12 6,13.59 6,12A6,6 0 0,1 12,6M12,8A1,1 0 0,0 11,9A1,1 0 0,0 12,10A1,1 0 0,0 13,9A1,1 0 0,0 12,8Z";var mdiRouter="M12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22C17.5 22 22 17.5 22 12C22 6.5 17.5 2 12 2M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20M13 13V16H15L12 19L9 16H11V13M5 13H8V15L11 12L8 9V11H5M11 11V8H9L12 5L15 8H13V11M19 11H16V9L13 12L16 15V13H19";var mdiRouterWireless="M20.2,5.9L21,5.1C19.6,3.7 17.8,3 16,3C14.2,3 12.4,3.7 11,5.1L11.8,5.9C13,4.8 14.5,4.2 16,4.2C17.5,4.2 19,4.8 20.2,5.9M19.3,6.7C18.4,5.8 17.2,5.3 16,5.3C14.8,5.3 13.6,5.8 12.7,6.7L13.5,7.5C14.2,6.8 15.1,6.5 16,6.5C16.9,6.5 17.8,6.8 18.5,7.5L19.3,6.7M19,13H17V9H15V13H5A2,2 0 0,0 3,15V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V15A2,2 0 0,0 19,13M8,18H6V16H8V18M11.5,18H9.5V16H11.5V18M15,18H13V16H15V18Z";var mdiShareVariant="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19A2.92,2.92 0 0,0 18,16.08Z";var mdiSignalCellular1="M19.5,5.5V18.5H17.5V5.5H19.5M12.5,10.5V18.5H10.5V10.5H12.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular2="M19.5,5.5V18.5H17.5V5.5H19.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular3="M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSleep="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z";var mdiSmokeDetector="M12,18A6,6 0 0,0 18,12C18,8.68 15.31,6 12,6C8.68,6 6,8.68 6,12A6,6 0 0,0 12,18M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H19M8,12A4,4 0 0,1 12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12Z";var mdiSnowflakeAlert="M16.46,9.41L13,7.38V5.12L14.71,3.41L13.29,2L12,3.29L10.71,2L9.29,3.41L11,5.12V7.38L8.5,8.82L6.5,7.69L5.92,5.36L4,5.88L4.47,7.65L2.7,8.12L3.22,10.05L5.55,9.43L7.55,10.56V13.45L5.55,14.58L3.22,13.96L2.7,15.89L4.47,16.36L4,18.12L5.93,18.64L6.55,16.31L8.55,15.18L11,16.62V18.88L9.29,20.59L10.71,22L12,20.71L13.29,22L14.7,20.59L13,18.88V16.62L16.46,14.61M9.5,10.56L12,9.11L14.5,10.56V13.44L12,14.89L9.5,13.44M19,13V7H21V13H19M19,17V15H21V17H19Z";var mdiSolarPower="M11.45,2V5.55L15,3.77L11.45,2M10.45,8L8,10.46L11.75,11.71L10.45,8M2,11.45L3.77,15L5.55,11.45H2M10,2H2V10C2.57,10.17 3.17,10.25 3.77,10.25C7.35,10.26 10.26,7.35 10.27,3.75C10.26,3.16 10.17,2.57 10,2M17,22V16H14L19,7V13H22L17,22Z";var mdiSpeaker="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z";var mdiSprinkler="M11 7H13V9H11V7M5 22H9V10H5V22M14 11H16V9H14V11M17 10H19V8H17V10M17 5V7H19V5H17M14 8H16V6H14V8M17 13H19V11H17V13M5 7H5.33L6 9H8L8.67 7H9V6H5V7Z";var mdiStar="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z";var mdiStove="M6,14H8L11,17H9L6,14M4,4H5V3A1,1 0 0,1 6,2H10A1,1 0 0,1 11,3V4H13V3A1,1 0 0,1 14,2H18A1,1 0 0,1 19,3V4H20A2,2 0 0,1 22,6V19A2,2 0 0,1 20,21V22H17V21H7V22H4V21A2,2 0 0,1 2,19V6A2,2 0 0,1 4,4M18,7A1,1 0 0,1 19,8A1,1 0 0,1 18,9A1,1 0 0,1 17,8A1,1 0 0,1 18,7M14,7A1,1 0 0,1 15,8A1,1 0 0,1 14,9A1,1 0 0,1 13,8A1,1 0 0,1 14,7M20,6H4V10H20V6M4,19H20V12H4V19M6,7A1,1 0 0,1 7,8A1,1 0 0,1 6,9A1,1 0 0,1 5,8A1,1 0 0,1 6,7M13,14H15L18,17H16L13,14Z";var mdiSwapHorizontal="M21,9L17,5V8H10V10H17V13M7,11L3,15L7,19V16H14V14H7V11Z";var mdiTelevision="M21,17H3V5H21M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H8V21H16V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z";var mdiThermometer="M15 13V5A3 3 0 0 0 9 5V13A5 5 0 1 0 15 13M12 4A1 1 0 0 1 13 5V8H11V5A1 1 0 0 1 12 4Z";var mdiToggleSwitch="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z";var mdiTrashCan="M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z";var mdiTumbleDryer="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8M8.11,10.5H10C9.76,11.88 10,12.67 10.58,13.29C11.68,14.36 12.16,15.71 11.89,17.5H10C10.24,16.12 10,15.33 9.42,14.71C8.32,13.64 7.85,12.29 8.11,10.5M12.11,10.5H14C13.76,11.88 14,12.67 14.58,13.29C15.68,14.36 16.16,15.71 15.89,17.5H14C14.24,16.12 14,15.33 13.42,14.71C12.32,13.64 11.85,12.29 12.11,10.5Z";var mdiUpdate="M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z";var mdiVideo="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z";var mdiVideoOutline="M15,8V16H5V8H15M16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5V7A1,1 0 0,0 16,6Z";var mdiVolumeHigh="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z";var mdiVolumeOff="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z";var mdiWashingMachine="M14.83,11.17C16.39,12.73 16.39,15.27 14.83,16.83C13.27,18.39 10.73,18.39 9.17,16.83L14.83,11.17M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8Z";var mdiWater="M12,20A6,6 0 0,1 6,14C6,10 12,3.25 12,3.25C12,3.25 18,10 18,14A6,6 0 0,1 12,20Z";var mdiWaterBoiler="M8 2C6.89 2 6 2.89 6 4V16C6 17.11 6.89 18 8 18H9V20H6V22H9C10.11 22 11 21.11 11 20V18H13V20C13 21.11 13.89 22 15 22H18V20H15V18H16C17.11 18 18 17.11 18 16V4C18 2.89 17.11 2 16 2H8M12 4.97A2 2 0 0 1 14 6.97A2 2 0 0 1 12 8.97A2 2 0 0 1 10 6.97A2 2 0 0 1 12 4.97M10 14.5H14V16H10V14.5Z";var mdiWaterPercent="M12,3.25C12,3.25 6,10 6,14C6,17.32 8.69,20 12,20A6,6 0 0,0 18,14C18,10 12,3.25 12,3.25M14.47,9.97L15.53,11.03L9.53,17.03L8.47,15.97M9.75,10A1.25,1.25 0 0,1 11,11.25A1.25,1.25 0 0,1 9.75,12.5A1.25,1.25 0 0,1 8.5,11.25A1.25,1.25 0 0,1 9.75,10M14.25,14.5A1.25,1.25 0 0,1 15.5,15.75A1.25,1.25 0 0,1 14.25,17A1.25,1.25 0 0,1 13,15.75A1.25,1.25 0 0,1 14.25,14.5Z";var mdiWeatherNight="M17.75,4.09L15.22,6.03L16.13,9.09L13.5,7.28L10.87,9.09L11.78,6.03L9.25,4.09L12.44,4L13.5,1L14.56,4L17.75,4.09M21.25,11L19.61,12.25L20.2,14.23L18.5,13.06L16.8,14.23L17.39,12.25L15.75,11L17.81,10.95L18.5,9L19.19,10.95L21.25,11M18.97,15.95C19.8,15.87 20.69,17.05 20.16,17.8C19.84,18.25 19.5,18.67 19.08,19.07C15.17,23 8.84,23 4.94,19.07C1.03,15.17 1.03,8.83 4.94,4.93C5.34,4.53 5.76,4.17 6.21,3.85C6.96,3.32 8.14,4.21 8.06,5.04C7.79,7.9 8.75,10.87 10.95,13.06C13.14,15.26 16.1,16.22 18.97,15.95M17.33,17.97C14.5,17.81 11.7,16.64 9.53,14.5C7.36,12.31 6.2,9.5 6.04,6.68C3.23,9.82 3.34,14.64 6.35,17.66C9.37,20.67 14.19,20.78 17.33,17.97Z";var mdiWeatherRainy="M6,14.03A1,1 0 0,1 7,15.03C7,15.58 6.55,16.03 6,16.03C3.24,16.03 1,13.79 1,11.03C1,8.27 3.24,6.03 6,6.03C7,3.68 9.3,2.03 12,2.03C15.43,2.03 18.24,4.69 18.5,8.06L19,8.03A4,4 0 0,1 23,12.03C23,14.23 21.21,16.03 19,16.03H18C17.45,16.03 17,15.58 17,15.03C17,14.47 17.45,14.03 18,14.03H19A2,2 0 0,0 21,12.03A2,2 0 0,0 19,10.03H17V9.03C17,6.27 14.76,4.03 12,4.03C9.5,4.03 7.45,5.84 7.06,8.21C6.73,8.09 6.37,8.03 6,8.03A3,3 0 0,0 3,11.03A3,3 0 0,0 6,14.03M12,14.15C12.18,14.39 12.37,14.66 12.56,14.94C13,15.56 14,17.03 14,18C14,19.11 13.1,20 12,20A2,2 0 0,1 10,18C10,17.03 11,15.56 11.44,14.94C11.63,14.66 11.82,14.4 12,14.15M12,11.03L11.5,11.59C11.5,11.59 10.65,12.55 9.79,13.81C8.93,15.06 8,16.56 8,18A4,4 0 0,0 12,22A4,4 0 0,0 16,18C16,16.56 15.07,15.06 14.21,13.81C13.35,12.55 12.5,11.59 12.5,11.59";var mdiWeatherSunny="M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,2L14.39,5.42C13.65,5.15 12.84,5 12,5C11.16,5 10.35,5.15 9.61,5.42L12,2M3.34,7L7.5,6.65C6.9,7.16 6.36,7.78 5.94,8.5C5.5,9.24 5.25,10 5.11,10.79L3.34,7M3.36,17L5.12,13.23C5.26,14 5.53,14.78 5.95,15.5C6.37,16.24 6.91,16.86 7.5,17.37L3.36,17M20.65,7L18.88,10.79C18.74,10 18.47,9.23 18.05,8.5C17.63,7.78 17.1,7.15 16.5,6.64L20.65,7M20.64,17L16.5,17.36C17.09,16.85 17.62,16.22 18.04,15.5C18.46,14.77 18.73,14 18.87,13.21L20.64,17M12,22L9.59,18.56C10.33,18.83 11.14,19 12,19C12.82,19 13.63,18.83 14.37,18.56L12,22Z";var mdiWifi="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z";
|
|
237
|
+
var mdiAccessPoint="M4.93,4.93C3.12,6.74 2,9.24 2,12C2,14.76 3.12,17.26 4.93,19.07L6.34,17.66C4.89,16.22 4,14.22 4,12C4,9.79 4.89,7.78 6.34,6.34L4.93,4.93M19.07,4.93L17.66,6.34C19.11,7.78 20,9.79 20,12C20,14.22 19.11,16.22 17.66,17.66L19.07,19.07C20.88,17.26 22,14.76 22,12C22,9.24 20.88,6.74 19.07,4.93M7.76,7.76C6.67,8.85 6,10.35 6,12C6,13.65 6.67,15.15 7.76,16.24L9.17,14.83C8.45,14.11 8,13.11 8,12C8,10.89 8.45,9.89 9.17,9.17L7.76,7.76M16.24,7.76L14.83,9.17C15.55,9.89 16,10.89 16,12C16,13.11 15.55,14.11 14.83,14.83L16.24,16.24C17.33,15.15 18,13.65 18,12C18,10.35 17.33,8.85 16.24,7.76M12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12A2,2 0 0,0 12,10Z";var mdiAirConditioner="M6.59,0.66C8.93,-1.15 11.47,1.06 12.04,4.5C12.47,4.5 12.89,4.62 13.27,4.84C13.79,4.24 14.25,3.42 14.07,2.5C13.65,0.35 16.06,-1.39 18.35,1.58C20.16,3.92 17.95,6.46 14.5,7.03C14.5,7.46 14.39,7.89 14.16,8.27C14.76,8.78 15.58,9.24 16.5,9.06C18.63,8.64 20.38,11.04 17.41,13.34C15.07,15.15 12.53,12.94 11.96,9.5C11.53,9.5 11.11,9.37 10.74,9.15C10.22,9.75 9.75,10.58 9.93,11.5C10.35,13.64 7.94,15.39 5.65,12.42C3.83,10.07 6.05,7.53 9.5,6.97C9.5,6.54 9.63,6.12 9.85,5.74C9.25,5.23 8.43,4.76 7.5,4.94C5.37,5.36 3.62,2.96 6.59,0.66M5,16H7A2,2 0 0,1 9,18V24H7V22H5V24H3V18A2,2 0 0,1 5,16M5,18V20H7V18H5M12.93,16H15L12.07,24H10L12.93,16M18,16H21V18H18V22H21V24H18A2,2 0 0,1 16,22V18A2,2 0 0,1 18,16Z";var mdiAirFilter="M19,18.31V20A2,2 0 0,1 17,22H7A2,2 0 0,1 5,20V16.3C4.54,16.12 3.95,16 3,16A1,1 0 0,1 2,15A1,1 0 0,1 3,14C3.82,14 4.47,14.08 5,14.21V12.3C4.54,12.12 3.95,12 3,12A1,1 0 0,1 2,11A1,1 0 0,1 3,10C3.82,10 4.47,10.08 5,10.21V8.3C4.54,8.12 3.95,8 3,8A1,1 0 0,1 2,7A1,1 0 0,1 3,6C3.82,6 4.47,6.08 5,6.21V4A2,2 0 0,1 7,2H17A2,2 0 0,1 19,4V6.16C20.78,6.47 21.54,7.13 21.71,7.29C22.1,7.68 22.1,8.32 21.71,8.71C21.32,9.1 20.8,9.09 20.29,8.71V8.71C20.29,8.71 19.25,8 17,8C15.74,8 14.91,8.41 13.95,8.9C12.91,9.41 11.74,10 10,10C9.64,10 9.31,10 9,9.96V7.95C9.3,8 9.63,8 10,8C11.26,8 12.09,7.59 13.05,7.11C14.09,6.59 15.27,6 17,6V4H7V20H17V18C18.5,18 18.97,18.29 19,18.31M17,10C15.27,10 14.09,10.59 13.05,11.11C12.09,11.59 11.26,12 10,12C9.63,12 9.3,12 9,11.95V13.96C9.31,14 9.64,14 10,14C11.74,14 12.91,13.41 13.95,12.9C14.91,12.42 15.74,12 17,12C19.25,12 20.29,12.71 20.29,12.71V12.71C20.8,13.1 21.32,13.1 21.71,12.71C22.1,12.32 22.1,11.69 21.71,11.29C21.5,11.08 20.25,10 17,10M17,14C15.27,14 14.09,14.59 13.05,15.11C12.09,15.59 11.26,16 10,16C9.63,16 9.3,16 9,15.95V17.96C9.31,18 9.64,18 10,18C11.74,18 12.91,17.41 13.95,16.9C14.91,16.42 15.74,16 17,16C19.25,16 20.29,16.71 20.29,16.71V16.71C20.8,17.1 21.32,17.1 21.71,16.71C22.1,16.32 22.1,15.69 21.71,15.29C21.5,15.08 20.25,14 17,14Z";var mdiAirPurifier="M11,9A4,4 0 0,1 15,13A4,4 0 0,1 11,17A4,4 0 0,1 7,13A4,4 0 0,1 11,9M11,11A2,2 0 0,0 9,13A2,2 0 0,0 11,15A2,2 0 0,0 13,13A2,2 0 0,0 11,11M7,4H14A4,4 0 0,1 18,8V9H16V8A2,2 0 0,0 14,6H7A2,2 0 0,0 5,8V20H16V18H18V22H3V8A4,4 0 0,1 7,4M16,11C18.5,11 18.5,9 21,9V11C18.5,11 18.5,13 16,13V11M16,15C18.5,15 18.5,13 21,13V15C18.5,15 18.5,17 16,17V15Z";var mdiAlert="M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z";var mdiAlertCircleOutline="M11,15H13V17H11V15M11,7H13V13H11V7M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20Z";var mdiArrowDown="M11,4H13V16L18.5,10.5L19.92,11.92L12,19.84L4.08,11.92L5.5,10.5L11,16V4Z";var mdiArrowLeft="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z";var mdiArrowRight="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z";var mdiArrowUp="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z";var mdiBell="M21,19V20H3V19L5,17V11C5,7.9 7.03,5.17 10,4.29C10,4.19 10,4.1 10,4A2,2 0 0,1 12,2A2,2 0 0,1 14,4C14,4.1 14,4.19 14,4.29C16.97,5.17 19,7.9 19,11V17L21,19M14,21A2,2 0 0,1 12,23A2,2 0 0,1 10,21";var mdiBlindsHorizontal="M20 19V3H4V19H2V21H22V19H20M16 9H18V11H16V9M14 11H6V9H14V11M18 7H16V5H18V7M14 5V7H6V5H14M6 19V13H14V14.82C13.55 15.14 13.25 15.66 13.25 16.25C13.25 17.22 14.03 18 15 18S16.75 17.22 16.75 16.25C16.75 15.66 16.45 15.13 16 14.82V13H18V19H6Z";var mdiBrightnessAuto="M14.3,16L13.6,14H10.4L9.7,16H7.8L11,7H13L16.2,16H14.3M20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31L23.31,12L20,8.69M10.85,12.65H13.15L12,9L10.85,12.65Z";var mdiBrightnessPercent="M20.04,8.71V4H15.34L12,0.69L8.71,4H4V8.71L0.69,12L4,15.34V20.04H8.71L12,23.35L15.34,20.04H20.04V15.34L23.35,12L20.04,8.71M8.83,7.05C9.81,7.05 10.6,7.84 10.6,8.83A1.77,1.77 0 0,1 8.83,10.6C7.84,10.6 7.05,9.81 7.05,8.83C7.05,7.84 7.84,7.05 8.83,7.05M15.22,17C14.24,17 13.45,16.2 13.45,15.22A1.77,1.77 0 0,1 15.22,13.45C16.2,13.45 17,14.24 17,15.22A1.78,1.78 0 0,1 15.22,17M8.5,17.03L7,15.53L15.53,7L17.03,8.5L8.5,17.03Z";var mdiCamera="M4,4H7L9,2H15L17,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z";var mdiCast="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z";var mdiCctv="M6.03 12.03L8.03 15.5L5.5 18.68L2 12.62L6.03 12.03M17 18V15.29C17.88 14.9 18.5 14.03 18.5 13C18.5 12.43 18.3 11.9 17.97 11.5L19.94 10.35C20.95 9.76 21.3 8.47 20.71 7.46L19.33 5.06C18.74 4.05 17.45 3.7 16.44 4.28L8.31 9C7.36 9.53 7.03 10.75 7.58 11.71L9.08 14.31C9.63 15.26 10.86 15.59 11.81 15.04L13.69 13.96C13.94 14.55 14.41 15.03 15 15.29V18C15 19.1 15.9 20 17 20H22V18H17Z";var mdiChatProcessing="M12,3C17.5,3 22,6.58 22,11C22,15.42 17.5,19 12,19C10.76,19 9.57,18.82 8.47,18.5C5.55,21 2,21 2,21C4.33,18.67 4.7,17.1 4.75,16.5C3.05,15.07 2,13.13 2,11C2,6.58 6.5,3 12,3M17,12V10H15V12H17M13,12V10H11V12H13M9,12V10H7V12H9Z";var mdiChevronDown="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z";var mdiChevronRight="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z";var mdiChip="M6,4H18V5H21V7H18V9H21V11H18V13H21V15H18V17H21V19H18V20H6V19H3V17H6V15H3V13H6V11H3V9H6V7H3V5H6V4M11,15V18H12V15H11M13,15V18H14V15H13M15,15V18H16V15H15Z";var mdiCircleMedium="M12,8A4,4 0 0,0 8,12A4,4 0 0,0 12,16A4,4 0 0,0 16,12A4,4 0 0,0 12,8Z";var mdiClose="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z";var mdiCog="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z";var mdiContentSaveOutline="M17 3H5C3.89 3 3 3.9 3 5V19C3 20.1 3.89 21 5 21H19C20.1 21 21 20.1 21 19V7L17 3M19 19H5V5H16.17L19 7.83V19M12 12C10.34 12 9 13.34 9 15S10.34 18 12 18 15 16.66 15 15 13.66 12 12 12M6 6H15V10H6V6Z";var mdiCrown="M5 16L3 5L8.5 10L12 4L15.5 10L21 5L19 16H5M19 19C19 19.6 18.6 20 18 20H6C5.4 20 5 19.6 5 19V18H19V19Z";var mdiDishwasher="M18,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V4A2,2 0 0,0 18,2M10,4A1,1 0 0,1 11,5A1,1 0 0,1 10,6A1,1 0 0,1 9,5A1,1 0 0,1 10,4M7,4A1,1 0 0,1 8,5A1,1 0 0,1 7,6A1,1 0 0,1 6,5A1,1 0 0,1 7,4M18,20H6V8H18V20M14.67,15.33C14.69,16.03 14.41,16.71 13.91,17.21C12.86,18.26 11.15,18.27 10.09,17.21C9.59,16.71 9.31,16.03 9.33,15.33C9.4,14.62 9.63,13.94 10,13.33C10.37,12.5 10.81,11.73 11.33,11L12,10C13.79,12.59 14.67,14.36 14.67,15.33";var mdiDoorOpen="M12,3C10.89,3 10,3.89 10,5H3V19H2V21H22V19H21V5C21,3.89 20.11,3 19,3H12M12,5H19V19H12V5M5,11H7V13H5V11Z";var mdiDoorbell="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M16 2H8C6.9 2 6 2.9 6 4V20C6 21.1 6.9 22 8 22H16C17.1 22 18 21.1 18 20V4C18 2.9 17.1 2 16 2M16 20H8V4H16V20Z";var mdiDoorbellVideo="M14 15C14 16.11 13.11 17 12 17S10 16.11 10 15 10.9 13 12 13 14 13.9 14 15M18 4V20C18 21.1 17.11 22 16 22H8C6.9 22 6 21.11 6 20V4C6 2.9 6.9 2 8 2H16C17.11 2 18 2.9 18 4M10.5 7C10.5 7.83 11.17 8.5 12 8.5S13.5 7.83 13.5 7 12.83 5.5 12 5.5 10.5 6.17 10.5 7M16 10H8V20H16V10Z";var mdiEthernet="M7,15H9V18H11V15H13V18H15V15H17V18H19V9H15V6H9V9H5V18H7V15M4.38,3H19.63C20.94,3 22,4.06 22,5.38V19.63A2.37,2.37 0 0,1 19.63,22H4.38C3.06,22 2,20.94 2,19.63V5.38C2,4.06 3.06,3 4.38,3Z";var mdiEvStation="M19.77,7.23L19.78,7.22L16.06,3.5L15,4.56L17.11,6.67C16.17,7.03 15.5,7.93 15.5,9A2.5,2.5 0 0,0 18,11.5C18.36,11.5 18.69,11.42 19,11.29V18.5A1,1 0 0,1 18,19.5A1,1 0 0,1 17,18.5V14A2,2 0 0,0 15,12H14V5A2,2 0 0,0 12,3H6A2,2 0 0,0 4,5V21H14V13.5H15.5V18.5A2.5,2.5 0 0,0 18,21A2.5,2.5 0 0,0 20.5,18.5V9C20.5,8.31 20.22,7.68 19.77,7.23M18,10A1,1 0 0,1 17,9A1,1 0 0,1 18,8A1,1 0 0,1 19,9A1,1 0 0,1 18,10M8,18V13.5H6L10,6V11H12L8,18Z";var mdiEye="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z";var mdiEyeOff="M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z";var mdiFan="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12.5,2C17,2 17.11,5.57 14.75,6.75C13.76,7.24 13.32,8.29 13.13,9.22C13.61,9.42 14.03,9.73 14.35,10.13C18.05,8.13 22.03,8.92 22.03,12.5C22.03,17 18.46,17.1 17.28,14.73C16.78,13.74 15.72,13.3 14.79,13.11C14.59,13.59 14.28,14 13.88,14.34C15.87,18.03 15.08,22 11.5,22C7,22 6.91,18.42 9.27,17.24C10.25,16.75 10.69,15.71 10.89,14.79C10.4,14.59 9.97,14.27 9.65,13.87C5.96,15.85 2,15.07 2,11.5C2,7 5.56,6.89 6.74,9.26C7.24,10.25 8.29,10.68 9.22,10.87C9.41,10.39 9.73,9.97 10.14,9.65C8.15,5.96 8.94,2 12.5,2Z";var mdiFile="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z";var mdiFitToScreen="M17 4H20C21.1 4 22 4.9 22 6V8H20V6H17V4M4 8V6H7V4H4C2.9 4 2 4.9 2 6V8H4M20 16V18H17V20H20C21.1 20 22 19.1 22 18V16H20M7 18H4V16H2V18C2 19.1 2.9 20 4 20H7V18M18 8H6V16H18V8Z";var mdiFridge="M7,2H17A2,2 0 0,1 19,4V9H5V4A2,2 0 0,1 7,2M19,19A2,2 0 0,1 17,21V22H15V21H9V22H7V21A2,2 0 0,1 5,19V10H19V19M8,5V7H10V5H8M8,12V15H10V12H8Z";var mdiGauge="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12C20,14.4 19,16.5 17.3,18C15.9,16.7 14,16 12,16C10,16 8.2,16.7 6.7,18C5,16.5 4,14.4 4,12A8,8 0 0,1 12,4M14,5.89C13.62,5.9 13.26,6.15 13.1,6.54L11.81,9.77L11.71,10C11,10.13 10.41,10.6 10.14,11.26C9.73,12.29 10.23,13.45 11.26,13.86C12.29,14.27 13.45,13.77 13.86,12.74C14.12,12.08 14,11.32 13.57,10.76L13.67,10.5L14.96,7.29L14.97,7.26C15.17,6.75 14.92,6.17 14.41,5.96C14.28,5.91 14.15,5.89 14,5.89M10,6A1,1 0 0,0 9,7A1,1 0 0,0 10,8A1,1 0 0,0 11,7A1,1 0 0,0 10,6M7,9A1,1 0 0,0 6,10A1,1 0 0,0 7,11A1,1 0 0,0 8,10A1,1 0 0,0 7,9M17,9A1,1 0 0,0 16,10A1,1 0 0,0 17,11A1,1 0 0,0 18,10A1,1 0 0,0 17,9Z";var mdiGraphOutline="M19.5 17C19.36 17 19.24 17 19.11 17.04L17.5 13.8C17.95 13.35 18.25 12.71 18.25 12C18.25 10.62 17.13 9.5 15.75 9.5C15.61 9.5 15.5 9.5 15.35 9.54L13.74 6.3C14.21 5.84 14.5 5.21 14.5 4.5C14.5 3.12 13.38 2 12 2S9.5 3.12 9.5 4.5C9.5 5.2 9.79 5.84 10.26 6.29L8.65 9.54C8.5 9.5 8.39 9.5 8.25 9.5C6.87 9.5 5.75 10.62 5.75 12C5.75 12.71 6.04 13.34 6.5 13.79L4.89 17.04C4.76 17 4.64 17 4.5 17C3.12 17 2 18.12 2 19.5C2 20.88 3.12 22 4.5 22S7 20.88 7 19.5C7 18.8 6.71 18.16 6.24 17.71L7.86 14.46C8 14.5 8.12 14.5 8.25 14.5C8.38 14.5 8.5 14.5 8.63 14.46L10.26 17.71C9.79 18.16 9.5 18.8 9.5 19.5C9.5 20.88 10.62 22 12 22S14.5 20.88 14.5 19.5C14.5 18.12 13.38 17 12 17C11.87 17 11.74 17 11.61 17.04L10 13.8C10.45 13.35 10.75 12.71 10.75 12C10.75 11.3 10.46 10.67 10 10.21L11.61 6.96C11.74 7 11.87 7 12 7C12.13 7 12.26 7 12.39 6.96L14 10.21C13.54 10.66 13.25 11.3 13.25 12C13.25 13.38 14.37 14.5 15.75 14.5C15.88 14.5 16 14.5 16.13 14.46L17.76 17.71C17.29 18.16 17 18.8 17 19.5C17 20.88 18.12 22 19.5 22S22 20.88 22 19.5C22 18.12 20.88 17 19.5 17M4.5 20.5C3.95 20.5 3.5 20.05 3.5 19.5S3.95 18.5 4.5 18.5 5.5 18.95 5.5 19.5 5.05 20.5 4.5 20.5M13 19.5C13 20.05 12.55 20.5 12 20.5S11 20.05 11 19.5 11.45 18.5 12 18.5 13 18.95 13 19.5M7.25 12C7.25 11.45 7.7 11 8.25 11S9.25 11.45 9.25 12 8.8 13 8.25 13 7.25 12.55 7.25 12M11 4.5C11 3.95 11.45 3.5 12 3.5S13 3.95 13 4.5 12.55 5.5 12 5.5 11 5.05 11 4.5M14.75 12C14.75 11.45 15.2 11 15.75 11S16.75 11.45 16.75 12 16.3 13 15.75 13 14.75 12.55 14.75 12M19.5 20.5C18.95 20.5 18.5 20.05 18.5 19.5S18.95 18.5 19.5 18.5 20.5 18.95 20.5 19.5 20.05 20.5 19.5 20.5Z";var mdiHeatPump="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M12.75 7.08C13.57 7.2 14.32 7.5 14.95 8L12.75 10.19V7.08M11.25 7.08V10.19L9.05 8C9.68 7.5 10.43 7.2 11.25 7.08M8 9.05L10.19 11.25H7.08C7.2 10.43 7.5 9.68 8 9.05M7.08 12.75H10.19L8 14.95C7.5 14.32 7.2 13.57 7.08 12.75M11.25 16.92C10.43 16.8 9.68 16.5 9.05 16L11.25 13.81V16.92M12 13C11.45 13 11 12.55 11 12S11.45 11 12 11 13 11.45 13 12 12.55 13 12 13M12.75 16.92V13.81L14.95 16C14.32 16.5 13.57 16.8 12.75 16.92M16 14.95L13.81 12.75H16.92C16.8 13.57 16.5 14.32 16 14.95M13.81 11.25L16 9.05C16.5 9.69 16.8 10.44 16.92 11.25H13.81Z";var mdiHelp="M10,19H13V22H10V19M12,2C17.35,2.22 19.68,7.62 16.5,11.67C15.67,12.67 14.33,13.33 13.67,14.17C13,15 13,16 13,17H10C10,15.33 10,13.92 10.67,12.92C11.33,11.92 12.67,11.33 13.5,10.67C15.92,8.43 15.32,5.26 12,5A3,3 0 0,0 9,8H6A6,6 0 0,1 12,2Z";var mdiHome="M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z";var mdiLeaf="M17,8C8,10 5.9,16.17 3.82,21.34L5.71,22L6.66,19.7C7.14,19.87 7.64,20 8,20C19,20 22,3 22,3C21,5 14,5.25 9,6.25C4,7.25 2,11.5 2,13.5C2,15.5 3.75,17.25 3.75,17.25C7,8 17,8 17,8Z";var mdiLightbulb="M12,2A7,7 0 0,0 5,9C5,11.38 6.19,13.47 8,14.74V17A1,1 0 0,0 9,18H15A1,1 0 0,0 16,17V14.74C17.81,13.47 19,11.38 19,9A7,7 0 0,0 12,2M9,21A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21V20H9V21Z";var mdiLink="M3.9,12C3.9,10.29 5.29,8.9 7,8.9H11V7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H11V15.1H7C5.29,15.1 3.9,13.71 3.9,12M8,13H16V11H8V13M17,7H13V8.9H17C18.71,8.9 20.1,10.29 20.1,12C20.1,13.71 18.71,15.1 17,15.1H13V17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7Z";var mdiLinkVariantOff="M2,5.27L3.28,4L20,20.72L18.73,22L13.9,17.17L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L12.5,15.76L10.88,14.15C10.87,14.39 10.77,14.64 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C8.12,13.77 7.63,12.37 7.72,11L2,5.27M12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.79,8.97L9.38,7.55L12.71,4.22M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.2,10.54 16.61,12.5 16.06,14.23L14.28,12.46C14.23,11.78 13.94,11.11 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z";var mdiLoading="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z";var mdiLock="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z";var mdiLogout="M17 7L15.59 8.41L18.17 11H8V13H18.17L15.59 15.58L17 17L22 12M4 5H12V3H4C2.9 3 2 3.9 2 5V19C2 20.1 2.9 21 4 21H12V19H4V5Z";var mdiMagnifyMinus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M5,8V10H13V8H5Z";var mdiMagnifyPlus="M9,2A7,7 0 0,1 16,9C16,10.57 15.5,12 14.61,13.19L15.41,14H16L22,20L20,22L14,16V15.41L13.19,14.61C12,15.5 10.57,16 9,16A7,7 0 0,1 2,9A7,7 0 0,1 9,2M8,5V8H5V10H8V13H10V10H13V8H10V5H8Z";var mdiMeterElectric="M12 2C7.04 2 3 6.04 3 11C3 14.91 5.5 18.24 9 19.47V22H11V19.94C11.33 20 11.66 20 12 20S12.67 20 13 19.94V22H15V19.47C18.5 18.23 21 14.9 21 11C21 6.04 16.96 2 12 2M14.25 14L11.25 17L9.75 15.5L11 14.25L9.75 13L12.75 10L14.25 11.5L13 12.75L14.25 14M16 9H8V7H16V9Z";var mdiMicrowave="M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H16V17H4V7M19,7A1,1 0 0,1 20,8A1,1 0 0,1 19,9A1,1 0 0,1 18,8A1,1 0 0,1 19,7M13,9V15H15V9H13M19,11A1,1 0 0,1 20,12A1,1 0 0,1 19,13A1,1 0 0,1 18,12A1,1 0 0,1 19,11Z";var mdiMinus="M19,13H5V11H19V13Z";var mdiMotionSensor="M10,0.2C9,0.2 8.2,1 8.2,2C8.2,3 9,3.8 10,3.8C11,3.8 11.8,3 11.8,2C11.8,1 11,0.2 10,0.2M15.67,1A7.33,7.33 0 0,0 23,8.33V7A6,6 0 0,1 17,1H15.67M18.33,1C18.33,3.58 20.42,5.67 23,5.67V4.33C21.16,4.33 19.67,2.84 19.67,1H18.33M21,1A2,2 0 0,0 23,3V1H21M7.92,4.03C7.75,4.03 7.58,4.06 7.42,4.11L2,5.8V11H3.8V7.33L5.91,6.67L2,22H3.8L6.67,13.89L9,17V22H10.8V15.59L8.31,11.05L9.04,8.18L10.12,10H15V8.2H11.38L9.38,4.87C9.08,4.37 8.54,4.03 7.92,4.03Z";var mdiPause="M14,19H18V5H14M6,19H10V5H6V19Z";var mdiPencil="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z";var mdiPlay="M8,5.14V19.14L19,12.14L8,5.14Z";var mdiPlus="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z";var mdiPowerPlug="M16,7V3H14V7H10V3H8V7H8C7,7 6,8 6,9V14.5L9.5,18V21H14.5V18L18,14.5V9C18,8 17,7 16,7Z";var mdiPump="M2 21V15H3.5C3.18 14.06 3 13.05 3 12C3 7.03 7.03 3 12 3H22V9H20.5C20.82 9.94 21 10.95 21 12C21 16.97 16.97 21 12 21H2M5 12C5 13.28 5.34 14.47 5.94 15.5L9.4 13.5C9.15 13.06 9 12.55 9 12C9 11.35 9.21 10.75 9.56 10.26L6.3 7.93C5.5 9.08 5 10.5 5 12M12 19C14.59 19 16.85 17.59 18.06 15.5L14.6 13.5C14.08 14.4 13.11 15 12 15L11.71 15L11.33 18.97L12 19M12 9C13.21 9 14.26 9.72 14.73 10.76L18.37 9.1C17.27 6.68 14.83 5 12 5V9M12 11C11.45 11 11 11.45 11 12C11 12.55 11.45 13 12 13C12.55 13 13 12.55 13 12C13 11.45 12.55 11 12 11Z";var mdiRefresh="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z";var mdiRemote="M12,0C8.96,0 6.21,1.23 4.22,3.22L5.63,4.63C7.26,3 9.5,2 12,2C14.5,2 16.74,3 18.36,4.64L19.77,3.23C17.79,1.23 15.04,0 12,0M7.05,6.05L8.46,7.46C9.37,6.56 10.62,6 12,6C13.38,6 14.63,6.56 15.54,7.46L16.95,6.05C15.68,4.78 13.93,4 12,4C10.07,4 8.32,4.78 7.05,6.05M12,15A2,2 0 0,1 10,13A2,2 0 0,1 12,11A2,2 0 0,1 14,13A2,2 0 0,1 12,15M15,9H9A1,1 0 0,0 8,10V22A1,1 0 0,0 9,23H15A1,1 0 0,0 16,22V10A1,1 0 0,0 15,9Z";var mdiRobotVacuum="M12,2C14.65,2 17.19,3.06 19.07,4.93L17.65,6.35C16.15,4.85 14.12,4 12,4C9.88,4 7.84,4.84 6.35,6.35L4.93,4.93C6.81,3.06 9.35,2 12,2M3.66,6.5L5.11,7.94C4.39,9.17 4,10.57 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,10.57 19.61,9.17 18.88,7.94L20.34,6.5C21.42,8.12 22,10.04 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,10.04 2.58,8.12 3.66,6.5M12,6A6,6 0 0,1 18,12C18,13.59 17.37,15.12 16.24,16.24L14.83,14.83C14.08,15.58 13.06,16 12,16C10.94,16 9.92,15.58 9.17,14.83L7.76,16.24C6.63,15.12 6,13.59 6,12A6,6 0 0,1 12,6M12,8A1,1 0 0,0 11,9A1,1 0 0,0 12,10A1,1 0 0,0 13,9A1,1 0 0,0 12,8Z";var mdiRouter="M12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22C17.5 22 22 17.5 22 12C22 6.5 17.5 2 12 2M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20M13 13V16H15L12 19L9 16H11V13M5 13H8V15L11 12L8 9V11H5M11 11V8H9L12 5L15 8H13V11M19 11H16V9L13 12L16 15V13H19";var mdiRouterWireless="M20.2,5.9L21,5.1C19.6,3.7 17.8,3 16,3C14.2,3 12.4,3.7 11,5.1L11.8,5.9C13,4.8 14.5,4.2 16,4.2C17.5,4.2 19,4.8 20.2,5.9M19.3,6.7C18.4,5.8 17.2,5.3 16,5.3C14.8,5.3 13.6,5.8 12.7,6.7L13.5,7.5C14.2,6.8 15.1,6.5 16,6.5C16.9,6.5 17.8,6.8 18.5,7.5L19.3,6.7M19,13H17V9H15V13H5A2,2 0 0,0 3,15V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V15A2,2 0 0,0 19,13M8,18H6V16H8V18M11.5,18H9.5V16H11.5V18M15,18H13V16H15V18Z";var mdiShareVariant="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19A2.92,2.92 0 0,0 18,16.08Z";var mdiSignalCellular1="M19.5,5.5V18.5H17.5V5.5H19.5M12.5,10.5V18.5H10.5V10.5H12.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular2="M19.5,5.5V18.5H17.5V5.5H19.5M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSignalCellular3="M21,4H16V20H21V4M14,9H9V20H14V9M7,14H2V20H7V14Z";var mdiSleep="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z";var mdiSmokeDetector="M12,18A6,6 0 0,0 18,12C18,8.68 15.31,6 12,6C8.68,6 6,8.68 6,12A6,6 0 0,0 12,18M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H19M8,12A4,4 0 0,1 12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12Z";var mdiSnowflakeAlert="M16.46,9.41L13,7.38V5.12L14.71,3.41L13.29,2L12,3.29L10.71,2L9.29,3.41L11,5.12V7.38L8.5,8.82L6.5,7.69L5.92,5.36L4,5.88L4.47,7.65L2.7,8.12L3.22,10.05L5.55,9.43L7.55,10.56V13.45L5.55,14.58L3.22,13.96L2.7,15.89L4.47,16.36L4,18.12L5.93,18.64L6.55,16.31L8.55,15.18L11,16.62V18.88L9.29,20.59L10.71,22L12,20.71L13.29,22L14.7,20.59L13,18.88V16.62L16.46,14.61M9.5,10.56L12,9.11L14.5,10.56V13.44L12,14.89L9.5,13.44M19,13V7H21V13H19M19,17V15H21V17H19Z";var mdiSolarPower="M11.45,2V5.55L15,3.77L11.45,2M10.45,8L8,10.46L11.75,11.71L10.45,8M2,11.45L3.77,15L5.55,11.45H2M10,2H2V10C2.57,10.17 3.17,10.25 3.77,10.25C7.35,10.26 10.26,7.35 10.27,3.75C10.26,3.16 10.17,2.57 10,2M17,22V16H14L19,7V13H22L17,22Z";var mdiSpeaker="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z";var mdiSprinkler="M11 7H13V9H11V7M5 22H9V10H5V22M14 11H16V9H14V11M17 10H19V8H17V10M17 5V7H19V5H17M14 8H16V6H14V8M17 13H19V11H17V13M5 7H5.33L6 9H8L8.67 7H9V6H5V7Z";var mdiStar="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z";var mdiStove="M6,14H8L11,17H9L6,14M4,4H5V3A1,1 0 0,1 6,2H10A1,1 0 0,1 11,3V4H13V3A1,1 0 0,1 14,2H18A1,1 0 0,1 19,3V4H20A2,2 0 0,1 22,6V19A2,2 0 0,1 20,21V22H17V21H7V22H4V21A2,2 0 0,1 2,19V6A2,2 0 0,1 4,4M18,7A1,1 0 0,1 19,8A1,1 0 0,1 18,9A1,1 0 0,1 17,8A1,1 0 0,1 18,7M14,7A1,1 0 0,1 15,8A1,1 0 0,1 14,9A1,1 0 0,1 13,8A1,1 0 0,1 14,7M20,6H4V10H20V6M4,19H20V12H4V19M6,7A1,1 0 0,1 7,8A1,1 0 0,1 6,9A1,1 0 0,1 5,8A1,1 0 0,1 6,7M13,14H15L18,17H16L13,14Z";var mdiSwapHorizontal="M21,9L17,5V8H10V10H17V13M7,11L3,15L7,19V16H14V14H7V11Z";var mdiTelevision="M21,17H3V5H21M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H8V21H16V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z";var mdiThermometer="M15 13V5A3 3 0 0 0 9 5V13A5 5 0 1 0 15 13M12 4A1 1 0 0 1 13 5V8H11V5A1 1 0 0 1 12 4Z";var mdiToggleSwitch="M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z";var mdiTrashCan="M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M9,8H11V17H9V8M13,8H15V17H13V8Z";var mdiTumbleDryer="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8M8.11,10.5H10C9.76,11.88 10,12.67 10.58,13.29C11.68,14.36 12.16,15.71 11.89,17.5H10C10.24,16.12 10,15.33 9.42,14.71C8.32,13.64 7.85,12.29 8.11,10.5M12.11,10.5H14C13.76,11.88 14,12.67 14.58,13.29C15.68,14.36 16.16,15.71 15.89,17.5H14C14.24,16.12 14,15.33 13.42,14.71C12.32,13.64 11.85,12.29 12.11,10.5Z";var mdiUpdate="M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z";var mdiVideo="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z";var mdiVideoOutline="M15,8V16H5V8H15M16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5V7A1,1 0 0,0 16,6Z";var mdiVolumeHigh="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z";var mdiVolumeOff="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z";var mdiWashingMachine="M14.83,11.17C16.39,12.73 16.39,15.27 14.83,16.83C13.27,18.39 10.73,18.39 9.17,16.83L14.83,11.17M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M7,4A1,1 0 0,0 6,5A1,1 0 0,0 7,6A1,1 0 0,0 8,5A1,1 0 0,0 7,4M10,4A1,1 0 0,0 9,5A1,1 0 0,0 10,6A1,1 0 0,0 11,5A1,1 0 0,0 10,4M12,8A6,6 0 0,0 6,14A6,6 0 0,0 12,20A6,6 0 0,0 18,14A6,6 0 0,0 12,8Z";var mdiWater="M12,20A6,6 0 0,1 6,14C6,10 12,3.25 12,3.25C12,3.25 18,10 18,14A6,6 0 0,1 12,20Z";var mdiWaterBoiler="M8 2C6.89 2 6 2.89 6 4V16C6 17.11 6.89 18 8 18H9V20H6V22H9C10.11 22 11 21.11 11 20V18H13V20C13 21.11 13.89 22 15 22H18V20H15V18H16C17.11 18 18 17.11 18 16V4C18 2.89 17.11 2 16 2H8M12 4.97A2 2 0 0 1 14 6.97A2 2 0 0 1 12 8.97A2 2 0 0 1 10 6.97A2 2 0 0 1 12 4.97M10 14.5H14V16H10V14.5Z";var mdiWaterPercent="M12,3.25C12,3.25 6,10 6,14C6,17.32 8.69,20 12,20A6,6 0 0,0 18,14C18,10 12,3.25 12,3.25M14.47,9.97L15.53,11.03L9.53,17.03L8.47,15.97M9.75,10A1.25,1.25 0 0,1 11,11.25A1.25,1.25 0 0,1 9.75,12.5A1.25,1.25 0 0,1 8.5,11.25A1.25,1.25 0 0,1 9.75,10M14.25,14.5A1.25,1.25 0 0,1 15.5,15.75A1.25,1.25 0 0,1 14.25,17A1.25,1.25 0 0,1 13,15.75A1.25,1.25 0 0,1 14.25,14.5Z";var mdiWeatherNight="M17.75,4.09L15.22,6.03L16.13,9.09L13.5,7.28L10.87,9.09L11.78,6.03L9.25,4.09L12.44,4L13.5,1L14.56,4L17.75,4.09M21.25,11L19.61,12.25L20.2,14.23L18.5,13.06L16.8,14.23L17.39,12.25L15.75,11L17.81,10.95L18.5,9L19.19,10.95L21.25,11M18.97,15.95C19.8,15.87 20.69,17.05 20.16,17.8C19.84,18.25 19.5,18.67 19.08,19.07C15.17,23 8.84,23 4.94,19.07C1.03,15.17 1.03,8.83 4.94,4.93C5.34,4.53 5.76,4.17 6.21,3.85C6.96,3.32 8.14,4.21 8.06,5.04C7.79,7.9 8.75,10.87 10.95,13.06C13.14,15.26 16.1,16.22 18.97,15.95M17.33,17.97C14.5,17.81 11.7,16.64 9.53,14.5C7.36,12.31 6.2,9.5 6.04,6.68C3.23,9.82 3.34,14.64 6.35,17.66C9.37,20.67 14.19,20.78 17.33,17.97Z";var mdiWeatherRainy="M6,14.03A1,1 0 0,1 7,15.03C7,15.58 6.55,16.03 6,16.03C3.24,16.03 1,13.79 1,11.03C1,8.27 3.24,6.03 6,6.03C7,3.68 9.3,2.03 12,2.03C15.43,2.03 18.24,4.69 18.5,8.06L19,8.03A4,4 0 0,1 23,12.03C23,14.23 21.21,16.03 19,16.03H18C17.45,16.03 17,15.58 17,15.03C17,14.47 17.45,14.03 18,14.03H19A2,2 0 0,0 21,12.03A2,2 0 0,0 19,10.03H17V9.03C17,6.27 14.76,4.03 12,4.03C9.5,4.03 7.45,5.84 7.06,8.21C6.73,8.09 6.37,8.03 6,8.03A3,3 0 0,0 3,11.03A3,3 0 0,0 6,14.03M12,14.15C12.18,14.39 12.37,14.66 12.56,14.94C13,15.56 14,17.03 14,18C14,19.11 13.1,20 12,20A2,2 0 0,1 10,18C10,17.03 11,15.56 11.44,14.94C11.63,14.66 11.82,14.4 12,14.15M12,11.03L11.5,11.59C11.5,11.59 10.65,12.55 9.79,13.81C8.93,15.06 8,16.56 8,18A4,4 0 0,0 12,22A4,4 0 0,0 16,18C16,16.56 15.07,15.06 14.21,13.81C13.35,12.55 12.5,11.59 12.5,11.59";var mdiWeatherSunny="M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,2L14.39,5.42C13.65,5.15 12.84,5 12,5C11.16,5 10.35,5.15 9.61,5.42L12,2M3.34,7L7.5,6.65C6.9,7.16 6.36,7.78 5.94,8.5C5.5,9.24 5.25,10 5.11,10.79L3.34,7M3.36,17L5.12,13.23C5.26,14 5.53,14.78 5.95,15.5C6.37,16.24 6.91,16.86 7.5,17.37L3.36,17M20.65,7L18.88,10.79C18.74,10 18.47,9.23 18.05,8.5C17.63,7.78 17.1,7.15 16.5,6.64L20.65,7M20.64,17L16.5,17.36C17.09,16.85 17.62,16.22 18.04,15.5C18.46,14.77 18.73,14 18.87,13.21L20.64,17M12,22L9.59,18.56C10.33,18.83 11.14,19 12,19C12.82,19 13.63,18.83 14.37,18.56L12,22Z";var mdiWifi="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z";
|
|
238
238
|
|
|
239
239
|
/**
|
|
240
240
|
* @license
|
|
@@ -1102,12 +1102,12 @@ function n$4(n) {
|
|
|
1102
1102
|
const clientContext = n$9("client");
|
|
1103
1103
|
const tickContext = n$9("client-tick");
|
|
1104
1104
|
|
|
1105
|
-
var __defProp$
|
|
1106
|
-
var __getOwnPropDesc$
|
|
1107
|
-
var __decorateClass$
|
|
1108
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
1105
|
+
var __defProp$o = Object.defineProperty;
|
|
1106
|
+
var __getOwnPropDesc$p = Object.getOwnPropertyDescriptor;
|
|
1107
|
+
var __decorateClass$r = (decorators, target, key, kind) => {
|
|
1108
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$p(target, key) : target;
|
|
1109
1109
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
1110
|
-
if (kind && result) __defProp$
|
|
1110
|
+
if (kind && result) __defProp$o(target, key, result);
|
|
1111
1111
|
return result;
|
|
1112
1112
|
};
|
|
1113
1113
|
let HaSvgIcon = class extends i$4 {
|
|
@@ -1153,10 +1153,10 @@ let HaSvgIcon = class extends i$4 {
|
|
|
1153
1153
|
`;
|
|
1154
1154
|
}
|
|
1155
1155
|
};
|
|
1156
|
-
__decorateClass$
|
|
1157
|
-
__decorateClass$
|
|
1158
|
-
__decorateClass$
|
|
1159
|
-
HaSvgIcon = __decorateClass$
|
|
1156
|
+
__decorateClass$r([n$5()], HaSvgIcon.prototype, "path", 2);
|
|
1157
|
+
__decorateClass$r([n$5()], HaSvgIcon.prototype, "secondaryPath", 2);
|
|
1158
|
+
__decorateClass$r([n$5()], HaSvgIcon.prototype, "viewBox", 2);
|
|
1159
|
+
HaSvgIcon = __decorateClass$r([t$1("ha-svg-icon")], HaSvgIcon);
|
|
1160
1160
|
|
|
1161
1161
|
/******************************************************************************
|
|
1162
1162
|
Copyright (c) Microsoft Corporation.
|
|
@@ -4040,7 +4040,7 @@ MdListItem = __decorate([t$1('md-list-item')], MdListItem);
|
|
|
4040
4040
|
*/
|
|
4041
4041
|
const showSettingsDialog = async section => {
|
|
4042
4042
|
var _document$querySelect;
|
|
4043
|
-
await import('./settings-dialog-
|
|
4043
|
+
await import('./settings-dialog-DrHzJtsi.js');
|
|
4044
4044
|
const dialog = document.createElement("settings-dialog");
|
|
4045
4045
|
if (section) dialog.scrollToSection = section;
|
|
4046
4046
|
(_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
|
|
@@ -4134,12 +4134,12 @@ const notFoundStyles = i$7`
|
|
|
4134
4134
|
}
|
|
4135
4135
|
`;
|
|
4136
4136
|
|
|
4137
|
-
var __defProp$
|
|
4138
|
-
var __getOwnPropDesc$
|
|
4139
|
-
var __decorateClass$
|
|
4140
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
4137
|
+
var __defProp$n = Object.defineProperty;
|
|
4138
|
+
var __getOwnPropDesc$o = Object.getOwnPropertyDescriptor;
|
|
4139
|
+
var __decorateClass$q = (decorators, target, key, kind) => {
|
|
4140
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$o(target, key) : target;
|
|
4141
4141
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
4142
|
-
if (kind && result) __defProp$
|
|
4142
|
+
if (kind && result) __defProp$n(target, key, result);
|
|
4143
4143
|
return result;
|
|
4144
4144
|
};
|
|
4145
4145
|
let DashboardHeader = class extends i$4 {
|
|
@@ -4368,26 +4368,26 @@ DashboardHeader.styles = [reducedMotionStyles, i$7`
|
|
|
4368
4368
|
outline-offset: 2px;
|
|
4369
4369
|
}
|
|
4370
4370
|
`];
|
|
4371
|
-
__decorateClass$
|
|
4372
|
-
__decorateClass$
|
|
4373
|
-
__decorateClass$
|
|
4374
|
-
__decorateClass$
|
|
4371
|
+
__decorateClass$q([n$5()], DashboardHeader.prototype, "backButton", 2);
|
|
4372
|
+
__decorateClass$q([n$5()], DashboardHeader.prototype, "actions", 2);
|
|
4373
|
+
__decorateClass$q([n$5()], DashboardHeader.prototype, "activeView", 2);
|
|
4374
|
+
__decorateClass$q([n$5({
|
|
4375
4375
|
type: Boolean
|
|
4376
4376
|
})], DashboardHeader.prototype, "hasThreadDevices", 2);
|
|
4377
|
-
__decorateClass$
|
|
4377
|
+
__decorateClass$q([n$5({
|
|
4378
4378
|
type: Boolean
|
|
4379
4379
|
})], DashboardHeader.prototype, "hasWifiDevices", 2);
|
|
4380
|
-
__decorateClass$
|
|
4380
|
+
__decorateClass$q([c$5({
|
|
4381
4381
|
context: clientContext
|
|
4382
4382
|
})], DashboardHeader.prototype, "client", 2);
|
|
4383
|
-
__decorateClass$
|
|
4383
|
+
__decorateClass$q([c$5({
|
|
4384
4384
|
context: tickContext,
|
|
4385
4385
|
subscribe: true
|
|
4386
4386
|
})], DashboardHeader.prototype, "_tick", 2);
|
|
4387
|
-
__decorateClass$
|
|
4388
|
-
__decorateClass$
|
|
4389
|
-
__decorateClass$
|
|
4390
|
-
DashboardHeader = __decorateClass$
|
|
4387
|
+
__decorateClass$q([r$3()], DashboardHeader.prototype, "_themePreference", 2);
|
|
4388
|
+
__decorateClass$q([r$3()], DashboardHeader.prototype, "_effectiveTheme", 2);
|
|
4389
|
+
__decorateClass$q([r$3()], DashboardHeader.prototype, "_devMode", 2);
|
|
4390
|
+
DashboardHeader = __decorateClass$q([t$1("dashboard-header")], DashboardHeader);
|
|
4391
4391
|
|
|
4392
4392
|
/**
|
|
4393
4393
|
* @license
|
|
@@ -21796,7 +21796,7 @@ const clusters = {
|
|
|
21796
21796
|
* SPDX-License-Identifier: Apache-2.0
|
|
21797
21797
|
*/
|
|
21798
21798
|
const showDialogBox = async (type, dialogParams) => {
|
|
21799
|
-
await import('./dialog-box-
|
|
21799
|
+
await import('./dialog-box-bAdbnf-T.js');
|
|
21800
21800
|
return new Promise(resolve => {
|
|
21801
21801
|
const dialog = document.createElement("dialog-box");
|
|
21802
21802
|
dialog.params = dialogParams;
|
|
@@ -21815,7 +21815,7 @@ const showPromptDialog = dialogParams => showDialogBox("prompt", dialogParams);
|
|
|
21815
21815
|
*/
|
|
21816
21816
|
const showAttributeWriteDialog = async options => {
|
|
21817
21817
|
var _document$querySelect;
|
|
21818
|
-
await import('./attribute-write-dialog-
|
|
21818
|
+
await import('./attribute-write-dialog-CqqdRniU.js');
|
|
21819
21819
|
const dialog = document.createElement("attribute-write-dialog");
|
|
21820
21820
|
dialog.client = options.client;
|
|
21821
21821
|
dialog.nodeId = options.nodeId;
|
|
@@ -21834,7 +21834,7 @@ const showAttributeWriteDialog = async options => {
|
|
|
21834
21834
|
*/
|
|
21835
21835
|
const showCommandInvokeDialog = async options => {
|
|
21836
21836
|
var _document$querySelect;
|
|
21837
|
-
await import('./command-invoke-dialog-
|
|
21837
|
+
await import('./command-invoke-dialog-BuvBOrdC.js');
|
|
21838
21838
|
const dialog = document.createElement("command-invoke-dialog");
|
|
21839
21839
|
dialog.client = options.client;
|
|
21840
21840
|
dialog.nodeId = options.nodeId;
|
|
@@ -22000,20 +22000,6 @@ let MdTextButton = class MdTextButton extends TextButton {};
|
|
|
22000
22000
|
MdTextButton.styles = [styles$m, styles$b];
|
|
22001
22001
|
MdTextButton = __decorate([t$1('md-text-button')], MdTextButton);
|
|
22002
22002
|
|
|
22003
|
-
/**
|
|
22004
|
-
* @license
|
|
22005
|
-
* Copyright 2025-2026 Open Home Foundation
|
|
22006
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
22007
|
-
*/
|
|
22008
|
-
const showNodeBindingDialog = async (node, endpoint) => {
|
|
22009
|
-
var _document$querySelect;
|
|
22010
|
-
await import('./node-binding-dialog-B9IdqHrZ.js');
|
|
22011
|
-
const dialog = document.createElement("node-binding-dialog");
|
|
22012
|
-
dialog.node = node;
|
|
22013
|
-
dialog.endpoint = endpoint;
|
|
22014
|
-
(_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
|
|
22015
|
-
};
|
|
22016
|
-
|
|
22017
22003
|
/**
|
|
22018
22004
|
* @license
|
|
22019
22005
|
* Copyright 2026 Open Home Foundation
|
|
@@ -22021,7 +22007,7 @@ const showNodeBindingDialog = async (node, endpoint) => {
|
|
|
22021
22007
|
*/
|
|
22022
22008
|
const showNodeLabelDialog = async (client, node) => {
|
|
22023
22009
|
var _document$querySelect;
|
|
22024
|
-
await import('./node-label-dialog-
|
|
22010
|
+
await import('./node-label-dialog-T3nPG-Qy.js');
|
|
22025
22011
|
const dialog = document.createElement("node-label-dialog");
|
|
22026
22012
|
dialog.client = client;
|
|
22027
22013
|
dialog.node = node;
|
|
@@ -26388,12 +26374,12 @@ function pickString(obj, key) {
|
|
|
26388
26374
|
return typeof v === "string" ? v : null;
|
|
26389
26375
|
}
|
|
26390
26376
|
|
|
26391
|
-
var __defProp$
|
|
26392
|
-
var __getOwnPropDesc$
|
|
26393
|
-
var __decorateClass$
|
|
26394
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
26377
|
+
var __defProp$m = Object.defineProperty;
|
|
26378
|
+
var __getOwnPropDesc$n = Object.getOwnPropertyDescriptor;
|
|
26379
|
+
var __decorateClass$p = (decorators, target, key, kind) => {
|
|
26380
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$n(target, key) : target;
|
|
26395
26381
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
26396
|
-
if (kind && result) __defProp$
|
|
26382
|
+
if (kind && result) __defProp$m(target, key, result);
|
|
26397
26383
|
return result;
|
|
26398
26384
|
};
|
|
26399
26385
|
const STREAM_USAGE_LIVE_VIEW = 3;
|
|
@@ -27191,34 +27177,34 @@ WebRtcStreamView.styles = i$7`
|
|
|
27191
27177
|
}
|
|
27192
27178
|
}
|
|
27193
27179
|
`;
|
|
27194
|
-
__decorateClass$
|
|
27180
|
+
__decorateClass$p([c$5({
|
|
27195
27181
|
context: clientContext,
|
|
27196
27182
|
subscribe: true
|
|
27197
27183
|
}), n$5({
|
|
27198
27184
|
attribute: false
|
|
27199
27185
|
})], WebRtcStreamView.prototype, "client", 2);
|
|
27200
|
-
__decorateClass$
|
|
27186
|
+
__decorateClass$p([n$5({
|
|
27201
27187
|
attribute: false
|
|
27202
27188
|
})], WebRtcStreamView.prototype, "nodeId", 2);
|
|
27203
|
-
__decorateClass$
|
|
27189
|
+
__decorateClass$p([n$5({
|
|
27204
27190
|
type: Number
|
|
27205
27191
|
})], WebRtcStreamView.prototype, "endpointId", 2);
|
|
27206
|
-
__decorateClass$
|
|
27192
|
+
__decorateClass$p([n$5({
|
|
27207
27193
|
type: Object
|
|
27208
27194
|
})], WebRtcStreamView.prototype, "resolution", 2);
|
|
27209
|
-
__decorateClass$
|
|
27195
|
+
__decorateClass$p([n$5({
|
|
27210
27196
|
type: Boolean
|
|
27211
27197
|
})], WebRtcStreamView.prototype, "watermarkEnabled", 2);
|
|
27212
|
-
__decorateClass$
|
|
27198
|
+
__decorateClass$p([n$5({
|
|
27213
27199
|
type: Boolean
|
|
27214
27200
|
})], WebRtcStreamView.prototype, "osdEnabled", 2);
|
|
27215
|
-
__decorateClass$
|
|
27216
|
-
__decorateClass$
|
|
27217
|
-
__decorateClass$
|
|
27201
|
+
__decorateClass$p([r$3()], WebRtcStreamView.prototype, "_state", 2);
|
|
27202
|
+
__decorateClass$p([r$3()], WebRtcStreamView.prototype, "_errorMessage", 2);
|
|
27203
|
+
__decorateClass$p([n$5({
|
|
27218
27204
|
attribute: false
|
|
27219
27205
|
})], WebRtcStreamView.prototype, "snapshotResolution", 2);
|
|
27220
|
-
__decorateClass$
|
|
27221
|
-
WebRtcStreamView = __decorateClass$
|
|
27206
|
+
__decorateClass$p([e$6("video")], WebRtcStreamView.prototype, "_video", 2);
|
|
27207
|
+
WebRtcStreamView = __decorateClass$p([t$1("webrtc-stream-view")], WebRtcStreamView);
|
|
27222
27208
|
|
|
27223
27209
|
/**
|
|
27224
27210
|
* @license
|
|
@@ -27364,12 +27350,12 @@ function hasAvsumOnEndpoint(node, endpoint) {
|
|
|
27364
27350
|
return Object.keys(node.attributes).some(k => k.startsWith(prefix));
|
|
27365
27351
|
}
|
|
27366
27352
|
|
|
27367
|
-
var __defProp$
|
|
27368
|
-
var __getOwnPropDesc$
|
|
27369
|
-
var __decorateClass$
|
|
27370
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
27353
|
+
var __defProp$l = Object.defineProperty;
|
|
27354
|
+
var __getOwnPropDesc$m = Object.getOwnPropertyDescriptor;
|
|
27355
|
+
var __decorateClass$o = (decorators, target, key, kind) => {
|
|
27356
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$m(target, key) : target;
|
|
27371
27357
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
27372
|
-
if (kind && result) __defProp$
|
|
27358
|
+
if (kind && result) __defProp$l(target, key, result);
|
|
27373
27359
|
return result;
|
|
27374
27360
|
};
|
|
27375
27361
|
let AvsumPtzStrip = class extends i$4 {
|
|
@@ -27671,36 +27657,36 @@ AvsumPtzStrip.styles = i$7`
|
|
|
27671
27657
|
}
|
|
27672
27658
|
}
|
|
27673
27659
|
`;
|
|
27674
|
-
__decorateClass$
|
|
27660
|
+
__decorateClass$o([c$5({
|
|
27675
27661
|
context: clientContext,
|
|
27676
27662
|
subscribe: true
|
|
27677
27663
|
}), n$5({
|
|
27678
27664
|
attribute: false
|
|
27679
27665
|
})], AvsumPtzStrip.prototype, "client", 2);
|
|
27680
|
-
__decorateClass$
|
|
27666
|
+
__decorateClass$o([n$5({
|
|
27681
27667
|
attribute: false
|
|
27682
27668
|
})], AvsumPtzStrip.prototype, "nodeId", 2);
|
|
27683
|
-
__decorateClass$
|
|
27669
|
+
__decorateClass$o([n$5({
|
|
27684
27670
|
type: Number
|
|
27685
27671
|
})], AvsumPtzStrip.prototype, "endpointId", 2);
|
|
27686
|
-
__decorateClass$
|
|
27672
|
+
__decorateClass$o([n$5({
|
|
27687
27673
|
type: Number,
|
|
27688
27674
|
attribute: false
|
|
27689
27675
|
})], AvsumPtzStrip.prototype, "activeVideoStreamId", 2);
|
|
27690
|
-
__decorateClass$
|
|
27676
|
+
__decorateClass$o([n$5({
|
|
27691
27677
|
type: Object,
|
|
27692
27678
|
attribute: false
|
|
27693
27679
|
})], AvsumPtzStrip.prototype, "sensorSize", 2);
|
|
27694
|
-
__decorateClass$
|
|
27695
|
-
__decorateClass$
|
|
27696
|
-
AvsumPtzStrip = __decorateClass$
|
|
27680
|
+
__decorateClass$o([r$3()], AvsumPtzStrip.prototype, "_mode", 2);
|
|
27681
|
+
__decorateClass$o([r$3()], AvsumPtzStrip.prototype, "_toast", 2);
|
|
27682
|
+
AvsumPtzStrip = __decorateClass$o([t$1("avsum-ptz-strip")], AvsumPtzStrip);
|
|
27697
27683
|
|
|
27698
|
-
var __defProp$
|
|
27699
|
-
var __getOwnPropDesc$
|
|
27700
|
-
var __decorateClass$
|
|
27701
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
27684
|
+
var __defProp$k = Object.defineProperty;
|
|
27685
|
+
var __getOwnPropDesc$l = Object.getOwnPropertyDescriptor;
|
|
27686
|
+
var __decorateClass$n = (decorators, target, key, kind) => {
|
|
27687
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$l(target, key) : target;
|
|
27702
27688
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
27703
|
-
if (kind && result) __defProp$
|
|
27689
|
+
if (kind && result) __defProp$k(target, key, result);
|
|
27704
27690
|
return result;
|
|
27705
27691
|
};
|
|
27706
27692
|
const HA_DEFAULT_RESOLUTIONS = [{
|
|
@@ -28176,35 +28162,35 @@ CameraOverlay.styles = i$7`
|
|
|
28176
28162
|
font-style: normal;
|
|
28177
28163
|
}
|
|
28178
28164
|
`;
|
|
28179
|
-
__decorateClass$
|
|
28165
|
+
__decorateClass$n([c$5({
|
|
28180
28166
|
context: clientContext,
|
|
28181
28167
|
subscribe: true
|
|
28182
28168
|
}), n$5({
|
|
28183
28169
|
attribute: false
|
|
28184
28170
|
})], CameraOverlay.prototype, "client", 2);
|
|
28185
|
-
__decorateClass$
|
|
28171
|
+
__decorateClass$n([n$5({
|
|
28186
28172
|
attribute: false
|
|
28187
28173
|
})], CameraOverlay.prototype, "nodeId", 2);
|
|
28188
|
-
__decorateClass$
|
|
28174
|
+
__decorateClass$n([n$5({
|
|
28189
28175
|
type: Number
|
|
28190
28176
|
})], CameraOverlay.prototype, "endpointId", 2);
|
|
28191
|
-
__decorateClass$
|
|
28192
|
-
__decorateClass$
|
|
28193
|
-
__decorateClass$
|
|
28194
|
-
__decorateClass$
|
|
28195
|
-
__decorateClass$
|
|
28196
|
-
__decorateClass$
|
|
28197
|
-
__decorateClass$
|
|
28198
|
-
__decorateClass$
|
|
28199
|
-
__decorateClass$
|
|
28200
|
-
__decorateClass$
|
|
28201
|
-
__decorateClass$
|
|
28202
|
-
__decorateClass$
|
|
28203
|
-
__decorateClass$
|
|
28204
|
-
__decorateClass$
|
|
28205
|
-
__decorateClass$
|
|
28206
|
-
__decorateClass$
|
|
28207
|
-
CameraOverlay = __decorateClass$
|
|
28177
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_state", 2);
|
|
28178
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_errorMessage", 2);
|
|
28179
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotDataUri", 2);
|
|
28180
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotResolution", 2);
|
|
28181
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotBusy", 2);
|
|
28182
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotError", 2);
|
|
28183
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_resolutions", 2);
|
|
28184
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_selectedResolution", 2);
|
|
28185
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_resolutionsLoading", 2);
|
|
28186
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_closing", 2);
|
|
28187
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_activeVideoStreamId", 2);
|
|
28188
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_muted", 2);
|
|
28189
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_watermarkEnabled", 2);
|
|
28190
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_osdEnabled", 2);
|
|
28191
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_snapshotResolutions", 2);
|
|
28192
|
+
__decorateClass$n([r$3()], CameraOverlay.prototype, "_selectedSnapshotResolution", 2);
|
|
28193
|
+
CameraOverlay = __decorateClass$n([t$1("camera-overlay")], CameraOverlay);
|
|
28208
28194
|
|
|
28209
28195
|
/**
|
|
28210
28196
|
* @license
|
|
@@ -28558,87 +28544,14 @@ function createWiFiRouterIconDataUrl(isSelected = false) {
|
|
|
28558
28544
|
return createIconDataUrl(mdiWifi, color);
|
|
28559
28545
|
}
|
|
28560
28546
|
|
|
28561
|
-
/**
|
|
28562
|
-
* @license
|
|
28563
|
-
* Copyright 2018 Google LLC
|
|
28564
|
-
* SPDX-License-Identifier: BSD-3-Clause
|
|
28565
|
-
*/
|
|
28566
|
-
const e = {},
|
|
28567
|
-
i = e$4(class extends i$3 {
|
|
28568
|
-
constructor() {
|
|
28569
|
-
super(...arguments), this.ot = e;
|
|
28570
|
-
}
|
|
28571
|
-
render(r, t) {
|
|
28572
|
-
return t();
|
|
28573
|
-
}
|
|
28574
|
-
update(t, [s, e]) {
|
|
28575
|
-
if (Array.isArray(s)) {
|
|
28576
|
-
if (Array.isArray(this.ot) && this.ot.length === s.length && s.every((r, t) => r === this.ot[t])) return E;
|
|
28577
|
-
} else if (this.ot === s) return E;
|
|
28578
|
-
return this.ot = Array.isArray(s) ? Array.from(s) : s, this.render(s, e);
|
|
28579
|
-
}
|
|
28580
|
-
});
|
|
28581
|
-
|
|
28582
|
-
/**
|
|
28583
|
-
* @license
|
|
28584
|
-
* Copyright 2025-2026 Open Home Foundation
|
|
28585
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
28586
|
-
*/
|
|
28587
|
-
function formatHex(value) {
|
|
28588
|
-
let hex = value.toString(16).toUpperCase();
|
|
28589
|
-
if (hex.length < 4) {
|
|
28590
|
-
hex = hex.padStart(4, "0");
|
|
28591
|
-
} else if (hex.length % 2 !== 0) {
|
|
28592
|
-
hex = "0" + hex;
|
|
28593
|
-
}
|
|
28594
|
-
return `0x${hex}`;
|
|
28595
|
-
}
|
|
28596
|
-
function formatNodeAddress(fabricIndex, nodeId) {
|
|
28597
|
-
const fabricPart = fabricIndex !== void 0 ? fabricIndex : "?";
|
|
28598
|
-
return `@${fabricPart}:${nodeId.toString(16)}`;
|
|
28599
|
-
}
|
|
28600
|
-
function getEffectiveFabricIndex(serverFabricIndex, isTestNode) {
|
|
28601
|
-
return isTestNode || serverFabricIndex === void 0 ? void 0 : serverFabricIndex;
|
|
28602
|
-
}
|
|
28603
|
-
function formatNodeAddressFromAny(fabricIndex, nodeId) {
|
|
28604
|
-
let numericId;
|
|
28605
|
-
if (typeof nodeId === "bigint") {
|
|
28606
|
-
numericId = nodeId;
|
|
28607
|
-
} else if (typeof nodeId === "number") {
|
|
28608
|
-
numericId = BigInt(nodeId);
|
|
28609
|
-
} else {
|
|
28610
|
-
try {
|
|
28611
|
-
numericId = BigInt(nodeId);
|
|
28612
|
-
} catch {
|
|
28613
|
-
return "";
|
|
28614
|
-
}
|
|
28615
|
-
}
|
|
28616
|
-
return formatNodeAddress(fabricIndex, numericId);
|
|
28617
|
-
}
|
|
28618
|
-
|
|
28619
28547
|
/**
|
|
28620
28548
|
* @license
|
|
28621
28549
|
* Copyright 2025-2026 Open Home Foundation
|
|
28622
28550
|
* SPDX-License-Identifier: Apache-2.0
|
|
28623
28551
|
*/
|
|
28624
|
-
const bindingContext = n$9("binding");
|
|
28625
|
-
|
|
28626
|
-
var __defProp$h = Object.defineProperty;
|
|
28627
|
-
var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
|
|
28628
|
-
var __decorateClass$k = (decorators, target, key, kind) => {
|
|
28629
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
|
|
28630
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
28631
|
-
if (kind && result) __defProp$h(target, key, result);
|
|
28632
|
-
return result;
|
|
28633
|
-
};
|
|
28634
|
-
function getUniqueClusters(node, endpoint) {
|
|
28635
|
-
return Array.from(new Set(Object.keys(node.attributes).filter(key => key.startsWith(`${endpoint.toString()}/`)).map(key => Number(key.split("/")[1])))).sort((a, b) => {
|
|
28636
|
-
return a - b;
|
|
28637
|
-
});
|
|
28638
|
-
}
|
|
28639
28552
|
function getEndpointDeviceTypes(node, endpoint) {
|
|
28640
28553
|
const rawValues = node.attributes[`${endpoint}/29/0`];
|
|
28641
|
-
if (!rawValues) return
|
|
28554
|
+
if (!rawValues) return new Array();
|
|
28642
28555
|
return rawValues.map(rawValue => {
|
|
28643
28556
|
const id = rawValue["0"] ?? rawValue["deviceType"];
|
|
28644
28557
|
return device_types[id] ?? {
|
|
@@ -28648,127 +28561,20 @@ function getEndpointDeviceTypes(node, endpoint) {
|
|
|
28648
28561
|
};
|
|
28649
28562
|
});
|
|
28650
28563
|
}
|
|
28651
|
-
let MatterEndpointView = class extends i$4 {
|
|
28652
|
-
constructor() {
|
|
28653
|
-
super(...arguments);
|
|
28654
|
-
this._tick = 0;
|
|
28655
|
-
}
|
|
28656
|
-
render() {
|
|
28657
|
-
var _this$node;
|
|
28658
|
-
if (!this.node || this.endpoint == void 0) {
|
|
28659
|
-
return b`
|
|
28660
|
-
<dashboard-header title="Not found" backButton="#"></dashboard-header>
|
|
28661
|
-
<div class="not-found">
|
|
28662
|
-
<ha-svg-icon .path=${mdiAlertCircleOutline}></ha-svg-icon>
|
|
28663
|
-
<p>Node or endpoint not found</p>
|
|
28664
|
-
<md-outlined-button @click=${this._goBack}>Back</md-outlined-button>
|
|
28665
|
-
</div>
|
|
28666
|
-
`;
|
|
28667
|
-
}
|
|
28668
|
-
const fabricIndex = getEffectiveFabricIndex(this.client.serverInfo.fabric_index, isTestNodeId(this.node.node_id));
|
|
28669
|
-
const nodeHex = formatNodeAddress(fabricIndex, this.node.node_id);
|
|
28670
|
-
return b`
|
|
28671
|
-
<dashboard-header
|
|
28672
|
-
.title=${`Node ${this.node.node_id} ${nodeHex} | Endpoint ${this.endpoint}`}
|
|
28673
|
-
.backButton=${`#node/${this.node.node_id}`}
|
|
28674
|
-
></dashboard-header>
|
|
28675
|
-
|
|
28676
|
-
<!-- node details section -->
|
|
28677
|
-
<div class="container">
|
|
28678
|
-
<node-details .node=${this.node}></node-details>
|
|
28679
|
-
</div>
|
|
28680
|
-
|
|
28681
|
-
<!-- Endpoint clusters listing -->
|
|
28682
|
-
<div class="container">
|
|
28683
|
-
<md-list>
|
|
28684
|
-
<md-list-item>
|
|
28685
|
-
<div slot="headline">
|
|
28686
|
-
<b>Clusters on Endpoint ${this.endpoint}</b>
|
|
28687
|
-
</div>
|
|
28688
|
-
<div slot="supporting-text">
|
|
28689
|
-
Device Type(s):
|
|
28690
|
-
${getEndpointDeviceTypes(this.node, this.endpoint).map(deviceType => {
|
|
28691
|
-
return deviceType.label;
|
|
28692
|
-
}).join(" / ")}
|
|
28693
|
-
</div>
|
|
28694
|
-
</md-list-item>
|
|
28695
|
-
${i([(_this$node = this.node) === null || _this$node === void 0 ? void 0 : _this$node.attributes.length], () => getUniqueClusters(this.node, this.endpoint).map(cluster => {
|
|
28696
|
-
var _clusters$cluster;
|
|
28697
|
-
return b`
|
|
28698
|
-
<md-list-item
|
|
28699
|
-
type="link"
|
|
28700
|
-
href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
|
|
28701
|
-
>
|
|
28702
|
-
<div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) ?? "Custom/Unknown Cluster"}</div>
|
|
28703
|
-
<div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
|
|
28704
|
-
<ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
|
|
28705
|
-
</md-list-item>
|
|
28706
|
-
`;
|
|
28707
|
-
}))}
|
|
28708
|
-
</md-list>
|
|
28709
|
-
</div>
|
|
28710
|
-
`;
|
|
28711
|
-
}
|
|
28712
|
-
_goBack() {
|
|
28713
|
-
history.back();
|
|
28714
|
-
}
|
|
28715
|
-
};
|
|
28716
|
-
MatterEndpointView.styles = [notFoundStyles, i$7`
|
|
28717
|
-
:host {
|
|
28718
|
-
display: block;
|
|
28719
|
-
background-color: var(--md-sys-color-background);
|
|
28720
|
-
}
|
|
28721
|
-
|
|
28722
|
-
.header {
|
|
28723
|
-
background-color: var(--md-sys-color-primary);
|
|
28724
|
-
color: var(--md-sys-color-on-primary);
|
|
28725
|
-
--icon-primary-color: var(--md-sys-color-on-primary);
|
|
28726
|
-
font-weight: 400;
|
|
28727
|
-
display: flex;
|
|
28728
|
-
align-items: center;
|
|
28729
|
-
padding-right: 8px;
|
|
28730
|
-
height: 48px;
|
|
28731
|
-
}
|
|
28732
|
-
|
|
28733
|
-
md-icon-button {
|
|
28734
|
-
margin-right: 8px;
|
|
28735
|
-
}
|
|
28736
|
-
|
|
28737
|
-
.flex {
|
|
28738
|
-
flex: 1;
|
|
28739
|
-
}
|
|
28740
|
-
|
|
28741
|
-
.container {
|
|
28742
|
-
padding: 16px;
|
|
28743
|
-
max-width: 95%;
|
|
28744
|
-
margin: 0 auto;
|
|
28745
|
-
}
|
|
28746
28564
|
|
|
28747
|
-
|
|
28748
|
-
|
|
28749
|
-
|
|
28750
|
-
|
|
28751
|
-
|
|
28752
|
-
|
|
28753
|
-
__decorateClass$k([c$5({
|
|
28754
|
-
context: clientContext
|
|
28755
|
-
})], MatterEndpointView.prototype, "client", 2);
|
|
28756
|
-
__decorateClass$k([c$5({
|
|
28757
|
-
context: tickContext,
|
|
28758
|
-
subscribe: true
|
|
28759
|
-
})], MatterEndpointView.prototype, "_tick", 2);
|
|
28760
|
-
__decorateClass$k([n$5()], MatterEndpointView.prototype, "node", 2);
|
|
28761
|
-
__decorateClass$k([e$b({
|
|
28762
|
-
context: bindingContext
|
|
28763
|
-
}), n$5()], MatterEndpointView.prototype, "endpoint", 2);
|
|
28764
|
-
MatterEndpointView = __decorateClass$k([t$1("matter-endpoint-view")], MatterEndpointView);
|
|
28565
|
+
/**
|
|
28566
|
+
* @license
|
|
28567
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
28568
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
28569
|
+
*/
|
|
28570
|
+
const bindingContext = n$9("binding");
|
|
28765
28571
|
|
|
28766
|
-
var __defProp$
|
|
28767
|
-
var __getOwnPropDesc$
|
|
28768
|
-
var __decorateClass$
|
|
28769
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
28572
|
+
var __defProp$j = Object.defineProperty;
|
|
28573
|
+
var __getOwnPropDesc$k = Object.getOwnPropertyDescriptor;
|
|
28574
|
+
var __decorateClass$m = (decorators, target, key, kind) => {
|
|
28575
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$k(target, key) : target;
|
|
28770
28576
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
28771
|
-
if (kind && result) __defProp$
|
|
28577
|
+
if (kind && result) __defProp$j(target, key, result);
|
|
28772
28578
|
return result;
|
|
28773
28579
|
};
|
|
28774
28580
|
const UPDATE_STATE_LABELS = {
|
|
@@ -28806,7 +28612,6 @@ let NodeDetails = class extends i$4 {
|
|
|
28806
28612
|
}
|
|
28807
28613
|
render() {
|
|
28808
28614
|
if (!this.node) return b``;
|
|
28809
|
-
const bindings = this.node.attributes[this.endpoint + "/30/0"];
|
|
28810
28615
|
const deviceTypeIds = getEndpointDeviceTypes(this.node, this.endpoint).map(d => d.id);
|
|
28811
28616
|
const isCamera = deviceTypeIds.includes(322) || deviceTypeIds.includes(323);
|
|
28812
28617
|
return b`
|
|
@@ -28868,13 +28673,6 @@ let NodeDetails = class extends i$4 {
|
|
|
28868
28673
|
<ha-svg-icon slot="icon" .path=${mdiVideo}></ha-svg-icon>
|
|
28869
28674
|
</md-outlined-button>
|
|
28870
28675
|
` : A}
|
|
28871
|
-
${bindings ? b`
|
|
28872
|
-
<md-outlined-button @click=${handleAsync(() => this._binding())}>
|
|
28873
|
-
Binding
|
|
28874
|
-
<ha-svg-icon slot="icon" .path=${mdiLink}></ha-svg-icon>
|
|
28875
|
-
</md-outlined-button>
|
|
28876
|
-
` : A}
|
|
28877
|
-
|
|
28878
28676
|
<md-outlined-button @click=${handleAsync(() => this._openCommissioningWindow())}
|
|
28879
28677
|
>Share<ha-svg-icon slot="icon" .path=${mdiShareVariant}></ha-svg-icon
|
|
28880
28678
|
></md-outlined-button>
|
|
@@ -28929,13 +28727,6 @@ let NodeDetails = class extends i$4 {
|
|
|
28929
28727
|
});
|
|
28930
28728
|
}
|
|
28931
28729
|
}
|
|
28932
|
-
async _binding() {
|
|
28933
|
-
try {
|
|
28934
|
-
showNodeBindingDialog(this.node, this.endpoint);
|
|
28935
|
-
} catch (err) {
|
|
28936
|
-
console.error("Binding error:", err);
|
|
28937
|
-
}
|
|
28938
|
-
}
|
|
28939
28730
|
_openCameraOverlay() {
|
|
28940
28731
|
const overlay = document.createElement("camera-overlay");
|
|
28941
28732
|
overlay.nodeId = this.node.node_id;
|
|
@@ -29072,19 +28863,56 @@ NodeDetails.styles = i$7`
|
|
|
29072
28863
|
font-size: 0.8em;
|
|
29073
28864
|
}
|
|
29074
28865
|
`;
|
|
29075
|
-
__decorateClass$
|
|
28866
|
+
__decorateClass$m([c$5({
|
|
29076
28867
|
context: clientContext
|
|
29077
28868
|
})], NodeDetails.prototype, "client", 2);
|
|
29078
|
-
__decorateClass$
|
|
28869
|
+
__decorateClass$m([c$5({
|
|
29079
28870
|
context: tickContext,
|
|
29080
28871
|
subscribe: true
|
|
29081
28872
|
})], NodeDetails.prototype, "_tick", 2);
|
|
29082
|
-
__decorateClass$
|
|
29083
|
-
__decorateClass$
|
|
29084
|
-
__decorateClass$
|
|
28873
|
+
__decorateClass$m([n$5()], NodeDetails.prototype, "node", 2);
|
|
28874
|
+
__decorateClass$m([r$3()], NodeDetails.prototype, "_updateInitiated", 2);
|
|
28875
|
+
__decorateClass$m([c$5({
|
|
29085
28876
|
context: bindingContext
|
|
29086
28877
|
})], NodeDetails.prototype, "endpoint", 2);
|
|
29087
|
-
NodeDetails = __decorateClass$
|
|
28878
|
+
NodeDetails = __decorateClass$m([t$1("node-details")], NodeDetails);
|
|
28879
|
+
|
|
28880
|
+
/**
|
|
28881
|
+
* @license
|
|
28882
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
28883
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
28884
|
+
*/
|
|
28885
|
+
function formatHex(value) {
|
|
28886
|
+
let hex = value.toString(16).toUpperCase();
|
|
28887
|
+
if (hex.length < 4) {
|
|
28888
|
+
hex = hex.padStart(4, "0");
|
|
28889
|
+
} else if (hex.length % 2 !== 0) {
|
|
28890
|
+
hex = "0" + hex;
|
|
28891
|
+
}
|
|
28892
|
+
return `0x${hex}`;
|
|
28893
|
+
}
|
|
28894
|
+
function formatNodeAddress(fabricIndex, nodeId) {
|
|
28895
|
+
const fabricPart = fabricIndex !== void 0 ? fabricIndex : "?";
|
|
28896
|
+
return `@${fabricPart}:${nodeId.toString(16)}`;
|
|
28897
|
+
}
|
|
28898
|
+
function getEffectiveFabricIndex(serverFabricIndex, isTestNode) {
|
|
28899
|
+
return isTestNode || serverFabricIndex === void 0 ? void 0 : serverFabricIndex;
|
|
28900
|
+
}
|
|
28901
|
+
function formatNodeAddressFromAny(fabricIndex, nodeId) {
|
|
28902
|
+
let numericId;
|
|
28903
|
+
if (typeof nodeId === "bigint") {
|
|
28904
|
+
numericId = nodeId;
|
|
28905
|
+
} else if (typeof nodeId === "number") {
|
|
28906
|
+
numericId = BigInt(nodeId);
|
|
28907
|
+
} else {
|
|
28908
|
+
try {
|
|
28909
|
+
numericId = BigInt(nodeId);
|
|
28910
|
+
} catch {
|
|
28911
|
+
return "";
|
|
28912
|
+
}
|
|
28913
|
+
}
|
|
28914
|
+
return formatNodeAddress(fabricIndex, numericId);
|
|
28915
|
+
}
|
|
29088
28916
|
|
|
29089
28917
|
/**
|
|
29090
28918
|
* @license
|
|
@@ -29099,12 +28927,12 @@ function getClusterCommandsTag(clusterId) {
|
|
|
29099
28927
|
return clusterCommandRegistry.get(clusterId);
|
|
29100
28928
|
}
|
|
29101
28929
|
|
|
29102
|
-
var _staticBlock$
|
|
29103
|
-
var __defProp$
|
|
29104
|
-
var __decorateClass$
|
|
28930
|
+
var _staticBlock$3;
|
|
28931
|
+
var __defProp$i = Object.defineProperty;
|
|
28932
|
+
var __decorateClass$l = (decorators, target, key, kind) => {
|
|
29105
28933
|
var result = void 0 ;
|
|
29106
28934
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (decorator(target, key, result) ) || result;
|
|
29107
|
-
if (result) __defProp$
|
|
28935
|
+
if (result) __defProp$i(target, key, result);
|
|
29108
28936
|
return result;
|
|
29109
28937
|
};
|
|
29110
28938
|
class BaseClusterCommands extends i$4 {
|
|
@@ -29124,7 +28952,7 @@ class BaseClusterCommands extends i$4 {
|
|
|
29124
28952
|
console.error(`Failed to send command ${command}:`, error);
|
|
29125
28953
|
}
|
|
29126
28954
|
}
|
|
29127
|
-
static #_ = _staticBlock$
|
|
28955
|
+
static #_ = _staticBlock$3 = () => this.styles = [reducedMotionStyles, i$7`
|
|
29128
28956
|
:host {
|
|
29129
28957
|
display: block;
|
|
29130
28958
|
color: var(--md-sys-color-on-surface);
|
|
@@ -29206,30 +29034,782 @@ class BaseClusterCommands extends i$4 {
|
|
|
29206
29034
|
}
|
|
29207
29035
|
`];
|
|
29208
29036
|
}
|
|
29209
|
-
_staticBlock$
|
|
29210
|
-
__decorateClass$
|
|
29037
|
+
_staticBlock$3();
|
|
29038
|
+
__decorateClass$l([c$5({
|
|
29211
29039
|
context: clientContext
|
|
29212
29040
|
})], BaseClusterCommands.prototype, "client");
|
|
29213
|
-
__decorateClass$
|
|
29041
|
+
__decorateClass$l([c$5({
|
|
29214
29042
|
context: tickContext,
|
|
29215
29043
|
subscribe: true
|
|
29216
29044
|
})], BaseClusterCommands.prototype, "_tick");
|
|
29217
|
-
__decorateClass$
|
|
29045
|
+
__decorateClass$l([n$5({
|
|
29218
29046
|
attribute: false
|
|
29219
29047
|
})], BaseClusterCommands.prototype, "node");
|
|
29220
|
-
__decorateClass$
|
|
29048
|
+
__decorateClass$l([n$5({
|
|
29221
29049
|
type: Number
|
|
29222
29050
|
})], BaseClusterCommands.prototype, "endpoint");
|
|
29223
|
-
__decorateClass$
|
|
29051
|
+
__decorateClass$l([n$5({
|
|
29224
29052
|
type: Number
|
|
29225
29053
|
})], BaseClusterCommands.prototype, "cluster");
|
|
29226
29054
|
|
|
29227
|
-
var
|
|
29228
|
-
|
|
29229
|
-
|
|
29230
|
-
|
|
29055
|
+
var _staticBlock$2, _staticBlock2;
|
|
29056
|
+
/**
|
|
29057
|
+
* @license
|
|
29058
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29059
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29060
|
+
*/
|
|
29061
|
+
function isRecord$1(value) {
|
|
29062
|
+
return typeof value === "object" && value !== null;
|
|
29063
|
+
}
|
|
29064
|
+
class AccessControlTargetTransformer {
|
|
29065
|
+
static transform(input) {
|
|
29066
|
+
if (!isRecord$1(input)) {
|
|
29067
|
+
throw new Error("Invalid input: expected an object");
|
|
29068
|
+
}
|
|
29069
|
+
const result = {};
|
|
29070
|
+
const keyMapping = AccessControlTargetTransformer.KEY_MAPPING;
|
|
29071
|
+
for (const key in input) {
|
|
29072
|
+
if (key in keyMapping) {
|
|
29073
|
+
const mappedKey = keyMapping[key];
|
|
29074
|
+
if (mappedKey) {
|
|
29075
|
+
const value = input[key];
|
|
29076
|
+
if (value == null) continue;
|
|
29077
|
+
result[mappedKey] = Number(value);
|
|
29078
|
+
}
|
|
29079
|
+
}
|
|
29080
|
+
}
|
|
29081
|
+
return result;
|
|
29082
|
+
}
|
|
29083
|
+
static #_ = _staticBlock$2 = () => this.KEY_MAPPING = {
|
|
29084
|
+
"0": "cluster",
|
|
29085
|
+
"1": "endpoint",
|
|
29086
|
+
"2": "deviceType"
|
|
29087
|
+
};
|
|
29088
|
+
}
|
|
29089
|
+
_staticBlock$2();
|
|
29090
|
+
class AccessControlEntryDataTransformer {
|
|
29091
|
+
static transform(input) {
|
|
29092
|
+
if (!isRecord$1(input)) {
|
|
29093
|
+
throw new Error("Invalid input: expected an object");
|
|
29094
|
+
}
|
|
29095
|
+
const result = {};
|
|
29096
|
+
const keyMapping = AccessControlEntryDataTransformer.KEY_MAPPING;
|
|
29097
|
+
for (const key in input) {
|
|
29098
|
+
if (key in keyMapping) {
|
|
29099
|
+
const mappedKey = keyMapping[key];
|
|
29100
|
+
if (mappedKey) {
|
|
29101
|
+
const value = input[key];
|
|
29102
|
+
if (value == null) continue;
|
|
29103
|
+
if (mappedKey === "subjects") {
|
|
29104
|
+
result.subjects = Array.isArray(value) ? value : void 0;
|
|
29105
|
+
} else if (mappedKey === "targets") {
|
|
29106
|
+
result.targets = Array.isArray(value) ? value.map(val => AccessControlTargetTransformer.transform(val)) : void 0;
|
|
29107
|
+
} else {
|
|
29108
|
+
result[mappedKey] = Number(value);
|
|
29109
|
+
}
|
|
29110
|
+
}
|
|
29111
|
+
}
|
|
29112
|
+
}
|
|
29113
|
+
return result;
|
|
29114
|
+
}
|
|
29115
|
+
static #_ = _staticBlock2 = () => this.KEY_MAPPING = {
|
|
29116
|
+
"1": "privilege",
|
|
29117
|
+
"2": "authMode",
|
|
29118
|
+
"3": "subjects",
|
|
29119
|
+
"4": "targets",
|
|
29120
|
+
"254": "fabricIndex"
|
|
29121
|
+
};
|
|
29122
|
+
}
|
|
29123
|
+
_staticBlock2();
|
|
29124
|
+
|
|
29125
|
+
/**
|
|
29126
|
+
* @license
|
|
29127
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29128
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29129
|
+
*/
|
|
29130
|
+
var Privilege = /* @__PURE__ */(Privilege2 => {
|
|
29131
|
+
Privilege2[Privilege2["View"] = 1] = "View";
|
|
29132
|
+
Privilege2[Privilege2["ProxyView"] = 2] = "ProxyView";
|
|
29133
|
+
Privilege2[Privilege2["Operate"] = 3] = "Operate";
|
|
29134
|
+
Privilege2[Privilege2["Manage"] = 4] = "Manage";
|
|
29135
|
+
Privilege2[Privilege2["Administer"] = 5] = "Administer";
|
|
29136
|
+
return Privilege2;
|
|
29137
|
+
})(Privilege || {});
|
|
29138
|
+
var AuthMode = /* @__PURE__ */(AuthMode2 => {
|
|
29139
|
+
AuthMode2[AuthMode2["Pase"] = 1] = "Pase";
|
|
29140
|
+
AuthMode2[AuthMode2["Case"] = 2] = "Case";
|
|
29141
|
+
AuthMode2[AuthMode2["Group"] = 3] = "Group";
|
|
29142
|
+
return AuthMode2;
|
|
29143
|
+
})(AuthMode || {});
|
|
29144
|
+
const PRIVILEGE_NAMES = {
|
|
29145
|
+
[1 /* View */]: "View",
|
|
29146
|
+
[2 /* ProxyView */]: "ProxyView",
|
|
29147
|
+
[3 /* Operate */]: "Operate",
|
|
29148
|
+
[4 /* Manage */]: "Manage",
|
|
29149
|
+
[5 /* Administer */]: "Administer"
|
|
29150
|
+
};
|
|
29151
|
+
const AUTH_MODE_NAMES = {
|
|
29152
|
+
[1 /* Pase */]: "PASE",
|
|
29153
|
+
[2 /* Case */]: "CASE",
|
|
29154
|
+
[3 /* Group */]: "Group"
|
|
29155
|
+
};
|
|
29156
|
+
function nodeIdKey(id) {
|
|
29157
|
+
return String(id);
|
|
29158
|
+
}
|
|
29159
|
+
function attributeArray(value) {
|
|
29160
|
+
if (Array.isArray(value)) return value;
|
|
29161
|
+
if (value && typeof value === "object") return Object.values(value);
|
|
29162
|
+
return new Array();
|
|
29163
|
+
}
|
|
29164
|
+
function readAclEntries(node) {
|
|
29165
|
+
return attributeArray(node.attributes["0/31/0"]).map(value => AccessControlEntryDataTransformer.transform(value));
|
|
29166
|
+
}
|
|
29167
|
+
function entriesForFabric(entries, fabricIndex) {
|
|
29168
|
+
if (fabricIndex === void 0) return entries;
|
|
29169
|
+
return entries.filter(e => e.fabricIndex === fabricIndex);
|
|
29170
|
+
}
|
|
29171
|
+
function nodeFabricIndex(node) {
|
|
29172
|
+
const v = node.attributes["0/62/5"];
|
|
29173
|
+
return typeof v === "number" ? v : void 0;
|
|
29174
|
+
}
|
|
29175
|
+
function isWholeNode(entry) {
|
|
29176
|
+
return !entry.targets || entry.targets.length === 0;
|
|
29177
|
+
}
|
|
29178
|
+
function entryMatchesTarget(entry, endpoint, cluster) {
|
|
29179
|
+
if (isWholeNode(entry)) return true;
|
|
29180
|
+
return entry.targets.some(t => {
|
|
29181
|
+
const endpointMatch = t.endpoint == null || t.endpoint === endpoint;
|
|
29182
|
+
const clusterMatch = cluster == null ? t.cluster == null : t.cluster == null || t.cluster === cluster;
|
|
29183
|
+
return endpointMatch && clusterMatch;
|
|
29184
|
+
});
|
|
29185
|
+
}
|
|
29186
|
+
function aclCapacity(node) {
|
|
29187
|
+
const num = (key, fallback) => {
|
|
29188
|
+
const v = node.attributes[key];
|
|
29189
|
+
return typeof v === "number" ? v : fallback;
|
|
29190
|
+
};
|
|
29191
|
+
return {
|
|
29192
|
+
max: num("0/31/4", 0),
|
|
29193
|
+
subjectsMax: num("0/31/2", 0),
|
|
29194
|
+
targetsMax: num("0/31/3", 0)
|
|
29195
|
+
};
|
|
29196
|
+
}
|
|
29197
|
+
function aclEntryKey(entry) {
|
|
29198
|
+
const subjects = (entry.subjects ?? []).map(nodeIdKey).sort();
|
|
29199
|
+
const targets = (entry.targets ?? []).map(t => `${t.endpoint ?? ""}:${t.cluster ?? ""}:${t.deviceType ?? ""}`).sort();
|
|
29200
|
+
return JSON.stringify([entry.fabricIndex, entry.privilege, entry.authMode, subjects, targets]);
|
|
29201
|
+
}
|
|
29202
|
+
function subjectsInclude(entry, nodeId) {
|
|
29203
|
+
const key = nodeIdKey(nodeId);
|
|
29204
|
+
return (entry.subjects ?? []).some(s => nodeIdKey(s) === key);
|
|
29205
|
+
}
|
|
29206
|
+
function isProtectedAdmin(entry, controllerNodeId) {
|
|
29207
|
+
if (controllerNodeId === void 0) return false;
|
|
29208
|
+
return entry.privilege === 5 /* Administer */ && entry.authMode === 2 /* Case */ && subjectsInclude(entry, controllerNodeId);
|
|
29209
|
+
}
|
|
29210
|
+
|
|
29211
|
+
/**
|
|
29212
|
+
* @license
|
|
29213
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29214
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29215
|
+
*/
|
|
29216
|
+
function toApiAcl$1(e) {
|
|
29217
|
+
var _e$targets;
|
|
29218
|
+
return {
|
|
29219
|
+
privilege: e.privilege,
|
|
29220
|
+
auth_mode: e.authMode,
|
|
29221
|
+
subjects: e.subjects ?? null,
|
|
29222
|
+
targets: ((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.map(t => ({
|
|
29223
|
+
cluster: t.cluster ?? null,
|
|
29224
|
+
endpoint: t.endpoint ?? null,
|
|
29225
|
+
device_type: t.deviceType ?? null
|
|
29226
|
+
}))) ?? null
|
|
29227
|
+
};
|
|
29228
|
+
}
|
|
29229
|
+
async function freshOurAcl$1(client, nodeId) {
|
|
29230
|
+
const res = await client.readAttribute(nodeId, ["0/31/0", "0/62/5"]);
|
|
29231
|
+
const all = attributeArray(res["0/31/0"]).map(v => AccessControlEntryDataTransformer.transform(v));
|
|
29232
|
+
const fi = res["0/62/5"];
|
|
29233
|
+
if (typeof fi !== "number") {
|
|
29234
|
+
throw new Error(`Cannot determine the current fabric index (0/62/5) for node ${nodeId}`);
|
|
29235
|
+
}
|
|
29236
|
+
return entriesForFabric(all, fi);
|
|
29237
|
+
}
|
|
29238
|
+
async function addAclEntry(client, nodeId, entry) {
|
|
29239
|
+
const acl = await freshOurAcl$1(client, nodeId);
|
|
29240
|
+
acl.push(entry);
|
|
29241
|
+
await client.setACLEntry(nodeId, acl.map(toApiAcl$1));
|
|
29242
|
+
}
|
|
29243
|
+
async function deleteAclEntry(client, nodeId, key) {
|
|
29244
|
+
const acl = await freshOurAcl$1(client, nodeId);
|
|
29245
|
+
let removed = false;
|
|
29246
|
+
const kept = acl.filter(e => {
|
|
29247
|
+
if (!removed && aclEntryKey(e) === key) {
|
|
29248
|
+
removed = true;
|
|
29249
|
+
return false;
|
|
29250
|
+
}
|
|
29251
|
+
return true;
|
|
29252
|
+
});
|
|
29253
|
+
await client.setACLEntry(nodeId, kept.map(toApiAcl$1));
|
|
29254
|
+
}
|
|
29255
|
+
async function downgradeToOperate(client, nodeId, keys) {
|
|
29256
|
+
const acl = await freshOurAcl$1(client, nodeId);
|
|
29257
|
+
const updated = acl.map(e => keys.has(aclEntryKey(e)) ? {
|
|
29258
|
+
...e,
|
|
29259
|
+
privilege: Privilege.Operate
|
|
29260
|
+
} : e);
|
|
29261
|
+
await client.setACLEntry(nodeId, updated.map(toApiAcl$1));
|
|
29262
|
+
}
|
|
29263
|
+
|
|
29264
|
+
/**
|
|
29265
|
+
* @license
|
|
29266
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29267
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29268
|
+
*/
|
|
29269
|
+
const showNodeAclAddDialog = async node => {
|
|
29270
|
+
var _document$querySelect;
|
|
29271
|
+
await import('./node-acl-add-dialog-DlR-sF-b.js');
|
|
29272
|
+
const dialog = document.createElement("node-acl-add-dialog");
|
|
29273
|
+
dialog.node = node;
|
|
29274
|
+
(_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
|
|
29275
|
+
};
|
|
29276
|
+
|
|
29277
|
+
var _staticBlock$1;
|
|
29278
|
+
/**
|
|
29279
|
+
* @license
|
|
29280
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29281
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29282
|
+
*/
|
|
29283
|
+
function isRecord(value) {
|
|
29284
|
+
return typeof value === "object" && value !== null;
|
|
29285
|
+
}
|
|
29286
|
+
class BindingEntryDataTransformer {
|
|
29287
|
+
static transform(input) {
|
|
29288
|
+
if (!isRecord(input)) {
|
|
29289
|
+
throw new Error("Invalid input: expected an object");
|
|
29290
|
+
}
|
|
29291
|
+
const result = {};
|
|
29292
|
+
const keyMapping = BindingEntryDataTransformer.KEY_MAPPING;
|
|
29293
|
+
for (const key in input) {
|
|
29294
|
+
if (key in keyMapping) {
|
|
29295
|
+
const mappedKey = keyMapping[key];
|
|
29296
|
+
if (mappedKey) {
|
|
29297
|
+
const value = input[key];
|
|
29298
|
+
if (value == null) {
|
|
29299
|
+
continue;
|
|
29300
|
+
}
|
|
29301
|
+
if (mappedKey === "node") {
|
|
29302
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
29303
|
+
result.node = value;
|
|
29304
|
+
}
|
|
29305
|
+
} else {
|
|
29306
|
+
result[mappedKey] = Number(value);
|
|
29307
|
+
}
|
|
29308
|
+
}
|
|
29309
|
+
}
|
|
29310
|
+
}
|
|
29311
|
+
return result;
|
|
29312
|
+
}
|
|
29313
|
+
static #_ = _staticBlock$1 = () => this.KEY_MAPPING = {
|
|
29314
|
+
"1": "node",
|
|
29315
|
+
"2": "group",
|
|
29316
|
+
"3": "endpoint",
|
|
29317
|
+
"4": "cluster",
|
|
29318
|
+
"254": "fabricIndex"
|
|
29319
|
+
};
|
|
29320
|
+
}
|
|
29321
|
+
_staticBlock$1();
|
|
29322
|
+
|
|
29323
|
+
/**
|
|
29324
|
+
* @license
|
|
29325
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29326
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29327
|
+
*/
|
|
29328
|
+
const BINDING_KEY_RE = /^(\d+)\/30\/0$/;
|
|
29329
|
+
function readBindings(node, endpoint) {
|
|
29330
|
+
return attributeArray(node.attributes[`${endpoint}/30/0`]).map(value => BindingEntryDataTransformer.transform(value));
|
|
29331
|
+
}
|
|
29332
|
+
function readAllBindings(node) {
|
|
29333
|
+
const result = new Array();
|
|
29334
|
+
for (const key of Object.keys(node.attributes)) {
|
|
29335
|
+
const m = BINDING_KEY_RE.exec(key);
|
|
29336
|
+
if (!m) continue;
|
|
29337
|
+
const endpoint = Number(m[1]);
|
|
29338
|
+
for (const value of attributeArray(node.attributes[key])) {
|
|
29339
|
+
result.push({
|
|
29340
|
+
endpoint,
|
|
29341
|
+
binding: BindingEntryDataTransformer.transform(value)
|
|
29342
|
+
});
|
|
29343
|
+
}
|
|
29344
|
+
}
|
|
29345
|
+
return result;
|
|
29346
|
+
}
|
|
29347
|
+
function numberList(node, key) {
|
|
29348
|
+
const raw = node.attributes[key];
|
|
29349
|
+
if (!Array.isArray(raw)) return new Array();
|
|
29350
|
+
return raw.map(v => Number(v));
|
|
29351
|
+
}
|
|
29352
|
+
function targetServerClusters(node, endpoint) {
|
|
29353
|
+
return numberList(node, `${endpoint}/29/1`);
|
|
29354
|
+
}
|
|
29355
|
+
function sourceClientClusters(node, endpoint) {
|
|
29356
|
+
return numberList(node, `${endpoint}/29/2`);
|
|
29357
|
+
}
|
|
29358
|
+
function bindableClusters(source, sourceEndpoint, target, targetEndpoint) {
|
|
29359
|
+
const client = new Set(sourceClientClusters(source, sourceEndpoint));
|
|
29360
|
+
const server = targetServerClusters(target, targetEndpoint);
|
|
29361
|
+
const bindable = new Array();
|
|
29362
|
+
const otherTarget = new Array();
|
|
29363
|
+
for (const c of server) {
|
|
29364
|
+
if (client.has(c)) bindable.push(c);else otherTarget.push(c);
|
|
29365
|
+
}
|
|
29366
|
+
return {
|
|
29367
|
+
bindable,
|
|
29368
|
+
otherTarget
|
|
29369
|
+
};
|
|
29370
|
+
}
|
|
29371
|
+
function reverseAclState(sourceNodeId, binding, targetNode) {
|
|
29372
|
+
if (!targetNode || !targetNode.available) return {
|
|
29373
|
+
state: "cannotVerify"
|
|
29374
|
+
};
|
|
29375
|
+
const matching = entriesForFabric(readAclEntries(targetNode), nodeFabricIndex(targetNode)).filter(e => e.authMode === AuthMode.Case && subjectsInclude(e, sourceNodeId) && entryMatchesTarget(e, binding.endpoint ?? -1, binding.cluster));
|
|
29376
|
+
const granting = matching.filter(e => e.privilege >= Privilege.Operate);
|
|
29377
|
+
if (granting.length === 0) return {
|
|
29378
|
+
state: "missing"
|
|
29379
|
+
};
|
|
29380
|
+
if (granting.some(e => e.privilege === Privilege.Operate)) return {
|
|
29381
|
+
state: "present"
|
|
29382
|
+
};
|
|
29383
|
+
return {
|
|
29384
|
+
state: "overPrivileged"
|
|
29385
|
+
};
|
|
29386
|
+
}
|
|
29387
|
+
function detectBindingRelationship(entry, viewedNodeId, allNodes) {
|
|
29388
|
+
if (entry.authMode !== AuthMode.Case) return {
|
|
29389
|
+
kind: "none"
|
|
29390
|
+
};
|
|
29391
|
+
const viewedKey = nodeIdKey(viewedNodeId);
|
|
29392
|
+
for (const subject of entry.subjects ?? []) {
|
|
29393
|
+
const sourceKey = nodeIdKey(subject);
|
|
29394
|
+
const source = allNodes.find(n => nodeIdKey(n.node_id) === sourceKey);
|
|
29395
|
+
if (!source || !source.available) continue;
|
|
29396
|
+
for (const {
|
|
29397
|
+
endpoint,
|
|
29398
|
+
binding
|
|
29399
|
+
} of readAllBindings(source)) {
|
|
29400
|
+
if (binding.node == null) continue;
|
|
29401
|
+
if (nodeIdKey(binding.node) !== viewedKey) continue;
|
|
29402
|
+
if (!entryMatchesTarget(entry, binding.endpoint ?? -1, binding.cluster)) continue;
|
|
29403
|
+
const kind = entry.privilege > Privilege.Operate ? "overPrivileged" : "backs";
|
|
29404
|
+
return {
|
|
29405
|
+
kind,
|
|
29406
|
+
sourceNodeId: source.node_id,
|
|
29407
|
+
sourceEndpoint: endpoint
|
|
29408
|
+
};
|
|
29409
|
+
}
|
|
29410
|
+
}
|
|
29411
|
+
return {
|
|
29412
|
+
kind: "none"
|
|
29413
|
+
};
|
|
29414
|
+
}
|
|
29415
|
+
function targetAclCapacityForBinding(targetNode, sourceNodeId) {
|
|
29416
|
+
const fabricIndex = nodeFabricIndex(targetNode);
|
|
29417
|
+
if (fabricIndex === void 0) return {
|
|
29418
|
+
canAdd: true
|
|
29419
|
+
};
|
|
29420
|
+
const entries = entriesForFabric(readAclEntries(targetNode), fabricIndex);
|
|
29421
|
+
const targetsMaxRaw = targetNode.attributes["0/31/3"];
|
|
29422
|
+
const targetsMax = typeof targetsMaxRaw === "number" && targetsMaxRaw > 0 ? targetsMaxRaw : Number.MAX_SAFE_INTEGER;
|
|
29423
|
+
const reusable = entries.some(e => {
|
|
29424
|
+
var _e$targets;
|
|
29425
|
+
return e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && (isWholeNode(e) || (((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.length) ?? 0) < targetsMax);
|
|
29426
|
+
});
|
|
29427
|
+
if (reusable) return {
|
|
29428
|
+
canAdd: true
|
|
29429
|
+
};
|
|
29430
|
+
const maxRaw = targetNode.attributes["0/31/4"];
|
|
29431
|
+
const max = typeof maxRaw === "number" ? maxRaw : 0;
|
|
29432
|
+
if (max > 0 && entries.length >= max) {
|
|
29433
|
+
return {
|
|
29434
|
+
canAdd: false,
|
|
29435
|
+
reason: "Target node's access control list is full."
|
|
29436
|
+
};
|
|
29437
|
+
}
|
|
29438
|
+
return {
|
|
29439
|
+
canAdd: true
|
|
29440
|
+
};
|
|
29441
|
+
}
|
|
29442
|
+
|
|
29443
|
+
/**
|
|
29444
|
+
* @license
|
|
29445
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
29446
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29447
|
+
*/
|
|
29448
|
+
function getDeviceName(node) {
|
|
29449
|
+
if (node.nodeLabel) return node.nodeLabel;
|
|
29450
|
+
const productName = node.productName || "Unknown Device";
|
|
29451
|
+
const serialNumber = node.serialNumber;
|
|
29452
|
+
return serialNumber ? `${productName} (${serialNumber})` : productName;
|
|
29453
|
+
}
|
|
29454
|
+
|
|
29455
|
+
var __defProp$h = Object.defineProperty;
|
|
29456
|
+
var __getOwnPropDesc$j = Object.getOwnPropertyDescriptor;
|
|
29457
|
+
var __decorateClass$k = (decorators, target, key, kind) => {
|
|
29458
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$j(target, key) : target;
|
|
29231
29459
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
29232
|
-
if (kind && result) __defProp$
|
|
29460
|
+
if (kind && result) __defProp$h(target, key, result);
|
|
29461
|
+
return result;
|
|
29462
|
+
};
|
|
29463
|
+
const CLUSTER_ID$3 = 31;
|
|
29464
|
+
let AccessControlClusterCommands = class extends BaseClusterCommands {
|
|
29465
|
+
constructor() {
|
|
29466
|
+
super(...arguments);
|
|
29467
|
+
this._loadedKey = "";
|
|
29468
|
+
this._busy = false;
|
|
29469
|
+
}
|
|
29470
|
+
updated(changed) {
|
|
29471
|
+
super.updated(changed);
|
|
29472
|
+
if (changed.has("client") && this.client && !this._unsubscribe) {
|
|
29473
|
+
this._unsubscribe = this.client.addEventListener("nodes_changed", () => this.requestUpdate());
|
|
29474
|
+
}
|
|
29475
|
+
void this._ensureLoaded();
|
|
29476
|
+
}
|
|
29477
|
+
disconnectedCallback() {
|
|
29478
|
+
var _this$_unsubscribe;
|
|
29479
|
+
super.disconnectedCallback();
|
|
29480
|
+
(_this$_unsubscribe = this._unsubscribe) === null || _this$_unsubscribe === void 0 || _this$_unsubscribe.call(this);
|
|
29481
|
+
}
|
|
29482
|
+
/** The acl attribute is fabric-scoped and may be absent from the cache until read. Load it on open. */
|
|
29483
|
+
async _ensureLoaded() {
|
|
29484
|
+
if (!this.client || !this.node || !this.node.available) return;
|
|
29485
|
+
const key = nodeIdKey(this.node.node_id);
|
|
29486
|
+
if (this._loadedKey === key) return;
|
|
29487
|
+
this._loadedKey = key;
|
|
29488
|
+
try {
|
|
29489
|
+
const res = await this.client.readAttribute(this.node.node_id, ["0/31/0", "0/62/5"]);
|
|
29490
|
+
for (const [k, v] of Object.entries(res)) this.node.attributes[k] = v;
|
|
29491
|
+
this.requestUpdate();
|
|
29492
|
+
} catch (err) {
|
|
29493
|
+
this._loadedKey = "";
|
|
29494
|
+
console.error("Failed to load ACL", err);
|
|
29495
|
+
}
|
|
29496
|
+
}
|
|
29497
|
+
get _controllerNodeId() {
|
|
29498
|
+
var _this$client$serverIn;
|
|
29499
|
+
return (_this$client$serverIn = this.client.serverInfo) === null || _this$client$serverIn === void 0 ? void 0 : _this$client$serverIn.controller_node_id;
|
|
29500
|
+
}
|
|
29501
|
+
_entries() {
|
|
29502
|
+
return entriesForFabric(readAclEntries(this.node), nodeFabricIndex(this.node));
|
|
29503
|
+
}
|
|
29504
|
+
_clusterName(id) {
|
|
29505
|
+
var _clusters$id;
|
|
29506
|
+
if (id == null) return "all clusters";
|
|
29507
|
+
return `${((_clusters$id = clusters[id]) === null || _clusters$id === void 0 ? void 0 : _clusters$id.label) ?? "Cluster"} (0x${id.toString(16).padStart(2, "0").toUpperCase()})`;
|
|
29508
|
+
}
|
|
29509
|
+
_privilegeClass(p) {
|
|
29510
|
+
return `pv pv-${p}`;
|
|
29511
|
+
}
|
|
29512
|
+
async _delete(entry) {
|
|
29513
|
+
const isAdmin = entry.privilege === Privilege.Administer && entry.authMode === AuthMode.Case;
|
|
29514
|
+
const unverified = isAdmin && this._controllerNodeId === void 0;
|
|
29515
|
+
const confirmed = await showPromptDialog({
|
|
29516
|
+
title: "Delete ACL entry",
|
|
29517
|
+
text: unverified ? "This is an Administer entry and the controller cannot verify whether it is its own. Deleting the wrong admin entry can lock the controller out of this device. Continue?" : "Remove this access control entry? Devices relying on it will lose the granted access.",
|
|
29518
|
+
confirmText: "Delete"
|
|
29519
|
+
});
|
|
29520
|
+
if (!confirmed) return;
|
|
29521
|
+
this._busy = true;
|
|
29522
|
+
try {
|
|
29523
|
+
await deleteAclEntry(this.client, this.node.node_id, aclEntryKey(entry));
|
|
29524
|
+
} catch (err) {
|
|
29525
|
+
await showAlertDialog({
|
|
29526
|
+
title: "Delete failed",
|
|
29527
|
+
text: err instanceof Error ? err.message : String(err)
|
|
29528
|
+
});
|
|
29529
|
+
} finally {
|
|
29530
|
+
this._busy = false;
|
|
29531
|
+
}
|
|
29532
|
+
}
|
|
29533
|
+
async _fix(keys) {
|
|
29534
|
+
this._busy = true;
|
|
29535
|
+
try {
|
|
29536
|
+
await downgradeToOperate(this.client, this.node.node_id, keys);
|
|
29537
|
+
} catch (err) {
|
|
29538
|
+
await showAlertDialog({
|
|
29539
|
+
title: "Fix failed",
|
|
29540
|
+
text: err instanceof Error ? err.message : String(err)
|
|
29541
|
+
});
|
|
29542
|
+
} finally {
|
|
29543
|
+
this._busy = false;
|
|
29544
|
+
}
|
|
29545
|
+
}
|
|
29546
|
+
async _openAdd() {
|
|
29547
|
+
await showNodeAclAddDialog(this.node);
|
|
29548
|
+
}
|
|
29549
|
+
_renderSubjects(entry) {
|
|
29550
|
+
const subjects = entry.subjects ?? [];
|
|
29551
|
+
if (entry.authMode === AuthMode.Case && subjects.length === 0) {
|
|
29552
|
+
return b`<span class="mut">Any node on fabric</span>`;
|
|
29553
|
+
}
|
|
29554
|
+
if (entry.authMode === AuthMode.Group) {
|
|
29555
|
+
return b`${subjects.map(s => b`<div class="ident">Group ${s.toString()}</div>`)}`;
|
|
29556
|
+
}
|
|
29557
|
+
return b`${subjects.map(s => {
|
|
29558
|
+
const known = this.client.nodes[nodeIdKey(s)];
|
|
29559
|
+
const protectedMe = isProtectedAdmin(entry, this._controllerNodeId) && nodeIdKey(s) === nodeIdKey(this._controllerNodeId);
|
|
29560
|
+
return b`<div class="ident ${protectedMe ? "me" : ""}">
|
|
29561
|
+
${protectedMe ? "This controller" : known ? getDeviceName(known) : "Unknown node"} ·
|
|
29562
|
+
<span class="nid">${s.toString()}</span><span class="hex">0x${s.toString(16).toUpperCase()}</span>
|
|
29563
|
+
</div>`;
|
|
29564
|
+
})}`;
|
|
29565
|
+
}
|
|
29566
|
+
_renderTargets(entry) {
|
|
29567
|
+
if (isWholeNode(entry)) return b`<span class="mut">Whole node</span>`;
|
|
29568
|
+
return b`${entry.targets.map(t => {
|
|
29569
|
+
if (t.cluster != null) return b`<span class="chip ep">EP ${t.endpoint ?? "*"} · ${this._clusterName(t.cluster)}</span>`;
|
|
29570
|
+
if (t.deviceType != null) return b`<span class="chip ep">EP ${t.endpoint ?? "*"} · device type ${t.deviceType}</span>`;
|
|
29571
|
+
return b`<span class="chip ep">EP ${t.endpoint ?? "*"}</span>`;
|
|
29572
|
+
})}`;
|
|
29573
|
+
}
|
|
29574
|
+
_renderRelationship(rel) {
|
|
29575
|
+
if (rel.kind === "none") return b`<span class="mut">—</span>`;
|
|
29576
|
+
const source = rel.sourceNodeId != null ? this.client.nodes[nodeIdKey(rel.sourceNodeId)] : void 0;
|
|
29577
|
+
const label = source ? getDeviceName(source) : "node";
|
|
29578
|
+
if (rel.kind === "overPrivileged") {
|
|
29579
|
+
return b`<span class="chip bug"
|
|
29580
|
+
><ha-svg-icon .path=${mdiAlert}></ha-svg-icon> over-privileged binding ACL</span
|
|
29581
|
+
>`;
|
|
29582
|
+
}
|
|
29583
|
+
return b`<span class="chip link"
|
|
29584
|
+
><ha-svg-icon .path=${mdiLink}></ha-svg-icon> backs binding · ${label} EP${rel.sourceEndpoint}</span
|
|
29585
|
+
>`;
|
|
29586
|
+
}
|
|
29587
|
+
render() {
|
|
29588
|
+
if (!this.node || this.cluster !== CLUSTER_ID$3) return A;
|
|
29589
|
+
const entries = this._entries();
|
|
29590
|
+
const allNodes = Object.values(this.client.nodes);
|
|
29591
|
+
const rels = entries.map(e => detectBindingRelationship(e, this.node.node_id, allNodes));
|
|
29592
|
+
const capacity = aclCapacity(this.node);
|
|
29593
|
+
const full = capacity.max > 0 && entries.length >= capacity.max;
|
|
29594
|
+
const overPrivilegedKeys = /* @__PURE__ */new Set();
|
|
29595
|
+
entries.forEach((e, i) => {
|
|
29596
|
+
if (rels[i].kind === "overPrivileged") overPrivilegedKeys.add(aclEntryKey(e));
|
|
29597
|
+
});
|
|
29598
|
+
return b`
|
|
29599
|
+
<details class="command-panel">
|
|
29600
|
+
<summary>Access Control — ACL Entries (${entries.length})</summary>
|
|
29601
|
+
<div class="command-content">
|
|
29602
|
+
${overPrivilegedKeys.size >= 2 ? b`<div class="banner">
|
|
29603
|
+
<span
|
|
29604
|
+
>${overPrivilegedKeys.size} binding ACL entries grant Administer where Operate is
|
|
29605
|
+
sufficient.</span
|
|
29606
|
+
>
|
|
29607
|
+
<md-outlined-button
|
|
29608
|
+
?disabled=${this._busy || !this.node.available}
|
|
29609
|
+
@click=${handleAsync(() => this._fix(overPrivilegedKeys))}
|
|
29610
|
+
>Fix all → Operate</md-outlined-button
|
|
29611
|
+
>
|
|
29612
|
+
</div>` : A}
|
|
29613
|
+
<table class="acl">
|
|
29614
|
+
<thead>
|
|
29615
|
+
<tr>
|
|
29616
|
+
<th>Privilege</th>
|
|
29617
|
+
<th>Auth</th>
|
|
29618
|
+
<th>Subjects</th>
|
|
29619
|
+
<th>Targets</th>
|
|
29620
|
+
<th>Relationship</th>
|
|
29621
|
+
<th></th>
|
|
29622
|
+
</tr>
|
|
29623
|
+
</thead>
|
|
29624
|
+
<tbody>
|
|
29625
|
+
${entries.map((e, i) => this._row(e, rels[i]))}
|
|
29626
|
+
</tbody>
|
|
29627
|
+
</table>
|
|
29628
|
+
<md-outlined-button
|
|
29629
|
+
?disabled=${this._busy || full || !this.node.available}
|
|
29630
|
+
title=${full ? "Access control list is full" : ""}
|
|
29631
|
+
@click=${handleAsync(() => this._openAdd())}
|
|
29632
|
+
>Add ACL entry</md-outlined-button
|
|
29633
|
+
>
|
|
29634
|
+
${full ? b`<span class="mut full-note">List full (${capacity.max} entries)</span>` : A}
|
|
29635
|
+
</div>
|
|
29636
|
+
</details>
|
|
29637
|
+
`;
|
|
29638
|
+
}
|
|
29639
|
+
_row(entry, rel) {
|
|
29640
|
+
const protectedEntry = isProtectedAdmin(entry, this._controllerNodeId);
|
|
29641
|
+
const overPrivileged = rel.kind === "overPrivileged";
|
|
29642
|
+
return b`
|
|
29643
|
+
<tr class=${overPrivileged ? "row-warn" : ""}>
|
|
29644
|
+
<td>
|
|
29645
|
+
<span class=${this._privilegeClass(entry.privilege)}
|
|
29646
|
+
>${PRIVILEGE_NAMES[entry.privilege] ?? entry.privilege} · ${entry.privilege}</span
|
|
29647
|
+
>
|
|
29648
|
+
${overPrivileged ? b`<div>
|
|
29649
|
+
<md-outlined-button
|
|
29650
|
+
class="fix"
|
|
29651
|
+
?disabled=${this._busy || !this.node.available}
|
|
29652
|
+
@click=${handleAsync(() => this._fix(/* @__PURE__ */new Set([aclEntryKey(entry)])))}
|
|
29653
|
+
>Fix → Operate</md-outlined-button
|
|
29654
|
+
>
|
|
29655
|
+
</div>` : A}
|
|
29656
|
+
</td>
|
|
29657
|
+
<td>${AUTH_MODE_NAMES[entry.authMode] ?? entry.authMode}</td>
|
|
29658
|
+
<td>${this._renderSubjects(entry)}</td>
|
|
29659
|
+
<td>${this._renderTargets(entry)}</td>
|
|
29660
|
+
<td>${this._renderRelationship(rel)}</td>
|
|
29661
|
+
<td>
|
|
29662
|
+
${protectedEntry ? b`<ha-svg-icon
|
|
29663
|
+
class="lock"
|
|
29664
|
+
.path=${mdiLock}
|
|
29665
|
+
title="Your controller's administrator entry — deleting it would lock you out."
|
|
29666
|
+
></ha-svg-icon>` : b`<md-outlined-button
|
|
29667
|
+
class="danger"
|
|
29668
|
+
?disabled=${this._busy || !this.node.available}
|
|
29669
|
+
@click=${handleAsync(() => this._delete(entry))}
|
|
29670
|
+
>
|
|
29671
|
+
<ha-svg-icon .path=${mdiTrashCan} slot="icon"></ha-svg-icon>delete
|
|
29672
|
+
</md-outlined-button>`}
|
|
29673
|
+
</td>
|
|
29674
|
+
</tr>
|
|
29675
|
+
`;
|
|
29676
|
+
}
|
|
29677
|
+
};
|
|
29678
|
+
AccessControlClusterCommands.styles = [BaseClusterCommands.styles, i$7`
|
|
29679
|
+
.acl {
|
|
29680
|
+
width: 100%;
|
|
29681
|
+
border-collapse: collapse;
|
|
29682
|
+
margin-bottom: 12px;
|
|
29683
|
+
}
|
|
29684
|
+
.acl th {
|
|
29685
|
+
text-align: left;
|
|
29686
|
+
font-size: 11px;
|
|
29687
|
+
text-transform: uppercase;
|
|
29688
|
+
opacity: 0.6;
|
|
29689
|
+
padding: 8px 10px;
|
|
29690
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
29691
|
+
}
|
|
29692
|
+
.acl td {
|
|
29693
|
+
padding: 10px;
|
|
29694
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
29695
|
+
vertical-align: middle;
|
|
29696
|
+
}
|
|
29697
|
+
.ident {
|
|
29698
|
+
line-height: 1.4;
|
|
29699
|
+
}
|
|
29700
|
+
.ident.me {
|
|
29701
|
+
color: var(--md-sys-color-primary);
|
|
29702
|
+
font-weight: 600;
|
|
29703
|
+
}
|
|
29704
|
+
.ident .nid {
|
|
29705
|
+
font-weight: 600;
|
|
29706
|
+
}
|
|
29707
|
+
.row-warn td {
|
|
29708
|
+
background: var(--md-sys-color-error-container);
|
|
29709
|
+
box-shadow: inset 3px 0 0 var(--md-sys-color-error);
|
|
29710
|
+
}
|
|
29711
|
+
.pv {
|
|
29712
|
+
display: inline-block;
|
|
29713
|
+
padding: 2px 8px;
|
|
29714
|
+
border-radius: 999px;
|
|
29715
|
+
font-size: 12px;
|
|
29716
|
+
font-weight: 700;
|
|
29717
|
+
}
|
|
29718
|
+
.pv-5 {
|
|
29719
|
+
background: var(--md-sys-color-error-container);
|
|
29720
|
+
color: var(--md-sys-color-on-error-container);
|
|
29721
|
+
}
|
|
29722
|
+
.pv-4 {
|
|
29723
|
+
background: var(--md-sys-color-tertiary-container);
|
|
29724
|
+
color: var(--md-sys-color-on-tertiary-container);
|
|
29725
|
+
}
|
|
29726
|
+
.pv-3 {
|
|
29727
|
+
background: var(--md-sys-color-primary-container);
|
|
29728
|
+
color: var(--md-sys-color-on-primary-container);
|
|
29729
|
+
}
|
|
29730
|
+
.pv-1,
|
|
29731
|
+
.pv-2 {
|
|
29732
|
+
background: var(--md-sys-color-surface-container-highest);
|
|
29733
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
29734
|
+
}
|
|
29735
|
+
.chip {
|
|
29736
|
+
display: inline-flex;
|
|
29737
|
+
align-items: center;
|
|
29738
|
+
gap: 4px;
|
|
29739
|
+
padding: 3px 8px;
|
|
29740
|
+
border-radius: 6px;
|
|
29741
|
+
margin: 2px 4px 2px 0;
|
|
29742
|
+
font-size: inherit;
|
|
29743
|
+
background: var(--md-sys-color-surface-container-high);
|
|
29744
|
+
color: var(--md-sys-color-on-surface);
|
|
29745
|
+
}
|
|
29746
|
+
.chip ha-svg-icon {
|
|
29747
|
+
--mdc-icon-size: 14px;
|
|
29748
|
+
width: 14px;
|
|
29749
|
+
height: 14px;
|
|
29750
|
+
}
|
|
29751
|
+
.chip.ep {
|
|
29752
|
+
background: var(--md-sys-color-secondary-container);
|
|
29753
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
29754
|
+
}
|
|
29755
|
+
.chip.me {
|
|
29756
|
+
background: var(--md-sys-color-tertiary-container);
|
|
29757
|
+
color: var(--md-sys-color-on-tertiary-container);
|
|
29758
|
+
}
|
|
29759
|
+
.chip.link {
|
|
29760
|
+
background: var(--md-sys-color-primary-container);
|
|
29761
|
+
color: var(--md-sys-color-on-primary-container);
|
|
29762
|
+
}
|
|
29763
|
+
.chip.bug {
|
|
29764
|
+
background: var(--md-sys-color-error-container);
|
|
29765
|
+
color: var(--md-sys-color-on-error-container);
|
|
29766
|
+
}
|
|
29767
|
+
.nid {
|
|
29768
|
+
font-weight: 600;
|
|
29769
|
+
}
|
|
29770
|
+
.hex {
|
|
29771
|
+
font-family: var(--monospace-font, monospace);
|
|
29772
|
+
font-size: 10px;
|
|
29773
|
+
opacity: 0.6;
|
|
29774
|
+
margin-left: 4px;
|
|
29775
|
+
}
|
|
29776
|
+
.mut {
|
|
29777
|
+
opacity: 0.6;
|
|
29778
|
+
}
|
|
29779
|
+
.full-note {
|
|
29780
|
+
margin-left: 8px;
|
|
29781
|
+
font-size: 12px;
|
|
29782
|
+
}
|
|
29783
|
+
.banner {
|
|
29784
|
+
display: flex;
|
|
29785
|
+
align-items: center;
|
|
29786
|
+
justify-content: space-between;
|
|
29787
|
+
gap: 12px;
|
|
29788
|
+
padding: 10px 12px;
|
|
29789
|
+
margin-bottom: 12px;
|
|
29790
|
+
border-radius: 8px;
|
|
29791
|
+
background: var(--md-sys-color-error-container);
|
|
29792
|
+
color: var(--md-sys-color-on-error-container);
|
|
29793
|
+
}
|
|
29794
|
+
md-outlined-button.danger {
|
|
29795
|
+
--md-outlined-button-label-text-color: var(--md-sys-color-error);
|
|
29796
|
+
--md-outlined-button-outline-color: var(--md-sys-color-error);
|
|
29797
|
+
}
|
|
29798
|
+
md-outlined-button.fix {
|
|
29799
|
+
margin-top: 4px;
|
|
29800
|
+
--md-outlined-button-container-height: 28px;
|
|
29801
|
+
}
|
|
29802
|
+
`];
|
|
29803
|
+
__decorateClass$k([r$3()], AccessControlClusterCommands.prototype, "_busy", 2);
|
|
29804
|
+
AccessControlClusterCommands = __decorateClass$k([t$1("access-control-cluster-commands")], AccessControlClusterCommands);
|
|
29805
|
+
registerClusterCommands(CLUSTER_ID$3, "access-control-cluster-commands");
|
|
29806
|
+
|
|
29807
|
+
var __defProp$g = Object.defineProperty;
|
|
29808
|
+
var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
|
|
29809
|
+
var __decorateClass$j = (decorators, target, key, kind) => {
|
|
29810
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
|
|
29811
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
29812
|
+
if (kind && result) __defProp$g(target, key, result);
|
|
29233
29813
|
return result;
|
|
29234
29814
|
};
|
|
29235
29815
|
let AvsumClusterCommands = class extends BaseClusterCommands {
|
|
@@ -29715,9 +30295,9 @@ AvsumClusterCommands.styles = [...(Array.isArray(BaseClusterCommands.styles) ? B
|
|
|
29715
30295
|
font-weight: 500;
|
|
29716
30296
|
}
|
|
29717
30297
|
`];
|
|
29718
|
-
__decorateClass$
|
|
29719
|
-
__decorateClass$
|
|
29720
|
-
AvsumClusterCommands = __decorateClass$
|
|
30298
|
+
__decorateClass$j([r$3()], AvsumClusterCommands.prototype, "_toast", 2);
|
|
30299
|
+
__decorateClass$j([r$3()], AvsumClusterCommands.prototype, "_newPresetName", 2);
|
|
30300
|
+
AvsumClusterCommands = __decorateClass$j([t$1("avsum-cluster-commands")], AvsumClusterCommands);
|
|
29721
30301
|
registerClusterCommands(AVSUM_CLUSTER_ID, "avsum-cluster-commands");
|
|
29722
30302
|
|
|
29723
30303
|
/**
|
|
@@ -30689,12 +31269,12 @@ function writeNodeLabel(client, node, label) {
|
|
|
30689
31269
|
return client.writeAttribute(node.node_id, NODE_LABEL_ATTRIBUTE_PATH, label.trim());
|
|
30690
31270
|
}
|
|
30691
31271
|
|
|
30692
|
-
var __defProp$
|
|
30693
|
-
var __getOwnPropDesc$
|
|
30694
|
-
var __decorateClass$
|
|
30695
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
31272
|
+
var __defProp$f = Object.defineProperty;
|
|
31273
|
+
var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
|
|
31274
|
+
var __decorateClass$i = (decorators, target, key, kind) => {
|
|
31275
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
|
|
30696
31276
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
30697
|
-
if (kind && result) __defProp$
|
|
31277
|
+
if (kind && result) __defProp$f(target, key, result);
|
|
30698
31278
|
return result;
|
|
30699
31279
|
};
|
|
30700
31280
|
let BasicInformationClusterCommands = class extends BaseClusterCommands {
|
|
@@ -30804,11 +31384,378 @@ BasicInformationClusterCommands.styles = [BaseClusterCommands.styles, i$7`
|
|
|
30804
31384
|
border-radius: 4px;
|
|
30805
31385
|
}
|
|
30806
31386
|
`];
|
|
30807
|
-
__decorateClass$
|
|
30808
|
-
__decorateClass$
|
|
30809
|
-
BasicInformationClusterCommands = __decorateClass$
|
|
31387
|
+
__decorateClass$i([r$3()], BasicInformationClusterCommands.prototype, "_nodeLabel", 2);
|
|
31388
|
+
__decorateClass$i([r$3()], BasicInformationClusterCommands.prototype, "_saving", 2);
|
|
31389
|
+
BasicInformationClusterCommands = __decorateClass$i([t$1("basic-information-cluster-commands")], BasicInformationClusterCommands);
|
|
30810
31390
|
registerClusterCommands(NODE_LABEL_CLUSTER_ID, "basic-information-cluster-commands");
|
|
30811
31391
|
|
|
31392
|
+
/**
|
|
31393
|
+
* @license
|
|
31394
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
31395
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
31396
|
+
*/
|
|
31397
|
+
function toBindingTarget(e) {
|
|
31398
|
+
return {
|
|
31399
|
+
node: e.node ?? null,
|
|
31400
|
+
group: e.group ?? null,
|
|
31401
|
+
endpoint: e.endpoint ?? null,
|
|
31402
|
+
cluster: e.cluster ?? null
|
|
31403
|
+
};
|
|
31404
|
+
}
|
|
31405
|
+
function toApiAcl(e) {
|
|
31406
|
+
var _e$targets;
|
|
31407
|
+
return {
|
|
31408
|
+
privilege: e.privilege,
|
|
31409
|
+
auth_mode: e.authMode,
|
|
31410
|
+
subjects: e.subjects ?? null,
|
|
31411
|
+
targets: ((_e$targets = e.targets) === null || _e$targets === void 0 ? void 0 : _e$targets.map(t => ({
|
|
31412
|
+
cluster: t.cluster ?? null,
|
|
31413
|
+
endpoint: t.endpoint ?? null,
|
|
31414
|
+
device_type: t.deviceType ?? null
|
|
31415
|
+
}))) ?? null
|
|
31416
|
+
};
|
|
31417
|
+
}
|
|
31418
|
+
function requireFabricIndex(res, nodeId) {
|
|
31419
|
+
const fi = res["0/62/5"];
|
|
31420
|
+
if (typeof fi !== "number") {
|
|
31421
|
+
throw new Error(`Cannot determine the current fabric index (0/62/5) for node ${nodeId}`);
|
|
31422
|
+
}
|
|
31423
|
+
return fi;
|
|
31424
|
+
}
|
|
31425
|
+
async function freshOurAcl(client, nodeId) {
|
|
31426
|
+
const res = await client.readAttribute(nodeId, ["0/31/0", "0/62/5"]);
|
|
31427
|
+
const all = attributeArray(res["0/31/0"]).map(v => AccessControlEntryDataTransformer.transform(v));
|
|
31428
|
+
return entriesForFabric(all, requireFabricIndex(res, nodeId));
|
|
31429
|
+
}
|
|
31430
|
+
async function freshOurBindings(client, nodeId, endpoint) {
|
|
31431
|
+
const res = await client.readAttribute(nodeId, [`${endpoint}/30/0`, "0/62/5"]);
|
|
31432
|
+
const all = attributeArray(res[`${endpoint}/30/0`]).map(v => BindingEntryDataTransformer.transform(v));
|
|
31433
|
+
const fabricIndex = requireFabricIndex(res, nodeId);
|
|
31434
|
+
return all.filter(b => b.fabricIndex === fabricIndex);
|
|
31435
|
+
}
|
|
31436
|
+
function hasTarget(e, endpoint, cluster) {
|
|
31437
|
+
return (e.targets ?? []).some(t => t.endpoint === endpoint && t.cluster === cluster);
|
|
31438
|
+
}
|
|
31439
|
+
function aclTargetsMax(client, nodeId) {
|
|
31440
|
+
var _client$nodes$nodeIdK;
|
|
31441
|
+
const raw = (_client$nodes$nodeIdK = client.nodes[nodeIdKey(nodeId)]) === null || _client$nodes$nodeIdK === void 0 ? void 0 : _client$nodes$nodeIdK.attributes["0/31/3"];
|
|
31442
|
+
return typeof raw === "number" && raw > 0 ? raw : Number.MAX_SAFE_INTEGER;
|
|
31443
|
+
}
|
|
31444
|
+
async function ensureBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
|
|
31445
|
+
const acl = await freshOurAcl(client, targetNodeId);
|
|
31446
|
+
const alreadyGranted = acl.some(e => e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && entryMatchesTarget(e, targetEndpoint, cluster));
|
|
31447
|
+
if (alreadyGranted) return;
|
|
31448
|
+
const targetsMax = aclTargetsMax(client, targetNodeId);
|
|
31449
|
+
const reusable = acl.find(e => {
|
|
31450
|
+
var _e$targets2;
|
|
31451
|
+
return e.authMode === AuthMode.Case && e.privilege >= Privilege.Operate && subjectsInclude(e, sourceNodeId) && (isWholeNode(e) || hasTarget(e, targetEndpoint, cluster) || (((_e$targets2 = e.targets) === null || _e$targets2 === void 0 ? void 0 : _e$targets2.length) ?? 0) < targetsMax);
|
|
31452
|
+
});
|
|
31453
|
+
if (reusable) {
|
|
31454
|
+
if (!isWholeNode(reusable) && !hasTarget(reusable, targetEndpoint, cluster)) {
|
|
31455
|
+
reusable.targets = reusable.targets ?? [];
|
|
31456
|
+
reusable.targets.push({
|
|
31457
|
+
endpoint: targetEndpoint,
|
|
31458
|
+
cluster,
|
|
31459
|
+
deviceType: void 0
|
|
31460
|
+
});
|
|
31461
|
+
}
|
|
31462
|
+
} else {
|
|
31463
|
+
acl.push({
|
|
31464
|
+
privilege: Privilege.Operate,
|
|
31465
|
+
authMode: AuthMode.Case,
|
|
31466
|
+
subjects: [sourceNodeId],
|
|
31467
|
+
targets: [{
|
|
31468
|
+
endpoint: targetEndpoint,
|
|
31469
|
+
cluster,
|
|
31470
|
+
deviceType: void 0
|
|
31471
|
+
}],
|
|
31472
|
+
fabricIndex: 0
|
|
31473
|
+
});
|
|
31474
|
+
}
|
|
31475
|
+
await client.setACLEntry(targetNodeId, acl.map(toApiAcl));
|
|
31476
|
+
}
|
|
31477
|
+
async function fixOverPrivilegedBindingAcl(client, sourceNodeId, targetNodeId, targetEndpoint, cluster) {
|
|
31478
|
+
const acl = await freshOurAcl(client, targetNodeId);
|
|
31479
|
+
const updated = acl.map(e => e.authMode === AuthMode.Case && subjectsInclude(e, sourceNodeId) && e.privilege > Privilege.Operate && entryMatchesTarget(e, targetEndpoint, cluster) ? {
|
|
31480
|
+
...e,
|
|
31481
|
+
privilege: Privilege.Operate
|
|
31482
|
+
} : e);
|
|
31483
|
+
await client.setACLEntry(targetNodeId, updated.map(toApiAcl));
|
|
31484
|
+
}
|
|
31485
|
+
async function addBinding(client, sourceNode, sourceEndpoint, targetNodeId, targetEndpoint, cluster) {
|
|
31486
|
+
await ensureBindingAcl(client, sourceNode.node_id, targetNodeId, targetEndpoint, cluster);
|
|
31487
|
+
const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
|
|
31488
|
+
const targetKey = nodeIdKey(targetNodeId);
|
|
31489
|
+
const exists = bindings.some(b => b.node != null && nodeIdKey(b.node) === targetKey && b.endpoint === targetEndpoint && b.cluster === cluster);
|
|
31490
|
+
if (exists) return;
|
|
31491
|
+
bindings.push({
|
|
31492
|
+
node: targetNodeId,
|
|
31493
|
+
group: void 0,
|
|
31494
|
+
endpoint: targetEndpoint,
|
|
31495
|
+
cluster,
|
|
31496
|
+
fabricIndex: void 0
|
|
31497
|
+
});
|
|
31498
|
+
await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, bindings.map(toBindingTarget));
|
|
31499
|
+
}
|
|
31500
|
+
async function deleteBindingAtIndex(client, sourceNode, sourceEndpoint, index) {
|
|
31501
|
+
const bindings = await freshOurBindings(client, sourceNode.node_id, sourceEndpoint);
|
|
31502
|
+
const removed = bindings[index];
|
|
31503
|
+
if (!removed) return;
|
|
31504
|
+
const updated = [...bindings.slice(0, index), ...bindings.slice(index + 1)];
|
|
31505
|
+
await client.setNodeBinding(sourceNode.node_id, sourceEndpoint, updated.map(toBindingTarget));
|
|
31506
|
+
if (removed.node == null || removed.endpoint == null) return;
|
|
31507
|
+
const targetEndpoint = removed.endpoint;
|
|
31508
|
+
const removedCluster = removed.cluster;
|
|
31509
|
+
try {
|
|
31510
|
+
const acl = await freshOurAcl(client, removed.node);
|
|
31511
|
+
const kept = acl.map(e => {
|
|
31512
|
+
if (!subjectsInclude(e, sourceNode.node_id) || isWholeNode(e)) return e;
|
|
31513
|
+
const targets = e.targets.filter(t => !(t.endpoint === targetEndpoint && t.cluster === removedCluster));
|
|
31514
|
+
if (targets.length === 0) return void 0;
|
|
31515
|
+
return {
|
|
31516
|
+
...e,
|
|
31517
|
+
targets
|
|
31518
|
+
};
|
|
31519
|
+
}).filter(e => e !== void 0);
|
|
31520
|
+
await client.setACLEntry(removed.node, kept.map(toApiAcl));
|
|
31521
|
+
} catch (err) {
|
|
31522
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
31523
|
+
throw new Error(`Binding removed, but cleaning up the access control entry on the target node failed: ${detail}. The target may retain a stale access grant.`);
|
|
31524
|
+
}
|
|
31525
|
+
}
|
|
31526
|
+
|
|
31527
|
+
/**
|
|
31528
|
+
* @license
|
|
31529
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
31530
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
31531
|
+
*/
|
|
31532
|
+
const showNodeBindingDialog = async (node, endpoint) => {
|
|
31533
|
+
var _document$querySelect;
|
|
31534
|
+
await import('./node-binding-dialog-DhnX_86M.js');
|
|
31535
|
+
const dialog = document.createElement("node-binding-dialog");
|
|
31536
|
+
dialog.node = node;
|
|
31537
|
+
dialog.endpoint = endpoint;
|
|
31538
|
+
(_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
|
|
31539
|
+
};
|
|
31540
|
+
|
|
31541
|
+
var __defProp$e = Object.defineProperty;
|
|
31542
|
+
var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
|
|
31543
|
+
var __decorateClass$h = (decorators, target, key, kind) => {
|
|
31544
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
|
|
31545
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
31546
|
+
if (kind && result) __defProp$e(target, key, result);
|
|
31547
|
+
return result;
|
|
31548
|
+
};
|
|
31549
|
+
const CLUSTER_ID$2 = 30;
|
|
31550
|
+
let BindingClusterCommands = class extends BaseClusterCommands {
|
|
31551
|
+
constructor() {
|
|
31552
|
+
super(...arguments);
|
|
31553
|
+
this._loadedKey = "";
|
|
31554
|
+
this._busy = false;
|
|
31555
|
+
}
|
|
31556
|
+
updated(changed) {
|
|
31557
|
+
super.updated(changed);
|
|
31558
|
+
if (changed.has("client") && this.client && !this._unsubscribe) {
|
|
31559
|
+
this._unsubscribe = this.client.addEventListener("nodes_changed", () => this.requestUpdate());
|
|
31560
|
+
}
|
|
31561
|
+
void this._ensureLoaded();
|
|
31562
|
+
}
|
|
31563
|
+
disconnectedCallback() {
|
|
31564
|
+
var _this$_unsubscribe;
|
|
31565
|
+
super.disconnectedCallback();
|
|
31566
|
+
(_this$_unsubscribe = this._unsubscribe) === null || _this$_unsubscribe === void 0 || _this$_unsubscribe.call(this);
|
|
31567
|
+
}
|
|
31568
|
+
/** Read the (fabric-scoped) binding attribute and each target's ACL into the cache on open. */
|
|
31569
|
+
async _ensureLoaded() {
|
|
31570
|
+
if (!this.client || !this.node || !this.node.available || this.endpoint === void 0) return;
|
|
31571
|
+
const key = `${nodeIdKey(this.node.node_id)}/${this.endpoint}`;
|
|
31572
|
+
if (this._loadedKey === key) return;
|
|
31573
|
+
this._loadedKey = key;
|
|
31574
|
+
try {
|
|
31575
|
+
await this._readInto(this.node.node_id, [`${this.endpoint}/30/0`, "0/62/5"]);
|
|
31576
|
+
const targets = new Set(readBindings(this.node, this.endpoint).map(b => b.node != null ? nodeIdKey(b.node) : void 0).filter(k => k !== void 0));
|
|
31577
|
+
await Promise.all([...targets].map(k => {
|
|
31578
|
+
const target = this.client.nodes[k];
|
|
31579
|
+
return target !== null && target !== void 0 && target.available ? this._readInto(target.node_id, ["0/31/0", "0/62/5"]) : void 0;
|
|
31580
|
+
}));
|
|
31581
|
+
this.requestUpdate();
|
|
31582
|
+
} catch (err) {
|
|
31583
|
+
this._loadedKey = "";
|
|
31584
|
+
console.error("Failed to load binding/ACL data", err);
|
|
31585
|
+
}
|
|
31586
|
+
}
|
|
31587
|
+
async _readInto(nodeId, path) {
|
|
31588
|
+
const res = await this.client.readAttribute(nodeId, path);
|
|
31589
|
+
const node = this.client.nodes[nodeIdKey(nodeId)];
|
|
31590
|
+
if (node) for (const [k, v] of Object.entries(res)) node.attributes[k] = v;
|
|
31591
|
+
}
|
|
31592
|
+
_clusterName(id) {
|
|
31593
|
+
var _clusters$id;
|
|
31594
|
+
if (id == null) return "All clusters";
|
|
31595
|
+
return `${((_clusters$id = clusters[id]) === null || _clusters$id === void 0 ? void 0 : _clusters$id.label) ?? "Cluster"} (0x${id.toString(16).padStart(2, "0").toUpperCase()})`;
|
|
31596
|
+
}
|
|
31597
|
+
_targetNode(nodeId) {
|
|
31598
|
+
if (nodeId == null) return void 0;
|
|
31599
|
+
return this.client.nodes[nodeIdKey(nodeId)];
|
|
31600
|
+
}
|
|
31601
|
+
async _openAdd() {
|
|
31602
|
+
await showNodeBindingDialog(this.node, this.endpoint);
|
|
31603
|
+
}
|
|
31604
|
+
async _run(action, failTitle) {
|
|
31605
|
+
this._busy = true;
|
|
31606
|
+
try {
|
|
31607
|
+
await action();
|
|
31608
|
+
} catch (err) {
|
|
31609
|
+
await showAlertDialog({
|
|
31610
|
+
title: failTitle,
|
|
31611
|
+
text: err instanceof Error ? err.message : String(err)
|
|
31612
|
+
});
|
|
31613
|
+
} finally {
|
|
31614
|
+
this._busy = false;
|
|
31615
|
+
}
|
|
31616
|
+
}
|
|
31617
|
+
async _delete(index) {
|
|
31618
|
+
const confirmed = await showPromptDialog({
|
|
31619
|
+
title: "Remove binding",
|
|
31620
|
+
text: "Remove this binding and clean up the matching access control entry on the target node?",
|
|
31621
|
+
confirmText: "Remove"
|
|
31622
|
+
});
|
|
31623
|
+
if (!confirmed) return;
|
|
31624
|
+
await this._run(() => deleteBindingAtIndex(this.client, this.node, this.endpoint, index), "Delete failed");
|
|
31625
|
+
}
|
|
31626
|
+
async _fixAcl(b, mode) {
|
|
31627
|
+
if (b.node == null || b.endpoint == null) return;
|
|
31628
|
+
await this._run(() => mode === "missing" ? ensureBindingAcl(this.client, this.node.node_id, b.node, b.endpoint, b.cluster) : fixOverPrivilegedBindingAcl(this.client, this.node.node_id, b.node, b.endpoint, b.cluster), "Fix failed");
|
|
31629
|
+
}
|
|
31630
|
+
render() {
|
|
31631
|
+
if (!this.node || this.cluster !== CLUSTER_ID$2) return A;
|
|
31632
|
+
const bindings = readBindings(this.node, this.endpoint);
|
|
31633
|
+
return b`
|
|
31634
|
+
<details class="command-panel">
|
|
31635
|
+
<summary>Bindings (${bindings.length})</summary>
|
|
31636
|
+
<div class="command-content">
|
|
31637
|
+
${bindings.length === 0 ? b`<div class="empty">No bindings on this endpoint.</div>` : b`<table class="bt">
|
|
31638
|
+
<thead>
|
|
31639
|
+
<tr>
|
|
31640
|
+
<th>Target node</th>
|
|
31641
|
+
<th>Endpoint</th>
|
|
31642
|
+
<th>Cluster</th>
|
|
31643
|
+
<th>ACL on target</th>
|
|
31644
|
+
<th></th>
|
|
31645
|
+
</tr>
|
|
31646
|
+
</thead>
|
|
31647
|
+
<tbody>
|
|
31648
|
+
${bindings.map((b, i) => this._row(b, i))}
|
|
31649
|
+
</tbody>
|
|
31650
|
+
</table>`}
|
|
31651
|
+
<md-outlined-button
|
|
31652
|
+
?disabled=${this._busy || !this.node.available}
|
|
31653
|
+
@click=${handleAsync(() => this._openAdd())}
|
|
31654
|
+
>Add binding</md-outlined-button
|
|
31655
|
+
>
|
|
31656
|
+
</div>
|
|
31657
|
+
</details>
|
|
31658
|
+
`;
|
|
31659
|
+
}
|
|
31660
|
+
_row(b$1, index) {
|
|
31661
|
+
const target = this._targetNode(b$1.node);
|
|
31662
|
+
const aclState = b$1.node == null ? "cannotVerify" : reverseAclState(this.node.node_id, b$1, target).state;
|
|
31663
|
+
const name = b$1.group != null ? `Group ${b$1.group}` : target ? getDeviceName(target) : "Unknown node";
|
|
31664
|
+
const deviceType = b$1.endpoint != null && target ? getEndpointDeviceTypes(target, b$1.endpoint)[0] : void 0;
|
|
31665
|
+
const endpointText = b$1.endpoint == null ? "\u2014" : deviceType ? `EP ${b$1.endpoint} \xB7 ${deviceType.label}` : `EP ${b$1.endpoint}`;
|
|
31666
|
+
return b`
|
|
31667
|
+
<tr>
|
|
31668
|
+
<td>
|
|
31669
|
+
<span class="ident"
|
|
31670
|
+
><b>${name}</b>${b$1.node != null ? b` · <span class="nid">${b$1.node.toString()}</span>` : A}</span
|
|
31671
|
+
>
|
|
31672
|
+
</td>
|
|
31673
|
+
<td>${endpointText}</td>
|
|
31674
|
+
<td>${this._clusterName(b$1.cluster)}</td>
|
|
31675
|
+
<td>${this._aclCell(b$1, aclState)}</td>
|
|
31676
|
+
<td class="actions">
|
|
31677
|
+
<md-outlined-button
|
|
31678
|
+
class="danger"
|
|
31679
|
+
?disabled=${this._busy || !this.node.available}
|
|
31680
|
+
@click=${handleAsync(() => this._delete(index))}
|
|
31681
|
+
>
|
|
31682
|
+
<ha-svg-icon .path=${mdiTrashCan} slot="icon"></ha-svg-icon>delete
|
|
31683
|
+
</md-outlined-button>
|
|
31684
|
+
</td>
|
|
31685
|
+
</tr>
|
|
31686
|
+
`;
|
|
31687
|
+
}
|
|
31688
|
+
_aclCell(b$1, state2) {
|
|
31689
|
+
if (state2 === "present") return b`<span class="status ok">ACL present</span>`;
|
|
31690
|
+
if (state2 === "cannotVerify") return b`<span class="status mut">can't verify</span>`;
|
|
31691
|
+
const label = state2 === "missing" ? "ACL missing" : "ACL > Operate";
|
|
31692
|
+
const fixLabel = state2 === "missing" ? "Fix ACL" : "Fix \u2192 Operate";
|
|
31693
|
+
return b`
|
|
31694
|
+
<span class="status warn">${label}</span>
|
|
31695
|
+
<md-outlined-button
|
|
31696
|
+
class="fix"
|
|
31697
|
+
?disabled=${this._busy || !this.node.available}
|
|
31698
|
+
@click=${handleAsync(() => this._fixAcl(b$1, state2))}
|
|
31699
|
+
>${fixLabel}</md-outlined-button
|
|
31700
|
+
>
|
|
31701
|
+
`;
|
|
31702
|
+
}
|
|
31703
|
+
};
|
|
31704
|
+
BindingClusterCommands.styles = [BaseClusterCommands.styles, i$7`
|
|
31705
|
+
.bt {
|
|
31706
|
+
width: 100%;
|
|
31707
|
+
border-collapse: collapse;
|
|
31708
|
+
margin-bottom: 12px;
|
|
31709
|
+
}
|
|
31710
|
+
.bt th {
|
|
31711
|
+
text-align: left;
|
|
31712
|
+
font-size: 11px;
|
|
31713
|
+
text-transform: uppercase;
|
|
31714
|
+
opacity: 0.6;
|
|
31715
|
+
padding: 8px 10px;
|
|
31716
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
31717
|
+
}
|
|
31718
|
+
.bt td {
|
|
31719
|
+
padding: 10px;
|
|
31720
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
31721
|
+
vertical-align: middle;
|
|
31722
|
+
}
|
|
31723
|
+
.empty {
|
|
31724
|
+
opacity: 0.6;
|
|
31725
|
+
padding: 8px 0 12px;
|
|
31726
|
+
}
|
|
31727
|
+
.ident .nid {
|
|
31728
|
+
font-weight: 600;
|
|
31729
|
+
}
|
|
31730
|
+
.status {
|
|
31731
|
+
font-size: inherit;
|
|
31732
|
+
}
|
|
31733
|
+
.status.ok {
|
|
31734
|
+
color: var(--md-sys-color-primary);
|
|
31735
|
+
}
|
|
31736
|
+
.status.warn {
|
|
31737
|
+
color: var(--md-sys-color-error);
|
|
31738
|
+
margin-right: 8px;
|
|
31739
|
+
}
|
|
31740
|
+
.status.mut {
|
|
31741
|
+
opacity: 0.6;
|
|
31742
|
+
}
|
|
31743
|
+
.actions {
|
|
31744
|
+
text-align: right;
|
|
31745
|
+
white-space: nowrap;
|
|
31746
|
+
}
|
|
31747
|
+
md-outlined-button.fix {
|
|
31748
|
+
--md-outlined-button-container-height: 28px;
|
|
31749
|
+
}
|
|
31750
|
+
md-outlined-button.danger {
|
|
31751
|
+
--md-outlined-button-label-text-color: var(--md-sys-color-error);
|
|
31752
|
+
--md-outlined-button-outline-color: var(--md-sys-color-error);
|
|
31753
|
+
}
|
|
31754
|
+
`];
|
|
31755
|
+
__decorateClass$h([r$3()], BindingClusterCommands.prototype, "_busy", 2);
|
|
31756
|
+
BindingClusterCommands = __decorateClass$h([t$1("binding-cluster-commands")], BindingClusterCommands);
|
|
31757
|
+
registerClusterCommands(CLUSTER_ID$2, "binding-cluster-commands");
|
|
31758
|
+
|
|
30812
31759
|
/**
|
|
30813
31760
|
* @license
|
|
30814
31761
|
* Copyright 2023 Google LLC
|
|
@@ -31275,12 +32222,12 @@ async function play(client, nodeId, endpoint, chimeId) {
|
|
|
31275
32222
|
await client.deviceCommand(nodeId, endpoint, CHIME_CLUSTER_ID, "PlayChimeSound", payload);
|
|
31276
32223
|
}
|
|
31277
32224
|
|
|
31278
|
-
var __defProp$
|
|
31279
|
-
var __getOwnPropDesc$
|
|
31280
|
-
var __decorateClass$
|
|
31281
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
32225
|
+
var __defProp$d = Object.defineProperty;
|
|
32226
|
+
var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
|
|
32227
|
+
var __decorateClass$g = (decorators, target, key, kind) => {
|
|
32228
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
|
|
31282
32229
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
31283
|
-
if (kind && result) __defProp$
|
|
32230
|
+
if (kind && result) __defProp$d(target, key, result);
|
|
31284
32231
|
return result;
|
|
31285
32232
|
};
|
|
31286
32233
|
let ChimeClusterCommands = class extends BaseClusterCommands {
|
|
@@ -31481,17 +32428,17 @@ ChimeClusterCommands.styles = [...(Array.isArray(BaseClusterCommands.styles) ? B
|
|
|
31481
32428
|
color: var(--md-sys-color-on-surface-variant);
|
|
31482
32429
|
}
|
|
31483
32430
|
`];
|
|
31484
|
-
__decorateClass$
|
|
31485
|
-
__decorateClass$
|
|
31486
|
-
ChimeClusterCommands = __decorateClass$
|
|
32431
|
+
__decorateClass$g([r$3()], ChimeClusterCommands.prototype, "_lastPlayed", 2);
|
|
32432
|
+
__decorateClass$g([r$3()], ChimeClusterCommands.prototype, "_playDisabledUntil", 2);
|
|
32433
|
+
ChimeClusterCommands = __decorateClass$g([t$1("chime-cluster-commands")], ChimeClusterCommands);
|
|
31487
32434
|
registerClusterCommands(CHIME_CLUSTER_ID, "chime-cluster-commands");
|
|
31488
32435
|
|
|
31489
|
-
var __defProp$
|
|
31490
|
-
var __getOwnPropDesc$
|
|
31491
|
-
var __decorateClass$
|
|
31492
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
32436
|
+
var __defProp$c = Object.defineProperty;
|
|
32437
|
+
var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
|
|
32438
|
+
var __decorateClass$f = (decorators, target, key, kind) => {
|
|
32439
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
|
|
31493
32440
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
31494
|
-
if (kind && result) __defProp$
|
|
32441
|
+
if (kind && result) __defProp$c(target, key, result);
|
|
31495
32442
|
return result;
|
|
31496
32443
|
};
|
|
31497
32444
|
const CLUSTER_ID$1 = 8;
|
|
@@ -31595,15 +32542,15 @@ let LevelControlClusterCommands = class extends BaseClusterCommands {
|
|
|
31595
32542
|
});
|
|
31596
32543
|
}
|
|
31597
32544
|
};
|
|
31598
|
-
__decorateClass$
|
|
31599
|
-
__decorateClass$
|
|
31600
|
-
__decorateClass$
|
|
31601
|
-
LevelControlClusterCommands = __decorateClass$
|
|
32545
|
+
__decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_targetLevel", 2);
|
|
32546
|
+
__decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_transitionTime", 2);
|
|
32547
|
+
__decorateClass$f([r$3()], LevelControlClusterCommands.prototype, "_executeIfOff", 2);
|
|
32548
|
+
LevelControlClusterCommands = __decorateClass$f([t$1("level-control-cluster-commands")], LevelControlClusterCommands);
|
|
31602
32549
|
registerClusterCommands(CLUSTER_ID$1, "level-control-cluster-commands");
|
|
31603
32550
|
|
|
31604
|
-
var __getOwnPropDesc$
|
|
31605
|
-
var __decorateClass$
|
|
31606
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
32551
|
+
var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
|
|
32552
|
+
var __decorateClass$e = (decorators, target, key, kind) => {
|
|
32553
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
|
|
31607
32554
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (decorator(result)) || result;
|
|
31608
32555
|
return result;
|
|
31609
32556
|
};
|
|
@@ -31635,15 +32582,15 @@ let OnOffClusterCommands = class extends BaseClusterCommands {
|
|
|
31635
32582
|
await this.sendCommand("Toggle");
|
|
31636
32583
|
}
|
|
31637
32584
|
};
|
|
31638
|
-
OnOffClusterCommands = __decorateClass$
|
|
32585
|
+
OnOffClusterCommands = __decorateClass$e([t$1("on-off-cluster-commands")], OnOffClusterCommands);
|
|
31639
32586
|
registerClusterCommands(CLUSTER_ID, "on-off-cluster-commands");
|
|
31640
32587
|
|
|
31641
|
-
var __defProp$
|
|
31642
|
-
var __getOwnPropDesc$
|
|
31643
|
-
var __decorateClass$
|
|
31644
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$
|
|
32588
|
+
var __defProp$b = Object.defineProperty;
|
|
32589
|
+
var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
|
|
32590
|
+
var __decorateClass$d = (decorators, target, key, kind) => {
|
|
32591
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
|
|
31645
32592
|
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
31646
|
-
if (kind && result) __defProp$
|
|
32593
|
+
if (kind && result) __defProp$b(target, key, result);
|
|
31647
32594
|
return result;
|
|
31648
32595
|
};
|
|
31649
32596
|
const GLOBAL_ATTRIBUTE_MIN = 65520;
|
|
@@ -31914,7 +32861,8 @@ let MatterClusterView = class extends i$4 {
|
|
|
31914
32861
|
_renderClusterCommands() {
|
|
31915
32862
|
var _this$node5;
|
|
31916
32863
|
if (this.cluster === void 0) return b``;
|
|
31917
|
-
|
|
32864
|
+
const RENDER_WHEN_OFFLINE = /* @__PURE__ */new Set([30, 31]);
|
|
32865
|
+
if (!((_this$node5 = this.node) !== null && _this$node5 !== void 0 && _this$node5.available) && !RENDER_WHEN_OFFLINE.has(this.cluster)) return b``;
|
|
31918
32866
|
const tagName = getClusterCommandsTag(this.cluster);
|
|
31919
32867
|
if (!tagName) return b``;
|
|
31920
32868
|
const componentHtml = `<${tagName}></${tagName}>`;
|
|
@@ -32166,21 +33114,179 @@ MatterClusterView.styles = [notFoundStyles, i$7`
|
|
|
32166
33114
|
border-radius: 3px;
|
|
32167
33115
|
}
|
|
32168
33116
|
`];
|
|
32169
|
-
__decorateClass$
|
|
33117
|
+
__decorateClass$d([c$5({
|
|
32170
33118
|
context: clientContext
|
|
32171
33119
|
})], MatterClusterView.prototype, "client", 2);
|
|
32172
|
-
__decorateClass$
|
|
33120
|
+
__decorateClass$d([c$5({
|
|
32173
33121
|
context: tickContext,
|
|
32174
33122
|
subscribe: true
|
|
32175
33123
|
})], MatterClusterView.prototype, "_tick", 2);
|
|
32176
|
-
__decorateClass$
|
|
32177
|
-
__decorateClass$
|
|
33124
|
+
__decorateClass$d([n$5()], MatterClusterView.prototype, "node", 2);
|
|
33125
|
+
__decorateClass$d([e$b({
|
|
32178
33126
|
context: bindingContext
|
|
32179
33127
|
}), n$5()], MatterClusterView.prototype, "endpoint", 2);
|
|
32180
|
-
__decorateClass$
|
|
32181
|
-
__decorateClass$
|
|
32182
|
-
__decorateClass$
|
|
32183
|
-
MatterClusterView = __decorateClass$
|
|
33128
|
+
__decorateClass$d([n$5()], MatterClusterView.prototype, "cluster", 2);
|
|
33129
|
+
__decorateClass$d([r$3()], MatterClusterView.prototype, "_devMode", 2);
|
|
33130
|
+
__decorateClass$d([r$3()], MatterClusterView.prototype, "_refreshState", 2);
|
|
33131
|
+
MatterClusterView = __decorateClass$d([t$1("matter-cluster-view")], MatterClusterView);
|
|
33132
|
+
|
|
33133
|
+
/**
|
|
33134
|
+
* @license
|
|
33135
|
+
* Copyright 2018 Google LLC
|
|
33136
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
33137
|
+
*/
|
|
33138
|
+
const e = {},
|
|
33139
|
+
i = e$4(class extends i$3 {
|
|
33140
|
+
constructor() {
|
|
33141
|
+
super(...arguments), this.ot = e;
|
|
33142
|
+
}
|
|
33143
|
+
render(r, t) {
|
|
33144
|
+
return t();
|
|
33145
|
+
}
|
|
33146
|
+
update(t, [s, e]) {
|
|
33147
|
+
if (Array.isArray(s)) {
|
|
33148
|
+
if (Array.isArray(this.ot) && this.ot.length === s.length && s.every((r, t) => r === this.ot[t])) return E;
|
|
33149
|
+
} else if (this.ot === s) return E;
|
|
33150
|
+
return this.ot = Array.isArray(s) ? Array.from(s) : s, this.render(s, e);
|
|
33151
|
+
}
|
|
33152
|
+
});
|
|
33153
|
+
|
|
33154
|
+
var __defProp$a = Object.defineProperty;
|
|
33155
|
+
var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
|
|
33156
|
+
var __decorateClass$c = (decorators, target, key, kind) => {
|
|
33157
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
|
|
33158
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
33159
|
+
if (kind && result) __defProp$a(target, key, result);
|
|
33160
|
+
return result;
|
|
33161
|
+
};
|
|
33162
|
+
function getUniqueClusters(node, endpoint) {
|
|
33163
|
+
return Array.from(new Set(Object.keys(node.attributes).filter(key => key.startsWith(`${endpoint.toString()}/`)).map(key => Number(key.split("/")[1])))).sort((a, b) => {
|
|
33164
|
+
return a - b;
|
|
33165
|
+
});
|
|
33166
|
+
}
|
|
33167
|
+
let MatterEndpointView = class extends i$4 {
|
|
33168
|
+
constructor() {
|
|
33169
|
+
super(...arguments);
|
|
33170
|
+
this._tick = 0;
|
|
33171
|
+
}
|
|
33172
|
+
render() {
|
|
33173
|
+
var _this$node;
|
|
33174
|
+
if (!this.node || this.endpoint == void 0) {
|
|
33175
|
+
return b`
|
|
33176
|
+
<dashboard-header title="Not found" backButton="#"></dashboard-header>
|
|
33177
|
+
<div class="not-found">
|
|
33178
|
+
<ha-svg-icon .path=${mdiAlertCircleOutline}></ha-svg-icon>
|
|
33179
|
+
<p>Node or endpoint not found</p>
|
|
33180
|
+
<md-outlined-button @click=${this._goBack}>Back</md-outlined-button>
|
|
33181
|
+
</div>
|
|
33182
|
+
`;
|
|
33183
|
+
}
|
|
33184
|
+
const fabricIndex = getEffectiveFabricIndex(this.client.serverInfo.fabric_index, isTestNodeId(this.node.node_id));
|
|
33185
|
+
const nodeHex = formatNodeAddress(fabricIndex, this.node.node_id);
|
|
33186
|
+
return b`
|
|
33187
|
+
<dashboard-header
|
|
33188
|
+
.title=${`Node ${this.node.node_id} ${nodeHex} | Endpoint ${this.endpoint}`}
|
|
33189
|
+
.backButton=${`#node/${this.node.node_id}`}
|
|
33190
|
+
></dashboard-header>
|
|
33191
|
+
|
|
33192
|
+
<!-- node details section -->
|
|
33193
|
+
<div class="container">
|
|
33194
|
+
<node-details .node=${this.node}></node-details>
|
|
33195
|
+
</div>
|
|
33196
|
+
|
|
33197
|
+
<!-- Binding editor (when this endpoint has a Binding cluster) -->
|
|
33198
|
+
${getUniqueClusters(this.node, this.endpoint).includes(30) ? b`<div class="container">
|
|
33199
|
+
<binding-cluster-commands
|
|
33200
|
+
.node=${this.node}
|
|
33201
|
+
.endpoint=${this.endpoint}
|
|
33202
|
+
.cluster=${30}
|
|
33203
|
+
></binding-cluster-commands>
|
|
33204
|
+
</div>` : A}
|
|
33205
|
+
|
|
33206
|
+
<!-- Endpoint clusters listing -->
|
|
33207
|
+
<div class="container">
|
|
33208
|
+
<md-list>
|
|
33209
|
+
<md-list-item>
|
|
33210
|
+
<div slot="headline">
|
|
33211
|
+
<b>Clusters on Endpoint ${this.endpoint}</b>
|
|
33212
|
+
</div>
|
|
33213
|
+
<div slot="supporting-text">
|
|
33214
|
+
Device Type(s):
|
|
33215
|
+
${getEndpointDeviceTypes(this.node, this.endpoint).map(deviceType => {
|
|
33216
|
+
return deviceType.label;
|
|
33217
|
+
}).join(" / ")}
|
|
33218
|
+
</div>
|
|
33219
|
+
</md-list-item>
|
|
33220
|
+
${i([(_this$node = this.node) === null || _this$node === void 0 ? void 0 : _this$node.attributes.length], () => getUniqueClusters(this.node, this.endpoint).map(cluster => {
|
|
33221
|
+
var _clusters$cluster;
|
|
33222
|
+
return b`
|
|
33223
|
+
<md-list-item
|
|
33224
|
+
type="link"
|
|
33225
|
+
href=${`#node/${this.node.node_id}/${this.endpoint}/${cluster}`}
|
|
33226
|
+
>
|
|
33227
|
+
<div slot="headline">${((_clusters$cluster = clusters[cluster]) === null || _clusters$cluster === void 0 ? void 0 : _clusters$cluster.label) ?? "Custom/Unknown Cluster"}</div>
|
|
33228
|
+
<div slot="supporting-text">ClusterId ${cluster} (${formatHex(cluster)})</div>
|
|
33229
|
+
<ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
|
|
33230
|
+
</md-list-item>
|
|
33231
|
+
`;
|
|
33232
|
+
}))}
|
|
33233
|
+
</md-list>
|
|
33234
|
+
</div>
|
|
33235
|
+
`;
|
|
33236
|
+
}
|
|
33237
|
+
_goBack() {
|
|
33238
|
+
history.back();
|
|
33239
|
+
}
|
|
33240
|
+
};
|
|
33241
|
+
MatterEndpointView.styles = [notFoundStyles, i$7`
|
|
33242
|
+
:host {
|
|
33243
|
+
display: block;
|
|
33244
|
+
background-color: var(--md-sys-color-background);
|
|
33245
|
+
}
|
|
33246
|
+
|
|
33247
|
+
.header {
|
|
33248
|
+
background-color: var(--md-sys-color-primary);
|
|
33249
|
+
color: var(--md-sys-color-on-primary);
|
|
33250
|
+
--icon-primary-color: var(--md-sys-color-on-primary);
|
|
33251
|
+
font-weight: 400;
|
|
33252
|
+
display: flex;
|
|
33253
|
+
align-items: center;
|
|
33254
|
+
padding-right: 8px;
|
|
33255
|
+
height: 48px;
|
|
33256
|
+
}
|
|
33257
|
+
|
|
33258
|
+
md-icon-button {
|
|
33259
|
+
margin-right: 8px;
|
|
33260
|
+
}
|
|
33261
|
+
|
|
33262
|
+
.flex {
|
|
33263
|
+
flex: 1;
|
|
33264
|
+
}
|
|
33265
|
+
|
|
33266
|
+
.container {
|
|
33267
|
+
padding: 16px;
|
|
33268
|
+
max-width: 95%;
|
|
33269
|
+
margin: 0 auto;
|
|
33270
|
+
}
|
|
33271
|
+
|
|
33272
|
+
.status {
|
|
33273
|
+
color: var(--danger-color);
|
|
33274
|
+
font-weight: bold;
|
|
33275
|
+
font-size: 0.8em;
|
|
33276
|
+
}
|
|
33277
|
+
`];
|
|
33278
|
+
__decorateClass$c([c$5({
|
|
33279
|
+
context: clientContext
|
|
33280
|
+
})], MatterEndpointView.prototype, "client", 2);
|
|
33281
|
+
__decorateClass$c([c$5({
|
|
33282
|
+
context: tickContext,
|
|
33283
|
+
subscribe: true
|
|
33284
|
+
})], MatterEndpointView.prototype, "_tick", 2);
|
|
33285
|
+
__decorateClass$c([n$5()], MatterEndpointView.prototype, "node", 2);
|
|
33286
|
+
__decorateClass$c([e$b({
|
|
33287
|
+
context: bindingContext
|
|
33288
|
+
}), n$5()], MatterEndpointView.prototype, "endpoint", 2);
|
|
33289
|
+
MatterEndpointView = __decorateClass$c([t$1("matter-endpoint-view")], MatterEndpointView);
|
|
32184
33290
|
|
|
32185
33291
|
var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
|
|
32186
33292
|
var __decorateClass$b = (decorators, target, key, kind) => {
|
|
@@ -32658,17 +33764,6 @@ function getSignalColorFromLqi(lqi) {
|
|
|
32658
33764
|
function stripMdnsHostname(hostname) {
|
|
32659
33765
|
return hostname.replace(/\.$/, "").replace(/\.local$/i, "");
|
|
32660
33766
|
}
|
|
32661
|
-
function getDeviceName(node) {
|
|
32662
|
-
if (node.nodeLabel) {
|
|
32663
|
-
return node.nodeLabel;
|
|
32664
|
-
}
|
|
32665
|
-
const productName = node.productName || "Unknown Device";
|
|
32666
|
-
const serialNumber = node.serialNumber;
|
|
32667
|
-
if (serialNumber) {
|
|
32668
|
-
return `${productName} (${serialNumber})`;
|
|
32669
|
-
}
|
|
32670
|
-
return productName;
|
|
32671
|
-
}
|
|
32672
33767
|
function getThreadRoleName(role) {
|
|
32673
33768
|
switch (role) {
|
|
32674
33769
|
case 0:
|
|
@@ -45512,7 +46607,7 @@ MatterNodeView = __decorateClass$3([t$1("matter-node-view")], MatterNodeView);
|
|
|
45512
46607
|
*/
|
|
45513
46608
|
const showCommissionNodeDialog = async () => {
|
|
45514
46609
|
var _document$querySelect;
|
|
45515
|
-
await import('./commission-node-dialog-
|
|
46610
|
+
await import('./commission-node-dialog-nVZp3go0.js');
|
|
45516
46611
|
const dialog = document.createElement("commission-node-dialog");
|
|
45517
46612
|
(_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
|
|
45518
46613
|
};
|
|
@@ -45564,13 +46659,13 @@ let ServerDetails = class extends i$4 {
|
|
|
45564
46659
|
</md-list-item>
|
|
45565
46660
|
<md-list-item>
|
|
45566
46661
|
<div slot="supporting-text">
|
|
45567
|
-
<div class="left">
|
|
46662
|
+
<div class="left">Matter Server Version: </div>${this.client.serverInfo.sdk_version}
|
|
45568
46663
|
</div>
|
|
45569
46664
|
<div slot="supporting-text">
|
|
45570
|
-
<div class="left">
|
|
46665
|
+
<div class="left">FabricId: </div>${this.client.serverInfo.fabric_id}
|
|
45571
46666
|
</div>
|
|
45572
46667
|
<div slot="supporting-text">
|
|
45573
|
-
<div class="left">
|
|
46668
|
+
<div class="left">Compressed FabricId: </div>${this.client.serverInfo.compressed_fabric_id}
|
|
45574
46669
|
</div>
|
|
45575
46670
|
<div slot="supporting-text">
|
|
45576
46671
|
<div class="left">Schema Version: </div>${this.client.serverInfo.schema_version}
|
|
@@ -46070,4 +47165,4 @@ var matterDashboardApp = /*#__PURE__*/Object.freeze({
|
|
|
46070
47165
|
__proto__: null
|
|
46071
47166
|
});
|
|
46072
47167
|
|
|
46073
|
-
export { A, DevModeService as D, MAX_NODE_LABEL_LENGTH as M, __decorate as _, clientContext as a, i$4 as b, c$5 as c, b as d, e$6 as e, fireAndForget as f, t$1 as g, handleAsync as h, i$7 as i, mdiAccessPoint as j, mdiEyeOff as k, mdiEye as l, mdiWifi as m, n$5 as n, formatHex as o,
|
|
47168
|
+
export { A, mdiClose as B, getDeviceName as C, DevModeService as D, targetAclCapacityForBinding as E, addBinding as F, bindableClusters as G, getEndpointDeviceTypes as H, mixinDelegatesAria as I, e$3 as J, showSettingsDialog$1 as K, matterDashboardApp as L, MAX_NODE_LABEL_LENGTH as M, Privilege as P, __decorate as _, clientContext as a, i$4 as b, c$5 as c, b as d, e$6 as e, fireAndForget as f, t$1 as g, handleAsync as h, i$7 as i, mdiAccessPoint as j, mdiEyeOff as k, mdiEye as l, mdiWifi as m, n$5 as n, formatHex as o, nodeIdKey as p, aclCapacity as q, r$3 as r, showAlertDialog as s, tickContext as t, targetServerClusters as u, clusters as v, writeNodeLabel as w, AuthMode as x, addAclEntry as y, PRIVILEGE_NAMES as z };
|