matterbridge-dyson-robot 0.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.
Files changed (261) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +14 -0
  3. package/README.md +365 -0
  4. package/dist/async-eventemitter.d.ts +9 -0
  5. package/dist/async-eventemitter.d.ts.map +1 -0
  6. package/dist/async-eventemitter.js +35 -0
  7. package/dist/async-eventemitter.js.map +1 -0
  8. package/dist/check-configuration.d.ts +5 -0
  9. package/dist/check-configuration.d.ts.map +1 -0
  10. package/dist/check-configuration.js +35 -0
  11. package/dist/check-configuration.js.map +1 -0
  12. package/dist/check-versions.d.ts +3 -0
  13. package/dist/check-versions.d.ts.map +1 -0
  14. package/dist/check-versions.js +31 -0
  15. package/dist/check-versions.js.map +1 -0
  16. package/dist/config-types.d.ts +48 -0
  17. package/dist/config-types.d.ts.map +1 -0
  18. package/dist/config-types.js +4 -0
  19. package/dist/config-types.js.map +1 -0
  20. package/dist/decorator-changed.d.ts +16 -0
  21. package/dist/decorator-changed.d.ts.map +1 -0
  22. package/dist/decorator-changed.js +62 -0
  23. package/dist/decorator-changed.js.map +1 -0
  24. package/dist/dyson-360-msg-types.d.ts +113 -0
  25. package/dist/dyson-360-msg-types.d.ts.map +1 -0
  26. package/dist/dyson-360-msg-types.js +4 -0
  27. package/dist/dyson-360-msg-types.js.map +1 -0
  28. package/dist/dyson-360-types.d.ts +76 -0
  29. package/dist/dyson-360-types.d.ts.map +1 -0
  30. package/dist/dyson-360-types.js +72 -0
  31. package/dist/dyson-360-types.js.map +1 -0
  32. package/dist/dyson-air-msg-types.d.ts +99 -0
  33. package/dist/dyson-air-msg-types.d.ts.map +1 -0
  34. package/dist/dyson-air-msg-types.js +4 -0
  35. package/dist/dyson-air-msg-types.js.map +1 -0
  36. package/dist/dyson-air-sensor-types.d.ts +59 -0
  37. package/dist/dyson-air-sensor-types.d.ts.map +1 -0
  38. package/dist/dyson-air-sensor-types.js +4 -0
  39. package/dist/dyson-air-sensor-types.js.map +1 -0
  40. package/dist/dyson-air-state-types.d.ts +96 -0
  41. package/dist/dyson-air-state-types.d.ts.map +1 -0
  42. package/dist/dyson-air-state-types.js +4 -0
  43. package/dist/dyson-air-state-types.js.map +1 -0
  44. package/dist/dyson-air-types.d.ts +325 -0
  45. package/dist/dyson-air-types.d.ts.map +1 -0
  46. package/dist/dyson-air-types.js +382 -0
  47. package/dist/dyson-air-types.js.map +1 -0
  48. package/dist/dyson-device-360-base.d.ts +35 -0
  49. package/dist/dyson-device-360-base.d.ts.map +1 -0
  50. package/dist/dyson-device-360-base.js +233 -0
  51. package/dist/dyson-device-360-base.js.map +1 -0
  52. package/dist/dyson-device-360-commands.d.ts +7 -0
  53. package/dist/dyson-device-360-commands.d.ts.map +1 -0
  54. package/dist/dyson-device-360-commands.js +129 -0
  55. package/dist/dyson-device-360-commands.js.map +1 -0
  56. package/dist/dyson-device-360-faults-table.d.ts +20 -0
  57. package/dist/dyson-device-360-faults-table.d.ts.map +1 -0
  58. package/dist/dyson-device-360-faults-table.js +161 -0
  59. package/dist/dyson-device-360-faults-table.js.map +1 -0
  60. package/dist/dyson-device-360-faults.d.ts +10 -0
  61. package/dist/dyson-device-360-faults.d.ts.map +1 -0
  62. package/dist/dyson-device-360-faults.js +123 -0
  63. package/dist/dyson-device-360-faults.js.map +1 -0
  64. package/dist/dyson-device-360.d.ts +38 -0
  65. package/dist/dyson-device-360.d.ts.map +1 -0
  66. package/dist/dyson-device-360.js +45 -0
  67. package/dist/dyson-device-360.js.map +1 -0
  68. package/dist/dyson-device-air-base.d.ts +41 -0
  69. package/dist/dyson-device-air-base.d.ts.map +1 -0
  70. package/dist/dyson-device-air-base.js +446 -0
  71. package/dist/dyson-device-air-base.js.map +1 -0
  72. package/dist/dyson-device-air-heat.d.ts +52 -0
  73. package/dist/dyson-device-air-heat.d.ts.map +1 -0
  74. package/dist/dyson-device-air-heat.js +71 -0
  75. package/dist/dyson-device-air-heat.js.map +1 -0
  76. package/dist/dyson-device-air-quality.d.ts +7 -0
  77. package/dist/dyson-device-air-quality.d.ts.map +1 -0
  78. package/dist/dyson-device-air-quality.js +101 -0
  79. package/dist/dyson-device-air-quality.js.map +1 -0
  80. package/dist/dyson-device-air.d.ts +216 -0
  81. package/dist/dyson-device-air.d.ts.map +1 -0
  82. package/dist/dyson-device-air.js +80 -0
  83. package/dist/dyson-device-air.js.map +1 -0
  84. package/dist/dyson-device-base.d.ts +49 -0
  85. package/dist/dyson-device-base.d.ts.map +1 -0
  86. package/dist/dyson-device-base.js +46 -0
  87. package/dist/dyson-device-base.js.map +1 -0
  88. package/dist/dyson-device.d.ts +5 -0
  89. package/dist/dyson-device.d.ts.map +1 -0
  90. package/dist/dyson-device.js +43 -0
  91. package/dist/dyson-device.js.map +1 -0
  92. package/dist/dyson-mqtt-360.d.ts +16 -0
  93. package/dist/dyson-mqtt-360.d.ts.map +1 -0
  94. package/dist/dyson-mqtt-360.js +83 -0
  95. package/dist/dyson-mqtt-360.js.map +1 -0
  96. package/dist/dyson-mqtt-air.d.ts +48 -0
  97. package/dist/dyson-mqtt-air.d.ts.map +1 -0
  98. package/dist/dyson-mqtt-air.js +216 -0
  99. package/dist/dyson-mqtt-air.js.map +1 -0
  100. package/dist/dyson-mqtt-config.d.ts +6 -0
  101. package/dist/dyson-mqtt-config.d.ts.map +1 -0
  102. package/dist/dyson-mqtt-config.js +47 -0
  103. package/dist/dyson-mqtt-config.js.map +1 -0
  104. package/dist/dyson-mqtt-connect.d.ts +22 -0
  105. package/dist/dyson-mqtt-connect.d.ts.map +1 -0
  106. package/dist/dyson-mqtt-connect.js +145 -0
  107. package/dist/dyson-mqtt-connect.js.map +1 -0
  108. package/dist/dyson-mqtt-filter.d.ts +10 -0
  109. package/dist/dyson-mqtt-filter.d.ts.map +1 -0
  110. package/dist/dyson-mqtt-filter.js +25 -0
  111. package/dist/dyson-mqtt-filter.js.map +1 -0
  112. package/dist/dyson-mqtt-parse.d.ts +16 -0
  113. package/dist/dyson-mqtt-parse.d.ts.map +1 -0
  114. package/dist/dyson-mqtt-parse.js +100 -0
  115. package/dist/dyson-mqtt-parse.js.map +1 -0
  116. package/dist/dyson-mqtt-subscribe.d.ts +28 -0
  117. package/dist/dyson-mqtt-subscribe.d.ts.map +1 -0
  118. package/dist/dyson-mqtt-subscribe.js +85 -0
  119. package/dist/dyson-mqtt-subscribe.js.map +1 -0
  120. package/dist/dyson-mqtt.d.ts +51 -0
  121. package/dist/dyson-mqtt.d.ts.map +1 -0
  122. package/dist/dyson-mqtt.js +138 -0
  123. package/dist/dyson-mqtt.js.map +1 -0
  124. package/dist/dyson-types.d.ts +18 -0
  125. package/dist/dyson-types.d.ts.map +1 -0
  126. package/dist/dyson-types.js +20 -0
  127. package/dist/dyson-types.js.map +1 -0
  128. package/dist/endpoint-360-behavior.d.ts +55 -0
  129. package/dist/endpoint-360-behavior.d.ts.map +1 -0
  130. package/dist/endpoint-360-behavior.js +156 -0
  131. package/dist/endpoint-360-behavior.js.map +1 -0
  132. package/dist/endpoint-360-rvc.d.ts +14 -0
  133. package/dist/endpoint-360-rvc.d.ts.map +1 -0
  134. package/dist/endpoint-360-rvc.js +149 -0
  135. package/dist/endpoint-360-rvc.js.map +1 -0
  136. package/dist/endpoint-360.d.ts +35 -0
  137. package/dist/endpoint-360.d.ts.map +1 -0
  138. package/dist/endpoint-360.js +197 -0
  139. package/dist/endpoint-360.js.map +1 -0
  140. package/dist/endpoint-air-purifier.d.ts +24 -0
  141. package/dist/endpoint-air-purifier.d.ts.map +1 -0
  142. package/dist/endpoint-air-purifier.js +97 -0
  143. package/dist/endpoint-air-purifier.js.map +1 -0
  144. package/dist/endpoint-air-quality.d.ts +11 -0
  145. package/dist/endpoint-air-quality.d.ts.map +1 -0
  146. package/dist/endpoint-air-quality.js +104 -0
  147. package/dist/endpoint-air-quality.js.map +1 -0
  148. package/dist/endpoint-air-thermostat.d.ts +358 -0
  149. package/dist/endpoint-air-thermostat.d.ts.map +1 -0
  150. package/dist/endpoint-air-thermostat.js +67 -0
  151. package/dist/endpoint-air-thermostat.js.map +1 -0
  152. package/dist/endpoint-air.d.ts +125 -0
  153. package/dist/endpoint-air.d.ts.map +1 -0
  154. package/dist/endpoint-air.js +459 -0
  155. package/dist/endpoint-air.js.map +1 -0
  156. package/dist/endpoint-base.d.ts +36 -0
  157. package/dist/endpoint-base.d.ts.map +1 -0
  158. package/dist/endpoint-base.js +137 -0
  159. package/dist/endpoint-base.js.map +1 -0
  160. package/dist/error-360.d.ts +35 -0
  161. package/dist/error-360.d.ts.map +1 -0
  162. package/dist/error-360.js +105 -0
  163. package/dist/error-360.js.map +1 -0
  164. package/dist/index.d.ts +5 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +8 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/logger-filter.d.ts +23 -0
  169. package/dist/logger-filter.d.ts.map +1 -0
  170. package/dist/logger-filter.js +104 -0
  171. package/dist/logger-filter.js.map +1 -0
  172. package/dist/logger-options.d.ts +18 -0
  173. package/dist/logger-options.d.ts.map +1 -0
  174. package/dist/logger-options.js +41 -0
  175. package/dist/logger-options.js.map +1 -0
  176. package/dist/logger-prefix.d.ts +12 -0
  177. package/dist/logger-prefix.d.ts.map +1 -0
  178. package/dist/logger-prefix.js +37 -0
  179. package/dist/logger-prefix.js.map +1 -0
  180. package/dist/periodic.d.ts +31 -0
  181. package/dist/periodic.d.ts.map +1 -0
  182. package/dist/periodic.js +102 -0
  183. package/dist/periodic.js.map +1 -0
  184. package/dist/platform.d.ts +18 -0
  185. package/dist/platform.d.ts.map +1 -0
  186. package/dist/platform.js +138 -0
  187. package/dist/platform.js.map +1 -0
  188. package/dist/settings.d.ts +9 -0
  189. package/dist/settings.d.ts.map +1 -0
  190. package/dist/settings.js +28 -0
  191. package/dist/settings.js.map +1 -0
  192. package/dist/ti/config-types-ti.d.ts +16 -0
  193. package/dist/ti/config-types-ti.d.ts.map +1 -0
  194. package/dist/ti/config-types-ti.js +65 -0
  195. package/dist/ti/config-types-ti.js.map +1 -0
  196. package/dist/ti/config-types.d.ts +37 -0
  197. package/dist/ti/config-types.d.ts.map +1 -0
  198. package/dist/ti/config-types.js +11 -0
  199. package/dist/ti/config-types.js.map +1 -0
  200. package/dist/ti/dyson-360-msg-types-ti.d.ts +22 -0
  201. package/dist/ti/dyson-360-msg-types-ti.d.ts.map +1 -0
  202. package/dist/ti/dyson-360-msg-types-ti.js +134 -0
  203. package/dist/ti/dyson-360-msg-types-ti.js.map +1 -0
  204. package/dist/ti/dyson-360-msg-types.d.ts +55 -0
  205. package/dist/ti/dyson-360-msg-types.d.ts.map +1 -0
  206. package/dist/ti/dyson-360-msg-types.js +13 -0
  207. package/dist/ti/dyson-360-msg-types.js.map +1 -0
  208. package/dist/ti/dyson-360-types-ti.d.ts +17 -0
  209. package/dist/ti/dyson-360-types-ti.d.ts.map +1 -0
  210. package/dist/ti/dyson-360-types-ti.js +94 -0
  211. package/dist/ti/dyson-360-types-ti.js.map +1 -0
  212. package/dist/ti/dyson-360-types.d.ts +40 -0
  213. package/dist/ti/dyson-360-types.d.ts.map +1 -0
  214. package/dist/ti/dyson-360-types.js +11 -0
  215. package/dist/ti/dyson-360-types.js.map +1 -0
  216. package/dist/ti/dyson-air-msg-types-ti.d.ts +19 -0
  217. package/dist/ti/dyson-air-msg-types-ti.d.ts.map +1 -0
  218. package/dist/ti/dyson-air-msg-types-ti.js +115 -0
  219. package/dist/ti/dyson-air-msg-types-ti.js.map +1 -0
  220. package/dist/ti/dyson-air-msg-types.d.ts +46 -0
  221. package/dist/ti/dyson-air-msg-types.d.ts.map +1 -0
  222. package/dist/ti/dyson-air-msg-types.js +15 -0
  223. package/dist/ti/dyson-air-msg-types.js.map +1 -0
  224. package/dist/ti/dyson-air-sensor-types-ti.d.ts +9 -0
  225. package/dist/ti/dyson-air-sensor-types-ti.d.ts.map +1 -0
  226. package/dist/ti/dyson-air-sensor-types-ti.js +68 -0
  227. package/dist/ti/dyson-air-sensor-types-ti.js.map +1 -0
  228. package/dist/ti/dyson-air-sensor-types.d.ts +16 -0
  229. package/dist/ti/dyson-air-sensor-types.d.ts.map +1 -0
  230. package/dist/ti/dyson-air-sensor-types.js +12 -0
  231. package/dist/ti/dyson-air-sensor-types.js.map +1 -0
  232. package/dist/ti/dyson-air-state-types-ti.d.ts +9 -0
  233. package/dist/ti/dyson-air-state-types-ti.d.ts.map +1 -0
  234. package/dist/ti/dyson-air-state-types-ti.js +105 -0
  235. package/dist/ti/dyson-air-state-types-ti.js.map +1 -0
  236. package/dist/ti/dyson-air-state-types.d.ts +16 -0
  237. package/dist/ti/dyson-air-state-types.d.ts.map +1 -0
  238. package/dist/ti/dyson-air-state-types.js +12 -0
  239. package/dist/ti/dyson-air-state-types.js.map +1 -0
  240. package/dist/ti/dyson-air-types-ti.d.ts +59 -0
  241. package/dist/ti/dyson-air-types-ti.d.ts.map +1 -0
  242. package/dist/ti/dyson-air-types-ti.js +385 -0
  243. package/dist/ti/dyson-air-types-ti.js.map +1 -0
  244. package/dist/ti/dyson-air-types.d.ts +166 -0
  245. package/dist/ti/dyson-air-types.d.ts.map +1 -0
  246. package/dist/ti/dyson-air-types.js +11 -0
  247. package/dist/ti/dyson-air-types.js.map +1 -0
  248. package/dist/ti/dyson-types-ti.d.ts +10 -0
  249. package/dist/ti/dyson-types-ti.d.ts.map +1 -0
  250. package/dist/ti/dyson-types-ti.js +29 -0
  251. package/dist/ti/dyson-types-ti.js.map +1 -0
  252. package/dist/ti/dyson-types.d.ts +19 -0
  253. package/dist/ti/dyson-types.d.ts.map +1 -0
  254. package/dist/ti/dyson-types.js +11 -0
  255. package/dist/ti/dyson-types.js.map +1 -0
  256. package/dist/utils.d.ts +24 -0
  257. package/dist/utils.d.ts.map +1 -0
  258. package/dist/utils.js +150 -0
  259. package/dist/utils.js.map +1 -0
  260. package/matterbridge-dyson-robot.schema.json +359 -0
  261. package/package.json +93 -0
