@starak/sim800c 0.0.9 → 0.0.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/dist/index.d.ts +26 -8
- package/dist/index.js +33 -27
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,26 +2,42 @@
|
|
|
2
2
|
import EventEmitter from "events";
|
|
3
3
|
import { SerialPort } from "serialport";
|
|
4
4
|
import { pduMessage } from "pdu.ts";
|
|
5
|
-
|
|
5
|
+
interface UDH {
|
|
6
6
|
parts: number;
|
|
7
7
|
current_part: number;
|
|
8
8
|
reference_number: string;
|
|
9
9
|
length: string;
|
|
10
10
|
iei: string;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
interface EpduMessage extends pduMessage {
|
|
13
13
|
udh?: UDH;
|
|
14
14
|
multipart: boolean;
|
|
15
15
|
parts: number;
|
|
16
16
|
parts_raw?: GsmMessage[];
|
|
17
17
|
sender?: string;
|
|
18
18
|
senderType?: number;
|
|
19
|
+
time: Date;
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
interface GsmMessage {
|
|
21
22
|
index: number;
|
|
22
23
|
message: EpduMessage;
|
|
23
24
|
raw: string;
|
|
24
|
-
|
|
25
|
+
}
|
|
26
|
+
export interface Message {
|
|
27
|
+
index: number;
|
|
28
|
+
parts: number;
|
|
29
|
+
indexes: number[];
|
|
30
|
+
text: string;
|
|
31
|
+
sender: string;
|
|
32
|
+
time: Date;
|
|
33
|
+
}
|
|
34
|
+
interface ParsedPDUMessage {
|
|
35
|
+
index: number;
|
|
36
|
+
message: EpduMessage;
|
|
37
|
+
}
|
|
38
|
+
interface PDUMessage {
|
|
39
|
+
index: number;
|
|
40
|
+
raw: string;
|
|
25
41
|
}
|
|
26
42
|
export * from "serialport";
|
|
27
43
|
export declare class GSM extends EventEmitter {
|
|
@@ -38,9 +54,11 @@ export declare class GSM extends EventEmitter {
|
|
|
38
54
|
private setMessage;
|
|
39
55
|
rejectCalls(): Promise<void>;
|
|
40
56
|
sendMessage(number: string, message: string): Promise<void>;
|
|
41
|
-
deleteMessage(msg:
|
|
57
|
+
deleteMessage(msg: Message): Promise<void>;
|
|
42
58
|
deleteAllMessages(): Promise<void>;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
59
|
+
getAllPDUMessages(): Promise<PDUMessage[]>;
|
|
60
|
+
parsePDUMessage(msg: PDUMessage): ParsedPDUMessage;
|
|
61
|
+
getMessages(): Promise<Message[]>;
|
|
62
|
+
getMessage(index: number): Promise<Message>;
|
|
63
|
+
static convertToCleanMessage(message: ParsedPDUMessage): Message;
|
|
46
64
|
}
|
package/dist/index.js
CHANGED
|
@@ -27,17 +27,13 @@ class GSM extends events_1.default {
|
|
|
27
27
|
constructor(path) {
|
|
28
28
|
super();
|
|
29
29
|
this.onDataHandler = async (data) => {
|
|
30
|
-
var _a;
|
|
31
30
|
if (data.includes('+CMTI:')) { // Incoming Message
|
|
32
31
|
const index = data.toString().split(',')[1];
|
|
33
32
|
const message = await this.getMessage(+index);
|
|
34
33
|
if (message) {
|
|
35
|
-
if (
|
|
34
|
+
if (message.parts === message.indexes.length) {
|
|
36
35
|
this.emit('newMessage', message);
|
|
37
36
|
}
|
|
38
|
-
else {
|
|
39
|
-
this.emit('multipartMessage', message.message.udh);
|
|
40
|
-
}
|
|
41
37
|
}
|
|
42
38
|
else {
|
|
43
39
|
console.log('Error getting incoming message.', data.toString());
|
|
@@ -109,22 +105,16 @@ class GSM extends events_1.default {
|
|
|
109
105
|
await this.setMessage(message);
|
|
110
106
|
}
|
|
111
107
|
async deleteMessage(msg) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
indexes = ((_a = msg.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [];
|
|
116
|
-
}
|
|
117
|
-
else if (msg) {
|
|
118
|
-
indexes = [msg.index];
|
|
119
|
-
}
|
|
120
|
-
for (const i of indexes) {
|
|
108
|
+
if (!msg)
|
|
109
|
+
return;
|
|
110
|
+
for (const i of msg.indexes) {
|
|
121
111
|
await this.sendCommand(`AT+CMGD=${i}`);
|
|
122
112
|
}
|
|
123
113
|
}
|
|
124
114
|
async deleteAllMessages() {
|
|
125
115
|
return this.sendCommand('AT+CMGD=1,4');
|
|
126
116
|
}
|
|
127
|
-
async
|
|
117
|
+
async getAllPDUMessages() {
|
|
128
118
|
await this.reset();
|
|
129
119
|
await this.setPDUMode();
|
|
130
120
|
const { port } = this;
|
|
@@ -138,17 +128,17 @@ class GSM extends events_1.default {
|
|
|
138
128
|
for (const line of lines) {
|
|
139
129
|
if (line.includes('OK')) {
|
|
140
130
|
port.removeListener('data', listener);
|
|
141
|
-
resolve(msgs
|
|
131
|
+
resolve(msgs);
|
|
142
132
|
}
|
|
143
133
|
else if (line.includes('ERROR')) {
|
|
144
134
|
port.removeListener('data', listener);
|
|
145
135
|
reject();
|
|
146
136
|
}
|
|
147
137
|
else if (line.startsWith('+CMGL: ')) {
|
|
148
|
-
const [index,
|
|
138
|
+
const [index, , raw] = line.replace(/^\+CMGL:\s/, '')
|
|
149
139
|
.split(',')
|
|
150
140
|
.map(s => s.replace(/"/g, ''));
|
|
151
|
-
current = { index: +index,
|
|
141
|
+
current = { index: +index, raw };
|
|
152
142
|
msgs.push(current);
|
|
153
143
|
}
|
|
154
144
|
else {
|
|
@@ -157,13 +147,19 @@ class GSM extends events_1.default {
|
|
|
157
147
|
}
|
|
158
148
|
};
|
|
159
149
|
port.on('data', listener);
|
|
160
|
-
debug_1.logger_out.debug(command);
|
|
161
150
|
port.write(command);
|
|
162
151
|
});
|
|
163
152
|
}
|
|
153
|
+
parsePDUMessage(msg) {
|
|
154
|
+
return {
|
|
155
|
+
index: msg.index,
|
|
156
|
+
message: pdu_ts_1.PDUParser.Parse(msg.raw)
|
|
157
|
+
};
|
|
158
|
+
}
|
|
164
159
|
async getMessages() {
|
|
165
|
-
|
|
166
|
-
|
|
160
|
+
let messages = (await this.getAllPDUMessages().then(msgs => msgs.map(m => this.parsePDUMessage(m))));
|
|
161
|
+
console.log('msg count', messages.length);
|
|
162
|
+
messages = messages.map(m => {
|
|
167
163
|
if (m.message.udh) {
|
|
168
164
|
if (m.message.udh.current_part === 1) {
|
|
169
165
|
const parts = messages
|
|
@@ -182,17 +178,27 @@ class GSM extends events_1.default {
|
|
|
182
178
|
}
|
|
183
179
|
return undefined;
|
|
184
180
|
}
|
|
185
|
-
return { ...m, multipart: false, parts: 1 };
|
|
181
|
+
return { ...m, multipart: false, message: { ...m.message, parts: 1 } };
|
|
186
182
|
}).filter(m => m !== undefined);
|
|
183
|
+
return messages.map(m => GSM.convertToCleanMessage(m));
|
|
187
184
|
}
|
|
188
185
|
async getMessage(index) {
|
|
189
186
|
const messages = await this.getMessages();
|
|
190
|
-
let message = messages.find(m => m.index === index);
|
|
191
|
-
if (!message) {
|
|
192
|
-
message = messages.find(m => { var _a; return (_a = m.message.parts_raw) === null || _a === void 0 ? void 0 : _a.find(m2 => m2.index === index); });
|
|
193
|
-
}
|
|
187
|
+
let message = messages.find(m => m.index === index) || messages.find(m => m.indexes.find(m2 => m2 === index));
|
|
194
188
|
return message || undefined;
|
|
195
189
|
}
|
|
190
|
+
static convertToCleanMessage(message) {
|
|
191
|
+
var _a;
|
|
192
|
+
const senderPrefix = message.message.senderType === 91 ? '' : '+';
|
|
193
|
+
return {
|
|
194
|
+
index: message.index,
|
|
195
|
+
parts: message.message.parts,
|
|
196
|
+
indexes: ((_a = message.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [message.index],
|
|
197
|
+
text: message.message.text,
|
|
198
|
+
sender: senderPrefix + message.message.sender,
|
|
199
|
+
time: message.message.time,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
196
202
|
}
|
|
197
203
|
exports.GSM = GSM;
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsMkNBQXNDO0FBQ3RDLG1DQUE2QztBQUM3QyxtQ0FBOEM7QUE2QzlDLDZDQUEyQjtBQUUzQixNQUFhLEdBQUksU0FBUSxnQkFBWTtJQUlqQyxZQUFZLElBQVk7UUFDcEIsS0FBSyxFQUFFLENBQUM7UUFvQkosa0JBQWEsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CO2dCQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLEVBQUU7b0JBQ1QsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO3dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDcEM7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDbkU7YUFDSjtRQUNMLENBQUMsQ0FBQTtRQS9CRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxQixpQkFBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4QixZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFnQk8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFlLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDeEQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFTLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxPQUFPLEVBQUUsQ0FBQztpQkFDYjtxQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ25CO3FCQUFNO29CQUNILHFDQUFxQztpQkFDeEM7WUFDTCxDQUFDLENBQUE7WUFDRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxQixrQkFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBZTtRQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWMsRUFBRSxPQUFlO1FBQ3BELE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBWTtRQUNuQyxJQUFHLENBQUMsR0FBRztZQUFFLE9BQU87UUFDaEIsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDbkIsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFpQixFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQWdCLENBQUM7UUFFbkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQXVCLEVBQUU7WUFDeEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFTLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO29CQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pCO3lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ3RDLE1BQU0sRUFBRSxDQUFDO3FCQUNaO3lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTt3QkFDbkMsTUFBTSxDQUFDLEtBQUssRUFBRSxBQUFELEVBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDOzZCQUNoRCxLQUFLLENBQUMsR0FBRyxDQUFDOzZCQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ25DLE9BQU8sR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDdEI7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7cUJBQ3ZCO2lCQUNKO1lBQ0wsQ0FBQyxDQUFBO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBZTtRQUMzQixPQUFPO1lBQ0gsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLE9BQU8sRUFBRSxrQkFBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ3BDLENBQUE7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFDcEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtvQkFDbEMsTUFBTSxLQUFLLEdBQUcsUUFBUTt5QkFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7eUJBQzVCLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxlQUFDLE9BQUEsQ0FBQSxNQUFBLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRywwQ0FBRSxnQkFBZ0IsT0FBSyxNQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRywwQ0FBRSxnQkFBZ0IsQ0FBQSxDQUFBLEVBQUEsQ0FBQyxDQUFDO29CQUN4RixPQUFPO3dCQUNILEdBQUcsQ0FBQzt3QkFDSixPQUFPLEVBQUU7NEJBQ0wsR0FBRyxDQUFDLENBQUMsT0FBTzs0QkFDWixJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs0QkFDL0MsU0FBUyxFQUFFLElBQUk7NEJBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUs7NEJBQzFCLFNBQVMsRUFBRSxLQUFLO3lCQUNuQjtxQkFDSixDQUFBO2lCQUNKO2dCQUNELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxFQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQWlCLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBYTtRQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5RyxPQUFPLE9BQWtCLElBQUksU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsT0FBeUI7O1FBQ2xELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEUsT0FBTztZQUNILEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLO1lBQzVCLE9BQU8sRUFBRSxDQUFBLE1BQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUMxQixNQUFNLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTztZQUM5QyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1NBQzdCLENBQUE7SUFDTCxDQUFDO0NBQ0o7QUE3TEQsa0JBNkxDIn0=
|