iobroker.devices 1.2.12 → 2.0.2
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 +17 -6
- package/admin/assets/index-Csa94g2Q.js +845 -0
- package/admin/assets/index-pCeIEsc7.css +1 -0
- package/admin/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
- package/admin/index_m.html +2 -2
- package/admin/tab.html +2 -2
- package/build/lib/DeviceManagement.js +618 -0
- package/build/lib/DeviceManagement.js.map +1 -0
- package/build/lib/WidgetsManagement.js +627 -0
- package/build/lib/WidgetsManagement.js.map +1 -0
- package/build/main.js +53 -0
- package/build/main.js.map +1 -0
- package/build/widget-utils/WidgetsManagement.js +121 -0
- package/build/widget-utils/WidgetsManagement.js.map +1 -0
- package/build/widget-utils/index.js +18 -0
- package/build/widget-utils/index.js.map +1 -0
- package/build/widget-utils/types/api.js +3 -0
- package/build/widget-utils/types/api.js.map +1 -0
- package/build/widget-utils/types/base.js +3 -0
- package/build/widget-utils/types/base.js.map +1 -0
- package/build/widget-utils/types/common.js +3 -0
- package/build/widget-utils/types/common.js.map +1 -0
- package/build/widget-utils/types/index.js +3 -0
- package/build/widget-utils/types/index.js.map +1 -0
- package/img/ioBrokerLogo.png +0 -0
- package/io-package.json +59 -31
- package/package.json +27 -15
- package/www/assets/index-CmwOqvIb.css +1 -0
- package/www/assets/index-DHISOGRL.js +748 -0
- package/www/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
- package/www/devices.svg +26 -0
- package/www/favicon.ico +0 -0
- package/www/index.html +30 -0
- package/www/manifest.json +15 -0
- package/admin/assets/index-CKue6Ph0.css +0 -1
- package/admin/assets/index-ChCHYkC8.js +0 -826
package/build/main.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const adapter_core_1 = require("@iobroker/adapter-core");
|
|
8
|
+
const WidgetsManagement_1 = __importDefault(require("./lib/WidgetsManagement"));
|
|
9
|
+
class DevicesAdapter extends adapter_core_1.Adapter {
|
|
10
|
+
deviceManagement = null;
|
|
11
|
+
language = 'en';
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
super({
|
|
14
|
+
...options,
|
|
15
|
+
name: 'devices',
|
|
16
|
+
objectChange: (id, obj) => {
|
|
17
|
+
this.deviceManagement?.objectChange(id, obj);
|
|
18
|
+
},
|
|
19
|
+
ready: () => this.main(),
|
|
20
|
+
unload: cb => this.unload(cb),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
unload(cb) {
|
|
24
|
+
//this.deviceManagement?.destroy();
|
|
25
|
+
cb?.();
|
|
26
|
+
}
|
|
27
|
+
async main() {
|
|
28
|
+
this.deviceManagement = new WidgetsManagement_1.default(this, true);
|
|
29
|
+
const systemConfig = await this.getForeignObjectAsync('system.config');
|
|
30
|
+
this.language = systemConfig?.common?.language || 'en';
|
|
31
|
+
this.subscribeForeignObjects('*');
|
|
32
|
+
// Upload one picture to devices.0, so it will be available in the File selector
|
|
33
|
+
try {
|
|
34
|
+
if (!(await this.fileExistsAsync(this.namespace, 'ioBrokerLogo.png'))) {
|
|
35
|
+
const image = (0, node_fs_1.readFileSync)(`${__dirname}/../img/ioBrokerLogo.png`);
|
|
36
|
+
await this.writeFileAsync(this.namespace, 'ioBrokerLogo.png', image);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.log.error(`Unable to upload default image: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.default = DevicesAdapter;
|
|
45
|
+
if (require.main !== module) {
|
|
46
|
+
// Export the constructor in compact mode
|
|
47
|
+
module.exports = (options) => new DevicesAdapter(options);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// otherwise start the instance directly
|
|
51
|
+
(() => new DevicesAdapter())();
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;AAAA,qCAAuC;AACvC,yDAAsE;AACtE,gFAA8D;AAE9D,MAAqB,cAAe,SAAQ,sBAAO;IACvC,gBAAgB,GAAmC,IAAI,CAAC;IACzD,QAAQ,GAAuB,IAAI,CAAC;IAE3C,YAAmB,UAAmC,EAAE;QACpD,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,CAAC,EAAU,EAAE,GAAuC,EAAQ,EAAE;gBACxE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,EAAc;QACjB,mCAAmC;QACnC,EAAE,EAAE,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,2BAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,YAAY,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAElC,gFAAgF;QAChF,IAAI,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,IAAA,sBAAY,EAAC,GAAG,SAAS,0BAA0B,CAAC,CAAC;gBACnE,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;CACJ;AArCD,iCAqCC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,MAAM,CAAC,OAAO,GAAG,CAAC,OAA4C,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACnG,CAAC;KAAM,CAAC;IACJ,wCAAwC;IACxC,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The idea of a widgets manager to minimize the communication between GUI and backend.
|
|
4
|
+
* All items will be detected in the backend, and GUI must not load ALL objects.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WidgetsManagement = void 0;
|
|
8
|
+
class WidgetsManagement {
|
|
9
|
+
widgets;
|
|
10
|
+
categories;
|
|
11
|
+
communicationStateId = '';
|
|
12
|
+
adapter;
|
|
13
|
+
constructor(adapter, communicationStateId) {
|
|
14
|
+
adapter.on('message', this.onMessage.bind(this));
|
|
15
|
+
this.adapter = adapter;
|
|
16
|
+
if (communicationStateId === true) {
|
|
17
|
+
// use standard ID `info.deviceManager`
|
|
18
|
+
this.communicationStateId = 'info.widgetManager';
|
|
19
|
+
}
|
|
20
|
+
else if (communicationStateId) {
|
|
21
|
+
this.communicationStateId = communicationStateId;
|
|
22
|
+
}
|
|
23
|
+
if (this.communicationStateId) {
|
|
24
|
+
this.ensureCommunicationState().catch(e => this.log.error(`Cannot initialize communication state: ${e}`));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async ensureCommunicationState() {
|
|
28
|
+
let stateObj = await this.adapter.getObjectAsync(this.communicationStateId);
|
|
29
|
+
if (!stateObj) {
|
|
30
|
+
stateObj = {
|
|
31
|
+
_id: this.communicationStateId,
|
|
32
|
+
type: 'state',
|
|
33
|
+
common: {
|
|
34
|
+
expert: true,
|
|
35
|
+
name: 'Communication with GUI for device manager',
|
|
36
|
+
type: 'string',
|
|
37
|
+
role: 'state',
|
|
38
|
+
def: '',
|
|
39
|
+
read: true,
|
|
40
|
+
write: false,
|
|
41
|
+
},
|
|
42
|
+
native: {},
|
|
43
|
+
};
|
|
44
|
+
await this.adapter.setObjectAsync(this.communicationStateId, stateObj);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async sendCommandToGui(command) {
|
|
48
|
+
if (this.communicationStateId) {
|
|
49
|
+
await this.adapter.setState(this.communicationStateId, JSON.stringify(command), true);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error('Communication state not found');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
get log() {
|
|
56
|
+
return this.adapter.log;
|
|
57
|
+
}
|
|
58
|
+
getWidgetStatus(_itemId) {
|
|
59
|
+
throw new Error('Do not send "statusUpdate" command without implementing getDeviceStatus method!');
|
|
60
|
+
}
|
|
61
|
+
onMessage(obj) {
|
|
62
|
+
if (!obj.command.startsWith('dm:')) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
void this.handleMessage(obj).catch(this.log.error);
|
|
66
|
+
}
|
|
67
|
+
async handleMessage(msg) {
|
|
68
|
+
this.log.debug(`DeviceManagement received: ${JSON.stringify(msg)}`);
|
|
69
|
+
switch (msg.command) {
|
|
70
|
+
case 'dm:loadItems': {
|
|
71
|
+
const [, adapterWidgets] = await Promise.all([this.loadItems(), this.loadCustomWidgets()]);
|
|
72
|
+
const response = {
|
|
73
|
+
categories: [...this.categories.values()],
|
|
74
|
+
widgets: [...this.widgets.values()],
|
|
75
|
+
};
|
|
76
|
+
if (Object.keys(adapterWidgets).length) {
|
|
77
|
+
response.adapterWidgets = adapterWidgets;
|
|
78
|
+
}
|
|
79
|
+
this.sendReply(response, msg);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Read all adapter instances that have `common.deviceWidgets` and return them
|
|
86
|
+
* as `{ adapterName: { widget1: any, widget2: any } }`.
|
|
87
|
+
*/
|
|
88
|
+
async loadCustomWidgets() {
|
|
89
|
+
const result = {};
|
|
90
|
+
try {
|
|
91
|
+
const instances = await this.adapter.getObjectViewAsync('system', 'instance', {
|
|
92
|
+
startkey: 'system.adapter.',
|
|
93
|
+
endkey: 'system.adapter.\u9999',
|
|
94
|
+
});
|
|
95
|
+
if (instances?.rows) {
|
|
96
|
+
for (const row of instances.rows) {
|
|
97
|
+
const common = row.value?.common;
|
|
98
|
+
// @ts-expect-error will be fixed in js-controller
|
|
99
|
+
if (common?.deviceWidgets && typeof common.deviceWidgets === 'object') {
|
|
100
|
+
// Extract adapter name from "system.adapter.adapterName.0"
|
|
101
|
+
const parts = row.id.split('.');
|
|
102
|
+
const adapterName = parts[2];
|
|
103
|
+
if (adapterName) {
|
|
104
|
+
// @ts-expect-error will be fixed in js-controller
|
|
105
|
+
result[adapterName] = common.deviceWidgets;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
this.log.error(`Cannot load custom widgets from instances: ${e}`);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
sendReply(reply, msg) {
|
|
117
|
+
this.adapter.sendTo(msg.from, msg.command, reply, msg.callback);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.WidgetsManagement = WidgetsManagement;
|
|
121
|
+
//# sourceMappingURL=WidgetsManagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetsManagement.js","sourceRoot":"","sources":["../../src/widget-utils/WidgetsManagement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./WidgetsManagement"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widget-utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/widget-utils/types/api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/widget-utils/types/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/widget-utils/types/common.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/widget-utils/types/index.ts"],"names":[],"mappings":""}
|
|
Binary file
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "devices",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.0.2": {
|
|
7
|
+
"en": "Added widgets' visualisation. Now it is possible to create a GUI within the adapter",
|
|
8
|
+
"de": "Die Visualisierung von Widgets wurde hinzugefügt. Jetzt ist es möglich, eine GUI innerhalb des Adapters zu erstellen",
|
|
9
|
+
"ru": "Добавлена визуализация виджетов. Теперь можно создать GUI внутри адаптера",
|
|
10
|
+
"pt": "Visualização de widgets adicionados. Agora é possível criar uma GUI dentro do adaptador",
|
|
11
|
+
"nl": "Toegevoegd widgets visualisatie. Nu is het mogelijk om een GUI te maken binnen de adapter",
|
|
12
|
+
"fr": "Ajout de la visualisation des widgets. Maintenant il est possible de créer une interface graphique dans l'adaptateur",
|
|
13
|
+
"it": "Aggiunta visualizzazione dei widget. Ora è possibile creare una GUI all'interno dell'adattatore",
|
|
14
|
+
"es": "Visualización de widgets añadidos. Ahora es posible crear un GUI dentro del adaptador",
|
|
15
|
+
"pl": "Dodano wizualizację widżetów. Teraz jest możliwe stworzenie GUI w adapterze",
|
|
16
|
+
"uk": "Додано візуалізацію віджетів. Тепер можна створювати GUI в адаптері",
|
|
17
|
+
"zh-cn": "添加部件的可视化 。 现在可以在适配器内创建图形界面"
|
|
18
|
+
},
|
|
19
|
+
"1.2.14": {
|
|
20
|
+
"en": "Correcting the scrolling on the touch devices\nFixing a problem with `ACTUAL` state\nCorrecting the hover effect under safari",
|
|
21
|
+
"de": "Korrektur des Scrollens auf den Touch-Geräten\nProblem mit `ACTUAL` Zustand beheben\nKorrektur der Hover-Effekt unter Safari",
|
|
22
|
+
"ru": "Коррекция прокрутки на сенсорных устройствах\nУстранение проблемы с «фактическим» состоянием\nКоррекция эффекта парения под сафари",
|
|
23
|
+
"pt": "Corrigindo o rolagem nos dispositivos de toque\nCorrigindo um problema com o estado 'ATUAL'\nCorrigindo o efeito hover sob safari",
|
|
24
|
+
"nl": "Corrigeren van het scrollen op de aanraakapparaten\nHet oplossen van een probleem met de status van \"ACT\"\nCorrigeren van het zweefeffect onder safari",
|
|
25
|
+
"fr": "Correction du défilement sur les appareils tactiles\nCorrection d'un problème avec l'état `ACTUEL`\nCorrection de l'effet hover sous safari",
|
|
26
|
+
"it": "Correggere lo scorrimento sui dispositivi touch\nFissare un problema con lo stato `ACTUAL`\nCorreggere l'effetto hover sotto safari",
|
|
27
|
+
"es": "Corregir el desplazamiento en los dispositivos táctiles\nArreglar un problema con el estado \"ACTUAL\"\nCorregir el efecto del tubo bajo safari",
|
|
28
|
+
"pl": "Korekcja przewijania na urządzeniach dotykowych\nNaprawianie problemu ze stanem 'ACTUAL'\nKorekta efektu unoszenia się pod safari",
|
|
29
|
+
"uk": "Виправлення прокручування на сенсорних пристроях\nВиправлення проблеми з державою `ACTUAL'\nКорекція ефекту конюшини під сафарі",
|
|
30
|
+
"zh-cn": "纠正触摸设备上的滚动\n解决`实际 ' 状态的问题\n校正 Safari 下的悬浮效应"
|
|
31
|
+
},
|
|
6
32
|
"1.2.12": {
|
|
7
33
|
"en": "Show in color if fx is not empty\nAdded for all text fields the clear button",
|
|
8
34
|
"de": "Farbe anzeigen, wenn fx nicht leer ist\nHinzugefügt für alle Textfelder die klare Schaltfläche",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "Aktualizacja czujnika typu\nWykonaj wzór konwersji na wartość bieżącą\nWybór lepszych kategorii\nPoprawiony importer wyrobów",
|
|
68
94
|
"uk": "Type-detector оновлений\nВиконувати формулу перетворення на поточну вартість\nКращий вибір категорій\nВиправлений пристрій імпортера",
|
|
69
95
|
"zh-cn": "类型检测器更新\n执行当前值的转换公式\n更好的类别选择器\n修正设备导入器"
|
|
70
|
-
},
|
|
71
|
-
"1.2.4": {
|
|
72
|
-
"en": "Corrected many GUI issues",
|
|
73
|
-
"de": "Viele GUI Probleme korrigiert",
|
|
74
|
-
"ru": "Исправлено много проблем GUI",
|
|
75
|
-
"pt": "Corrigido muitos problemas de GUI",
|
|
76
|
-
"nl": "Veel GUI-problemen gecorrigeerd",
|
|
77
|
-
"fr": "Correction de nombreux problèmes d'interface utilisateur",
|
|
78
|
-
"it": "Corretto molti problemi GUI",
|
|
79
|
-
"es": "Corregidos muchos problemas de GUI",
|
|
80
|
-
"pl": "Poprawiono wiele problemów GUI",
|
|
81
|
-
"uk": "Виправлено багато питань GUI",
|
|
82
|
-
"zh-cn": "更正了许多图形用户界面问题"
|
|
83
|
-
},
|
|
84
|
-
"1.2.1": {
|
|
85
|
-
"en": "Updated logo\nUpdated type-detector",
|
|
86
|
-
"de": "Aktualisiertes Logo\nAktualisierter Typ-Detektor",
|
|
87
|
-
"ru": "Обновленный логотип\nОбновленный детектор типов",
|
|
88
|
-
"pt": "Logotipo atualizado\nDetetor de tipo atualizado",
|
|
89
|
-
"nl": "Bijgewerkt logo\nBijgewerkt type-detector",
|
|
90
|
-
"fr": "Logo actualisé\nDétecteur de type mis à jour",
|
|
91
|
-
"it": "Logo aggiornato\nTipo di rilevatore aggiornato",
|
|
92
|
-
"es": "Logo Actualizado\nActualizado tipo-detector",
|
|
93
|
-
"pl": "Aktualizacja logo\nAktualizacja czujnika typu",
|
|
94
|
-
"uk": "Оновлений логотип\nОновлений тип-детектор",
|
|
95
|
-
"zh-cn": "更新的标志\n更新类型检测器"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -136,16 +136,16 @@
|
|
|
136
136
|
"connectionType": "none",
|
|
137
137
|
"dataSource": "none",
|
|
138
138
|
"tier": 3,
|
|
139
|
+
"onlyWWW": false,
|
|
139
140
|
"icon": "devices.svg",
|
|
140
141
|
"enabled": true,
|
|
141
142
|
"extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.devices/master/admin/devices.svg",
|
|
142
143
|
"readme": "https://github.com/ioBroker/ioBroker.devices/blob/master/README.md",
|
|
143
144
|
"loglevel": "info",
|
|
144
|
-
"onlyWWW": true,
|
|
145
145
|
"singleton": true,
|
|
146
146
|
"type": "general",
|
|
147
147
|
"eraseOnUpload": true,
|
|
148
|
-
"mode": "
|
|
148
|
+
"mode": "daemon",
|
|
149
149
|
"adminTab": {
|
|
150
150
|
"singleton": true,
|
|
151
151
|
"name": {
|
|
@@ -162,16 +162,44 @@
|
|
|
162
162
|
"zh-cn": "设备"
|
|
163
163
|
}
|
|
164
164
|
},
|
|
165
|
+
"supportedMessages": {
|
|
166
|
+
"deviceManager": true
|
|
167
|
+
},
|
|
165
168
|
"adminUI": {
|
|
166
169
|
"config": "none"
|
|
167
170
|
},
|
|
171
|
+
"welcomeScreen": {
|
|
172
|
+
"link": "devices/index.html",
|
|
173
|
+
"name": "Devices",
|
|
174
|
+
"img": "devices.svg",
|
|
175
|
+
"color": "#2196F3",
|
|
176
|
+
"order": 10
|
|
177
|
+
},
|
|
168
178
|
"globalDependencies": [
|
|
169
179
|
{
|
|
170
|
-
"admin": ">=7.
|
|
180
|
+
"admin": ">=7.6.17"
|
|
171
181
|
}
|
|
172
182
|
]
|
|
173
183
|
},
|
|
174
184
|
"native": {},
|
|
175
185
|
"objects": [],
|
|
176
|
-
"instanceObjects": [
|
|
186
|
+
"instanceObjects": [
|
|
187
|
+
{
|
|
188
|
+
"_id": "",
|
|
189
|
+
"type": "meta",
|
|
190
|
+
"common": {
|
|
191
|
+
"name": "user files and images for GUI",
|
|
192
|
+
"type": "meta.user"
|
|
193
|
+
},
|
|
194
|
+
"native": {}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"_id": "config",
|
|
198
|
+
"type": "channel",
|
|
199
|
+
"common": {
|
|
200
|
+
"name": "Stores the configuration of the GUI"
|
|
201
|
+
},
|
|
202
|
+
"native": {}
|
|
203
|
+
}
|
|
204
|
+
]
|
|
177
205
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.devices",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Manage and create devices for using it in other adapters like material, iot,...",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bluefox",
|
|
@@ -19,43 +19,55 @@
|
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "https://github.com/ioBroker/ioBroker.devices"
|
|
21
21
|
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@iobroker/dm-utils": "^3.0.0",
|
|
24
|
+
"@iobroker/type-detector": "^5.0.10",
|
|
25
|
+
"typescript": "~5.9.3"
|
|
26
|
+
},
|
|
22
27
|
"devDependencies": {
|
|
23
|
-
"@alcalzone/release-script": "^5.
|
|
24
|
-
"@alcalzone/release-script-plugin-iobroker": "^
|
|
25
|
-
"@alcalzone/release-script-plugin-license": "^
|
|
28
|
+
"@alcalzone/release-script": "^5.1.1",
|
|
29
|
+
"@alcalzone/release-script-plugin-iobroker": "^5.1.2",
|
|
30
|
+
"@alcalzone/release-script-plugin-license": "^5.1.1",
|
|
26
31
|
"@iobroker/build-tools": "^3.0.1",
|
|
27
32
|
"@iobroker/eslint-config": "^2.2.0",
|
|
28
33
|
"@iobroker/legacy-testing": "^2.0.2",
|
|
29
34
|
"@iobroker/testing": "^5.2.2",
|
|
30
|
-
"@types
|
|
35
|
+
"@iobroker/types": "^7.1.0",
|
|
36
|
+
"@types/node": "^25.3.5",
|
|
31
37
|
"colorette": "^2.0.20",
|
|
32
|
-
"
|
|
33
|
-
"puppeteer": "^24.36.1"
|
|
38
|
+
"puppeteer": "^24.38.0"
|
|
34
39
|
},
|
|
35
|
-
"main": "
|
|
40
|
+
"main": "build/main.js",
|
|
36
41
|
"files": [
|
|
37
42
|
"admin/",
|
|
38
43
|
"img/",
|
|
44
|
+
"www/",
|
|
45
|
+
"build/",
|
|
39
46
|
"io-package.json",
|
|
40
47
|
"LICENSE"
|
|
41
48
|
],
|
|
42
49
|
"scripts": {
|
|
43
50
|
"prepublishOnly": "node tasks",
|
|
44
|
-
"build": "
|
|
45
|
-
"
|
|
51
|
+
"build:backend": "tsc -p tsconfig.build.json",
|
|
52
|
+
"build": "npm run build:backend && node tasks",
|
|
53
|
+
"lint": "eslint -c eslint.config.mjs && cd src-admin && npm run lint",
|
|
46
54
|
"test:package": "mocha test/package.test.js --exit",
|
|
47
55
|
"test:integration": "mocha test/testAdapter.gui.test.js --exit",
|
|
48
56
|
"release": "release-script",
|
|
49
57
|
"release-patch": "release-script patch --yes",
|
|
50
58
|
"release-minor": "release-script minor --yes",
|
|
51
59
|
"release-major": "release-script major --yes",
|
|
52
|
-
"update-packages": "npx -y npm-check-updates --upgrade && cd src-admin && npx -y npm-check-updates --upgrade",
|
|
53
|
-
"npm": "npm i && cd src-admin && npm i -f",
|
|
60
|
+
"update-packages": "npx -y npm-check-updates --upgrade && cd src-admin && npx -y npm-check-updates --upgrade && cd ../src-www && npx -y npm-check-updates --upgrade",
|
|
61
|
+
"npm": "npm i && cd src-admin && npm i -f && cd ../src-www && npm i -f",
|
|
54
62
|
"test": "npm run test:integration && npm run test:package",
|
|
55
63
|
"0-clean": "node tasks --0-clean",
|
|
56
|
-
"1-npm": "node tasks --1-npm",
|
|
57
|
-
"2-build": "node tasks --2-build",
|
|
58
|
-
"3-copy": "node tasks --3-copy"
|
|
64
|
+
"1-npm-admin": "node tasks --1-npm",
|
|
65
|
+
"2-build-admin": "node tasks --2-build",
|
|
66
|
+
"3-copy-admin": "node tasks --3-copy",
|
|
67
|
+
"0-clean-www": "node tasks --0-clean-www",
|
|
68
|
+
"1-npm-www": "node tasks --1-npm-www",
|
|
69
|
+
"2-build-www": "node tasks --2-build-www",
|
|
70
|
+
"3-copy-www": "node tasks --3-copy-www"
|
|
59
71
|
},
|
|
60
72
|
"bugs": {
|
|
61
73
|
"url": "https://github.com/ioBroker/ioBroker.devices/issues"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
html{height:100%}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;overflow:hidden}::-webkit-scrollbar-track{background-color:#ccc;border-radius:5px}::-webkit-scrollbar{width:5px;height:5px;background-color:#ccc}::-webkit-scrollbar-thumb{background-color:#575757;border-radius:5px}#root,.App{height:100%}@keyframes glow{0%{background-color:initial}to{background-color:#58c458}}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:#ffffff80}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px #000000a6;border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px #0006;background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:#fffc;margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:#fffc;text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px #0006}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}
|