@iobroker/gui-components 10.3.9 → 10.3.11

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/README.md CHANGED
@@ -36,7 +36,7 @@ npm create vite@latest src -- --template react-ts
36
36
  "dependencies": {
37
37
  "@emotion/react": "^11.14.0",
38
38
  "@emotion/styled": "^11.14.1",
39
- "@iobroker/gui-components": "^10.3.9",
39
+ "@iobroker/gui-components": "^10.3.11",
40
40
  "@mui/icons-material": "^9.0.1",
41
41
  "@mui/material": "^9.0.1",
42
42
  "react": "^19.2.5",
@@ -877,6 +877,14 @@ You can find the migration instructions:
877
877
  -->
878
878
 
879
879
  ## Changelog
880
+ ### 10.3.11 (2026-10-14)
881
+ - (@GermanBluefox) Changed: `GenericApp` asks for the system configuration, the instance object and the state of the Sentry plugin at once instead of one after the other, and does not wait for the UUID of the system anymore before `onConnectionReady()` - three round trips less before an app gets its turn, which a remote connection pays most for
882
+ - (@GermanBluefox) Changed: the Sentry SDK (180 KB) is only loaded when the instance really reports errors. It was part of every app before its first frame. Errors of the very first moment of an app are not reported anymore, as they were not before the UUID was read either
883
+ - (@GermanBluefox) Added: `"sideEffects": ["*.css"]` in package.json. Without it a bundler had to keep every module of the package that runs anything at its top level as soon as one export was used - the object browser, the file browser, the cron editor, the icon library. In vis-2 that was 1.5 MB in a runtime that uses ten exports
884
+
885
+ ### 10.3.10 (2026-10-13)
886
+ - (@GermanBluefox) Fixed: the labels of the device types `rgb` and `rgbSingle`/`rgbwSingle` were swapped - `rgb` is now "R,G,B light - separate states" and `rgbSingle`/`rgbwSingle` are "RGB(W) light - single state"
887
+
880
888
  ### 10.3.9 (2026-10-03)
881
889
  - (@GermanBluefox) Added: the context menu of the object browser has an entry "Edit name" (Alt+9). Giving an object a name is an everyday operation, so it needs neither the expert mode nor the big "Edit object" dialog, which the expert mode hides - it stands next to "Edit function" and "Edit room" and is offered wherever those are. A name that is translated keeps its other languages: only the language of the GUI is written, and the dialog says which languages stay untouched (ioBroker.admin#3640)
882
890
 
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Prozentsatz",
38
38
  "type-pressure": "Druck",
39
39
  "type-pump": "Pumpe",
40
- "type-rgb": "RGB-Licht",
41
- "type-rgbSingle": "R,G,B-Licht Einzelwerte",
42
- "type-rgbwSingle": "R,G,B,W-Licht Einzelwerte",
40
+ "type-rgb": "R,G,B-Licht - Einzelwerte",
41
+ "type-rgbSingle": "RGB-Licht - ein State",
42
+ "type-rgbwSingle": "RGBW-Licht - ein State",
43
43
  "type-slider": "Schieberegler",
44
44
  "type-socket": "Steckdose",
45
45
  "type-temperature": "Temperatur",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Percentage",
38
38
  "type-pressure": "Pressure",
39
39
  "type-pump": "Pump",
40
- "type-rgb": "RGB light",
41
- "type-rgbSingle": "R,G,B light - single states",
42
- "type-rgbwSingle": "R,G,B,W light - single states",
40
+ "type-rgb": "R,G,B light - separate states",
41
+ "type-rgbSingle": "RGB light - single state",
42
+ "type-rgbwSingle": "RGBW light - single state",
43
43
  "type-slider": "Slider",
44
44
  "type-socket": "Socket",
45
45
  "type-temperature": "Temperature",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Porcentaje",
38
38
  "type-pressure": "Presión",
39
39
  "type-pump": "Bomba",
40
- "type-rgb": "Luz RGB",
41
- "type-rgbSingle": "Luz RGB individual",
42
- "type-rgbwSingle": "RGBW como valor único",
40
+ "type-rgb": "Luz R,G,B - valores separados",
41
+ "type-rgbSingle": "Luz RGB - valor único",
42
+ "type-rgbwSingle": "Luz RGBW - valor único",
43
43
  "type-slider": "control deslizante",
44
44
  "type-socket": "enchufe",
45
45
  "type-temperature": "temperatura",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Pourcentage",
38
38
  "type-pressure": "Pression",
39
39
  "type-pump": "Pompe",
40
- "type-rgb": "lumière RVB",
41
- "type-rgbSingle": "Lumière RVB simple",
42
- "type-rgbwSingle": "RGBW comme valeur unique",
40
+ "type-rgb": "Lumière R,V,B - valeurs séparées",
41
+ "type-rgbSingle": "Lumière RVB - valeur unique",
42
+ "type-rgbwSingle": "Lumière RVBW - valeur unique",
43
43
  "type-slider": "curseur",
44
44
  "type-socket": "douille",
45
45
  "type-temperature": "température",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Percentuale",
38
38
  "type-pressure": "Pressione",
39
39
  "type-pump": "Pompa",
40
- "type-rgb": "luce RGB",
41
- "type-rgbSingle": "Luce RGB singola",
42
- "type-rgbwSingle": "RGBW come valore singolo",
40
+ "type-rgb": "Luce R,G,B - valori separati",
41
+ "type-rgbSingle": "Luce RGB - valore singolo",
42
+ "type-rgbwSingle": "Luce RGBW - valore singolo",
43
43
  "type-slider": "cursore",
44
44
  "type-socket": "PRESA",
45
45
  "type-temperature": "temperatura",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Percentage",
38
38
  "type-pressure": "Druk",
39
39
  "type-pump": "Pomp",
40
- "type-rgb": "RGB-licht",
41
- "type-rgbSingle": "RGB-licht enkel",
42
- "type-rgbwSingle": "RGBW als enkele waarde",
40
+ "type-rgb": "R,G,B-licht - afzonderlijke waarden",
41
+ "type-rgbSingle": "RGB-licht - enkele waarde",
42
+ "type-rgbwSingle": "RGBW-licht - enkele waarde",
43
43
  "type-slider": "schuifregelaar",
44
44
  "type-socket": "stopcontact",
45
45
  "type-temperature": "temperatuur",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Procent",
38
38
  "type-pressure": "Ciśnienie",
39
39
  "type-pump": "Pompa",
40
- "type-rgb": "Światło RGB",
41
- "type-rgbSingle": "Pojedyncze światło RGB",
42
- "type-rgbwSingle": "RGBW jako pojedyncza wartość",
40
+ "type-rgb": "Światło R,G,B - osobne wartości",
41
+ "type-rgbSingle": "Światło RGB - pojedyncza wartość",
42
+ "type-rgbwSingle": "Światło RGBW - pojedyncza wartość",
43
43
  "type-slider": "suwak",
44
44
  "type-socket": "gniazdo",
45
45
  "type-temperature": "temperatura",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Percentagem",
38
38
  "type-pressure": "Pressão",
39
39
  "type-pump": "Bomba",
40
- "type-rgb": "Luz RGB",
41
- "type-rgbSingle": "Luz RGB única",
42
- "type-rgbwSingle": "RGBW como valor único",
40
+ "type-rgb": "Luz R,G,B - valores separados",
41
+ "type-rgbSingle": "Luz RGB - valor único",
42
+ "type-rgbwSingle": "Luz RGBW - valor único",
43
43
  "type-slider": "controle deslizante",
44
44
  "type-socket": "soquete",
45
45
  "type-temperature": "temperatura",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Проценты",
38
38
  "type-pressure": "Давление",
39
39
  "type-pump": "Насос",
40
- "type-rgb": "RGB свет",
41
- "type-rgbSingle": "R,G,B как отдельные значение",
42
- "type-rgbwSingle": "R,G,B,W как отдельные значение",
40
+ "type-rgb": "R,G,B свет - отдельные значения",
41
+ "type-rgbSingle": "RGB свет - одно значение",
42
+ "type-rgbwSingle": "RGBW свет - одно значение",
43
43
  "type-slider": "Ползунок",
44
44
  "type-socket": "Розетка",
45
45
  "type-temperature": "Температура",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "Відсоток",
38
38
  "type-pressure": "Тиск",
39
39
  "type-pump": "Насос",
40
- "type-rgb": "RGB світло",
41
- "type-rgbSingle": "Одиночне світло RGB",
42
- "type-rgbwSingle": "RGBW як одне значення",
40
+ "type-rgb": "R,G,B світло - окремі значення",
41
+ "type-rgbSingle": "RGB світло - одне значення",
42
+ "type-rgbwSingle": "RGBW світло - одне значення",
43
43
  "type-slider": "повзунок",
44
44
  "type-socket": "гніздо",
45
45
  "type-temperature": "температура",
@@ -37,9 +37,9 @@
37
37
  "type-percentage": "百分比",
38
38
  "type-pressure": "压力",
39
39
  "type-pump": "泵",
40
- "type-rgb": "RGB灯",
41
- "type-rgbSingle": "RGB灯单",
42
- "type-rgbwSingle": "RGBW 作为单一值",
40
+ "type-rgb": "R,G,B 灯 - 独立值",
41
+ "type-rgbSingle": "RGB 灯 - 单一值",
42
+ "type-rgbwSingle": "RGBW 灯 - 单一值",
43
43
  "type-slider": "滑块",
44
44
  "type-socket": "插座",
45
45
  "type-temperature": "温度",
@@ -41,6 +41,16 @@ export declare class GenericApp<TProps extends GenericAppProps = GenericAppProps
41
41
  private sentryInited;
42
42
  private resizeTimer;
43
43
  constructor(props: TProps, settings?: GenericAppSettings);
44
+ /**
45
+ * Report the errors of this app to Sentry.
46
+ *
47
+ * The SDK is loaded only here: it is 180 KB, and every app would otherwise load it before its first frame,
48
+ * whether the instance reports anything or not. Nothing waits for it - the errors of the first moment go
49
+ * unreported, as they did while the identification of the system was still being read.
50
+ *
51
+ * @param instanceObj the object of the instance this app belongs to
52
+ */
53
+ private startSentry;
44
54
  /**
45
55
  * Checks if this connection is running in a web adapter and not in an admin.
46
56
  *
@@ -6,7 +6,6 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import { PROGRESS, Connection } from '@iobroker/socket-client';
9
- import * as Sentry from '@sentry/browser';
10
9
  import { Snackbar, IconButton } from '@mui/material';
11
10
  import { Close as IconClose } from '@mui/icons-material';
12
11
  import { printPrompt } from './Prompt';
@@ -243,20 +242,25 @@ export class GenericApp extends Router {
243
242
  },
244
243
  onReady: ( /* objects, scripts */) => {
245
244
  I18n.setLanguage(this.socket.systemLang);
246
- // subscribe because of language and expert mode
247
- this.socket
248
- .subscribeObject('system.config', this.onSystemConfigChanged)
249
- .then(() => this.getSystemConfig())
250
- .then(obj => {
245
+ // All of this is asked for at once. It used to be four round trips one after the other, plus a
246
+ // fifth for Sentry, and the app only got its turn (`onConnectionReady`) after all of them - which
247
+ // is what a remote connection pays most for.
248
+ Promise.all([
249
+ // subscribe because of language and expert mode
250
+ this.socket.subscribeObject('system.config', this.onSystemConfigChanged),
251
+ this.getSystemConfig(),
252
+ this.socket.getObject(this.instanceId),
253
+ this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`),
254
+ ])
255
+ .then(([, systemConfig, obj, sentryState]) => {
251
256
  this._secret =
252
- (typeof obj !== 'undefined' && obj.native && obj.native.secret) || 'Zgfr56gFe87jJOM';
253
- this._systemConfig = obj?.common || {};
254
- return this.socket.getObject(this.instanceId);
255
- })
256
- .then(async (obj) => {
257
- let waitPromise;
257
+ (typeof systemConfig !== 'undefined' &&
258
+ systemConfig.native &&
259
+ systemConfig.native.secret) ||
260
+ 'Zgfr56gFe87jJOM';
261
+ this._systemConfig = systemConfig?.common || {};
258
262
  const instanceObj = obj;
259
- const sentryPluginEnabled = (await this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`))?.val;
263
+ const sentryPluginEnabled = sentryState?.val;
260
264
  const sentryEnabled = sentryPluginEnabled !== false &&
261
265
  this._systemConfig?.diag !== 'none' &&
262
266
  instanceObj?.common &&
@@ -265,44 +269,24 @@ export class GenericApp extends Router {
265
269
  // @ts-expect-error will be extended in js-controller TODO: (BF: 2024.05.30) this is redundant to state `${this.instanceId}.plugins.sentry.enabled`, remove this in future when admin sets the state correctly
266
270
  !instanceObj.common.disableDataReporting &&
267
271
  window.location.host !== 'localhost:3000';
268
- // activate sentry plugin
269
- if (!this.sentryStarted && this.sentryDSN && sentryEnabled) {
270
- this.sentryStarted = true;
271
- Sentry.init({
272
- dsn: this.sentryDSN,
273
- release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,
274
- integrations: [Sentry.dedupeIntegration()],
275
- });
276
- console.log('Sentry initialized');
277
- }
278
- // read UUID and init sentry with it.
279
- // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined
280
272
  if (!this.sentryInited && sentryEnabled) {
281
273
  this.sentryInited = true;
282
- waitPromise = this.socket.getObject('system.meta.uuid').then(uuidObj => {
283
- if (uuidObj && uuidObj.native && uuidObj.native.uuid) {
284
- const scope = Sentry.getCurrentScope();
285
- scope.setUser({ id: uuidObj.native.uuid });
286
- }
287
- });
274
+ this.startSentry(instanceObj);
275
+ }
276
+ if (instanceObj) {
277
+ this.common = instanceObj?.common;
278
+ this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets
279
+ this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));
280
+ this.setState({ native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() }, () => this.onConnectionReady && this.onConnectionReady());
281
+ }
282
+ else {
283
+ console.warn('Cannot load instance settings');
284
+ this.setState({
285
+ native: {},
286
+ loaded: true,
287
+ expertMode: this.getExpertMode(),
288
+ }, () => this.onConnectionReady && this.onConnectionReady());
288
289
  }
289
- waitPromise = waitPromise instanceof Promise ? waitPromise : Promise.resolve();
290
- void waitPromise.then(() => {
291
- if (instanceObj) {
292
- this.common = instanceObj?.common;
293
- this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets
294
- this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));
295
- this.setState({ native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() }, () => this.onConnectionReady && this.onConnectionReady());
296
- }
297
- else {
298
- console.warn('Cannot load instance settings');
299
- this.setState({
300
- native: {},
301
- loaded: true,
302
- expertMode: this.getExpertMode(),
303
- }, () => this.onConnectionReady && this.onConnectionReady());
304
- }
305
- });
306
290
  })
