@chatlychat/sdk-node 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -7
- package/dist/errors.d.ts +113 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +177 -0
- package/dist/errors.js.map +1 -0
- package/dist/identity.d.ts +21 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +30 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +51 -165
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +72 -271
- package/dist/index.js.map +1 -1
- package/dist/pagination.d.ts +32 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +43 -0
- package/dist/pagination.js.map +1 -0
- package/dist/resources.d.ts +237 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +183 -0
- package/dist/resources.js.map +1 -0
- package/dist/transport.d.ts +63 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +178 -0
- package/dist/transport.js.map +1 -0
- package/dist/webhooks.d.ts +35 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +47 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +22 -22
- package/dist/index.spec.d.ts +0 -2
- package/dist/index.spec.d.ts.map +0 -1
- package/dist/index.spec.js +0 -315
- package/dist/index.spec.js.map +0 -1
package/dist/index.spec.js
DELETED
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Behaviour tests for the public SDK surface that the dashboard /
|
|
3
|
-
* partner integrators depend on. Focused on the bits that are easy to
|
|
4
|
-
* regress and load-bearing for correctness:
|
|
5
|
-
*
|
|
6
|
-
* - every write sends an `Idempotency-Key` (no header drop on dispatch)
|
|
7
|
-
* - `withIdempotencyKey(key)` pins the key across multiple writes
|
|
8
|
-
* - `withIdempotencyKey` returns a derived client, not a mutated one
|
|
9
|
-
* - webhook signature verification (timing-safe, malformed inputs ok)
|
|
10
|
-
*
|
|
11
|
-
* `fetch` is injected via `ClientOptions.fetchFn`, so we don't touch the
|
|
12
|
-
* network — the spec asserts on the request shape the SDK builds.
|
|
13
|
-
*/
|
|
14
|
-
import { createHmac } from 'node:crypto';
|
|
15
|
-
import { at } from '@livechat/shared/narrow';
|
|
16
|
-
import { describe, expect, it } from 'vitest';
|
|
17
|
-
import { ChatlyClient, verifyWebhookSignature, chatlyIdentityHash, WEBHOOK_SIGNATURE_TOLERANCE_SECONDS, } from './index.js';
|
|
18
|
-
function recordingFetch() {
|
|
19
|
-
const calls = [];
|
|
20
|
-
const fn = async (url, init) => {
|
|
21
|
-
calls.push({ url: String(url), init: init ?? {} });
|
|
22
|
-
return new Response(JSON.stringify({ ok: true }), {
|
|
23
|
-
status: 200,
|
|
24
|
-
headers: { 'content-type': 'application/json' },
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
return { calls, fn: fn };
|
|
28
|
-
}
|
|
29
|
-
describe('ChatlyClient — Idempotency-Key on writes', () => {
|
|
30
|
-
it('attaches a fresh idempotency-key to every POST when no key is pinned', async () => {
|
|
31
|
-
const rec = recordingFetch();
|
|
32
|
-
const client = new ChatlyClient({
|
|
33
|
-
apiKey: 'k',
|
|
34
|
-
apiUrl: 'https://api.test',
|
|
35
|
-
fetchFn: rec.fn,
|
|
36
|
-
});
|
|
37
|
-
await client.events.track({ contactId: 'c1', name: 'signup' });
|
|
38
|
-
await client.events.track({ contactId: 'c2', name: 'signup' });
|
|
39
|
-
expect(rec.calls).toHaveLength(2);
|
|
40
|
-
const k1 = new Headers(at(rec.calls, 0, 'recorded requests').init.headers).get('idempotency-key');
|
|
41
|
-
const k2 = new Headers(at(rec.calls, 1, 'recorded requests').init.headers).get('idempotency-key');
|
|
42
|
-
expect(k1).toBeTruthy();
|
|
43
|
-
expect(k2).toBeTruthy();
|
|
44
|
-
expect(k1).not.toEqual(k2);
|
|
45
|
-
});
|
|
46
|
-
it('preserves the base auth headers on the dispatch path', async () => {
|
|
47
|
-
const rec = recordingFetch();
|
|
48
|
-
const client = new ChatlyClient({
|
|
49
|
-
apiKey: 'secret-token',
|
|
50
|
-
apiUrl: 'https://api.test',
|
|
51
|
-
fetchFn: rec.fn,
|
|
52
|
-
});
|
|
53
|
-
await client.contacts.upsert({ email: 'a@b.c' });
|
|
54
|
-
const h = new Headers(at(rec.calls, 0, 'recorded requests').init.headers);
|
|
55
|
-
expect(h.get('authorization')).toBe('Bearer secret-token');
|
|
56
|
-
expect(h.get('content-type')).toBe('application/json');
|
|
57
|
-
expect(h.get('idempotency-key')).toBeTruthy();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe('ChatlyClient — withIdempotencyKey', () => {
|
|
61
|
-
it('pins a stable key across multiple writes on the derived client', async () => {
|
|
62
|
-
const rec = recordingFetch();
|
|
63
|
-
const client = new ChatlyClient({
|
|
64
|
-
apiKey: 'k',
|
|
65
|
-
apiUrl: 'https://api.test',
|
|
66
|
-
fetchFn: rec.fn,
|
|
67
|
-
});
|
|
68
|
-
const pinned = client.withIdempotencyKey('fixed-key-123');
|
|
69
|
-
await pinned.events.track({ contactId: 'c1', name: 'a' });
|
|
70
|
-
await pinned.events.track({ contactId: 'c2', name: 'b' });
|
|
71
|
-
expect(rec.calls).toHaveLength(2);
|
|
72
|
-
for (const call of rec.calls) {
|
|
73
|
-
const h = new Headers(call.init.headers);
|
|
74
|
-
expect(h.get('idempotency-key')).toBe('fixed-key-123');
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
it('does not mutate the original client', async () => {
|
|
78
|
-
const rec = recordingFetch();
|
|
79
|
-
const client = new ChatlyClient({
|
|
80
|
-
apiKey: 'k',
|
|
81
|
-
apiUrl: 'https://api.test',
|
|
82
|
-
fetchFn: rec.fn,
|
|
83
|
-
});
|
|
84
|
-
client.withIdempotencyKey('pinned'); // intentionally unused
|
|
85
|
-
await client.events.track({ contactId: 'c1', name: 'x' });
|
|
86
|
-
const h = new Headers(at(rec.calls, 0, 'recorded requests').init.headers);
|
|
87
|
-
expect(h.get('idempotency-key')).not.toBe('pinned');
|
|
88
|
-
});
|
|
89
|
-
it('rejects empty / non-string keys with a TypeError (cheap mistake guard)', () => {
|
|
90
|
-
const client = new ChatlyClient({ apiKey: 'k' });
|
|
91
|
-
expect(() => client.withIdempotencyKey('')).toThrow(TypeError);
|
|
92
|
-
// @ts-expect-error — intentional misuse
|
|
93
|
-
expect(() => client.withIdempotencyKey(undefined)).toThrow(TypeError);
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
describe('ChatlyClient — withIdempotencyKey keeps the full surface', () => {
|
|
97
|
-
/**
|
|
98
|
-
* `derive` rebuilds every route namespace by hand so the closures target
|
|
99
|
-
* the derived instance. That is easy to forget: `search` was never rebound
|
|
100
|
-
* at all, and `messages` was caught only by the compiler because its
|
|
101
|
-
* namespace happened to already be listed.
|
|
102
|
-
*
|
|
103
|
-
* This compares the shape of a derived client against its parent, so a new
|
|
104
|
-
* method on any namespace fails here rather than silently calling the
|
|
105
|
-
* parent's request methods.
|
|
106
|
-
*/
|
|
107
|
-
it('exposes exactly the same namespaces and methods as the parent', () => {
|
|
108
|
-
const rec = recordingFetch();
|
|
109
|
-
const parent = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
110
|
-
const child = parent.withIdempotencyKey('order-1');
|
|
111
|
-
const surface = (c) => {
|
|
112
|
-
const bags = ['contacts', 'conversations', 'events', 'search'];
|
|
113
|
-
return bags
|
|
114
|
-
.flatMap((bag) => Object.keys(c[bag] ?? {}).map((k) => `${bag}.${k}`))
|
|
115
|
-
.sort();
|
|
116
|
-
};
|
|
117
|
-
expect(surface(child)).toEqual(surface(parent));
|
|
118
|
-
});
|
|
119
|
-
it('routes a derived namespace through the derived client', async () => {
|
|
120
|
-
const rec = recordingFetch();
|
|
121
|
-
const parent = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
122
|
-
await parent.withIdempotencyKey('order-1').contacts.upsert({ email: 'a@b.c' });
|
|
123
|
-
const headers = new Headers(rec.calls[0]?.init.headers);
|
|
124
|
-
expect(headers.get('idempotency-key')).toBe('order-1');
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
describe('ChatlyClient — parity with the MCP tools', () => {
|
|
128
|
-
/**
|
|
129
|
-
* The MCP server exposed `get_messages` and `search_kb` while the SDK did
|
|
130
|
-
* not, so the same capability was reachable from a tool call and not from
|
|
131
|
-
* the published client. These pin the request shapes against the routes the
|
|
132
|
-
* MCP tools use.
|
|
133
|
-
*/
|
|
134
|
-
it('reads a thread by conversation id', async () => {
|
|
135
|
-
const rec = recordingFetch();
|
|
136
|
-
const client = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
137
|
-
await client.conversations.messages('c-1', { limit: 50 });
|
|
138
|
-
expect(rec.calls[0]?.url).toBe('https://api.test/v1/conversations/c-1/messages?limit=50');
|
|
139
|
-
});
|
|
140
|
-
it('narrows KB search with the kinds[] parameter the API expects', async () => {
|
|
141
|
-
// The bracket in `kinds[]` is the whole point: `kinds=kb` is silently
|
|
142
|
-
// ignored by the list-filter parser and returns everything.
|
|
143
|
-
const rec = recordingFetch();
|
|
144
|
-
const client = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
145
|
-
await client.search.kb('refund');
|
|
146
|
-
const url = new URL(rec.calls[0]?.url ?? '');
|
|
147
|
-
expect(url.pathname).toBe('/v1/search');
|
|
148
|
-
expect(url.searchParams.get('q')).toBe('refund');
|
|
149
|
-
expect(url.searchParams.get('kinds[]')).toBe('kb');
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
describe('ChatlyClient — events.list', () => {
|
|
153
|
-
/**
|
|
154
|
-
* The SDK could POST an event and never read one back: `/v1/cdp/events`
|
|
155
|
-
* was referenced only under POST, so the read half of the CDP integration
|
|
156
|
-
* had no shipped caller at all. These pin the exact request.
|
|
157
|
-
*/
|
|
158
|
-
it('GETs the same collection track() posts to', async () => {
|
|
159
|
-
const rec = recordingFetch();
|
|
160
|
-
const client = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
161
|
-
await client.events.list();
|
|
162
|
-
expect(rec.calls).toHaveLength(1);
|
|
163
|
-
expect(new URL(at(rec.calls, 0, 'recorded requests').url).pathname).toBe('/v1/cdp/events');
|
|
164
|
-
expect(at(rec.calls, 0, 'recorded requests').init.method).toBe('GET');
|
|
165
|
-
});
|
|
166
|
-
it('scopes the stream to one contact and passes the page cursor through', async () => {
|
|
167
|
-
const rec = recordingFetch();
|
|
168
|
-
const client = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
169
|
-
await client.events.list({ contactId: 'ct-1', limit: 25, cursor: 'abc' });
|
|
170
|
-
const url = new URL(at(rec.calls, 0, 'recorded requests').url);
|
|
171
|
-
expect(url.pathname).toBe('/v1/cdp/events');
|
|
172
|
-
expect(url.searchParams.get('contactId')).toBe('ct-1');
|
|
173
|
-
expect(url.searchParams.get('limit')).toBe('25');
|
|
174
|
-
expect(url.searchParams.get('cursor')).toBe('abc');
|
|
175
|
-
});
|
|
176
|
-
it('is a read, so it sends no idempotency key', async () => {
|
|
177
|
-
const rec = recordingFetch();
|
|
178
|
-
const client = new ChatlyClient({ apiKey: 'k', apiUrl: 'https://api.test', fetchFn: rec.fn });
|
|
179
|
-
await client.events.list();
|
|
180
|
-
const headers = new Headers(at(rec.calls, 0, 'recorded requests').init.headers);
|
|
181
|
-
expect(headers.get('idempotency-key')).toBeNull();
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
describe('ChatlyClient — whoami', () => {
|
|
185
|
-
it('GETs the one api-keys route a key is allowed to call', async () => {
|
|
186
|
-
const rec = recordingFetch();
|
|
187
|
-
const client = new ChatlyClient({
|
|
188
|
-
apiKey: 'k',
|
|
189
|
-
apiUrl: 'https://api.test',
|
|
190
|
-
fetchFn: rec.fn,
|
|
191
|
-
});
|
|
192
|
-
await client.whoami();
|
|
193
|
-
expect(rec.calls).toHaveLength(1);
|
|
194
|
-
expect(rec.calls[0]?.url).toBe('https://api.test/v1/api-keys/whoami');
|
|
195
|
-
expect(rec.calls[0]?.init.method).toBe('GET');
|
|
196
|
-
});
|
|
197
|
-
it('is a read, so it sends no idempotency key', async () => {
|
|
198
|
-
const rec = recordingFetch();
|
|
199
|
-
const client = new ChatlyClient({
|
|
200
|
-
apiKey: 'k',
|
|
201
|
-
apiUrl: 'https://api.test',
|
|
202
|
-
fetchFn: rec.fn,
|
|
203
|
-
});
|
|
204
|
-
await client.whoami();
|
|
205
|
-
const headers = new Headers(rec.calls[0]?.init.headers);
|
|
206
|
-
expect(headers.get('idempotency-key')).toBeNull();
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
describe('verifyWebhookSignature', () => {
|
|
210
|
-
const secret = 'shh';
|
|
211
|
-
const body = '{"type":"message.created","payload":{"id":"m1"}}';
|
|
212
|
-
const t = 1_714_060_800;
|
|
213
|
-
// The construction the producer uses and the docs describe: HMAC over
|
|
214
|
-
// `${t}.${body}`, never the body alone. Computed here rather than
|
|
215
|
-
// hard-coded so the spec doesn't rot, but note that the round-trip
|
|
216
|
-
// assertion lives in the worker
|
|
217
|
-
// (`apps/worker/src/__tests__/webhook-sig.spec.ts`) — this file can only
|
|
218
|
-
// ever prove the verifier agrees with ITSELF.
|
|
219
|
-
const header = (ts, payload = body, key = secret) => `t=${String(ts)},v1=${createHmac('sha256', key)
|
|
220
|
-
.update(`${String(ts)}.${payload}`)
|
|
221
|
-
.digest('hex')}`;
|
|
222
|
-
it('returns true for a signature over `t.body`', () => {
|
|
223
|
-
expect(verifyWebhookSignature({ body, signatureHeader: header(t), secret, nowSeconds: t })).toBe(true);
|
|
224
|
-
});
|
|
225
|
-
it('accepts the raw body as bytes', () => {
|
|
226
|
-
expect(verifyWebhookSignature({
|
|
227
|
-
body: Buffer.from(body, 'utf8'),
|
|
228
|
-
signatureHeader: header(t),
|
|
229
|
-
secret,
|
|
230
|
-
nowSeconds: t,
|
|
231
|
-
})).toBe(true);
|
|
232
|
-
});
|
|
233
|
-
it('rejects a signature over the body alone', () => {
|
|
234
|
-
// This is what this verifier used to COMPUTE. If it ever passes again,
|
|
235
|
-
// every genuine delivery is being rejected in the field.
|
|
236
|
-
const bodyOnly = `t=${String(t)},v1=${createHmac('sha256', secret).update(body).digest('hex')}`;
|
|
237
|
-
expect(verifyWebhookSignature({ body, signatureHeader: bodyOnly, secret, nowSeconds: t })).toBe(false);
|
|
238
|
-
});
|
|
239
|
-
it('returns false for a tampered body', () => {
|
|
240
|
-
expect(verifyWebhookSignature({
|
|
241
|
-
body: '{"type":"message.created","payload":{"id":"m2"}}',
|
|
242
|
-
signatureHeader: header(t),
|
|
243
|
-
secret,
|
|
244
|
-
nowSeconds: t,
|
|
245
|
-
})).toBe(false);
|
|
246
|
-
});
|
|
247
|
-
it('returns false for a wrong secret', () => {
|
|
248
|
-
expect(verifyWebhookSignature({
|
|
249
|
-
body,
|
|
250
|
-
signatureHeader: header(t, body, 'evil'),
|
|
251
|
-
secret,
|
|
252
|
-
nowSeconds: t,
|
|
253
|
-
})).toBe(false);
|
|
254
|
-
});
|
|
255
|
-
it('returns false when the header is missing the v1= scheme', () => {
|
|
256
|
-
expect(verifyWebhookSignature({ body, signatureHeader: `t=${String(t)}`, secret, nowSeconds: t })).toBe(false);
|
|
257
|
-
});
|
|
258
|
-
it('returns false when the header is missing t=', () => {
|
|
259
|
-
// Without `t` there is no replay window to enforce, so a header that
|
|
260
|
-
// omits it is not verifiable — not merely unfresh.
|
|
261
|
-
const sig = createHmac('sha256', secret)
|
|
262
|
-
.update(`${String(t)}.${body}`)
|
|
263
|
-
.digest('hex');
|
|
264
|
-
expect(verifyWebhookSignature({ body, signatureHeader: `v1=${sig}`, secret, nowSeconds: t })).toBe(false);
|
|
265
|
-
});
|
|
266
|
-
it('rejects a replayed delivery outside the tolerance window', () => {
|
|
267
|
-
expect(verifyWebhookSignature({
|
|
268
|
-
body,
|
|
269
|
-
signatureHeader: header(t),
|
|
270
|
-
secret,
|
|
271
|
-
nowSeconds: t + WEBHOOK_SIGNATURE_TOLERANCE_SECONDS + 1,
|
|
272
|
-
})).toBe(false);
|
|
273
|
-
expect(verifyWebhookSignature({
|
|
274
|
-
body,
|
|
275
|
-
signatureHeader: header(t),
|
|
276
|
-
secret,
|
|
277
|
-
nowSeconds: t + WEBHOOK_SIGNATURE_TOLERANCE_SECONDS,
|
|
278
|
-
})).toBe(true);
|
|
279
|
-
});
|
|
280
|
-
it('rejects a delivery timestamped in the future beyond tolerance', () => {
|
|
281
|
-
// Clock skew cuts both ways; an attacker post-dating `t` to buy a longer
|
|
282
|
-
// replay window is the case that matters.
|
|
283
|
-
expect(verifyWebhookSignature({
|
|
284
|
-
body,
|
|
285
|
-
signatureHeader: header(t),
|
|
286
|
-
secret,
|
|
287
|
-
nowSeconds: t - WEBHOOK_SIGNATURE_TOLERANCE_SECONDS - 1,
|
|
288
|
-
})).toBe(false);
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
describe('chatlyIdentityHash', () => {
|
|
292
|
-
it('matches the digest the API verifies against', () => {
|
|
293
|
-
// The API computes HMAC-SHA256(secret, externalId) and compares with
|
|
294
|
-
// timingSafeEqual. If these two ever disagree, identity verification
|
|
295
|
-
// rejects every legitimate visitor -- and the failure looks like a
|
|
296
|
-
// widget bug rather than a hashing mismatch.
|
|
297
|
-
const expected = createHmac('sha256', 'shh').update('user-42').digest('hex');
|
|
298
|
-
expect(chatlyIdentityHash('shh', 'user-42')).toBe(expected);
|
|
299
|
-
});
|
|
300
|
-
it('differs per user, which is the entire point', () => {
|
|
301
|
-
expect(chatlyIdentityHash('shh', 'user-1')).not.toBe(chatlyIdentityHash('shh', 'user-2'));
|
|
302
|
-
});
|
|
303
|
-
it('differs per workspace secret', () => {
|
|
304
|
-
expect(chatlyIdentityHash('a', 'user-1')).not.toBe(chatlyIdentityHash('b', 'user-1'));
|
|
305
|
-
});
|
|
306
|
-
it.each([
|
|
307
|
-
['an empty secret', '', 'user-1'],
|
|
308
|
-
['an empty externalId', 'shh', ''],
|
|
309
|
-
])('refuses %s rather than returning a hash of nothing', (_label, secret, externalId) => {
|
|
310
|
-
// An empty secret produces a perfectly valid-looking digest that any
|
|
311
|
-
// attacker can also compute.
|
|
312
|
-
expect(() => chatlyIdentityHash(secret, externalId)).toThrow();
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
//# sourceMappingURL=index.spec.js.map
|
package/dist/index.spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,mCAAmC,GACpC,MAAM,YAAY,CAAC;AAEpB,SAAS,cAAc;IACrB,MAAM,KAAK,GAA8C,EAAE,CAAC;IAC5D,MAAM,EAAE,GAAG,KAAK,EAAE,GAA2B,EAAE,IAAkB,EAAE,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;YAChD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAA6B,EAAE,CAAC;AACtD,CAAC;AAED,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,OAAO,CACpB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAiC,CAC7E,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,OAAO,CACpB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAiC,CAC7E,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,IAAI,OAAO,CACnB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAiC,CAC7E,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAiC,CAAC,CAAC;YACnE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB;QAC5D,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,OAAO,CACnB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAiC,CAC7E,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/D,wCAAwC;QACxC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACxE;;;;;;;;;OASG;IACH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,CAAC,CAAe,EAAY,EAAE;YAC5C,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;YACxE,OAAO,IAAI;iBACR,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,MAAM,CAAC,IAAI,CAAE,CAAuC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAClE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CACrB,CACF;iBACA,IAAI,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD;;;;;OAKG;IACH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C;;;;OAIG;IACH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,CAAC,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,MAAM,IAAI,GAAG,kDAAkD,CAAC;IAChE,MAAM,CAAC,GAAG,aAAa,CAAC;IACxB,sEAAsE;IACtE,kEAAkE;IAClE,mEAAmE;IACnE,gCAAgC;IAChC,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,GAAG,MAAM,EAAU,EAAE,CAClE,KAAK,MAAM,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;SAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;SAClC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAErB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,sBAAsB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;YAC/B,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,MAAM;YACN,UAAU,EAAE,CAAC;SACd,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,uEAAuE;QACvE,yDAAyD;QACzD,MAAM,QAAQ,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,MAAM,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7F,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI,EAAE,kDAAkD;YACxD,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,MAAM;YACN,UAAU,EAAE,CAAC;SACd,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI;YACJ,eAAe,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC;YACxC,MAAM;YACN,UAAU,EAAE,CAAC;SACd,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CACJ,sBAAsB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAC3F,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aACrC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;aAC9B,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,CACJ,sBAAsB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CACtF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI;YACJ,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,MAAM;YACN,UAAU,EAAE,CAAC,GAAG,mCAAmC,GAAG,CAAC;SACxD,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI;YACJ,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,MAAM;YACN,UAAU,EAAE,CAAC,GAAG,mCAAmC;SACpD,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,CACJ,sBAAsB,CAAC;YACrB,IAAI;YACJ,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,MAAM;YACN,UAAU,EAAE,CAAC,GAAG,mCAAmC,GAAG,CAAC;SACxD,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,qEAAqE;QACrE,qEAAqE;QACrE,mEAAmE;QACnE,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,iBAAiB,EAAE,EAAE,EAAE,QAAQ,CAAC;QACjC,CAAC,qBAAqB,EAAE,KAAK,EAAE,EAAE,CAAC;KACnC,CAAC,CAAC,oDAAoD,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;QACtF,qEAAqE;QACrE,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|