homebridge-eufy-security 4.3.4 → 4.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/homebridge-ui/server.js +369 -376
- package/homebridge-ui/server.js.map +1 -1
- package/package.json +1 -1
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const LIB_VERSION = "4.3.
|
|
1
|
+
export declare const LIB_VERSION = "4.3.6";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/homebridge-ui/server.js
CHANGED
|
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const eufy_security_client_1 = require("eufy-security-client");
|
|
40
|
+
const plugin_ui_utils_1 = require("@homebridge/plugin-ui-utils");
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const tslog_1 = require("tslog");
|
|
42
43
|
const rotating_file_stream_1 = require("rotating-file-stream");
|
|
@@ -44,421 +45,413 @@ const zip_lib_1 = require("zip-lib");
|
|
|
44
45
|
const types_1 = require("./configui/app/util/types");
|
|
45
46
|
const package_json_1 = require("../package.json");
|
|
46
47
|
const path_1 = __importDefault(require("path"));
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
INFO: ['bold', 'blue'],
|
|
97
|
-
WARN: ['bold', 'yellow'],
|
|
98
|
-
ERROR: ['bold', 'red'],
|
|
99
|
-
FATAL: ['bold', 'redBright'],
|
|
100
|
-
},
|
|
101
|
-
dateIsoStr: 'gray',
|
|
102
|
-
filePathWithLine: 'white',
|
|
103
|
-
name: 'green',
|
|
104
|
-
nameWithDelimiterPrefix: ['white', 'bold'],
|
|
105
|
-
nameWithDelimiterSuffix: ['white', 'bold'],
|
|
106
|
-
errorName: ['bold', 'bgRedBright', 'whiteBright'],
|
|
107
|
-
fileName: ['yellow'],
|
|
48
|
+
class UiServer extends plugin_ui_utils_1.HomebridgePluginUiServer {
|
|
49
|
+
stations = [];
|
|
50
|
+
eufyClient = null;
|
|
51
|
+
log;
|
|
52
|
+
tsLog;
|
|
53
|
+
storagePath = this.homebridgeStoragePath + '/eufysecurity';
|
|
54
|
+
storedAccessories_file = this.storagePath + '/accessories.json';
|
|
55
|
+
logZipFilePath = this.storagePath + '/logs.zip';
|
|
56
|
+
adminAccountUsed = false;
|
|
57
|
+
config = {
|
|
58
|
+
username: '',
|
|
59
|
+
password: '',
|
|
60
|
+
language: 'en',
|
|
61
|
+
country: 'US',
|
|
62
|
+
trustedDeviceName: 'My Phone',
|
|
63
|
+
persistentDir: this.storagePath,
|
|
64
|
+
p2pConnectionSetup: 0,
|
|
65
|
+
pollingIntervalMinutes: 99,
|
|
66
|
+
eventDurationSeconds: 10,
|
|
67
|
+
acceptInvitations: true,
|
|
68
|
+
};
|
|
69
|
+
constructor() {
|
|
70
|
+
super();
|
|
71
|
+
this.initLogger();
|
|
72
|
+
this.initTransportStreams();
|
|
73
|
+
this.initEventListeners();
|
|
74
|
+
this.ready();
|
|
75
|
+
}
|
|
76
|
+
initLogger() {
|
|
77
|
+
this.log = new tslog_1.Logger({
|
|
78
|
+
name: `[${package_json_1.version}]`,
|
|
79
|
+
prettyLogTemplate: '{{name}}\t{{logLevelName}}\t[{{fileNameWithLine}}]\t',
|
|
80
|
+
prettyErrorTemplate: '\n{{errorName}} {{errorMessage}}\nerror stack:\n{{errorStack}}',
|
|
81
|
+
prettyErrorStackTemplate: ' • {{fileName}}\t{{method}}\n\t{{fileNameWithLine}}',
|
|
82
|
+
prettyErrorParentNamesSeparator: ':',
|
|
83
|
+
prettyErrorLoggerNameDelimiter: '\t',
|
|
84
|
+
stylePrettyLogs: true,
|
|
85
|
+
minLevel: 2,
|
|
86
|
+
prettyLogTimeZone: 'local',
|
|
87
|
+
prettyLogStyles: {
|
|
88
|
+
logLevelName: {
|
|
89
|
+
'*': ['bold', 'black', 'bgWhiteBright', 'dim'],
|
|
90
|
+
SILLY: ['bold', 'white'],
|
|
91
|
+
TRACE: ['bold', 'whiteBright'],
|
|
92
|
+
DEBUG: ['bold', 'green'],
|
|
93
|
+
INFO: ['bold', 'blue'],
|
|
94
|
+
WARN: ['bold', 'yellow'],
|
|
95
|
+
ERROR: ['bold', 'red'],
|
|
96
|
+
FATAL: ['bold', 'redBright'],
|
|
108
97
|
},
|
|
109
|
-
|
|
110
|
-
|
|
98
|
+
dateIsoStr: 'gray',
|
|
99
|
+
filePathWithLine: 'white',
|
|
100
|
+
name: 'green',
|
|
101
|
+
nameWithDelimiterPrefix: ['white', 'bold'],
|
|
102
|
+
nameWithDelimiterSuffix: ['white', 'bold'],
|
|
103
|
+
errorName: ['bold', 'bgRedBright', 'whiteBright'],
|
|
104
|
+
fileName: ['yellow'],
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
this.tsLog = new tslog_1.Logger({ type: 'hidden', minLevel: 2 });
|
|
108
|
+
}
|
|
109
|
+
initTransportStreams() {
|
|
110
|
+
if (!fs.existsSync(this.storagePath)) {
|
|
111
|
+
fs.mkdirSync(this.storagePath);
|
|
111
112
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
const pluginLogStream = (0, rotating_file_stream_1.createStream)('configui-server.log', { path: this.storagePath, interval: '1d', rotate: 3, maxSize: '200M' });
|
|
114
|
+
const pluginLogLibStream = (0, rotating_file_stream_1.createStream)('configui-lib.log', { path: this.storagePath, interval: '1d', rotate: 3, maxSize: '200M' });
|
|
115
|
+
this.log.attachTransport((logObj) => pluginLogStream.write(JSON.stringify(logObj) + '\n'));
|
|
116
|
+
this.tsLog.attachTransport((logObj) => pluginLogLibStream.write(JSON.stringify(logObj) + '\n'));
|
|
117
|
+
this.log.debug('Using bropats eufy-security-client library in version ' + eufy_security_client_1.libVersion);
|
|
118
|
+
}
|
|
119
|
+
initEventListeners() {
|
|
120
|
+
this.onRequest('/login', this.login.bind(this));
|
|
121
|
+
this.onRequest('/storedAccessories', this.loadStoredAccessories.bind(this));
|
|
122
|
+
this.onRequest('/reset', this.resetPlugin.bind(this));
|
|
123
|
+
this.onRequest('/downloadLogs', this.downloadLogs.bind(this));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Deletes a file if it exists.
|
|
127
|
+
*
|
|
128
|
+
* @param filePath The path to the file to be deleted.
|
|
129
|
+
* @returns A Promise that resolves when the operation is complete, or rejects if an error occurs.
|
|
130
|
+
* @throws Will reject the Promise with the error if file deletion fails.
|
|
131
|
+
*/
|
|
132
|
+
async deleteFileIfExists(filePath) {
|
|
133
|
+
try {
|
|
134
|
+
if (fs.existsSync(filePath)) {
|
|
135
|
+
fs.unlinkSync(filePath);
|
|
115
136
|
}
|
|
116
|
-
const pluginLogStream = (0, rotating_file_stream_1.createStream)('configui-server.log', { path: this.storagePath, interval: '1d', rotate: 3, maxSize: '200M' });
|
|
117
|
-
const pluginLogLibStream = (0, rotating_file_stream_1.createStream)('configui-lib.log', { path: this.storagePath, interval: '1d', rotate: 3, maxSize: '200M' });
|
|
118
|
-
this.log.attachTransport((logObj) => pluginLogStream.write(JSON.stringify(logObj) + '\n'));
|
|
119
|
-
this.tsLog.attachTransport((logObj) => pluginLogLibStream.write(JSON.stringify(logObj) + '\n'));
|
|
120
|
-
this.log.debug('Using bropats eufy-security-client library in version ' + eufy_security_client_1.libVersion);
|
|
121
137
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
this.onRequest('/storedAccessories', this.loadStoredAccessories.bind(this));
|
|
125
|
-
this.onRequest('/reset', this.resetPlugin.bind(this));
|
|
126
|
-
this.onRequest('/downloadLogs', this.downloadLogs.bind(this));
|
|
138
|
+
catch (error) {
|
|
139
|
+
return Promise.reject(error);
|
|
127
140
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Resets the persistent data by removing the persistent.json file.
|
|
144
|
+
*
|
|
145
|
+
* @returns A Promise that resolves when the operation is complete, or rejects if an error occurs.
|
|
146
|
+
*/
|
|
147
|
+
async resetPersistentData() {
|
|
148
|
+
return this.deleteFileIfExists(this.storagePath + '/persistent.json');
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Resets the accessory data by removing the stored accessories file.
|
|
152
|
+
*
|
|
153
|
+
* @returns A Promise that resolves when the operation is complete, or rejects if an error occurs.
|
|
154
|
+
*/
|
|
155
|
+
async resetAccessoryData() {
|
|
156
|
+
return this.deleteFileIfExists(this.storedAccessories_file);
|
|
157
|
+
}
|
|
158
|
+
async login(options) {
|
|
159
|
+
try {
|
|
160
|
+
if (options && options.username && options.password) {
|
|
161
|
+
this.log.info('deleting persistent.json and accessories due to new login');
|
|
162
|
+
this.resetAccessoryData();
|
|
163
|
+
await this.resetPersistentData(); // To be commented for testing purpose
|
|
143
164
|
}
|
|
144
165
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
*
|
|
148
|
-
* @returns A Promise that resolves when the operation is complete, or rejects if an error occurs.
|
|
149
|
-
*/
|
|
150
|
-
async resetPersistentData() {
|
|
151
|
-
return this.deleteFileIfExists(this.storagePath + '/persistent.json');
|
|
166
|
+
catch (error) {
|
|
167
|
+
this.log.error('Could not delete persistent.json due to error: ' + error);
|
|
152
168
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
async login(options) {
|
|
169
|
+
if (!this.eufyClient && options && options.username && options.password && options.country) {
|
|
170
|
+
this.stations = [];
|
|
171
|
+
this.log.debug('init eufyClient');
|
|
172
|
+
this.config.username = options.username;
|
|
173
|
+
this.config.password = options.password;
|
|
174
|
+
this.config.country = options.country;
|
|
175
|
+
this.config.trustedDeviceName = options.deviceName;
|
|
162
176
|
try {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
177
|
+
this.eufyClient = await eufy_security_client_1.EufySecurity.initialize(this.config, this.tsLog);
|
|
178
|
+
this.eufyClient?.on('station added', await this.addStation.bind(this));
|
|
179
|
+
this.eufyClient?.on('device added', await this.addDevice.bind(this));
|
|
180
|
+
// Close connection after 40 seconds enough time to get all devices
|
|
181
|
+
setTimeout(() => {
|
|
182
|
+
this.eufyClient?.removeAllListeners();
|
|
183
|
+
this.eufyClient?.close();
|
|
184
|
+
}, 40 * 1000);
|
|
168
185
|
}
|
|
169
186
|
catch (error) {
|
|
170
|
-
this.log.error(
|
|
187
|
+
this.log.error(error);
|
|
171
188
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
this.
|
|
189
|
+
}
|
|
190
|
+
return new Promise((resolve, reject) => {
|
|
191
|
+
setTimeout(() => {
|
|
192
|
+
resolve({ success: false, failReason: types_1.LoginFailReason.TIMEOUT });
|
|
193
|
+
}, 25 * 1000);
|
|
194
|
+
if (options && options.username && options.password && options.country) {
|
|
195
|
+
this.log.debug('login with credentials');
|
|
179
196
|
try {
|
|
180
|
-
this.
|
|
181
|
-
this.eufyClient?.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
setTimeout(() => {
|
|
185
|
-
this.eufyClient?.removeAllListeners();
|
|
186
|
-
this.eufyClient?.close();
|
|
187
|
-
}, 40 * 1000);
|
|
197
|
+
this.loginHandlers(resolve);
|
|
198
|
+
this.eufyClient?.connect()
|
|
199
|
+
.then(() => this.log.debug('connected?: ' + this.eufyClient?.isConnected()))
|
|
200
|
+
.catch((error) => this.log.error(error));
|
|
188
201
|
}
|
|
189
202
|
catch (error) {
|
|
190
203
|
this.log.error(error);
|
|
204
|
+
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
191
205
|
}
|
|
192
206
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
resolve
|
|
196
|
-
|
|
197
|
-
if (options && options.username && options.password && options.country) {
|
|
198
|
-
this.log.debug('login with credentials');
|
|
199
|
-
try {
|
|
200
|
-
this.loginHandlers(resolve);
|
|
201
|
-
this.eufyClient?.connect()
|
|
202
|
-
.then(() => this.log.debug('connected?: ' + this.eufyClient?.isConnected()))
|
|
203
|
-
.catch((error) => this.log.error(error));
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
this.log.error(error);
|
|
207
|
-
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
else if (options && options.verifyCode) {
|
|
211
|
-
try {
|
|
212
|
-
this.loginHandlers(resolve);
|
|
213
|
-
this.eufyClient?.connect({ verifyCode: options.verifyCode, force: false });
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else if (options && options.captcha) {
|
|
220
|
-
try {
|
|
221
|
-
this.loginHandlers(resolve);
|
|
222
|
-
this.eufyClient?.connect({ captcha: { captchaCode: options.captcha.captchaCode, captchaId: options.captcha.captchaId }, force: false });
|
|
223
|
-
}
|
|
224
|
-
catch (error) {
|
|
225
|
-
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
226
|
-
}
|
|
207
|
+
else if (options && options.verifyCode) {
|
|
208
|
+
try {
|
|
209
|
+
this.loginHandlers(resolve);
|
|
210
|
+
this.eufyClient?.connect({ verifyCode: options.verifyCode, force: false });
|
|
227
211
|
}
|
|
228
|
-
|
|
229
|
-
|
|
212
|
+
catch (error) {
|
|
213
|
+
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
230
214
|
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
this.eufyClient?.once('connect', () => resolveCallback({ success: true }));
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Asynchronously loads stored accessories from a file.
|
|
240
|
-
* @returns A promise resolving to an array of accessories.
|
|
241
|
-
*/
|
|
242
|
-
async loadStoredAccessories() {
|
|
243
|
-
try {
|
|
244
|
-
// Check if the stored accessories file exists
|
|
245
|
-
if (!fs.existsSync(this.storedAccessories_file)) {
|
|
246
|
-
// If the file doesn't exist, log a warning and return an empty array
|
|
247
|
-
this.log.debug('Stored accessories file does not exist.');
|
|
248
|
-
return [];
|
|
215
|
+
}
|
|
216
|
+
else if (options && options.captcha) {
|
|
217
|
+
try {
|
|
218
|
+
this.loginHandlers(resolve);
|
|
219
|
+
this.eufyClient?.connect({ captcha: { captchaCode: options.captcha.captchaCode, captchaId: options.captcha.captchaId }, force: false });
|
|
249
220
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
// Parse the JSON data obtained from the file
|
|
253
|
-
const { version: storedVersion, stations: storedAccessories } = JSON.parse(storedData);
|
|
254
|
-
// Compare the stored version with the current version
|
|
255
|
-
if (storedVersion !== package_json_1.version) {
|
|
256
|
-
// If the versions do not match, log a warning and push an event
|
|
257
|
-
this.pushEvent('versionUnmatched', { currentVersion: package_json_1.version, storedVersion: storedVersion });
|
|
258
|
-
this.log.warn(`Stored version (${storedVersion}) does not match current version (${package_json_1.version})`);
|
|
221
|
+
catch (error) {
|
|
222
|
+
resolve({ success: false, failReason: types_1.LoginFailReason.UNKNOWN, data: { error: error } });
|
|
259
223
|
}
|
|
260
|
-
// Return the parsed accessories
|
|
261
|
-
return storedAccessories;
|
|
262
224
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
225
|
+
else {
|
|
226
|
+
reject('unsupported login method');
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
loginHandlers(resolveCallback) {
|
|
231
|
+
this.eufyClient?.once('tfa request', () => resolveCallback({ success: false, failReason: types_1.LoginFailReason.TFA }));
|
|
232
|
+
this.eufyClient?.once('captcha request', (id, captcha) => resolveCallback({ success: false, failReason: types_1.LoginFailReason.CAPTCHA, data: { id: id, captcha: captcha } }));
|
|
233
|
+
this.eufyClient?.once('connect', () => resolveCallback({ success: true }));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Asynchronously loads stored accessories from a file.
|
|
237
|
+
* @returns A promise resolving to an array of accessories.
|
|
238
|
+
*/
|
|
239
|
+
async loadStoredAccessories() {
|
|
240
|
+
try {
|
|
241
|
+
// Check if the stored accessories file exists
|
|
242
|
+
if (!fs.existsSync(this.storedAccessories_file)) {
|
|
243
|
+
// If the file doesn't exist, log a warning and return an empty array
|
|
244
|
+
this.log.debug('Stored accessories file does not exist.');
|
|
266
245
|
return [];
|
|
267
246
|
}
|
|
247
|
+
// Read the content of the stored accessories file asynchronously
|
|
248
|
+
const storedData = await fs.promises.readFile(this.storedAccessories_file, { encoding: 'utf-8' });
|
|
249
|
+
// Parse the JSON data obtained from the file
|
|
250
|
+
const { version: storedVersion, stations: storedAccessories } = JSON.parse(storedData);
|
|
251
|
+
// Compare the stored version with the current version
|
|
252
|
+
if (storedVersion !== package_json_1.version) {
|
|
253
|
+
// If the versions do not match, log a warning and push an event
|
|
254
|
+
this.pushEvent('versionUnmatched', { currentVersion: package_json_1.version, storedVersion: storedVersion });
|
|
255
|
+
this.log.warn(`Stored version (${storedVersion}) does not match current version (${package_json_1.version})`);
|
|
256
|
+
}
|
|
257
|
+
// Return the parsed accessories
|
|
258
|
+
return storedAccessories;
|
|
268
259
|
}
|
|
269
|
-
|
|
270
|
-
|
|
260
|
+
catch (error) {
|
|
261
|
+
// If an error occurs during the process, log an error message and return an empty array
|
|
262
|
+
this.log.error('Could not get stored accessories. Most likely no stored accessories yet: ' + error);
|
|
263
|
+
return [];
|
|
271
264
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
265
|
+
}
|
|
266
|
+
async delay(ms) {
|
|
267
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
268
|
+
}
|
|
269
|
+
async addStation(station) {
|
|
270
|
+
// Before doing anything check if creds are guest admin
|
|
271
|
+
const rawStation = station.getRawStation();
|
|
272
|
+
if (rawStation.member.member_type !== eufy_security_client_1.UserType.ADMIN) {
|
|
273
|
+
this.adminAccountUsed = true;
|
|
274
|
+
this.eufyClient?.close();
|
|
275
|
+
this.pushEvent('AdminAccountUsed', true);
|
|
276
|
+
this.resetPlugin();
|
|
277
|
+
this.log.error(`
|
|
278
|
+
#########################
|
|
279
|
+
######### ERROR #########
|
|
280
|
+
#########################
|
|
281
|
+
You're not using a guest admin account with this plugin! You must use a guest admin account!
|
|
282
|
+
Please look here for more details:
|
|
283
|
+
https://github.com/homebridge-eufy-security/plugin/wiki/Create-a-dedicated-admin-account-for-Homebridge-Eufy-Security-Plugin
|
|
284
|
+
#########################
|
|
285
|
+
`);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
await this.delay(1000);
|
|
289
|
+
const s = {
|
|
290
|
+
uniqueId: station.getSerial(),
|
|
291
|
+
displayName: station.getName(),
|
|
292
|
+
type: station.getDeviceType(),
|
|
293
|
+
typename: eufy_security_client_1.DeviceType[station.getDeviceType()],
|
|
294
|
+
disabled: false,
|
|
295
|
+
devices: [],
|
|
296
|
+
};
|
|
297
|
+
s.ignored = (this.config['ignoreStations'] ?? []).includes(s.uniqueId);
|
|
298
|
+
// Standalone Lock or Doorbell doesn't have Security Control
|
|
299
|
+
if (eufy_security_client_1.Device.isLock(s.type) || eufy_security_client_1.Device.isDoorbell(s.type)) {
|
|
300
|
+
s.disabled = true;
|
|
301
|
+
s.ignored = true;
|
|
302
|
+
}
|
|
303
|
+
this.stations.push(s);
|
|
304
|
+
this.storeAccessories();
|
|
305
|
+
this.pushEvent('addAccessory', this.stations);
|
|
306
|
+
}
|
|
307
|
+
async addDevice(device) {
|
|
308
|
+
// Before doing anything check if creds are guest admin
|
|
309
|
+
if (this.adminAccountUsed) {
|
|
310
|
+
this.pushEvent('AdminAccountUsed', true);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
await this.delay(2000);
|
|
314
|
+
const d = {
|
|
315
|
+
uniqueId: device.getSerial(),
|
|
316
|
+
displayName: device.getName(),
|
|
317
|
+
type: device.getDeviceType(),
|
|
318
|
+
typename: eufy_security_client_1.DeviceType[device.getDeviceType()],
|
|
319
|
+
standalone: device.getSerial() === device.getStationSerial(),
|
|
320
|
+
hasBattery: device.hasBattery(),
|
|
321
|
+
isCamera: device.isCamera(),
|
|
322
|
+
isDoorbell: device.isDoorbell(),
|
|
323
|
+
isKeypad: device.isKeyPad(),
|
|
324
|
+
supportsRTSP: device.hasPropertyValue(eufy_security_client_1.PropertyName.DeviceRTSPStream),
|
|
325
|
+
supportsTalkback: device.hasCommand(eufy_security_client_1.CommandName.DeviceStartTalkback),
|
|
326
|
+
DeviceEnabled: device.hasProperty(eufy_security_client_1.PropertyName.DeviceEnabled),
|
|
327
|
+
DeviceMotionDetection: device.hasProperty(eufy_security_client_1.PropertyName.DeviceMotionDetection),
|
|
328
|
+
DeviceLight: device.hasProperty(eufy_security_client_1.PropertyName.DeviceLight),
|
|
329
|
+
DeviceChimeIndoor: device.hasProperty(eufy_security_client_1.PropertyName.DeviceChimeIndoor),
|
|
330
|
+
disabled: false,
|
|
331
|
+
properties: device.getProperties(),
|
|
332
|
+
};
|
|
333
|
+
if (device.hasProperty(eufy_security_client_1.PropertyName.DeviceChargingStatus)) {
|
|
334
|
+
d.chargingStatus = device.getPropertyValue(eufy_security_client_1.PropertyName.DeviceChargingStatus);
|
|
335
|
+
}
|
|
336
|
+
try {
|
|
337
|
+
delete d.properties.picture;
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
this.log.error(error);
|
|
341
|
+
}
|
|
342
|
+
d.ignored = (this.config['ignoreDevices'] ?? []).includes(d.uniqueId);
|
|
343
|
+
const stationUniqueId = device.getStationSerial();
|
|
344
|
+
const stationIndex = this.stations.findIndex(station => station.uniqueId === stationUniqueId);
|
|
345
|
+
if (stationIndex !== -1) {
|
|
346
|
+
if (!this.stations[stationIndex].devices) {
|
|
347
|
+
this.stations[stationIndex].devices = [];
|
|
305
348
|
}
|
|
306
|
-
this.stations.push(
|
|
349
|
+
this.stations[stationIndex].devices.push(d);
|
|
307
350
|
this.storeAccessories();
|
|
308
351
|
this.pushEvent('addAccessory', this.stations);
|
|
309
352
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
if (this.adminAccountUsed) {
|
|
313
|
-
this.pushEvent('AdminAccountUsed', true);
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
await this.delay(2000);
|
|
317
|
-
const d = {
|
|
318
|
-
uniqueId: device.getSerial(),
|
|
319
|
-
displayName: device.getName(),
|
|
320
|
-
type: device.getDeviceType(),
|
|
321
|
-
typename: eufy_security_client_1.DeviceType[device.getDeviceType()],
|
|
322
|
-
standalone: device.getSerial() === device.getStationSerial(),
|
|
323
|
-
hasBattery: device.hasBattery(),
|
|
324
|
-
isCamera: device.isCamera(),
|
|
325
|
-
isDoorbell: device.isDoorbell(),
|
|
326
|
-
isKeypad: device.isKeyPad(),
|
|
327
|
-
supportsRTSP: device.hasPropertyValue(eufy_security_client_1.PropertyName.DeviceRTSPStream),
|
|
328
|
-
supportsTalkback: device.hasCommand(eufy_security_client_1.CommandName.DeviceStartTalkback),
|
|
329
|
-
DeviceEnabled: device.hasProperty(eufy_security_client_1.PropertyName.DeviceEnabled),
|
|
330
|
-
DeviceMotionDetection: device.hasProperty(eufy_security_client_1.PropertyName.DeviceMotionDetection),
|
|
331
|
-
DeviceLight: device.hasProperty(eufy_security_client_1.PropertyName.DeviceLight),
|
|
332
|
-
DeviceChimeIndoor: device.hasProperty(eufy_security_client_1.PropertyName.DeviceChimeIndoor),
|
|
333
|
-
disabled: false,
|
|
334
|
-
properties: device.getProperties(),
|
|
335
|
-
};
|
|
336
|
-
if (device.hasProperty(eufy_security_client_1.PropertyName.DeviceChargingStatus)) {
|
|
337
|
-
d.chargingStatus = device.getPropertyValue(eufy_security_client_1.PropertyName.DeviceChargingStatus);
|
|
338
|
-
}
|
|
339
|
-
try {
|
|
340
|
-
delete d.properties.picture;
|
|
341
|
-
}
|
|
342
|
-
catch (error) {
|
|
343
|
-
this.log.error(error);
|
|
344
|
-
}
|
|
345
|
-
d.ignored = (this.config['ignoreDevices'] ?? []).includes(d.uniqueId);
|
|
346
|
-
const stationUniqueId = device.getStationSerial();
|
|
347
|
-
const stationIndex = this.stations.findIndex(station => station.uniqueId === stationUniqueId);
|
|
348
|
-
if (stationIndex !== -1) {
|
|
349
|
-
if (!this.stations[stationIndex].devices) {
|
|
350
|
-
this.stations[stationIndex].devices = [];
|
|
351
|
-
}
|
|
352
|
-
this.stations[stationIndex].devices.push(d);
|
|
353
|
-
this.storeAccessories();
|
|
354
|
-
this.pushEvent('addAccessory', this.stations);
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
this.log.error('Station not found for device:', d.displayName);
|
|
358
|
-
}
|
|
353
|
+
else {
|
|
354
|
+
this.log.error('Station not found for device:', d.displayName);
|
|
359
355
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
356
|
+
}
|
|
357
|
+
storeAccessories() {
|
|
358
|
+
const dataToStore = { version: package_json_1.version, stations: this.stations };
|
|
359
|
+
fs.writeFileSync(this.storedAccessories_file, JSON.stringify(dataToStore));
|
|
360
|
+
}
|
|
361
|
+
async resetPlugin() {
|
|
362
|
+
try {
|
|
363
|
+
fs.rmSync(this.storagePath, { recursive: true });
|
|
364
|
+
return { result: 1 };
|
|
363
365
|
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
366
|
+
catch (error) {
|
|
367
|
+
this.log.error('Could not reset plugin: ' + error);
|
|
368
|
+
return { result: 0 };
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
async getLogs() {
|
|
372
|
+
// Step 1: List Files in Directory
|
|
373
|
+
// Asynchronously list all files in the directory specified by this.storagePath.
|
|
374
|
+
const files = await fs.promises.readdir(this.storagePath);
|
|
375
|
+
// Step 2: Filter Log Files
|
|
376
|
+
// Filter the list of files to include only those with names ending in .log, .log.0.
|
|
377
|
+
const logFiles = files.filter(file => {
|
|
378
|
+
return file.endsWith('.log') || file.endsWith('.log.0');
|
|
379
|
+
});
|
|
380
|
+
// Step 3: Filter out Empty Log Files
|
|
381
|
+
const nonEmptyLogFiles = await Promise.all(logFiles.map(async (file) => {
|
|
382
|
+
const filePath = path_1.default.join(this.storagePath, file);
|
|
383
|
+
const stats = await fs.promises.stat(filePath);
|
|
384
|
+
if (stats.size > 0) {
|
|
385
|
+
return file;
|
|
372
386
|
}
|
|
387
|
+
return null;
|
|
388
|
+
}));
|
|
389
|
+
// Step 4: Remove null entries (empty log files) from the array
|
|
390
|
+
return nonEmptyLogFiles.filter(file => file !== null);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Asynchronously compresses log files from a directory and returns a Promise that resolves to a Buffer.
|
|
394
|
+
* @returns {Promise<Buffer>} A Promise resolving to a Buffer containing compressed log files.
|
|
395
|
+
*/
|
|
396
|
+
async downloadLogs() {
|
|
397
|
+
this.pushEvent('downloadLogsProgress', { progress: 10, status: 'Gets non-empty log files' });
|
|
398
|
+
const finalLogFiles = await this.getLogs();
|
|
399
|
+
// Step 5: Add Log Files to Zip
|
|
400
|
+
// Initialize a Zip instance and add each log file to the archive.
|
|
401
|
+
this.pushEvent('downloadLogsProgress', { progress: 30, status: 'Add Log Files to Zip' });
|
|
402
|
+
const zip = new zip_lib_1.Zip();
|
|
403
|
+
let numberOfFiles = 0;
|
|
404
|
+
finalLogFiles.forEach(logFile => {
|
|
405
|
+
const filePath = path_1.default.join(this.storagePath, logFile);
|
|
406
|
+
zip.addFile(filePath);
|
|
407
|
+
numberOfFiles++;
|
|
408
|
+
});
|
|
409
|
+
// Step 6: Handle No Log Files Found
|
|
410
|
+
// If no log files are found after filtering, throw an error.
|
|
411
|
+
this.pushEvent('downloadLogsProgress', { progress: 40, status: 'No Log Files Found' });
|
|
412
|
+
if (numberOfFiles === 0) {
|
|
413
|
+
throw new Error('No log files were found');
|
|
373
414
|
}
|
|
374
|
-
|
|
375
|
-
// Step
|
|
376
|
-
//
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
//
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
// Step
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
if (stats.size > 0) {
|
|
388
|
-
return file;
|
|
389
|
-
}
|
|
390
|
-
return null;
|
|
391
|
-
}));
|
|
392
|
-
// Step 4: Remove null entries (empty log files) from the array
|
|
393
|
-
return nonEmptyLogFiles.filter(file => file !== null);
|
|
415
|
+
try {
|
|
416
|
+
// Step 7: Archive Zip
|
|
417
|
+
// Archive the Zip instance to the specified log zip file.
|
|
418
|
+
this.pushEvent('downloadLogsProgress', { progress: 45, status: `Compressing ${numberOfFiles} files` });
|
|
419
|
+
await zip.archive(this.logZipFilePath);
|
|
420
|
+
// Step 8: Read Zip File
|
|
421
|
+
// Read the content of the generated log zip file into a Buffer.
|
|
422
|
+
this.pushEvent('downloadLogsProgress', { progress: 80, status: 'Reading content' });
|
|
423
|
+
const fileBuffer = fs.readFileSync(this.logZipFilePath);
|
|
424
|
+
// Step 9: Return Buffer
|
|
425
|
+
// Return the Buffer containing the compressed log files.
|
|
426
|
+
this.pushEvent('downloadLogsProgress', { progress: 90, status: 'Returning zip file' });
|
|
427
|
+
return fileBuffer;
|
|
394
428
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
this.pushEvent('downloadLogsProgress', { progress: 10, status: 'Gets non-empty log files' });
|
|
401
|
-
const finalLogFiles = await this.getLogs();
|
|
402
|
-
// Step 5: Add Log Files to Zip
|
|
403
|
-
// Initialize a Zip instance and add each log file to the archive.
|
|
404
|
-
this.pushEvent('downloadLogsProgress', { progress: 30, status: 'Add Log Files to Zip' });
|
|
405
|
-
const zip = new zip_lib_1.Zip();
|
|
406
|
-
let numberOfFiles = 0;
|
|
407
|
-
finalLogFiles.forEach(logFile => {
|
|
408
|
-
const filePath = path_1.default.join(this.storagePath, logFile);
|
|
409
|
-
zip.addFile(filePath);
|
|
410
|
-
numberOfFiles++;
|
|
411
|
-
});
|
|
412
|
-
// Step 6: Handle No Log Files Found
|
|
413
|
-
// If no log files are found after filtering, throw an error.
|
|
414
|
-
this.pushEvent('downloadLogsProgress', { progress: 40, status: 'No Log Files Found' });
|
|
415
|
-
if (numberOfFiles === 0) {
|
|
416
|
-
throw new Error('No log files were found');
|
|
417
|
-
}
|
|
418
|
-
try {
|
|
419
|
-
// Step 7: Archive Zip
|
|
420
|
-
// Archive the Zip instance to the specified log zip file.
|
|
421
|
-
this.pushEvent('downloadLogsProgress', { progress: 45, status: `Compressing ${numberOfFiles} files` });
|
|
422
|
-
await zip.archive(this.logZipFilePath);
|
|
423
|
-
// Step 8: Read Zip File
|
|
424
|
-
// Read the content of the generated log zip file into a Buffer.
|
|
425
|
-
this.pushEvent('downloadLogsProgress', { progress: 80, status: 'Reading content' });
|
|
426
|
-
const fileBuffer = fs.readFileSync(this.logZipFilePath);
|
|
427
|
-
// Step 9: Return Buffer
|
|
428
|
-
// Return the Buffer containing the compressed log files.
|
|
429
|
-
this.pushEvent('downloadLogsProgress', { progress: 90, status: 'Returning zip file' });
|
|
430
|
-
return fileBuffer;
|
|
431
|
-
}
|
|
432
|
-
catch (error) {
|
|
433
|
-
// Step 10: Error Handling
|
|
434
|
-
// Log an error if archiving the zip file fails and propagate the error.
|
|
435
|
-
this.log.error('Error while generating log files: ' + error);
|
|
436
|
-
throw error;
|
|
437
|
-
}
|
|
438
|
-
finally {
|
|
439
|
-
// Step 11: Cleanup
|
|
440
|
-
// Ensure to remove any compressed log files after the operation, regardless of success or failure.
|
|
441
|
-
this.removeCompressedLogs();
|
|
442
|
-
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
// Step 10: Error Handling
|
|
431
|
+
// Log an error if archiving the zip file fails and propagate the error.
|
|
432
|
+
this.log.error('Error while generating log files: ' + error);
|
|
433
|
+
throw error;
|
|
443
434
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
435
|
+
finally {
|
|
436
|
+
// Step 11: Cleanup
|
|
437
|
+
// Ensure to remove any compressed log files after the operation, regardless of success or failure.
|
|
438
|
+
this.removeCompressedLogs();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
removeCompressedLogs() {
|
|
442
|
+
try {
|
|
443
|
+
if (fs.existsSync(this.logZipFilePath)) {
|
|
444
|
+
fs.unlinkSync(this.logZipFilePath);
|
|
453
445
|
}
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
return false;
|
|
454
450
|
}
|
|
455
451
|
}
|
|
456
|
-
// Start the instance of the server
|
|
457
|
-
new UiServer();
|
|
458
452
|
}
|
|
459
|
-
//
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
});
|
|
453
|
+
// Start the instance of the server
|
|
454
|
+
(() => {
|
|
455
|
+
return new UiServer();
|
|
456
|
+
})();
|
|
464
457
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAAsJ;AACtJ,uCAAyB;AACzB,iCAAoD;AACpD,+DAAoD;AACpD,qCAA8B;AAC9B,qDAAyG;AACzG,kDAA0C;AAC1C,gDAAwB;AAExB,gDAAgD;AAChD,KAAK,UAAU,UAAU;IACvB,mCAAmC;IACnC,MAAM,EAAE,wBAAwB,EAAE,GAAG,wDAAa,6BAA6B,GAAC,CAAC;IAEjF,MAAM,QAAS,SAAQ,wBAAwB;QACtC,QAAQ,GAAgB,EAAE,CAAC;QAE1B,UAAU,GAAwB,IAAI,CAAC;QACvC,GAAG,CAAqB;QACxB,KAAK,CAAqB;QAC1B,WAAW,GAAW,IAAI,CAAC,qBAAqB,GAAG,eAAe,CAAC;QACnE,sBAAsB,GAAW,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC;QACxE,cAAc,GAAW,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAExD,gBAAgB,GAAY,KAAK,CAAC;QAEnC,MAAM,GAAuB;YAClC,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,UAAU;YAC7B,aAAa,EAAE,IAAI,CAAC,WAAW;YAC/B,kBAAkB,EAAE,CAAC;YACrB,sBAAsB,EAAE,EAAE;YAC1B,oBAAoB,EAAE,EAAE;YACxB,iBAAiB,EAAE,IAAI;SACF,CAAC;QAExB;YACE,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAEO,UAAU;YAChB,IAAI,CAAC,GAAG,GAAG,IAAI,cAAQ,CAAC;gBACtB,IAAI,EAAE,IAAI,sBAAO,GAAG;gBACpB,iBAAiB,EAAE,sDAAsD;gBACzE,mBAAmB,EAAE,gEAAgE;gBACrF,wBAAwB,EAAE,sDAAsD;gBAChF,+BAA+B,EAAE,GAAG;gBACpC,8BAA8B,EAAE,IAAI;gBACpC,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,CAAC;gBACX,iBAAiB,EAAE,OAA4B;gBAC/C,eAAe,EAAE;oBACf,YAAY,EAAE;wBACZ,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC;wBAC9C,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;wBACxB,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;wBAC9B,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;wBACxB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;wBACtB,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;wBACxB,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;wBACtB,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;qBAC7B;oBACD,UAAU,EAAE,MAAM;oBAClB,gBAAgB,EAAE,OAAO;oBACzB,IAAI,EAAE,OAAO;oBACb,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;oBAC1C,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;oBAC1C,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC;oBACjD,QAAQ,EAAE,CAAC,QAAQ,CAAC;iBACrB;aACF,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,cAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAEO,oBAAoB;YAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,eAAe,GAAG,IAAA,mCAAY,EAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpI,MAAM,kBAAkB,GAAG,IAAA,mCAAY,EAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3F,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAChG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wDAAwD,GAAG,iCAAU,CAAC,CAAC;QACxF,CAAC;QAEO,kBAAkB;YACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,CAAC;QAED;;;;;;WAMG;QACK,KAAK,CAAC,kBAAkB,CAAC,QAAgB;YAC/C,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,mBAAmB;YACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,CAAC;QACxE,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,kBAAkB;YACtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,IAAI,CAAC;gBACH,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACpD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;oBAC3E,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,sCAAsC;gBAC1E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iDAAiD,GAAG,KAAK,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3F,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;gBACnD,IAAI,CAAC;oBACH,IAAI,CAAC,UAAU,GAAG,MAAM,mCAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACvE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrE,mEAAmE;oBACnE,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,CAAC;wBACtC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;oBAC3B,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;gBAEd,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACvE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBACzC,IAAI,CAAC;wBACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC5B,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;6BACvB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;6BAC3E,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC7C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACtB,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACzC,IAAI,CAAC;wBACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC5B,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC7E,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,CAAC;wBACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC5B,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1I,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,0BAA0B,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,aAAa,CAAC,eAAe;YAC3B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjH,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,uBAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACxK,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,qBAAqB;YACzB,IAAI,CAAC;gBACH,8CAA8C;gBAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBAChD,qEAAqE;oBACrE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;oBAC1D,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,iEAAiE;gBACjE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAElG,6CAA6C;gBAC7C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEvF,sDAAsD;gBACtD,IAAI,aAAa,KAAK,sBAAO,EAAE,CAAC;oBAC9B,gEAAgE;oBAChE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,cAAc,EAAE,sBAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;oBAC9F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,aAAa,qCAAqC,sBAAO,GAAG,CAAC,CAAC;gBACjG,CAAC;gBAED,gCAAgC;gBAChC,OAAO,iBAAgC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wFAAwF;gBACxF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2EAA2E,GAAG,KAAK,CAAC,CAAC;gBACpG,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,EAAU;YACpB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,OAAgB;YAC/B,uDAAuD;YACvD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,MAAM,CAAC,WAAW,KAAK,+BAAQ,CAAC,KAAK,EAAE,CAAC;gBACrD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACzC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;;;;;;;SAQd,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvB,MAAM,CAAC,GAAc;gBACnB,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE;gBAC7B,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE;gBAC9B,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;gBAC7B,QAAQ,EAAE,iCAAU,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC7C,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,EAAE;aACZ,CAAC;YACF,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEvE,4DAA4D;YAC5D,IAAI,6BAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,6BAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,MAAc;YAC5B,uDAAuD;YACvD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvB,MAAM,CAAC,GAAa;gBAClB,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC5B,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE;gBAC7B,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE;gBAC5B,QAAQ,EAAE,iCAAU,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC5C,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,MAAM,CAAC,gBAAgB,EAAE;gBAC5D,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;gBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;gBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC3B,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,mCAAY,CAAC,gBAAgB,CAAC;gBACpE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,kCAAW,CAAC,mBAAmB,CAAC;gBACpE,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,mCAAY,CAAC,aAAa,CAAC;gBAC7D,qBAAqB,EAAE,MAAM,CAAC,WAAW,CAAC,mCAAY,CAAC,qBAAqB,CAAC;gBAC7E,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,mCAAY,CAAC,WAAW,CAAC;gBACzD,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,mCAAY,CAAC,iBAAiB,CAAC;gBACrE,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE;aACnC,CAAC;YAEF,IAAI,MAAM,CAAC,WAAW,CAAC,mCAAY,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC1D,CAAC,CAAC,cAAc,GAAI,MAAM,CAAC,gBAAgB,CAAC,mCAAY,CAAC,oBAAoB,CAAY,CAAC;YAC5F,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YAED,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEtE,MAAM,eAAe,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC;YAE9F,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;oBACzC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC3C,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,gBAAgB;YACd,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,sBAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,KAAK,CAAC,WAAW;YACf,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,GAAG,KAAK,CAAC,CAAC;gBACnD,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO;YACX,kCAAkC;YAClC,gFAAgF;YAChF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE1D,2BAA2B;YAC3B,oFAAoF;YACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;gBACnE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/C,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC,CAAC;YAEJ,+DAA+D;YAC/D,OAAO,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAa,CAAC;QACpE,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,YAAY;YAEhB,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC7F,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAE3C,+BAA+B;YAC/B,kEAAkE;YAClE,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACzF,MAAM,GAAG,GAAG,IAAI,aAAG,EAAE,CAAC;YACtB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACtD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtB,aAAa,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,oCAAoC;YACpC,6DAA6D;YAC7D,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACvF,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,CAAC;gBACH,sBAAsB;gBACtB,0DAA0D;gBAC1D,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,aAAa,QAAQ,EAAE,CAAC,CAAC;gBACvG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAEvC,wBAAwB;gBACxB,gEAAgE;gBAChE,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACpF,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAExD,wBAAwB;gBACxB,yDAAyD;gBACzD,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBACvF,OAAO,UAAU,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,0BAA0B;gBAC1B,wEAAwE;gBACxE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,GAAG,KAAK,CAAC,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,mBAAmB;gBACnB,mGAAmG;gBACnG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;QAEO,oBAAoB;YAC1B,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;oBACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF;IAED,mCAAmC;IACnC,IAAI,QAAQ,EAAE,CAAC;AACjB,CAAC;AAED,wBAAwB;AACxB,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACvB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|