307
291
  .catch(e => window.alert(`Cannot settings: ${e}`));
308
292
  },
@@ -312,6 +296,38 @@ export class GenericApp extends Router {
312
296
  },
313
297
  });
314
298
  }
299
+ /**
300
+ * Report the errors of this app to Sentry.
301
+ *
302
+ * The SDK is loaded only here: it is 180 KB, and every app would otherwise load it before its first frame,
303
+ * whether the instance reports anything or not. Nothing waits for it - the errors of the first moment go
304
+ * unreported, as they did while the identification of the system was still being read.
305
+ *
306
+ * @param instanceObj the object of the instance this app belongs to
307
+ */
308
+ startSentry(instanceObj) {
309
+ void import('@sentry/browser')
310
+ .then(async (Sentry) => {
311
+ // activate sentry plugin
312
+ if (!this.sentryStarted && this.sentryDSN) {
313
+ this.sentryStarted = true;
314
+ Sentry.init({
315
+ dsn: this.sentryDSN,
316
+ release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,
317
+ integrations: [Sentry.dedupeIntegration()],
318
+ });
319
+ console.log('Sentry initialized');
320
+ }
321
+ // read UUID and init sentry with it.
322
+ // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined
323
+ const uuidObj = await this.socket.getObject('system.meta.uuid');
324
+ if (uuidObj?.native?.uuid) {
325
+ const scope = Sentry.getCurrentScope();
326
+ scope.setUser({ id: uuidObj.native.uuid });
327
+ }
328
+ })
329
+ .catch(e => console.warn(`Cannot start Sentry: ${e}`));
330
+ }
315
331
  /**
316
332
  * Checks if this connection is running in a web adapter and not in an admin.
317
333
  *
@@ -1 +1 @@
1
- {"version":3,"file":"GenericApp.js","sourceRoot":"./src/","sources":["GenericApp.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAwB,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAW9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAmB1C,wBAAwB;AACxB,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDhB,CAAC;AAEF,SAAS,QAAQ;IACb,IAAI,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,OAAO,UAGX,SAAQ,MAAsB;IAClB,MAAM,CAAkB;IAExB,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAEb,QAAQ,CAAS;IAEjB,WAAW,CAAS;IAEpB,UAAU,CAAS;IAEnB,QAAQ,CAAU;IAE3B,eAAe,CAAW;IAEjB,SAAS,CAAqB;IAEzC,mBAAmB,CAAU;IAE7B,OAAO,CAAqB;IAE1B,aAAa,CAA0C;IAEjE,qBAAqB;IACb,WAAW,CAAsB;IAE/B,MAAM,GAAmC,IAAI,CAAC;IAEhD,aAAa,GAAY,KAAK,CAAC;IAE/B,YAAY,GAAY,KAAK,CAAC;IAE9B,WAAW,GAAyC,IAAI,CAAC;IAEjE,YAAY,KAAa,EAAE,QAA6B;QACpD,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,UAAU;YACrC,QAAQ,EAAE,UAAU;YACpB,UAAU,CAAsC,CAAC;QACrD,qKAAqK;QAErK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrD,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;YAC3D,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,gHAAgH;QAChH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtE,IAAI,CAAC;gBACD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACrC,OAAO,MAAM,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;QACL,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,CAAC;QAEb,WAAW,EAAE,CAAC;QAEd,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,GAIN,EAAE,CAAC;QACP,KAAK;aACA,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACrB,OAAO,CAAC,CAAC,CAAC,EAAE;YACT,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC3B,IAAyC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACrF,IAAK,IAAyC,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC7D,IAAyC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC5D,CAAC;iBAAM,IAAK,IAAyC,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;gBACrE,IAAyC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC7D,CAAC;QACL,CAAC,CAAC,CAAC;QAEP,4BAA4B;QAC5B,IAAI,CAAC,QAAQ;YACT,QAAQ,EAAE,QAAQ;gBAClB,KAAK,CAAC,QAAQ;gBACd,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;oBACxB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAkB,EAAE,EAAE,CAAC,IAAI,CAAC;oBAC5C,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,gCAAgC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW;YACZ,QAAQ,EAAE,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;QACrG,IAAI,CAAC,UAAU,GAAG,kBAAkB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,eAAe;QAEvD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,QAAQ,CAAC,GAAG;YACR,QAAQ,CAAC,GAAG;gBACZ,CAAE,MAAc,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,UAAU,CAAC;gBAC7F,EAAE,CAAC;QAEP,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,GAAG;YACT,GAAG,IAAI,CAAC,KAAK,EAAE,0BAA0B;YACzC,WAAW,EACP,CAAE,MAAc,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,UAAU,CAAC,IAAI,EAAE;YACvG,cAAc,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,KAAK;YACb,oBAAoB,EAAE,EAAE;YACxB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YAC3C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YAC3C,aAAa,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,KAAK;YACtG,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC5B,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,EAAE;SACpB,CAAC;QAEF,oBAAoB;QACpB,MAAM,YAAY,GAAuD,UAAU,CAAC;QAEpF,iBAAiB;QACjB,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC9C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;oBACxB,YAAY,CAAC,IAA0B,CAAC,GAAG,MAAM,CAAC,MAAM,CACpD,YAAY,CAAC,IAA0B,CAAC,EACxC,QAAQ,CAAC,YAAY,CAAC,IAA0B,CAAC,IAAI,EAAE,CAC1D,CAAC;gBACN,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC3C,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACrB,YAAY,CAAC,IAA0B,CAAC,GAAG,MAAM,CAAC,MAAM,CACpD,YAAY,CAAC,IAA0B,CAAC,EACxC,KAAK,CAAC,YAAY,CAAC,IAA0B,CAAC,IAAI,EAAE,CACvD,CAAC;gBACN,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAEnC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,kCAAkC;QAEzD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC;QAEhF,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QAExD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACrG,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7F,MAAM,CAAC,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1E,CAAC;QACL,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,OAAO;YACX,CAAC;YACD,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC,CAAC;QAEF,iJAAiJ;QACjJ,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC;YAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB;YAClD,UAAU,EAAE,CAAC,QAAkB,EAAE,EAAE;gBAC/B,IAAI,QAAQ,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,EAAC,sBAAsB,EAAE,EAAE;gBAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAEzC,gDAAgD;gBAChD,IAAI,CAAC,MAAM;qBACN,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,qBAAqB,CAAC;qBAC5D,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;qBAClC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACR,IAAI,CAAC,OAAO;wBACR,CAAC,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC;oBACzF,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE,MAAM,IAAK,EAAkC,CAAC;oBACxE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClD,CAAC,CAAC;qBACD,IAAI,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;oBACd,IAAI,WAAW,CAAC;oBAChB,MAAM,WAAW,GAA+C,GAClB,CAAC;oBAE/C,MAAM,mBAAmB,GAAG,CACxB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,yBAAyB,CAAC,CAC1E,EAAE,GAAG,CAAC;oBAEP,MAAM,aAAa,GACf,mBAAmB,KAAK,KAAK;wBAC7B,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,MAAM;wBACnC,WAAW,EAAE,MAAM;wBACnB,WAAW,CAAC,MAAM,CAAC,IAAI;wBACvB,WAAW,CAAC,MAAM,CAAC,OAAO;wBAC1B,8MAA8M;wBAC9M,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB;wBACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,gBAAgB,CAAC;oBAE9C,yBAAyB;oBACzB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC;wBACzD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wBAE1B,MAAM,CAAC,IAAI,CAAC;4BACR,GAAG,EAAE,IAAI,CAAC,SAAS;4BACnB,OAAO,EAAE,YAAY,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE;4BAC5E,YAAY,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;yBAC7C,CAAC,CAAC;wBAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBACtC,CAAC;oBAED,qCAAqC;oBACrC,8IAA8I;oBAC9I,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,CAAC;wBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;wBAEzB,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;4BACnE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gCACnD,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;gCACvC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;4BAC/C,CAAC;wBACL,CAAC,CAAC,CAAC;oBACP,CAAC;oBAED,WAAW,GAAG,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBAE/E,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;wBACvB,IAAI,WAAW,EAAE,CAAC;4BACd,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,MAAM,CAAC;4BAClC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB;4BAC1F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;4BAClE,IAAI,CAAC,QAAQ,CACT,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,EAC9E,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAC3D,CAAC;wBACN,CAAC;6BAAM,CAAC;4BACJ,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;4BAC9C,IAAI,CAAC,QAAQ,CACT;gCACI,MAAM,EAAE,EAAE;gCACV,MAAM,EAAE,IAAI;gCACZ,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;6BACnC,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAC3D,CAAC;wBACN,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK;QACR,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,IAA+C;QACtE,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAClF,IAAI,GAAG,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC;YACV,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,OAAO;SACzB,CAAC,CAAC;IACP,CAAC;IAED,mBAAmB;QACf,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,OAAO,CACH,oBAAC,QAAQ,IACL,KAAK,EACD,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,OAAO;gBAC7B,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE;gBAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;oBACnC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE;oBAChC,CAAC,CAAC,SAAS,EAErB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EACvB,gBAAgB,EAAE,IAAI,EACtB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EACnF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GACnC,CACL,CAAC;IACN,CAAC;IAED,qBAAqB,GAAG,CAAC,EAAU,EAAE,GAA0C,EAAQ,EAAE;QACrF,IAAI,GAAG,IAAI,EAAE,KAAK,eAAe,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAM,GAAmC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,UAAU,GAAI,GAAmC,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;gBACvF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,EAAE,UAAU,KAAK,CAAC,CAAE,GAAmC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;gBAChG,IAAI,CAAC,aAAa;oBACb,GAAmC,EAAE,MAAM,IAAK,EAAkC,CAAC;gBACxF,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,aAAa;oBACb,GAAmC,EAAE,MAAM,IAAK,EAAkC,CAAC;YAC5F,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF;;OAEG;IACH,iBAAiB;QACb,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACjE,KAAK,CAAC,iBAAiB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAChB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;YAClC,OAAO,MAAM,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,KAAK,CAAC,oBAAoB,EAAE,CAAC;IACjC,CAAC;IAED,gBAAgB,GAAG,CAAC,OAAmD,EAAQ,EAAE;QAC7E,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAChB,IACI,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC;gBACpE,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,EAC3F,CAAC;gBACC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC1C,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;gBAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBAEhD,IAAI,CAAC,QAAQ,CACT;oBACI,KAAK,EAAE,QAAQ;oBACf,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;oBACtC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;iBACzC,EACD,GAAG,EAAE;oBACD,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;oBACnE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;gBAC7D,CAAC,CACJ,CAAC;YACN,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC7C,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YAC7E,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,gCAAgC;gBAChC,OAAO,CAAC,KAAK,CACT,8BAA8B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,sCAAsC,CACnG,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,QAAQ;QACX;;;;WAIG;QAEH,MAAM,KAAK,GAA0B;YACjC,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,GAAG;YACP,EAAE,EAAE,GAAG;YACP,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,IAAI;SACX,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,GAAY,CAAC,CAAU,CAAC;QAE9E,OAAO,aAAa,IAAI,IAAI,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,kDAAkD;IAClD,WAAW,CAAC,IAAgC;QACxC,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,kDAAkD;IAClD,YAAY,CAAC,YAAsB;QAC/B,OAAO,YAAY,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,kDAAkD;IAClD,YAAY,CAAC,YAAsB;QAC/B,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,CAAC;IAED,kDAAkD;IAClD,cAAc,CAAC,aAAqB,IAAS,CAAC;IAE9C,kDAAkD;IAClD,kBAAkB,CAAC,WAAoB,IAAS,CAAC;IAEjD;;OAEG;IACH,WAAW,CAAC,YAAwB;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAEvC,uFAAuF;QACvF,2FAA2F;QAC3F,4EAA4E;QAC5E,YAAY,KAAK,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAEhD,IAAI,CAAC,QAAQ,CACT;gBACI,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;gBACtC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;aACzC,EACD,GAAG,EAAE;gBACD,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;gBAC9E,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;YACxE,CAAC,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,aAAa;QACT,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;IAC1G,CAAC;IAED;;;OAGG;IACH,kDAAkD;IAClD,iBAAiB,KAAU,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,KAAa;QACjB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,IAAI,MAAM,CAAC,YAAY,CACzB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAC5E,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACjB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,IAAI,MAAM,CAAC,YAAY,CACzB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAC5E,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,aAAa;QACT,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW,EAAE,KAAc;QACjC,CAAE,MAAc,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,UAAU,EAAE,GAAG,CAAC,CAAC;QACnG,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAA6B;QACvC,6BAA6B;QAC7B,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,aAAa,CAAC,QAA6B,EAAE,eAA0B;QACnE,6BAA6B;QAC7B,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC,CAAC,CAAC;QACH,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;YAClD,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QACxB,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CACnD,UAAU,EACV,iBAAiB,EACjB,uBAAuB,CAC1B,CAAC;YACF,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,IAAY;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,kBAAkB;QAClB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QACrD,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,IAAI,GAAG,oBAAoB,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,IAAI,GAAG,eAAe,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAiB;QACpB,IAAI,MAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;YAC9D,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM;aACN,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;aAC1B,IAAI,CAAC,OAAO,CAAC,EAAE;YACZ,MAAM,GAAG,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YAEpD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC7D,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAChC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBAC5B,CAAC;yBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxE,CAAC;yBAAM,CAAC;wBACJ,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC5B,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC/B,MAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBACrD,CAAC;yBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC3C,MAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CACvC,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACJ,OAAQ,MAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACrD,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YACjC,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;gBACnC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CACH,oBAAC,QAAQ,IACL,YAAY,EAAE;gBACV,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,MAAM;aACrB,EACD,IAAI,EAAE,CAAC,CAAC,EACR,gBAAgB,EAAE,IAAI,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAC3C,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,EAAE,EAC5D,OAAO,EAAE,8BAAM,EAAE,EAAC,YAAY,IAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAQ,EACxD,MAAM,EAAE;gBACJ,oBAAC,UAAU,IACP,GAAG,EAAC,OAAO,gBACA,OAAO,EAClB,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAC3C,IAAI,EAAC,OAAO;oBAEZ,oBAAC,SAAS,OAAG,CACJ;aAChB,GACH,CACL,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO;QACV,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACxD,IAAI,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBACzF,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CACH,oBAAC,WAAW,IACR,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,GACjD,CACL,CAAC;IACN,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,MAA2B;QACpC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9E,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;QAE/B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,SAA8B;QACvC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACL,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,SAAiB;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CACH;YACK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CACxB,oBAAC,gBAAgB,IACb,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,eAAe,EACX,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAEvF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAC3B,MAAM,EAAE,CAAC,OAAgB,EAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EACxD,OAAO,EAAE,GAAS,EAAE;oBAChB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;wBACrB,IAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACJ,UAAU,CAAC,OAAO,EAAE,CAAC;oBACzB,CAAC;gBACL,CAAC,EACD,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAC1C,CACL,CAAC,CAAC,CAAC,IAAI;YACP,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CACvB,oBAAC,aAAa,IACV,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAClC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,uCAAuC,CAAC,EACrD,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,EACxB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAC3B,OAAO,EAAE,CAAC,KAAc,EAAQ,EAAE,CAC9B,IAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,GAEjF,CACL,CAAC,CAAC,CAAC,IAAI,CACT,CACN,CAAC;IACN,CAAC;IAEO,kBAAkB,CAAC,GAAwB,EAAE,KAAwB,EAAE,KAAU;QACrF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,IAAI,GAAW,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBAClB,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBACtB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAClB,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,sBAAsB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAY,EAAE,KAAU,EAAE,EAAe;QACvD,MAAM,MAAM,GAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACL,SAAS;gBACb,CAAC;YACL,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAgC;QACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAiC;QACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,mBAAmB;QACf,OAAO,CACH;YACK,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CAC5B,CACN,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,oBAAC,MAAM,IAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAI,CAAC;QACvD,CAAC;QAED,OAAO,CACH,6BAAK,SAAS,EAAC,KAAK;YACf,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CACzB,CACT,CAAC;IACN,CAAC;CACJ","sourcesContent":["/**\n * Copyright 2018-2026 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { type JSX } from 'react';\nimport { PROGRESS, Connection, type AdminConnection } from '@iobroker/socket-client';\nimport * as Sentry from '@sentry/browser';\n\nimport { Snackbar, IconButton } from '@mui/material';\n\nimport { Close as IconClose } from '@mui/icons-material';\n\nimport { printPrompt } from './Prompt';\nimport { Theme } from './Theme';\nimport { Loader } from './Components/Loader';\nimport { Router } from './Components/Router';\nimport { Utils } from './Components/Utils';\nimport { SaveCloseButtons } from './Components/SaveCloseButtons';\nimport { DialogConfirm } from './Dialogs/Confirm';\nimport { I18n } from './i18n';\nimport { DialogError } from './Dialogs/Error';\nimport type {\n GenericAppProps,\n GenericAppState,\n GenericAppSettings,\n ThemeName,\n ThemeType,\n IobTheme,\n Width,\n} from './types';\n\nimport { dictionary } from './dictionary';\n\ndeclare global {\n /** If config has been changed */\n var changed: boolean;\n\n interface Window {\n io: any;\n SocketClient: any;\n adapterName: undefined | string;\n socketUrl: undefined | string;\n iobOldAlert: any;\n changed: boolean;\n $iframeDialog: {\n close?: () => void;\n };\n }\n}\n\n// import './index.css';\nconst cssStyle = `\nhtml {\n height: 100%;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* scrollbar */\n::-webkit-scrollbar-track {\n background-color: #ccc;\n border-radius: 5px;\n}\n\n::-webkit-scrollbar {\n width: 5px;\n height: 5px;\n background-color: #ccc;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: #575757;\n border-radius: 5px;\n}\n\n#root {\n height: 100%;\n}\n\n.App {\n height: 100%;\n}\n\n@keyframes glow {\n from {\n background-color: initial;\n }\n to {\n background-color: #58c458;\n }\n}\n`;\n\nfunction isIFrame(): boolean {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport class GenericApp<\n TProps extends GenericAppProps = GenericAppProps,\n TState extends GenericAppState = GenericAppState,\n> extends Router<TProps, TState> {\n protected socket: AdminConnection;\n\n protected isIFrame = isIFrame();\n\n protected readonly instance: number;\n\n protected readonly adapterName: string;\n\n protected readonly instanceId: string;\n\n protected readonly newReact: boolean;\n\n protected encryptedFields: string[];\n\n protected readonly sentryDSN: string | undefined;\n\n private alertDialogRendered: boolean;\n\n private _secret: string | undefined;\n\n protected _systemConfig: ioBroker.SystemConfigCommon | undefined;\n\n // it is not readonly\n private savedNative: Record<string, any>;\n\n protected common: ioBroker.InstanceCommon | null = null;\n\n private sentryStarted: boolean = false;\n\n private sentryInited: boolean = false;\n\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: TProps, settings?: GenericAppSettings) {\n const ConnectionClass = (props.Connection ||\n settings?.Connection ||\n Connection) as unknown as typeof AdminConnection;\n // const ConnectionClass = props.Connection === 'admin' || settings.Connection = 'admin' ? AdminConnection : (props.Connection || settings.Connection || Connection);\n\n if (!window.document.getElementById('generic-app-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'generic-app-iobroker-component');\n style.innerHTML = cssStyle;\n window.document.head.appendChild(style);\n }\n\n // Remove `!Connection.isWeb() && window.adapterName !== 'material'` when iobroker.socket will support native ws\n if (!GenericApp.isWeb() && window.io && window.location.port === '3000') {\n try {\n const io = new window.SocketClient();\n delete window.io;\n window.io = io;\n } catch {\n // ignore\n }\n }\n\n super(props);\n\n printPrompt();\n\n const query = (window.location.search || '').replace(/^\\?/, '').replace(/#.*$/, '');\n const args: {\n newReact?: boolean;\n instance?: string | number;\n theme?: ThemeName;\n } = {};\n query\n .trim()\n .split('&')\n .filter(t => t.trim())\n .forEach(b => {\n const parts = b.split('=');\n const [name, value] = parts;\n (args as Record<string, boolean | string>)[name] = parts.length === 2 ? value : true;\n if ((args as Record<string, boolean | string>)[name] === 'true') {\n (args as Record<string, boolean | string>)[name] = true;\n } else if ((args as Record<string, boolean | string>)[name] === 'false') {\n (args as Record<string, boolean | string>)[name] = false;\n }\n });\n\n // extract instance from URL\n this.instance =\n settings?.instance ??\n props.instance ??\n (args.instance !== undefined\n ? parseInt(args.instance as string, 10) || 0\n : parseInt(window.location.search.slice(1), 10) || 0);\n // extract adapter name from URL\n const tmp = window.location.pathname.split('/');\n this.adapterName =\n settings?.adapterName || props.adapterName || window.adapterName || tmp[tmp.length - 2] || 'iot';\n this.instanceId = `system.adapter.${this.adapterName}.${this.instance}`;\n this.newReact = args.newReact === true; // it is admin5\n\n const location = Router.getLocation();\n location.tab =\n location.tab ||\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) ||\n '';\n\n const themeInstance = this.createTheme(args.theme);\n\n this.state = {\n ...this.state, // keep the existing state\n selectedTab:\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) || '',\n selectedTabNum: -1,\n native: {},\n errorText: '',\n changed: false,\n connected: false,\n loaded: false,\n isConfigurationError: '',\n expertMode: false,\n toast: '',\n theme: themeInstance,\n themeName: this.getThemeName(themeInstance),\n themeType: this.getThemeType(themeInstance),\n bottomButtons: (settings && settings.bottomButtons) === false ? false : props?.bottomButtons !== false,\n width: GenericApp.getWidth(),\n confirmClose: false,\n _alert: false,\n _alertType: 'info',\n _alertMessage: '',\n };\n\n // init translations\n const translations: Record<ioBroker.Languages, Record<string, string>> = dictionary;\n\n // merge together\n if (settings?.translations) {\n Object.keys(settings.translations).forEach(lang => {\n if (settings.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n settings.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n } else if (props.translations) {\n Object.keys(props.translations).forEach(lang => {\n if (props.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n props.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n }\n\n I18n.setTranslations(translations);\n\n this.savedNative = {}; // to detect if the config changed\n\n this.encryptedFields = props.encryptedFields || settings?.encryptedFields || [];\n\n this.sentryDSN = settings?.sentryDSN || props.sentryDSN;\n\n if (window.socketUrl) {\n if (window.socketUrl.startsWith(':')) {\n window.socketUrl = `${window.location.protocol}//${window.location.hostname}${window.socketUrl}`;\n } else if (!window.socketUrl.startsWith('http://') && !window.socketUrl.startsWith('https://')) {\n window.socketUrl = `${window.location.protocol}//${window.socketUrl}`;\n }\n }\n\n this.alertDialogRendered = false;\n\n if (!window.iobOldAlert) {\n window.iobOldAlert = window.alert;\n }\n window.alert = message => {\n if (!this.alertDialogRendered) {\n window.iobOldAlert(message);\n return;\n }\n if (message?.toString().toLowerCase().includes('error')) {\n console.error(message);\n this.showAlert(message.toString(), 'error');\n } else {\n console.log(message);\n this.showAlert(message.toString(), 'info');\n }\n };\n\n // @ts-expect-error either make props in ConnectionProps required or the constructor needs to accept than as they are (means adapt socket-client)\n this.socket = new ConnectionClass({\n ...(props?.socket || settings?.socket),\n name: this.adapterName,\n doNotLoadAllObjects: settings?.doNotLoadAllObjects,\n onProgress: (progress: PROGRESS) => {\n if (progress === PROGRESS.CONNECTING) {\n this.setState({ connected: false });\n } else if (progress === PROGRESS.READY) {\n this.setState({ connected: true });\n } else {\n this.setState({ connected: true });\n }\n },\n onReady: (/* objects, scripts */) => {\n I18n.setLanguage(this.socket.systemLang);\n\n // subscribe because of language and expert mode\n this.socket\n .subscribeObject('system.config', this.onSystemConfigChanged)\n .then(() => this.getSystemConfig())\n .then(obj => {\n this._secret =\n (typeof obj !== 'undefined' && obj.native && obj.native.secret) || 'Zgfr56gFe87jJOM';\n this._systemConfig = obj?.common || ({} as ioBroker.SystemConfigCommon);\n return this.socket.getObject(this.instanceId);\n })\n .then(async obj => {\n let waitPromise;\n const instanceObj: ioBroker.InstanceObject | null | undefined = obj as\n ioBroker.InstanceObject | null | undefined;\n\n const sentryPluginEnabled = (\n await this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`)\n )?.val;\n\n const sentryEnabled =\n sentryPluginEnabled !== false &&\n this._systemConfig?.diag !== 'none' &&\n instanceObj?.common &&\n instanceObj.common.name &&\n instanceObj.common.version &&\n // @ts-expect-error will be extended in js-controller TODO: (BF: 2024.05.30) this is redundant to state `${this.instanceId}.plugins.sentry.enabled`, remove this in future when admin sets the state correctly\n !instanceObj.common.disableDataReporting &&\n window.location.host !== 'localhost:3000';\n\n // activate sentry plugin\n if (!this.sentryStarted && this.sentryDSN && sentryEnabled) {\n this.sentryStarted = true;\n\n Sentry.init({\n dsn: this.sentryDSN,\n release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,\n integrations: [Sentry.dedupeIntegration()],\n });\n\n console.log('Sentry initialized');\n }\n\n // read UUID and init sentry with it.\n // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined\n if (!this.sentryInited && sentryEnabled) {\n this.sentryInited = true;\n\n waitPromise = this.socket.getObject('system.meta.uuid').then(uuidObj => {\n if (uuidObj && uuidObj.native && uuidObj.native.uuid) {\n const scope = Sentry.getCurrentScope();\n scope.setUser({ id: uuidObj.native.uuid });\n }\n });\n }\n\n waitPromise = waitPromise instanceof Promise ? waitPromise : Promise.resolve();\n\n void waitPromise.then(() => {\n if (instanceObj) {\n this.common = instanceObj?.common;\n this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets\n this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));\n this.setState(\n { native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n } else {\n console.warn('Cannot load instance settings');\n this.setState(\n {\n native: {},\n loaded: true,\n expertMode: this.getExpertMode(),\n },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n }\n });\n })\n .catch(e => window.alert(`Cannot settings: ${e}`));\n },\n onError: (err: string) => {\n console.error(err);\n this.showError(err);\n },\n });\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n return window.socketUrl !== undefined;\n }\n\n showAlert(message: string, type?: 'info' | 'warning' | 'error' | 'success'): void {\n if (type !== 'error' && type !== 'warning' && type !== 'info' && type !== 'success') {\n type = 'info';\n }\n\n this.setState({\n _alert: true,\n _alertType: type,\n _alertMessage: message,\n });\n }\n\n renderAlertSnackbar(): JSX.Element {\n this.alertDialogRendered = true;\n\n return (\n <Snackbar\n style={\n this.state._alertType === 'error'\n ? { backgroundColor: '#f44336' }\n : this.state._alertType === 'success'\n ? { backgroundColor: '#4caf50' }\n : undefined\n }\n open={this.state._alert}\n autoHideDuration={6000}\n onClose={(_e, reason) => reason !== 'clickaway' && this.setState({ _alert: false })}\n message={this.state._alertMessage}\n />\n );\n }\n\n onSystemConfigChanged = (id: string, obj: ioBroker.AnyObject | null | undefined): void => {\n if (obj && id === 'system.config') {\n if (this.socket.systemLang !== (obj as ioBroker.SystemConfigObject)?.common.language) {\n this.socket.systemLang = (obj as ioBroker.SystemConfigObject)?.common.language || 'en';\n I18n.setLanguage(this.socket.systemLang);\n }\n\n if (this._systemConfig?.expertMode !== !!(obj as ioBroker.SystemConfigObject)?.common?.expertMode) {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n this.setState({ expertMode: this.getExpertMode() });\n } else {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n }\n }\n };\n\n /**\n * Called immediately after a component is mounted. Setting the state here will trigger re-rendering.\n */\n componentDidMount(): void {\n window.addEventListener('resize', this.onResize, true);\n window.addEventListener('message', this.onReceiveMessage, false);\n super.componentDidMount();\n }\n\n /**\n * Called immediately before a component is destroyed.\n */\n componentWillUnmount(): void {\n window.removeEventListener('resize', this.onResize, true);\n window.removeEventListener('message', this.onReceiveMessage, false);\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // restore window.alert\n if (window.iobOldAlert) {\n window.alert = window.iobOldAlert;\n delete window.iobOldAlert;\n }\n\n super.componentWillUnmount();\n }\n\n onReceiveMessage = (message: { data: string | { type: string } } | null): void => {\n if (message?.data) {\n if (\n (typeof message.data === 'string' && message.data === 'updateTheme') ||\n (message.data && typeof message.data === 'object' && message.data.type === 'updateTheme')\n ) {\n const newThemeName = Utils.getThemeName();\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName);\n this.onThemeChanged && this.onThemeChanged(newThemeName);\n },\n );\n } else if (message.data === 'updateExpertMode') {\n this.onToggleExpertMode && this.onToggleExpertMode(this.getExpertMode());\n } else if (message.data !== 'chartReady') {\n // if not \"echart ready\" message\n console.debug(\n `Received unknown message: \"${JSON.stringify(message.data)}\". May be it will be processed later`,\n );\n }\n }\n };\n\n private onResize = (): void => {\n this.resizeTimer && clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.setState({ width: GenericApp.getWidth() });\n }, 200);\n };\n\n /**\n * Gets the width depending on the window inner width.\n */\n static getWidth(): Width {\n /**\n * innerWidth |xs sm md lg xl\n * |-------|-------|-------|-------|------>\n * width | xs | sm | md | lg | xl\n */\n\n const SIZES: Record<Width, number> = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n };\n const width = window.innerWidth;\n const keys = Object.keys(SIZES).reverse();\n const widthComputed = keys.find(key => width >= SIZES[key as Width]) as Width;\n\n return widthComputed || 'xs';\n }\n\n /**\n * Get a theme\n *\n * @param name Theme name\n */\n // eslint-disable-next-line class-methods-use-this\n createTheme(name?: ThemeName | 'auto' | null): IobTheme {\n return Theme(Utils.getThemeName(name));\n }\n\n /**\n * Get the theme name\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeName(currentTheme: IobTheme): ThemeName {\n return currentTheme.name;\n }\n\n /**\n * Get the theme type\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeType(currentTheme: IobTheme): ThemeType {\n return currentTheme.palette.mode;\n }\n\n // eslint-disable-next-line class-methods-use-this\n onThemeChanged(_newThemeName: string): void {}\n\n // eslint-disable-next-line class-methods-use-this\n onToggleExpertMode(_expertMode: boolean): void {}\n\n /**\n * Changes the current theme\n */\n toggleTheme(newThemeName?: ThemeName): void {\n const themeName = this.state.themeName;\n\n // `Utils.toggleTheme` cycles through `Utils.getThemeNames()` and thus also through the\n // modern themes. The chain that used to be here knew only dark, blue and colored and threw\n // the user out of every other theme - and it already wrote the name itself.\n newThemeName ||= Utils.toggleTheme(themeName);\n\n if (newThemeName !== themeName) {\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName || 'light');\n this.onThemeChanged && this.onThemeChanged(newThemeName || 'light');\n },\n );\n }\n }\n\n /**\n * Gets the system configuration.\n */\n getSystemConfig(): Promise<ioBroker.SystemConfigObject> {\n return this.socket.getSystemConfig();\n }\n\n /**\n * Get current expert mode\n */\n getExpertMode(): boolean {\n return window.sessionStorage.getItem('App.expertMode') === 'true' || !!this._systemConfig?.expertMode;\n }\n\n /**\n * Gets called when the socket.io connection is ready.\n * You can overload this function to execute own commands.\n */\n // eslint-disable-next-line class-methods-use-this\n onConnectionReady(): void {}\n\n /**\n * Encrypts a string.\n */\n encrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Decrypts a string.\n */\n decrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Gets called when the navigation hash changes.\n * You may override this if needed.\n */\n onHashChanged(): void {\n const location = Router.getLocation();\n if (location.tab !== this.state.selectedTab) {\n this.selectTab(location.tab);\n }\n }\n\n /**\n * Selects the given tab.\n */\n selectTab(tab: string, index?: number): void {\n ((window as any)._localStorage || window.localStorage).setItem(`${this.adapterName}-adapter`, tab);\n this.setState({ selectedTab: tab, selectedTabNum: index });\n }\n\n /**\n * Gets called before the settings are saved.\n * You may override this if needed.\n */\n onPrepareSave(settings: Record<string, any>): boolean {\n // here you can encode values\n this.encryptedFields?.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.encrypt(settings[attr]);\n }\n });\n\n return true;\n }\n\n /**\n * Gets called after the settings are loaded.\n * You may override this if needed.\n *\n * @param settings instance settings from native part\n * @param encryptedNative optional list of fields to be decrypted\n */\n onPrepareLoad(settings: Record<string, any>, encryptedNative?: string[]): void {\n // here you can encode values\n this.encryptedFields?.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n encryptedNative?.forEach(attr => {\n this.encryptedFields = this.encryptedFields || [];\n !this.encryptedFields.includes(attr) && this.encryptedFields.push(attr);\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n }\n\n /**\n * Gets the extendable instances.\n */\n async getExtendableInstances(): Promise<ioBroker.InstanceObject[]> {\n try {\n const instances = await this.socket.getObjectViewSystem(\n 'instance',\n 'system.adapter.',\n 'system.adapter.\\u9999',\n );\n return Object.values(instances).filter(instance => !!instance?.common?.webExtendable);\n } catch {\n return [];\n }\n }\n\n /**\n * Gets the IP addresses of the given host.\n */\n async getIpAddresses(host: string): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n const ips = await this.socket.getHostByIp(host || this.common?.host || '');\n // translate names\n const ip4 = ips.find(ip => ip.address === '0.0.0.0');\n if (ip4) {\n ip4.name = `[IPv4] 0.0.0.0 - ${I18n.t('ra_Listen on all IPs')}`;\n }\n const ip6 = ips.find(ip => ip.address === '::');\n if (ip6) {\n ip6.name = `[IPv6] :: - ${I18n.t('ra_Listen on all IPs')}`;\n }\n return ips;\n }\n\n /**\n * Saves the settings to the server.\n *\n * @param isClose True if the user is closing the dialog.\n */\n onSave(isClose?: boolean): void {\n let oldObj: ioBroker.InstanceObject;\n if (this.state.isConfigurationError) {\n this.setState({ errorText: this.state.isConfigurationError });\n return;\n }\n\n this.socket\n .getObject(this.instanceId)\n .then(_oldObj => {\n oldObj = (_oldObj || {}) as ioBroker.InstanceObject;\n\n for (const a in this.state.native) {\n if (Object.prototype.hasOwnProperty.call(this.state.native, a)) {\n if (this.state.native[a] === null) {\n oldObj.native[a] = null;\n } else if (this.state.native[a] !== undefined) {\n oldObj.native[a] = JSON.parse(JSON.stringify(this.state.native[a]));\n } else {\n delete oldObj.native[a];\n }\n }\n }\n\n if (this.state.common) {\n for (const b in this.state.common) {\n if (this.state.common[b] === null) {\n (oldObj as Record<string, any>).common[b] = null;\n } else if (this.state.common[b] !== undefined) {\n (oldObj as Record<string, any>).common[b] = JSON.parse(\n JSON.stringify(this.state.common[b]),\n );\n } else {\n delete (oldObj as Record<string, any>).common[b];\n }\n }\n }\n\n if (this.onPrepareSave(oldObj.native) !== false) {\n return this.socket.setObject(this.instanceId, oldObj);\n }\n\n return Promise.reject(new Error('Invalid configuration'));\n })\n .then(() => {\n this.savedNative = oldObj.native;\n globalThis.changed = false;\n try {\n window.parent.postMessage('nochange', '*');\n } catch {\n // ignore\n }\n\n this.setState({ changed: false }, () => {\n isClose && GenericApp.onClose();\n });\n })\n .catch(e => console.error(`Cannot save configuration: ${e}`));\n }\n\n /**\n * Renders the toast.\n */\n renderToast(): JSX.Element | null {\n if (!this.state.toast) {\n return null;\n }\n\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={!0}\n autoHideDuration={6000}\n onClose={() => this.setState({ toast: '' })}\n slotProps={{ content: { 'aria-describedby': 'message-id' } }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n onClick={() => this.setState({ toast: '' })}\n size=\"large\"\n >\n <IconClose />\n </IconButton>,\n ]}\n />\n );\n }\n\n /**\n * Closes the dialog.\n */\n static onClose(): void {\n if (typeof window.parent !== 'undefined' && window.parent) {\n try {\n if (window.parent.$iframeDialog && typeof window.parent.$iframeDialog.close === 'function') {\n window.parent.$iframeDialog.close();\n } else {\n window.parent.postMessage('close', '*');\n }\n } catch {\n window.parent.postMessage('close', '*');\n }\n }\n }\n\n /**\n * Renders the error dialog.\n */\n renderError(): React.JSX.Element | null {\n if (!this.state.errorText) {\n return null;\n }\n\n return (\n <DialogError\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n\n /**\n * Checks if the configuration has changed.\n *\n * @param native the new state\n */\n getIsChanged(native: Record<string, any>): boolean {\n native = native || this.state.native;\n const isChanged = JSON.stringify(native) !== JSON.stringify(this.savedNative);\n\n globalThis.changed = isChanged;\n\n return isChanged;\n }\n\n /**\n * Gets called when loading the configuration.\n *\n * @param newNative The new configuration object.\n */\n onLoadConfig(newNative: Record<string, any>): void {\n if (JSON.stringify(newNative) !== JSON.stringify(this.state.native)) {\n this.setState({ native: newNative, changed: this.getIsChanged(newNative) });\n }\n }\n\n /**\n * Sets the configuration error.\n */\n setConfigurationError(errorText: string): void {\n if (this.state.isConfigurationError !== errorText) {\n this.setState({ isConfigurationError: errorText });\n }\n }\n\n /**\n * Renders the save and close buttons.\n */\n renderSaveCloseButtons(): React.JSX.Element | null {\n if (!this.state.confirmClose && !this.state.bottomButtons) {\n return null;\n }\n\n return (\n <>\n {this.state.bottomButtons ? (\n <SaveCloseButtons\n theme={this.state.theme}\n newReact={this.newReact}\n noTextOnButtons={\n this.state.width === 'xs' || this.state.width === 'sm' || this.state.width === 'md'\n }\n changed={this.state.changed}\n onSave={(isClose: boolean): void => this.onSave(isClose)}\n onClose={(): void => {\n if (this.state.changed) {\n this.setState({ confirmClose: true });\n } else {\n GenericApp.onClose();\n }\n }}\n error={!!this.state.isConfigurationError}\n />\n ) : null}\n {this.state.confirmClose ? (\n <DialogConfirm\n title={I18n.t('ra_Please confirm')}\n text={I18n.t('ra_Some data are not stored. Discard?')}\n ok={I18n.t('ra_Discard')}\n cancel={I18n.t('ra_Cancel')}\n onClose={(isYes: boolean): void =>\n this.setState({ confirmClose: false }, () => isYes && GenericApp.onClose())\n }\n />\n ) : null}\n </>\n );\n }\n\n private _updateNativeValue(obj: Record<string, any>, attrs: string | string[], value: any): boolean {\n if (typeof attrs !== 'object') {\n attrs = attrs.split('.');\n }\n const attr: string = attrs.shift() || '';\n if (!attrs.length) {\n if (value && typeof value === 'object') {\n if (JSON.stringify(obj[attr]) !== JSON.stringify(value)) {\n obj[attr] = value;\n return true;\n }\n return false;\n }\n if (obj[attr] !== value) {\n obj[attr] = value;\n return true;\n }\n\n return false;\n }\n\n obj[attr] = obj[attr] || {};\n if (typeof obj[attr] !== 'object') {\n throw new Error(`attribute ${attr} is no object, but ${typeof obj[attr]}`);\n }\n return this._updateNativeValue(obj[attr], attrs, value);\n }\n\n /**\n * Update the native value\n *\n * @param attr The attribute name with dots as delimiter.\n * @param value The new value.\n * @param cb Callback which will be called upon completion.\n */\n updateNativeValue(attr: string, value: any, cb?: () => void): void {\n const native: Record<string, any> = JSON.parse(JSON.stringify(this.state.native));\n if (this._updateNativeValue(native, attr, value)) {\n const changed = this.getIsChanged(native);\n\n if (changed !== this.state.changed) {\n try {\n window.parent.postMessage(changed ? 'change' : 'nochange', '*');\n } catch {\n // ignore\n }\n }\n\n this.setState({ native, changed }, cb);\n }\n }\n\n /**\n * Set the error text to be shown.\n */\n showError(text: string | React.JSX.Element): void {\n this.setState({ errorText: text });\n }\n\n /**\n * Sets the toast to be shown.\n *\n * @param toast Text to be shown.\n */\n showToast(toast: string | React.JSX.Element): void {\n this.setState({ toast });\n }\n\n /**\n * Renders helper dialogs\n */\n renderHelperDialogs(): React.JSX.Element {\n return (\n <>\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </>\n );\n }\n\n /**\n * Renders this component.\n */\n render(): React.JSX.Element {\n if (!this.state.loaded) {\n return <Loader themeType={this.state.themeType} />;\n }\n\n return (\n <div className=\"App\">\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"GenericApp.js","sourceRoot":"./src/","sources":["GenericApp.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright 2018-2026 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { type JSX } from 'react';\nimport { PROGRESS, Connection, type AdminConnection } from '@iobroker/socket-client';\n\nimport { Snackbar, IconButton } from '@mui/material';\n\nimport { Close as IconClose } from '@mui/icons-material';\n\nimport { printPrompt } from './Prompt';\nimport { Theme } from './Theme';\nimport { Loader } from './Components/Loader';\nimport { Router } from './Components/Router';\nimport { Utils } from './Components/Utils';\nimport { SaveCloseButtons } from './Components/SaveCloseButtons';\nimport { DialogConfirm } from './Dialogs/Confirm';\nimport { I18n } from './i18n';\nimport { DialogError } from './Dialogs/Error';\nimport type {\n GenericAppProps,\n GenericAppState,\n GenericAppSettings,\n ThemeName,\n ThemeType,\n IobTheme,\n Width,\n} from './types';\n\nimport { dictionary } from './dictionary';\n\ndeclare global {\n /** If config has been changed */\n var changed: boolean;\n\n interface Window {\n io: any;\n SocketClient: any;\n adapterName: undefined | string;\n socketUrl: undefined | string;\n iobOldAlert: any;\n changed: boolean;\n $iframeDialog: {\n close?: () => void;\n };\n }\n}\n\n// import './index.css';\nconst cssStyle = `\nhtml {\n height: 100%;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* scrollbar */\n::-webkit-scrollbar-track {\n background-color: #ccc;\n border-radius: 5px;\n}\n\n::-webkit-scrollbar {\n width: 5px;\n height: 5px;\n background-color: #ccc;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: #575757;\n border-radius: 5px;\n}\n\n#root {\n height: 100%;\n}\n\n.App {\n height: 100%;\n}\n\n@keyframes glow {\n from {\n background-color: initial;\n }\n to {\n background-color: #58c458;\n }\n}\n`;\n\nfunction isIFrame(): boolean {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport class GenericApp<\n TProps extends GenericAppProps = GenericAppProps,\n TState extends GenericAppState = GenericAppState,\n> extends Router<TProps, TState> {\n protected socket: AdminConnection;\n\n protected isIFrame = isIFrame();\n\n protected readonly instance: number;\n\n protected readonly adapterName: string;\n\n protected readonly instanceId: string;\n\n protected readonly newReact: boolean;\n\n protected encryptedFields: string[];\n\n protected readonly sentryDSN: string | undefined;\n\n private alertDialogRendered: boolean;\n\n private _secret: string | undefined;\n\n protected _systemConfig: ioBroker.SystemConfigCommon | undefined;\n\n // it is not readonly\n private savedNative: Record<string, any>;\n\n protected common: ioBroker.InstanceCommon | null = null;\n\n private sentryStarted: boolean = false;\n\n private sentryInited: boolean = false;\n\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: TProps, settings?: GenericAppSettings) {\n const ConnectionClass = (props.Connection ||\n settings?.Connection ||\n Connection) as unknown as typeof AdminConnection;\n // const ConnectionClass = props.Connection === 'admin' || settings.Connection = 'admin' ? AdminConnection : (props.Connection || settings.Connection || Connection);\n\n if (!window.document.getElementById('generic-app-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'generic-app-iobroker-component');\n style.innerHTML = cssStyle;\n window.document.head.appendChild(style);\n }\n\n // Remove `!Connection.isWeb() && window.adapterName !== 'material'` when iobroker.socket will support native ws\n if (!GenericApp.isWeb() && window.io && window.location.port === '3000') {\n try {\n const io = new window.SocketClient();\n delete window.io;\n window.io = io;\n } catch {\n // ignore\n }\n }\n\n super(props);\n\n printPrompt();\n\n const query = (window.location.search || '').replace(/^\\?/, '').replace(/#.*$/, '');\n const args: {\n newReact?: boolean;\n instance?: string | number;\n theme?: ThemeName;\n } = {};\n query\n .trim()\n .split('&')\n .filter(t => t.trim())\n .forEach(b => {\n const parts = b.split('=');\n const [name, value] = parts;\n (args as Record<string, boolean | string>)[name] = parts.length === 2 ? value : true;\n if ((args as Record<string, boolean | string>)[name] === 'true') {\n (args as Record<string, boolean | string>)[name] = true;\n } else if ((args as Record<string, boolean | string>)[name] === 'false') {\n (args as Record<string, boolean | string>)[name] = false;\n }\n });\n\n // extract instance from URL\n this.instance =\n settings?.instance ??\n props.instance ??\n (args.instance !== undefined\n ? parseInt(args.instance as string, 10) || 0\n : parseInt(window.location.search.slice(1), 10) || 0);\n // extract adapter name from URL\n const tmp = window.location.pathname.split('/');\n this.adapterName =\n settings?.adapterName || props.adapterName || window.adapterName || tmp[tmp.length - 2] || 'iot';\n this.instanceId = `system.adapter.${this.adapterName}.${this.instance}`;\n this.newReact = args.newReact === true; // it is admin5\n\n const location = Router.getLocation();\n location.tab =\n location.tab ||\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) ||\n '';\n\n const themeInstance = this.createTheme(args.theme);\n\n this.state = {\n ...this.state, // keep the existing state\n selectedTab:\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) || '',\n selectedTabNum: -1,\n native: {},\n errorText: '',\n changed: false,\n connected: false,\n loaded: false,\n isConfigurationError: '',\n expertMode: false,\n toast: '',\n theme: themeInstance,\n themeName: this.getThemeName(themeInstance),\n themeType: this.getThemeType(themeInstance),\n bottomButtons: (settings && settings.bottomButtons) === false ? false : props?.bottomButtons !== false,\n width: GenericApp.getWidth(),\n confirmClose: false,\n _alert: false,\n _alertType: 'info',\n _alertMessage: '',\n };\n\n // init translations\n const translations: Record<ioBroker.Languages, Record<string, string>> = dictionary;\n\n // merge together\n if (settings?.translations) {\n Object.keys(settings.translations).forEach(lang => {\n if (settings.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n settings.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n } else if (props.translations) {\n Object.keys(props.translations).forEach(lang => {\n if (props.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n props.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n }\n\n I18n.setTranslations(translations);\n\n this.savedNative = {}; // to detect if the config changed\n\n this.encryptedFields = props.encryptedFields || settings?.encryptedFields || [];\n\n this.sentryDSN = settings?.sentryDSN || props.sentryDSN;\n\n if (window.socketUrl) {\n if (window.socketUrl.startsWith(':')) {\n window.socketUrl = `${window.location.protocol}//${window.location.hostname}${window.socketUrl}`;\n } else if (!window.socketUrl.startsWith('http://') && !window.socketUrl.startsWith('https://')) {\n window.socketUrl = `${window.location.protocol}//${window.socketUrl}`;\n }\n }\n\n this.alertDialogRendered = false;\n\n if (!window.iobOldAlert) {\n window.iobOldAlert = window.alert;\n }\n window.alert = message => {\n if (!this.alertDialogRendered) {\n window.iobOldAlert(message);\n return;\n }\n if (message?.toString().toLowerCase().includes('error')) {\n console.error(message);\n this.showAlert(message.toString(), 'error');\n } else {\n console.log(message);\n this.showAlert(message.toString(), 'info');\n }\n };\n\n // @ts-expect-error either make props in ConnectionProps required or the constructor needs to accept than as they are (means adapt socket-client)\n this.socket = new ConnectionClass({\n ...(props?.socket || settings?.socket),\n name: this.adapterName,\n doNotLoadAllObjects: settings?.doNotLoadAllObjects,\n onProgress: (progress: PROGRESS) => {\n if (progress === PROGRESS.CONNECTING) {\n this.setState({ connected: false });\n } else if (progress === PROGRESS.READY) {\n this.setState({ connected: true });\n } else {\n this.setState({ connected: true });\n }\n },\n onReady: (/* objects, scripts */) => {\n I18n.setLanguage(this.socket.systemLang);\n\n // All of this is asked for at once. It used to be four round trips one after the other, plus a\n // fifth for Sentry, and the app only got its turn (`onConnectionReady`) after all of them - which\n // is what a remote connection pays most for.\n Promise.all([\n // subscribe because of language and expert mode\n this.socket.subscribeObject('system.config', this.onSystemConfigChanged),\n this.getSystemConfig(),\n this.socket.getObject(this.instanceId),\n this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`),\n ])\n .then(([, systemConfig, obj, sentryState]) => {\n this._secret =\n (typeof systemConfig !== 'undefined' &&\n systemConfig.native &&\n systemConfig.native.secret) ||\n 'Zgfr56gFe87jJOM';\n this._systemConfig = systemConfig?.common || ({} as ioBroker.SystemConfigCommon);\n\n const instanceObj: ioBroker.InstanceObject | null | undefined = obj as\n ioBroker.InstanceObject | null | undefined;\n\n const sentryPluginEnabled = sentryState?.val;\n\n const sentryEnabled =\n sentryPluginEnabled !== false &&\n this._systemConfig?.diag !== 'none' &&\n instanceObj?.common &&\n instanceObj.common.name &&\n instanceObj.common.version &&\n // @ts-expect-error will be extended in js-controller TODO: (BF: 2024.05.30) this is redundant to state `${this.instanceId}.plugins.sentry.enabled`, remove this in future when admin sets the state correctly\n !instanceObj.common.disableDataReporting &&\n window.location.host !== 'localhost:3000';\n\n if (!this.sentryInited && sentryEnabled) {\n this.sentryInited = true;\n this.startSentry(instanceObj);\n }\n\n if (instanceObj) {\n this.common = instanceObj?.common;\n this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets\n this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));\n this.setState(\n { native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n } else {\n console.warn('Cannot load instance settings');\n this.setState(\n {\n native: {},\n loaded: true,\n expertMode: this.getExpertMode(),\n },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n }\n })\n .catch(e => window.alert(`Cannot settings: ${e}`));\n },\n onError: (err: string) => {\n console.error(err);\n this.showError(err);\n },\n });\n }\n\n /**\n * Report the errors of this app to Sentry.\n *\n * The SDK is loaded only here: it is 180 KB, and every app would otherwise load it before its first frame,\n * whether the instance reports anything or not. Nothing waits for it - the errors of the first moment go\n * unreported, as they did while the identification of the system was still being read.\n *\n * @param instanceObj the object of the instance this app belongs to\n */\n private startSentry(instanceObj: ioBroker.InstanceObject): void {\n void import('@sentry/browser')\n .then(async Sentry => {\n // activate sentry plugin\n if (!this.sentryStarted && this.sentryDSN) {\n this.sentryStarted = true;\n\n Sentry.init({\n dsn: this.sentryDSN,\n release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,\n integrations: [Sentry.dedupeIntegration()],\n });\n\n console.log('Sentry initialized');\n }\n\n // read UUID and init sentry with it.\n // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined\n const uuidObj = await this.socket.getObject('system.meta.uuid');\n if (uuidObj?.native?.uuid) {\n const scope = Sentry.getCurrentScope();\n scope.setUser({ id: uuidObj.native.uuid });\n }\n })\n .catch(e => console.warn(`Cannot start Sentry: ${e}`));\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n return window.socketUrl !== undefined;\n }\n\n showAlert(message: string, type?: 'info' | 'warning' | 'error' | 'success'): void {\n if (type !== 'error' && type !== 'warning' && type !== 'info' && type !== 'success') {\n type = 'info';\n }\n\n this.setState({\n _alert: true,\n _alertType: type,\n _alertMessage: message,\n });\n }\n\n renderAlertSnackbar(): JSX.Element {\n this.alertDialogRendered = true;\n\n return (\n <Snackbar\n style={\n this.state._alertType === 'error'\n ? { backgroundColor: '#f44336' }\n : this.state._alertType === 'success'\n ? { backgroundColor: '#4caf50' }\n : undefined\n }\n open={this.state._alert}\n autoHideDuration={6000}\n onClose={(_e, reason) => reason !== 'clickaway' && this.setState({ _alert: false })}\n message={this.state._alertMessage}\n />\n );\n }\n\n onSystemConfigChanged = (id: string, obj: ioBroker.AnyObject | null | undefined): void => {\n if (obj && id === 'system.config') {\n if (this.socket.systemLang !== (obj as ioBroker.SystemConfigObject)?.common.language) {\n this.socket.systemLang = (obj as ioBroker.SystemConfigObject)?.common.language || 'en';\n I18n.setLanguage(this.socket.systemLang);\n }\n\n if (this._systemConfig?.expertMode !== !!(obj as ioBroker.SystemConfigObject)?.common?.expertMode) {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n this.setState({ expertMode: this.getExpertMode() });\n } else {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n }\n }\n };\n\n /**\n * Called immediately after a component is mounted. Setting the state here will trigger re-rendering.\n */\n componentDidMount(): void {\n window.addEventListener('resize', this.onResize, true);\n window.addEventListener('message', this.onReceiveMessage, false);\n super.componentDidMount();\n }\n\n /**\n * Called immediately before a component is destroyed.\n */\n componentWillUnmount(): void {\n window.removeEventListener('resize', this.onResize, true);\n window.removeEventListener('message', this.onReceiveMessage, false);\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // restore window.alert\n if (window.iobOldAlert) {\n window.alert = window.iobOldAlert;\n delete window.iobOldAlert;\n }\n\n super.componentWillUnmount();\n }\n\n onReceiveMessage = (message: { data: string | { type: string } } | null): void => {\n if (message?.data) {\n if (\n (typeof message.data === 'string' && message.data === 'updateTheme') ||\n (message.data && typeof message.data === 'object' && message.data.type === 'updateTheme')\n ) {\n const newThemeName = Utils.getThemeName();\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName);\n this.onThemeChanged && this.onThemeChanged(newThemeName);\n },\n );\n } else if (message.data === 'updateExpertMode') {\n this.onToggleExpertMode && this.onToggleExpertMode(this.getExpertMode());\n } else if (message.data !== 'chartReady') {\n // if not \"echart ready\" message\n console.debug(\n `Received unknown message: \"${JSON.stringify(message.data)}\". May be it will be processed later`,\n );\n }\n }\n };\n\n private onResize = (): void => {\n this.resizeTimer && clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.setState({ width: GenericApp.getWidth() });\n }, 200);\n };\n\n /**\n * Gets the width depending on the window inner width.\n */\n static getWidth(): Width {\n /**\n * innerWidth |xs sm md lg xl\n * |-------|-------|-------|-------|------>\n * width | xs | sm | md | lg | xl\n */\n\n const SIZES: Record<Width, number> = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n };\n const width = window.innerWidth;\n const keys = Object.keys(SIZES).reverse();\n const widthComputed = keys.find(key => width >= SIZES[key as Width]) as Width;\n\n return widthComputed || 'xs';\n }\n\n /**\n * Get a theme\n *\n * @param name Theme name\n */\n // eslint-disable-next-line class-methods-use-this\n createTheme(name?: ThemeName | 'auto' | null): IobTheme {\n return Theme(Utils.getThemeName(name));\n }\n\n /**\n * Get the theme name\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeName(currentTheme: IobTheme): ThemeName {\n return currentTheme.name;\n }\n\n /**\n * Get the theme type\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeType(currentTheme: IobTheme): ThemeType {\n return currentTheme.palette.mode;\n }\n\n // eslint-disable-next-line class-methods-use-this\n onThemeChanged(_newThemeName: string): void {}\n\n // eslint-disable-next-line class-methods-use-this\n onToggleExpertMode(_expertMode: boolean): void {}\n\n /**\n * Changes the current theme\n */\n toggleTheme(newThemeName?: ThemeName): void {\n const themeName = this.state.themeName;\n\n // `Utils.toggleTheme` cycles through `Utils.getThemeNames()` and thus also through the\n // modern themes. The chain that used to be here knew only dark, blue and colored and threw\n // the user out of every other theme - and it already wrote the name itself.\n newThemeName ||= Utils.toggleTheme(themeName);\n\n if (newThemeName !== themeName) {\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName || 'light');\n this.onThemeChanged && this.onThemeChanged(newThemeName || 'light');\n },\n );\n }\n }\n\n /**\n * Gets the system configuration.\n */\n getSystemConfig(): Promise<ioBroker.SystemConfigObject> {\n return this.socket.getSystemConfig();\n }\n\n /**\n * Get current expert mode\n */\n getExpertMode(): boolean {\n return window.sessionStorage.getItem('App.expertMode') === 'true' || !!this._systemConfig?.expertMode;\n }\n\n /**\n * Gets called when the socket.io connection is ready.\n * You can overload this function to execute own commands.\n */\n // eslint-disable-next-line class-methods-use-this\n onConnectionReady(): void {}\n\n /**\n * Encrypts a string.\n */\n encrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Decrypts a string.\n */\n decrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Gets called when the navigation hash changes.\n * You may override this if needed.\n */\n onHashChanged(): void {\n const location = Router.getLocation();\n if (location.tab !== this.state.selectedTab) {\n this.selectTab(location.tab);\n }\n }\n\n /**\n * Selects the given tab.\n */\n selectTab(tab: string, index?: number): void {\n ((window as any)._localStorage || window.localStorage).setItem(`${this.adapterName}-adapter`, tab);\n this.setState({ selectedTab: tab, selectedTabNum: index });\n }\n\n /**\n * Gets called before the settings are saved.\n * You may override this if needed.\n */\n onPrepareSave(settings: Record<string, any>): boolean {\n // here you can encode values\n this.encryptedFields?.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.encrypt(settings[attr]);\n }\n });\n\n return true;\n }\n\n /**\n * Gets called after the settings are loaded.\n * You may override this if needed.\n *\n * @param settings instance settings from native part\n * @param encryptedNative optional list of fields to be decrypted\n */\n onPrepareLoad(settings: Record<string, any>, encryptedNative?: string[]): void {\n // here you can encode values\n this.encryptedFields?.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n encryptedNative?.forEach(attr => {\n this.encryptedFields = this.encryptedFields || [];\n !this.encryptedFields.includes(attr) && this.encryptedFields.push(attr);\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n }\n\n /**\n * Gets the extendable instances.\n */\n async getExtendableInstances(): Promise<ioBroker.InstanceObject[]> {\n try {\n const instances = await this.socket.getObjectViewSystem(\n 'instance',\n 'system.adapter.',\n 'system.adapter.\\u9999',\n );\n return Object.values(instances).filter(instance => !!instance?.common?.webExtendable);\n } catch {\n return [];\n }\n }\n\n /**\n * Gets the IP addresses of the given host.\n */\n async getIpAddresses(host: string): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n const ips = await this.socket.getHostByIp(host || this.common?.host || '');\n // translate names\n const ip4 = ips.find(ip => ip.address === '0.0.0.0');\n if (ip4) {\n ip4.name = `[IPv4] 0.0.0.0 - ${I18n.t('ra_Listen on all IPs')}`;\n }\n const ip6 = ips.find(ip => ip.address === '::');\n if (ip6) {\n ip6.name = `[IPv6] :: - ${I18n.t('ra_Listen on all IPs')}`;\n }\n return ips;\n }\n\n /**\n * Saves the settings to the server.\n *\n * @param isClose True if the user is closing the dialog.\n */\n onSave(isClose?: boolean): void {\n let oldObj: ioBroker.InstanceObject;\n if (this.state.isConfigurationError) {\n this.setState({ errorText: this.state.isConfigurationError });\n return;\n }\n\n this.socket\n .getObject(this.instanceId)\n .then(_oldObj => {\n oldObj = (_oldObj || {}) as ioBroker.InstanceObject;\n\n for (const a in this.state.native) {\n if (Object.prototype.hasOwnProperty.call(this.state.native, a)) {\n if (this.state.native[a] === null) {\n oldObj.native[a] = null;\n } else if (this.state.native[a] !== undefined) {\n oldObj.native[a] = JSON.parse(JSON.stringify(this.state.native[a]));\n } else {\n delete oldObj.native[a];\n }\n }\n }\n\n if (this.state.common) {\n for (const b in this.state.common) {\n if (this.state.common[b] === null) {\n (oldObj as Record<string, any>).common[b] = null;\n } else if (this.state.common[b] !== undefined) {\n (oldObj as Record<string, any>).common[b] = JSON.parse(\n JSON.stringify(this.state.common[b]),\n );\n } else {\n delete (oldObj as Record<string, any>).common[b];\n }\n }\n }\n\n if (this.onPrepareSave(oldObj.native) !== false) {\n return this.socket.setObject(this.instanceId, oldObj);\n }\n\n return Promise.reject(new Error('Invalid configuration'));\n })\n .then(() => {\n this.savedNative = oldObj.native;\n globalThis.changed = false;\n try {\n window.parent.postMessage('nochange', '*');\n } catch {\n // ignore\n }\n\n this.setState({ changed: false }, () => {\n isClose && GenericApp.onClose();\n });\n })\n .catch(e => console.error(`Cannot save configuration: ${e}`));\n }\n\n /**\n * Renders the toast.\n */\n renderToast(): JSX.Element | null {\n if (!this.state.toast) {\n return null;\n }\n\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={!0}\n autoHideDuration={6000}\n onClose={() => this.setState({ toast: '' })}\n slotProps={{ content: { 'aria-describedby': 'message-id' } }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n onClick={() => this.setState({ toast: '' })}\n size=\"large\"\n >\n <IconClose />\n </IconButton>,\n ]}\n />\n );\n }\n\n /**\n * Closes the dialog.\n */\n static onClose(): void {\n if (typeof window.parent !== 'undefined' && window.parent) {\n try {\n if (window.parent.$iframeDialog && typeof window.parent.$iframeDialog.close === 'function') {\n window.parent.$iframeDialog.close();\n } else {\n window.parent.postMessage('close', '*');\n }\n } catch {\n window.parent.postMessage('close', '*');\n }\n }\n }\n\n /**\n * Renders the error dialog.\n */\n renderError(): React.JSX.Element | null {\n if (!this.state.errorText) {\n return null;\n }\n\n return (\n <DialogError\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n\n /**\n * Checks if the configuration has changed.\n *\n * @param native the new state\n */\n getIsChanged(native: Record<string, any>): boolean {\n native = native || this.state.native;\n const isChanged = JSON.stringify(native) !== JSON.stringify(this.savedNative);\n\n globalThis.changed = isChanged;\n\n return isChanged;\n }\n\n /**\n * Gets called when loading the configuration.\n *\n * @param newNative The new configuration object.\n */\n onLoadConfig(newNative: Record<string, any>): void {\n if (JSON.stringify(newNative) !== JSON.stringify(this.state.native)) {\n this.setState({ native: newNative, changed: this.getIsChanged(newNative) });\n }\n }\n\n /**\n * Sets the configuration error.\n */\n setConfigurationError(errorText: string): void {\n if (this.state.isConfigurationError !== errorText) {\n this.setState({ isConfigurationError: errorText });\n }\n }\n\n /**\n * Renders the save and close buttons.\n */\n renderSaveCloseButtons(): React.JSX.Element | null {\n if (!this.state.confirmClose && !this.state.bottomButtons) {\n return null;\n }\n\n return (\n <>\n {this.state.bottomButtons ? (\n <SaveCloseButtons\n theme={this.state.theme}\n newReact={this.newReact}\n noTextOnButtons={\n this.state.width === 'xs' || this.state.width === 'sm' || this.state.width === 'md'\n }\n changed={this.state.changed}\n onSave={(isClose: boolean): void => this.onSave(isClose)}\n onClose={(): void => {\n if (this.state.changed) {\n this.setState({ confirmClose: true });\n } else {\n GenericApp.onClose();\n }\n }}\n error={!!this.state.isConfigurationError}\n />\n ) : null}\n {this.state.confirmClose ? (\n <DialogConfirm\n title={I18n.t('ra_Please confirm')}\n text={I18n.t('ra_Some data are not stored. Discard?')}\n ok={I18n.t('ra_Discard')}\n cancel={I18n.t('ra_Cancel')}\n onClose={(isYes: boolean): void =>\n this.setState({ confirmClose: false }, () => isYes && GenericApp.onClose())\n }\n />\n ) : null}\n </>\n );\n }\n\n private _updateNativeValue(obj: Record<string, any>, attrs: string | string[], value: any): boolean {\n if (typeof attrs !== 'object') {\n attrs = attrs.split('.');\n }\n const attr: string = attrs.shift() || '';\n if (!attrs.length) {\n if (value && typeof value === 'object') {\n if (JSON.stringify(obj[attr]) !== JSON.stringify(value)) {\n obj[attr] = value;\n return true;\n }\n return false;\n }\n if (obj[attr] !== value) {\n obj[attr] = value;\n return true;\n }\n\n return false;\n }\n\n obj[attr] = obj[attr] || {};\n if (typeof obj[attr] !== 'object') {\n throw new Error(`attribute ${attr} is no object, but ${typeof obj[attr]}`);\n }\n return this._updateNativeValue(obj[attr], attrs, value);\n }\n\n /**\n * Update the native value\n *\n * @param attr The attribute name with dots as delimiter.\n * @param value The new value.\n * @param cb Callback which will be called upon completion.\n */\n updateNativeValue(attr: string, value: any, cb?: () => void): void {\n const native: Record<string, any> = JSON.parse(JSON.stringify(this.state.native));\n if (this._updateNativeValue(native, attr, value)) {\n const changed = this.getIsChanged(native);\n\n if (changed !== this.state.changed) {\n try {\n window.parent.postMessage(changed ? 'change' : 'nochange', '*');\n } catch {\n // ignore\n }\n }\n\n this.setState({ native, changed }, cb);\n }\n }\n\n /**\n * Set the error text to be shown.\n */\n showError(text: string | React.JSX.Element): void {\n this.setState({ errorText: text });\n }\n\n /**\n * Sets the toast to be shown.\n *\n * @param toast Text to be shown.\n */\n showToast(toast: string | React.JSX.Element): void {\n this.setState({ toast });\n }\n\n /**\n * Renders helper dialogs\n */\n renderHelperDialogs(): React.JSX.Element {\n return (\n <>\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </>\n );\n }\n\n /**\n * Renders this component.\n */\n render(): React.JSX.Element {\n if (!this.state.loaded) {\n return <Loader themeType={this.state.themeType} />;\n }\n\n return (\n <div className=\"App\">\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </div>\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iobroker/gui-components",
3
- "version": "10.3.9",
3
+ "version": "10.3.11",
4
4
  "description": "Shared React components (React 19 / MUI 9) to develop ioBroker interfaces. Successor of @iobroker/adapter-react-v5.",