@@ -0,0 +1,459 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
4
+ var useValue = arguments.length > 2;
5
+ for (var i = 0; i < initializers.length; i++) {
6
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
7
+ }
8
+ return useValue ? value : void 0;
9
+ };
10
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
11
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
12
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
13
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
14
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
15
+ var _, done = false;
16
+ for (var i = decorators.length - 1; i >= 0; i--) {
17
+ var context = {};
18
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
19
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
20
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
21
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
22
+ if (kind === "accessor") {
23
+ if (result === void 0) continue;
24
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
25
+ if (_ = accept(result.get)) descriptor.get = _;
26
+ if (_ = accept(result.set)) descriptor.set = _;
27
+ if (_ = accept(result.init)) initializers.unshift(_);
28
+ }
29
+ else if (_ = accept(result)) {
30
+ if (kind === "field") initializers.unshift(_);
31
+ else descriptor[key] = _;
32
+ }
33
+ }
34
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
35
+ done = true;
36
+ };
37
+ import { airPurifier, airQualitySensor, bridgedNode, humiditySensor, OnOff, temperatureSensor, thermostatDevice } from 'matterbridge';
38
+ import { EndpointBase, formatEnumLog } from './endpoint-base.js';
39
+ import { ActivatedCarbonFilterMonitoring, AirQuality, ConcentrationMeasurement, CarbonDioxideConcentrationMeasurement, FanControl, FormaldehydeConcentrationMeasurement, HepaFilterMonitoring, NitrogenDioxideConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm25ConcentrationMeasurement, RelativeHumidityMeasurement, ResourceMonitoring, TemperatureMeasurement, Thermostat, TotalVolatileOrganicCompoundsConcentrationMeasurement } from 'matterbridge/matter/clusters';
40
+ import { createActivatedCarbonFilterMonitoringClusterServer, createFanControlClusterServer, createHepaFilterMonitoringClusterServer, createOnOffClusterServer } from './endpoint-air-purifier.js';
41
+ import { Changed, ifValueChanged } from './decorator-changed.js';
42
+ import { AN, AV, CN, CV, RI } from './logger-options.js';
43
+ import { assertIsBoolean, assertIsNumber, formatList, logError } from './utils.js';
44
+ import { createAirQualityClusterServer, createTemperatureMeasurementClusterServer, createRelativeHumidityMeasurementClusterServer, createTotalVolatileOrganicCompoundsConcentrationMeasurementClusterServer, createCarbonDioxideConcentrationMeasurementClusterServer, createNitrogenDioxideConcentrationMeasurementClusterServer, createFormaldehydeConcentrationMeasurementClusterServer, createPm25ConcentrationMeasurementClusterServer, createPm10ConcentrationMeasurementClusterServer } from './endpoint-air-quality.js';
45
+ import { createThermostatClusterServer } from './endpoint-air-thermostat.js';
46
+ // A Matterbridge endpoint for an air purifier composite device
47
+ let EndpointsAir = (() => {
48
+ let _instanceExtraInitializers = [];
49
+ let _updateFanControl_decorators;
50
+ let _updateThermostat_decorators;
51
+ let _updateFilterMonitoring_decorators;
52
+ let _updateSensors_decorators;
53
+ return class EndpointsAir {
54
+ static {
55
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
56
+ _updateFanControl_decorators = [ifValueChanged];
57
+ _updateThermostat_decorators = [ifValueChanged];
58
+ _updateFilterMonitoring_decorators = [ifValueChanged];
59
+ _updateSensors_decorators = [ifValueChanged];
60
+ __esDecorate(this, null, _updateFanControl_decorators, { kind: "method", name: "updateFanControl", static: false, private: false, access: { has: obj => "updateFanControl" in obj, get: obj => obj.updateFanControl }, metadata: _metadata }, null, _instanceExtraInitializers);
61
+ __esDecorate(this, null, _updateThermostat_decorators, { kind: "method", name: "updateThermostat", static: false, private: false, access: { has: obj => "updateThermostat" in obj, get: obj => obj.updateThermostat }, metadata: _metadata }, null, _instanceExtraInitializers);
62
+ __esDecorate(this, null, _updateFilterMonitoring_decorators, { kind: "method", name: "updateFilterMonitoring", static: false, private: false, access: { has: obj => "updateFilterMonitoring" in obj, get: obj => obj.updateFilterMonitoring }, metadata: _metadata }, null, _instanceExtraInitializers);
63
+ __esDecorate(this, null, _updateSensors_decorators, { kind: "method", name: "updateSensors", static: false, private: false, access: { has: obj => "updateSensors" in obj, get: obj => obj.updateSensors }, metadata: _metadata }, null, _instanceExtraInitializers);
64
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
65
+ }
66
+ log = __runInitializers(this, _instanceExtraInitializers);
67
+ config;
68
+ options;
69
+ // Bridge node endpoints
70
+ bridged = [];
71
+ // Aliases to endpoints for specific clusters
72
+ purifier; // On/Off + Air Purifier + X Filter Monitoring
73
+ thermostat; // Thermostat
74
+ airQuality = []; // Air Quality + X Measurement
75
+ temperature = []; // Temperature Measurement
76
+ humidity = []; // Relative Humidity Measurement
77
+ // Decorator support
78
+ changed;
79
+ // Filter own attribute writes from subscription events
80
+ lastWrite = new Map;
81
+ // Construct a new endpoint
82
+ constructor(log, config, options) {
83
+ this.log = log;
84
+ this.config = config;
85
+ this.options = options;
86
+ // Construct the separately bridged devices, if enabled
87
+ this.createAirPurifierEndpoint();
88
+ this.createThermostatEndpoint();
89
+ this.createHumiditySensorEndpoint();
90
+ this.createTemperatureSensorEndpoint();
91
+ this.createAirQualitySensorEndpoint();
92
+ // Construct the composed air purifier device, if enabled
93
+ const parent = this.createAirPurifierEndpoint(true);
94
+ if (parent) {
95
+ this.createThermostatEndpoint(parent);
96
+ this.createHumiditySensorEndpoint(parent);
97
+ this.createTemperatureSensorEndpoint(parent);
98
+ this.createAirQualitySensorEndpoint(parent);
99
+ }
100
+ // Prepare the decorator support
101
+ this.changed = new Changed(log);
102
+ }
103
+ // Create an Air Purifier device
104
+ createAirPurifierEndpoint(composed = false) {
105
+ // Create the endpoint
106
+ if (this.purifier)
107
+ return;
108
+ const endpointName = composed ? 'Composed Air Purifier' : 'Air Purifier';
109
+ const endpoint = this.createDevice(endpointName, [airPurifier]);
110
+ if (!endpoint)
111
+ return;
112
+ this.purifier = endpoint;
113
+ // Create the device-specific clusters
114
+ const { fanControl, hepaFilter, carbonFilter } = this.options;
115
+ createOnOffClusterServer(endpoint);
116
+ createFanControlClusterServer(endpoint, fanControl);
117
+ createHepaFilterMonitoringClusterServer(endpoint, hepaFilter);
118
+ if (carbonFilter)
119
+ createActivatedCarbonFilterMonitoringClusterServer(endpoint, carbonFilter);
120
+ return endpoint;
121
+ }
122
+ // Create a Humidity Sensor device
123
+ createHumiditySensorEndpoint(parent) {
124
+ // Create the endpoint
125
+ const endpoint = this.createDevice('Humidity Sensor', [humiditySensor], parent);
126
+ if (!endpoint)
127
+ return;
128
+ this.humidity.push(endpoint);
129
+ // Create the device-specific clusters
130
+ createRelativeHumidityMeasurementClusterServer(endpoint);
131
+ return endpoint;
132
+ }
133
+ // Create a Temperature Sensor device
134
+ createTemperatureSensorEndpoint(parent) {
135
+ // Create the endpoint
136
+ const endpoint = this.createDevice('Temperature Sensor', [temperatureSensor], parent);
137
+ if (!endpoint)
138
+ return;
139
+ this.temperature.push(endpoint);
140
+ // Create the device-specific clusters
141
+ createTemperatureMeasurementClusterServer(endpoint);
142
+ return endpoint;
143
+ }
144
+ // Create a Thermostat device
145
+ createThermostatEndpoint(parent) {
146
+ // Create the endpoint
147
+ if (this.thermostat)
148
+ return;
149
+ const endpoint = this.createDevice('Thermostat', [thermostatDevice], parent);
150
+ if (!endpoint)
151
+ return;
152
+ this.thermostat = endpoint;
153
+ // Create the device-specific clusters
154
+ createThermostatClusterServer(endpoint);
155
+ return endpoint;
156
+ }
157
+ // Create an Air Quality Sensor device
158
+ createAirQualitySensorEndpoint(parent) {
159
+ // Create the endpoint
160
+ const endpoint = this.createDevice('Air Quality Sensor', [airQualitySensor, temperatureSensor, humiditySensor], parent);
161
+ if (!endpoint)
162
+ return;
163
+ this.airQuality.push(endpoint);
164
+ this.temperature.push(endpoint);
165
+ this.humidity.push(endpoint);
166
+ // Create the device-specific clusters
167
+ const { sensors } = this.options;
168
+ createAirQualityClusterServer(endpoint);
169
+ createTemperatureMeasurementClusterServer(endpoint);
170
+ createRelativeHumidityMeasurementClusterServer(endpoint);
171
+ if (sensors.voc)
172
+ createTotalVolatileOrganicCompoundsConcentrationMeasurementClusterServer(endpoint);
173
+ if (sensors.co2)
174
+ createCarbonDioxideConcentrationMeasurementClusterServer(endpoint);
175
+ if (sensors.nox)
176
+ createNitrogenDioxideConcentrationMeasurementClusterServer(endpoint);
177
+ if (sensors.hcho)
178
+ createFormaldehydeConcentrationMeasurementClusterServer(endpoint);
179
+ if (sensors.pm25)
180
+ createPm25ConcentrationMeasurementClusterServer(endpoint);
181
+ if (sensors.pm10)
182
+ createPm10ConcentrationMeasurementClusterServer(endpoint);
183
+ return endpoint;
184
+ }
185
+ // Create a device as either a bridged node or a child endpoint
186
+ createDevice(endpointName, definition, parent) {
187
+ const { config, options } = this;
188
+ const debug = config.debugFeatures.includes('Log Endpoint Debug');
189
+ // Construct a unique Matter.js endpoint identifier
190
+ const uniqueStorageKey = `${options.uniqueStorageKey}-${endpointName.toLowerCase()}`;
191
+ if (parent) {
192
+ // Create a child endpoint with an Identify cluster
193
+ const endpoint = parent.addChildDeviceType(endpointName, definition, { uniqueStorageKey }, debug);
194
+ endpoint.createDefaultIdentifyClusterServer();
195
+ return endpoint;
196
+ }
197
+ else {
198
+ // Only create the bridged node if allowed by the configuration
199
+ if (!this.options.validatedNames.includes(endpointName))
200
+ return;
201
+ // Construct other unique identifiers for this bridged node
202
+ const { deviceBasicInformation } = options;
203
+ const matterbridgeDeviceName = `${this.options.matterbridgeDeviceName} (${endpointName})`;
204
+ const suffix = `-${this.bridged.length}`;
205
+ const uniqueId = `${deviceBasicInformation.uniqueId.substring(0, 32 - suffix.length)}${suffix}`;
206
+ const nodeOptions = {
207
+ uniqueStorageKey,
208
+ matterbridgeDeviceName,
209
+ deviceBasicInformation: {
210
+ ...deviceBasicInformation,
211
+ uniqueId
212
+ }
213
+ };
214
+ // Create a bridged node endpoint
215
+ // (includes Identify and Bridged Device Basic Information clusters)
216
+ const endpoint = new EndpointBase(this.log, config, nodeOptions, [bridgedNode, ...definition]);
217
+ this.bridged.push(endpoint);
218
+ return endpoint;
219
+ }
220
+ }
221
+ // All bridged device endpoints
222
+ get bridgedNodeEndpoints() {
223
+ return this.bridged;
224
+ }
225
+ // Install On/Off and Fan Control cluster handlers
226
+ async setFanControlHandlers(handlers) {
227
+ const endpoint = this.purifier;
228
+ if (!endpoint)
229
+ return;
230
+ // Subscribe to Fan Control read/write attributes
231
+ const keys = ['fanMode', 'percentSetting', 'rockSetting', 'speedSetting', 'windSetting'];
232
+ await this.subscribeAttributes(endpoint, FanControl.Cluster.id, 'Fan Control', handlers, keys);
233
+ // Install On/Off command handlers
234
+ const setOnOff = async (command, newValue) => {
235
+ this.log.debug(`On/Off command: ${command}`);
236
+ const oldValue = endpoint.getAttribute(OnOff.Cluster.id, 'onOff', this.log);
237
+ assertIsBoolean(oldValue);
238
+ newValue ??= !oldValue; // (for Toggle command)
239
+ // Call the handler and then update the attribute
240
+ await handlers.onOff(newValue, oldValue);
241
+ await endpoint.setAttribute(OnOff.Cluster.id, 'onOff', newValue, this.log);
242
+ };
243
+ endpoint.addCommandHandler('on', () => { void setOnOff('On', true); });
244
+ endpoint.addCommandHandler('off', () => { void setOnOff('Off', false); });
245
+ endpoint.addCommandHandler('toggle', () => { void setOnOff('Toggle'); });
246
+ }
247
+ // Install Thermostat cluster handlers
248
+ async setThermostatHandlers(handlers) {
249
+ const endpoint = this.thermostat;
250
+ if (!endpoint)
251
+ return;
252
+ // Subscribe to Thermostat read/write attributes
253
+ await this.subscribeAttributes(endpoint, Thermostat.Cluster.id, 'Thermostat', handlers);
254
+ // Install Thermostat command handler
255
+ endpoint.addCommandHandler('setpointRaiseLower', async ({ mode, amount }) => {
256
+ this.log.debug(`Thermostat SetpointRaiseLower command: ${Thermostat.SetpointRaiseLowerMode[mode]} ${amount}`);
257
+ if ([Thermostat.SetpointRaiseLowerMode.Heat, Thermostat.SetpointRaiseLowerMode.Both].includes(mode)) {
258
+ // Treat the command as a write to occupiedHeatingSetpoint
259
+ const oldValue = endpoint.getAttribute(Thermostat.Cluster.id, 'occupiedHeatingSetpoint', this.log);
260
+ assertIsNumber(oldValue);
261
+ const newValue = oldValue + amount * 10;
262
+ // Call the handler and then update the attribute
263
+ await handlers.occupiedHeatingSetpoint(newValue, oldValue);
264
+ await endpoint.setAttribute(Thermostat.Cluster.id, 'occupiedHeatingSetpoint', newValue, this.log);
265
+ }
266
+ });
267
+ }
268
+ // Subscribe to attribute updates
269
+ async subscribeAttributes(endpoint, clusterId, name, handlers, keys) {
270
+ keys ??= Object.keys(handlers);
271
+ await Promise.all(keys.map(async (key) => {
272
+ const description = `${name} ${key}`;
273
+ // Wrapper around handler to trap errors and flush the change cache
274
+ const handler = (newValue, oldValue) => {
275
+ // Ignore reflected local writes (and duplicates)
276
+ if (!this.isAttributeChanged(endpoint, clusterId, key, newValue))
277
+ return;
278
+ // Call the handler and then ensure the next update gets applied
279
+ this.log.info(`${CN}${description}${RI}: ${JSON.stringify(oldValue)} → ${CV}${JSON.stringify(newValue)}${RI}`);
280
+ void (async () => {
281
+ try {
282
+ await handlers[key](newValue, oldValue);
283
+ this.updateNextStatus();
284
+ }
285
+ catch (err) {
286
+ logError(this.log, description, err);
287
+ }
288
+ })();
289
+ };
290
+ // Register the handler
291
+ const success = await endpoint.subscribeAttribute(clusterId, key, handler, this.log);
292
+ if (!success)
293
+ this.log.warn(`${description} subscription failed`);
294
+ }));
295
+ }
296
+ // Update the On/Off and Fan Control cluster attributes
297
+ async updateFanControl(fan) {
298
+ const endpoint = this.purifier;
299
+ if (!endpoint)
300
+ return;
301
+ // Matterbridge detects missing bitmap values as changes, so set defaults
302
+ if (fan.rockSetting)
303
+ fan.rockSetting = {
304
+ rockLeftRight: false, rockUpDown: false, rockRound: false,
305
+ ...fan.rockSetting
306
+ };
307
+ if (fan.windSetting)
308
+ fan.windSetting = {
309
+ sleepWind: false, naturalWind: false,
310
+ ...fan.windSetting
311
+ };
312
+ // Log the new values
313
+ const { onOff, airflowDirection, fanMode, percentSetting, rockSetting, speedSetting, windSetting, percentCurrent, speedCurrent } = fan;
314
+ this.log.info(`${AN}On/Off${RI}: ${onOff ? 'On' : 'Off'}`);
315
+ const logParts = [
316
+ `current speed ${AV}${speedCurrent}${RI} (${AV}${percentCurrent}${RI} %)`,
317
+ `set speed ${AV}${speedSetting}${RI} (${AV}${percentSetting}${RI} %)`,
318
+ formatEnumLog(FanControl.FanMode, fanMode)
319
+ ];
320
+ if (rockSetting?.rockLeftRight)
321
+ logParts.push('rock left/right');
322
+ if (rockSetting?.rockUpDown)
323
+ logParts.push('rock up/down');
324
+ if (rockSetting?.rockRound)
325
+ logParts.push('rock round');
326
+ if (windSetting?.sleepWind)
327
+ logParts.push('sleep wind');
328
+ if (windSetting?.naturalWind)
329
+ logParts.push('natural wind');
330
+ if (airflowDirection !== undefined) {
331
+ logParts.push(formatEnumLog(FanControl.AirflowDirection, airflowDirection));
332
+ }
333
+ this.log.info(`${AN}Fan Control${RI}: ${formatList(logParts)}`);
334
+ // Perform the cluster attribute updates
335
+ const fanAttributes = ['airflowDirection', 'fanMode', 'percentSetting', 'rockSetting',
336
+ 'speedSetting', 'windSetting', 'percentCurrent', 'speedCurrent'];
337
+ await Promise.all([
338
+ this.setAttribute(endpoint, OnOff.Cluster.id, 'onOff', onOff),
339
+ ...fanAttributes.map(key => fan[key] && this.setAttribute(endpoint, FanControl.Cluster.id, key, fan[key]))
340
+ ]);
341
+ }
342
+ // Update the Thermostat cluster attributes
343
+ async updateThermostat(thermostat) {
344
+ const endpoint = this.thermostat;
345
+ if (!endpoint)
346
+ return;
347
+ // Matterbridge detects missing bitmap values as changes, so set defaults
348
+ thermostat.thermostatRunningState = {
349
+ cool: false, heatStage2: false, coolStage2: false, fanStage2: false, fanStage3: false,
350
+ ...thermostat.thermostatRunningState
351
+ };
352
+ // Log the new values
353
+ const { occupiedHeatingSetpoint, systemMode, localTemperature, piHeatingDemand, thermostatRunningState } = thermostat;
354
+ const logParts = [
355
+ formatEnumLog(Thermostat.SystemMode, systemMode),
356
+ `demand ${AV}${piHeatingDemand}${RI} %`,
357
+ `target ${AV}${(occupiedHeatingSetpoint / 100).toFixed(2)}${RI} °C`
358
+ ];
359
+ if (localTemperature !== null) {
360
+ logParts.push(`currently ${AV}${(localTemperature / 100).toFixed(2)}${RI} °C`);
361
+ }
362
+ if (thermostatRunningState.heat)
363
+ logParts.push('heating');
364
+ if (thermostatRunningState.fanStage3)
365
+ logParts.push('fan stage 3');
366
+ else if (thermostatRunningState.fanStage2)
367
+ logParts.push('fan stage 2');
368
+ else if (thermostatRunningState.fan)
369
+ logParts.push('fan stage 1');
370
+ this.log.info(`${AN}Thermostat${RI}: ${formatList(logParts)}`);
371
+ // Perform the cluster attribute updates
372
+ const attributes = ['occupiedHeatingSetpoint', 'systemMode', 'localTemperature',
373
+ 'piHeatingDemand', 'thermostatRunningState'];
374
+ await Promise.all(attributes.map(key => this.setAttribute(endpoint, Thermostat.Cluster.id, key, thermostat[key])));
375
+ }
376
+ // Update the HEPA and Activated Carbon Filter Monitoring cluster attributes
377
+ async updateFilterMonitoring(filters) {
378
+ const updateCluster = async (clusterId, name, { condition, changeIndication, inPlaceIndicator }) => {
379
+ // Log the new values
380
+ this.log.info(`${AN}${name} Filter${RI}: ${AV}${condition}${RI}% `
381
+ + formatEnumLog(ResourceMonitoring.ChangeIndication, changeIndication)
382
+ + `${inPlaceIndicator ? '' : ' not'} installed`);
383
+ // Perform the cluster attribute updates
384
+ const endpoint = this.purifier;
385
+ await Promise.all([
386
+ this.setAttribute(endpoint, clusterId, 'condition', condition),
387
+ this.setAttribute(endpoint, clusterId, 'changeIndication', changeIndication),
388
+ inPlaceIndicator && this.setAttribute(endpoint, clusterId, 'inPlaceIndicator', inPlaceIndicator)
389
+ ]);
390
+ };
391
+ // Update the status of both filters
392
+ const { hepa, carbon } = filters;
393
+ await updateCluster(HepaFilterMonitoring.Cluster.id, 'HEPA', hepa);
394
+ if (carbon)
395
+ await updateCluster(ActivatedCarbonFilterMonitoring.Cluster.id, 'Activated Carbon', carbon);
396
+ }
397
+ // Update all of the Air Quality and Measurement cluster attributes
398
+ async updateSensors(measurements) {
399
+ const { airQuality, temperature, humidity, voc, co2, nox, hcho, pm25, pm10 } = measurements;
400
+ // Log the new values
401
+ const logMeasurements = [];
402
+ const logEnum = (value, enumType, suffix) => {
403
+ if (value === undefined)
404
+ return;
405
+ logMeasurements.push(`${formatEnumLog(enumType, value)} ${suffix}`);
406
+ };
407
+ const logNumber = (value, transform, suffix) => {
408
+ if (value === undefined)
409
+ return;
410
+ const formatted = transform && value !== null ? transform(value) : value;
411
+ logMeasurements.push(`${AV}${formatted}${RI} ${suffix}`);
412
+ };
413
+ logEnum(airQuality, AirQuality.AirQualityEnum, 'air quality');
414
+ logNumber(temperature, (v) => (v / 100).toFixed(2), '°C');
415
+ logNumber(humidity, (v) => (v / 100).toFixed(2), '% RH');
416
+ logEnum(voc, ConcentrationMeasurement.LevelValue, 'VOC');
417
+ logNumber(co2, undefined, 'ppm CO2');
418
+ logEnum(nox, ConcentrationMeasurement.LevelValue, 'NOx');
419
+ logNumber(hcho, undefined, 'µg/m³ H-CHO');
420
+ logNumber(pm25, undefined, 'µg/m³ PM2.5');
421
+ logNumber(pm10, undefined, 'µg/m³ PM10');
422
+ this.log.info(`${AN}Air Quality Measurements${RI}: ${formatList(logMeasurements)}`);
423
+ // Perform the cluster attribute updates
424
+ const attributes = [
425
+ [this.airQuality, AirQuality.Cluster.id, 'airQuality', airQuality],
426
+ [this.temperature, TemperatureMeasurement.Cluster.id, 'measuredValue', temperature],
427
+ [this.humidity, RelativeHumidityMeasurement.Cluster.id, 'measuredValue', humidity],
428
+ [this.airQuality, TotalVolatileOrganicCompoundsConcentrationMeasurement.Cluster.id, 'levelValue', voc],
429
+ [this.airQuality, CarbonDioxideConcentrationMeasurement.Cluster.id, 'levelValue', co2],
430
+ [this.airQuality, NitrogenDioxideConcentrationMeasurement.Cluster.id, 'levelValue', nox],
431
+ [this.airQuality, FormaldehydeConcentrationMeasurement.Cluster.id, 'levelValue', hcho],
432
+ [this.airQuality, Pm25ConcentrationMeasurement.Cluster.id, 'measuredValue', pm25],
433
+ [this.airQuality, Pm10ConcentrationMeasurement.Cluster.id, 'measuredValue', pm10]
434
+ ];
435
+ const updatePromises = attributes.flatMap(([endpoints, clusterId, attribute, value]) => value === undefined ? [] : endpoints.map(e => this.setAttribute(e, clusterId, attribute, value)));
436
+ await Promise.all(updatePromises);
437
+ }
438
+ // Write an attribute value, recording it to filter from subscriptions
439
+ async setAttribute(endpoint, clusterId, attribute, value) {
440
+ if (!endpoint)
441
+ return false;
442
+ const key = [endpoint.id, clusterId, attribute].join(':');
443
+ this.changed.setLast(key, value);
444
+ return endpoint.updateAttribute(clusterId, attribute, value, this.log);
445
+ }
446
+ // Filter an attribute changed event
447
+ isAttributeChanged(endpoint, clusterId, attribute, value) {
448
+ const key = [endpoint.id, clusterId, attribute].join(':');
449
+ return this.changed.isChanged(key, value);
450
+ }
451
+ // Ensure that the next MQTT status update is applied to the clusters
452
+ updateNextStatus() {
453
+ this.changed.flush('updateFanControl');
454
+ this.changed.flush('updateThermostat');
455
+ }
456
+ };
457
+ })();
458
+ export { EndpointsAir };
459
+ //# sourceMappingURL=endpoint-air.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-air.js","sourceRoot":"","sources":["../src/endpoint-air.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { AtLeastOne, DeviceTypeDefinition, MatterbridgeEndpoint } from 'matterbridge';
2
+ import { BasicInformation } from 'matterbridge/matter/clusters';
3
+ import { AnsiLogger } from 'matterbridge/logger';
4
+ import { Config } from './config-types.js';
5
+ import { Changed } from './decorator-changed.js';
6
+ export interface DeviceBasicInformationOptions {
7
+ uniqueId: string;
8
+ hardwareVersion?: string;
9
+ manufacturingDate?: string;
10
+ nodeLabel?: string;
11
+ partNumber?: string;
12
+ productAppearance?: BasicInformation.ProductAppearance;
13
+ productId?: number;
14
+ productLabel?: string;
15
+ productName?: string;
16
+ productUrl?: string;
17
+ serialNumber?: string;
18
+ softwareVersion?: string;
19
+ vendorId?: number;
20
+ vendorName?: string;
21
+ }
22
+ export interface EndpointOptionsBase {
23
+ uniqueStorageKey: string;
24
+ matterbridgeDeviceName: string;
25
+ deviceBasicInformation: DeviceBasicInformationOptions;
26
+ }
27
+ export type EndpointLike = Pick<EndpointBase, 'behaviors' | 'log' | 'triggerEvent' | 'updateAttribute' | 'changed'>;
28
+ export declare class EndpointBase extends MatterbridgeEndpoint {
29
+ readonly config: Config;
30
+ changed: Changed;
31
+ constructor(log: AnsiLogger, config: Config, options: EndpointOptionsBase, definition: DeviceTypeDefinition | AtLeastOne<DeviceTypeDefinition>);
32
+ createBridgedDeviceBasicInformationClusterServer(options: DeviceBasicInformationOptions): this;
33
+ updateReachable(reachable: boolean): Promise<void>;
34
+ }
35
+ export declare function formatEnumLog<T extends Record<string, number | string>>(enumMap: T, value: T[keyof T] extends number ? T[keyof T] : never): string;
36
+ //# sourceMappingURL=endpoint-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-base.d.ts","sourceRoot":"","sources":["../src/endpoint-base.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,gBAAgB,EAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,OAAO,EAAE,OAAO,EAAkB,MAAM,wBAAwB,CAAC;AAIjE,MAAM,WAAW,6BAA6B;IAE1C,QAAQ,EAAgB,MAAM,CAAC;IAE/B,eAAe,CAAC,EAAQ,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAM,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAc,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAa,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAM,gBAAgB,CAAC,iBAAiB,CAAC;IAC3D,SAAS,CAAC,EAAc,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAW,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAY,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAa,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAW,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAQ,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAe,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAa,MAAM,CAAC;CAClC;AACD,MAAM,WAAW,mBAAmB;IAEhC,gBAAgB,EAAQ,MAAM,CAAC;IAE/B,sBAAsB,EAAE,MAAM,CAAC;IAE/B,sBAAsB,EAAE,6BAA6B,CAAC;CACzD;AAGD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EACxC,WAAW,GAAG,KAAK,GAAG,cAAc,GAAG,iBAAiB,GAAG,SAAS,CACvE,CAAC;AAGF,qBAAa,YAAa,SAAQ,oBAAoB;IAQ9C,QAAQ,CAAC,MAAM,EAAK,MAAM;IAL9B,OAAO,EAAE,OAAO,CAAC;gBAIb,GAAG,EAAiB,UAAU,EACrB,MAAM,EAAK,MAAM,EAC1B,OAAO,EAAa,mBAAmB,EACvC,UAAU,EAAU,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IA0B/E,gDAAgD,CAAC,OAAO,EAAE,6BAA6B,GAAG,IAAI;IAiDxF,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAO3D;AAGD,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACnE,OAAO,EAAK,CAAC,EACb,KAAK,EAAO,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAC3D,MAAM,CAGR"}