5
5
  "author": {
6
6
  "name": "bluefox",
@@ -34,6 +34,9 @@
34
34
  },
35
35
  "main": "./build/index.js",
36
36
  "types": "./build/index.d.ts",
37
+ "sideEffects": [
38
+ "*.css"
39
+ ],
37
40
  "keywords": [
38
41
  "iobroker",
39
42
  "adapter",
@@ -55,17 +58,17 @@
55
58
  },
56
59
  "homepage": "https://github.com/ioBroker/adapter-react-v5#readme",
57
60
  "dependencies": {
58
- "@iobroker/js-controller-common": "^7.2.3",
59
- "@iobroker/js-controller-common-db": "^7.2.3",
60
- "@iobroker/socket-client": "^5.4.0",
61
- "@iobroker/type-detector": "^6.0.1",
62
- "@iobroker/types": "^7.2.3",
63
- "@sentry/browser": "^11.1.0",
64
- "cronstrue": "^3.27.0",
61
+ "@iobroker/js-controller-common": "^7.2.5",
62
+ "@iobroker/js-controller-common-db": "^7.2.5",
63
+ "@iobroker/socket-client": "^5.4.1",
64
+ "@iobroker/type-detector": "^6.0.3",
65
+ "@iobroker/types": "^7.2.5",
66
+ "@sentry/browser": "^11.7.0",
67
+ "cronstrue": "^3.32.0",
65
68
  "file-selector": "^5.0.1",
66
69
  "react-colorful": "^5.8.1",
67
70
  "react-cropper": "^2.3.3",
68
- "react-dropzone": "^20.1.2",
71
+ "react-dropzone": "^20.1.3",
69
72
  "react-icons": "^5.7.0",
70
73
  "react-inlinesvg": "^4.5.0"
71
74
  },
@@ -83,20 +86,20 @@
83
86
  "@iobroker/build-tools": "^3.0.3",
84
87
  "@iobroker/eslint-config": "^2.3.4",
85
88
  "@mdi/js": "^7.4.47",
86
- "@mui/icons-material": "^9.4.0",
87
- "@mui/material": "^9.4.0",
88
- "@types/node": "^26.6.3",
89
+ "@mui/icons-material": "^9.5.0",
90
+ "@mui/material": "^9.5.0",
91
+ "@types/node": "^26.6.5",
89
92
  "@types/react": "^19.3.0",
90
93
  "@types/react-dom": "^19.3.0",
91
94
  "ajv": "^8.20.0",
92
- "react": "^19.3.0",
93
- "react-dom": "^19.3.0",
95
+ "react": "^19.3.1",
96
+ "react-dom": "^19.3.1",
94
97
  "ts-node": "^10.9.2",
95
98
  "typescript": "~6.0.3"
96
99
  },
97
100
  "overrides": {
98
- "react": "^19.3.0",
99
- "react-dom": "^19.3.0",
101
+ "react": "^19.3.1",
102
+ "react-dom": "^19.3.1",
100
103
  "@types/react": "^19.3.0",
101
104
  "@types/react-dom": "^19.3.0"
102
105
  }