@kwik-id/sdk-react 0.1.0-alpha.3 → 0.1.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -186
- package/dist/hooks/kwik-id-context.d.ts +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37111 -6090
- package/dist/open-kwik-verification.d.ts +54 -0
- package/dist/open-kwik-verification.d.ts.map +1 -0
- package/dist/views/consent-step.d.ts +1 -1
- package/dist/views/document-upload-step.d.ts +1 -1
- package/dist/views/kwik-id.d.ts +2 -2
- package/dist/views/kyc-form.d.ts +6 -1
- package/dist/views/kyc-form.d.ts.map +1 -1
- package/dist/views/kyc-modal-flow.d.ts +1 -1
- package/dist/views/kyc-modal-flow.d.ts.map +1 -1
- package/dist/views/selfie-step.d.ts +1 -1
- package/dist/views/verification-step.d.ts +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @kwik-id/sdk-react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SDK for [KwikID](https://identity.kwiknkap.com) identity verification. Adds a complete KYC verification flow to any web application with a single function call.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -12,15 +12,13 @@ pnpm add @kwik-id/sdk-react
|
|
|
12
12
|
yarn add @kwik-id/sdk-react
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
**Peer dependencies:** `react >= 18`, `react-dom >= 18`, `framer-motion >= 10`, `lucide-react >= 0.300`
|
|
15
|
+
**Peer dependencies:** `react >= 18`, `react-dom >= 18`, `framer-motion >= 10`, `lucide-react >= 0.300`, `lottie-react >= 2.4`
|
|
16
16
|
|
|
17
17
|
## Quick Start
|
|
18
18
|
|
|
19
|
-
The fastest way to add verification is the `<KwikID>` component — a complete, pre-built verification flow.
|
|
20
|
-
|
|
21
19
|
### 1. Create a session on your backend
|
|
22
20
|
|
|
23
|
-
Use [`@kwik-id/sdk-node`](https://www.npmjs.com/package/@kwik-id/sdk-node) to
|
|
21
|
+
> **Security:** Sessions must be created server-side. Your API key must never be exposed to the browser. Use [`@kwik-id/sdk-node`](https://www.npmjs.com/package/@kwik-id/sdk-node) or a direct API call from your backend to get a short-lived `clientSecret` (session token) to pass to the frontend.
|
|
24
22
|
|
|
25
23
|
```ts
|
|
26
24
|
// Backend (Express, Next.js API route, etc.)
|
|
@@ -37,63 +35,67 @@ app.post("/api/create-session", async (req, res) => {
|
|
|
37
35
|
});
|
|
38
36
|
```
|
|
39
37
|
|
|
40
|
-
### 2.
|
|
38
|
+
### 2. Open the verification modal
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
import { KwikID } from "@kwik-id/sdk-react";
|
|
40
|
+
Call `openKwikVerification()` from any button click or event handler. It injects the modal at `document.body` — zero layout impact on your page — and returns a Promise that resolves when the user finishes or exits.
|
|
44
41
|
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
console.error("Verification error:", error);
|
|
74
|
-
},
|
|
75
|
-
}}
|
|
76
|
-
/>
|
|
77
|
-
);
|
|
42
|
+
```ts
|
|
43
|
+
import { openKwikVerification } from "@kwik-id/sdk-react";
|
|
44
|
+
|
|
45
|
+
// Works in React, Vue, Angular, or plain JavaScript
|
|
46
|
+
async function handleVerifyClick() {
|
|
47
|
+
const { clientSecret } = await fetch("/api/create-session", { method: "POST" })
|
|
48
|
+
.then((r) => r.json());
|
|
49
|
+
|
|
50
|
+
const { status, jobId } = await openKwikVerification({
|
|
51
|
+
clientSecret,
|
|
52
|
+
appName: "My App",
|
|
53
|
+
theme: { primary: "#2563EB", accent: "#FBBF24" },
|
|
54
|
+
onSubmitted: ({ jobId }) => {
|
|
55
|
+
// Fires while modal is still open — save the jobId immediately.
|
|
56
|
+
// The actual verification result (pass/fail) arrives later via webhook.
|
|
57
|
+
console.log("Submitted for review, jobId:", jobId);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (status === "submitted") {
|
|
62
|
+
// Modal closed. Documents are with the backend.
|
|
63
|
+
// Listen for the result via your webhook endpoint.
|
|
64
|
+
showMessage("We'll notify you once your identity is verified.");
|
|
65
|
+
} else if (status === "cancelled") {
|
|
66
|
+
// User closed the modal before submitting.
|
|
67
|
+
} else if (status === "error") {
|
|
68
|
+
// Upload or submission failed.
|
|
69
|
+
}
|
|
78
70
|
}
|
|
79
71
|
```
|
|
80
72
|
|
|
81
|
-
That's it — the
|
|
73
|
+
That's it — the modal handles the full flow: document selection, camera capture, quality checks, liveness, and submission.
|
|
74
|
+
|
|
75
|
+
> **Note:** `status === "submitted"` means documents were received by the backend and processing has started — **not** that the verification passed. The pass/fail result arrives asynchronously via [webhooks](#webhooks).
|
|
82
76
|
|
|
83
77
|
## Configuration
|
|
84
78
|
|
|
85
|
-
### `
|
|
79
|
+
### `OpenVerificationOptions`
|
|
80
|
+
|
|
81
|
+
| Option | Type | Required | Description |
|
|
82
|
+
| -------------- | --------------------- | -------- | --------------------------------------------------------------------------------------------------- |
|
|
83
|
+
| `clientSecret` | `string` | Yes | Session token from your backend |
|
|
84
|
+
| `appName` | `string` | No | App name shown in the modal header (falls back to org name) |
|
|
85
|
+
| `baseUrl` | `string` | No | API base URL (defaults to production) |
|
|
86
|
+
| `theme` | `KwikIDTheme` | No | Custom theme colors |
|
|
87
|
+
| `showLogo` | `boolean` | No | Show org logo in header (default: `true`) |
|
|
88
|
+
| `onSubmitted` | `({ jobId }) => void` | No | Called while the modal is still open, immediately when documents are uploaded. Save `jobId` here. |
|
|
89
|
+
|
|
90
|
+
### `VerificationOutcome`
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `onSubmitted` | `({ jobId }) => void` | No | Called immediately when documents are uploaded and background processing begins. Use this to save the `jobId`. |
|
|
95
|
-
| `onComplete` | `(data) => void` | No | Called when the user dismisses the result screen (clicks "Done") |
|
|
96
|
-
| `onError` | `(error: Error) => void` | No | Called on errors |
|
|
92
|
+
Resolved value of the Promise returned by `openKwikVerification()`:
|
|
93
|
+
|
|
94
|
+
| Field | Type | Description |
|
|
95
|
+
| -------- | ------------------------------------------ | ------------------------------------------------------ |
|
|
96
|
+
| `status` | `"submitted" \| "cancelled" \| "error"` | What happened when the modal closed |
|
|
97
|
+
| `jobId` | `string` | Present on `"submitted"` — use to track via webhooks |
|
|
98
|
+
| `error` | `Error` | Present on `"cancelled"` and `"error"` |
|
|
97
99
|
|
|
98
100
|
### `KwikIDTheme`
|
|
99
101
|
|
|
@@ -106,152 +108,47 @@ That's it — the component handles the full flow: document selection, camera ca
|
|
|
106
108
|
}
|
|
107
109
|
```
|
|
108
110
|
|
|
109
|
-
##
|
|
110
|
-
|
|
111
|
-
### `<KwikID>` — Drop-in Verification
|
|
111
|
+
## React Component (alternative)
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
If you prefer a declarative React approach, `<KwikID>` is available. It renders the same modal as `openKwikVerification()` — mount it conditionally, unmount it to close.
|
|
114
114
|
|
|
115
115
|
```tsx
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### `<KYCModalFlow>` — Modal Verification
|
|
120
|
-
|
|
121
|
-
Renders the verification flow inside a modal dialog with step indicators.
|
|
116
|
+
import { KwikID } from "@kwik-id/sdk-react";
|
|
122
117
|
|
|
123
|
-
|
|
124
|
-
|
|
118
|
+
{showVerification && (
|
|
119
|
+
<KwikID
|
|
120
|
+
config={{
|
|
121
|
+
clientSecret,
|
|
122
|
+
appName: "My App",
|
|
123
|
+
onSubmitted: ({ jobId }) => saveJobId(jobId),
|
|
124
|
+
onComplete: () => setShowVerification(false),
|
|
125
|
+
onError: () => setShowVerification(false),
|
|
126
|
+
}}
|
|
127
|
+
/>
|
|
128
|
+
)}
|
|
125
129
|
```
|
|
126
130
|
|
|
127
131
|
### `<KwikIDProvider>` — Context Provider
|
|
128
132
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
```tsx
|
|
132
|
-
import { KwikIDProvider, useKwikID } from "@kwik-id/sdk-react";
|
|
133
|
-
|
|
134
|
-
function App() {
|
|
135
|
-
return (
|
|
136
|
-
<KwikIDProvider config={{ clientSecret, appName: "My App" }} clientSecret={clientSecret}>
|
|
137
|
-
<CustomVerificationFlow />
|
|
138
|
-
</KwikIDProvider>
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function CustomVerificationFlow() {
|
|
143
|
-
const {
|
|
144
|
-
sdk,
|
|
145
|
-
isSDKReady,
|
|
146
|
-
qualityResult,
|
|
147
|
-
detectedFace,
|
|
148
|
-
analyzeQuality,
|
|
149
|
-
detectFace,
|
|
150
|
-
submitVerification,
|
|
151
|
-
} = useKwikID();
|
|
152
|
-
|
|
153
|
-
// Build your own UI using SDK state and actions
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Individual Steps
|
|
158
|
-
|
|
159
|
-
Build custom flows by composing individual step components:
|
|
160
|
-
|
|
161
|
-
```tsx
|
|
162
|
-
import {
|
|
163
|
-
CameraCapture,
|
|
164
|
-
ConsentStep,
|
|
165
|
-
DocumentTypeSelection,
|
|
166
|
-
IntroStep,
|
|
167
|
-
PhotoConfirmation,
|
|
168
|
-
PrepareIDBack,
|
|
169
|
-
PrepareIDFront,
|
|
170
|
-
PrepareSelfie,
|
|
171
|
-
SelfieConfirmation,
|
|
172
|
-
} from "@kwik-id/sdk-react";
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Cross-Device Handoff
|
|
133
|
+
Wraps your components to provide SDK state and actions via the `useKwikID()` hook. Used internally by both `openKwikVerification()` and `<KwikID>`.
|
|
176
134
|
|
|
177
|
-
|
|
135
|
+
> **Note:** Building a fully custom verification flow with this provider (custom camera UI, custom step sequencing, cross-device handoff) requires significant implementation work. Detailed documentation for custom integrations is coming.
|
|
178
136
|
|
|
179
|
-
|
|
180
|
-
import { HandoffChoiceView, HandoffQRView, useHandoff } from "@kwik-id/sdk-react";
|
|
181
|
-
```
|
|
137
|
+
`useKwikID()` returns: `isSDKReady`, `orgName`, `orgLogoUrl`, `qualityResult`, `detectedFace`, `alignmentResult`, `livenessResult`, `analyzeQuality(video)`, `detectFace(video)`, `checkAlignment()`, `runPassiveLiveness()`, `submitVerification(docType)`, `uploadFile(type, file)`.
|
|
182
138
|
|
|
183
139
|
## Hooks
|
|
184
140
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### `useCamera(options)`
|
|
199
|
-
|
|
200
|
-
Camera access and frame capture.
|
|
201
|
-
|
|
202
|
-
```tsx
|
|
203
|
-
const { videoRef, stream, start, stop, capture } = useCamera({
|
|
204
|
-
facingMode: "environment",
|
|
205
|
-
width: 1280,
|
|
206
|
-
height: 720,
|
|
207
|
-
});
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### `useQuality(options)`
|
|
211
|
-
|
|
212
|
-
Real-time image quality analysis.
|
|
213
|
-
|
|
214
|
-
```tsx
|
|
215
|
-
const { analyze, result, isAcceptable } = useQuality({
|
|
216
|
-
minBrightness: 0.3,
|
|
217
|
-
maxBrightness: 0.9,
|
|
218
|
-
});
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### `useFaceDetection(options)`
|
|
222
|
-
|
|
223
|
-
Face detection and alignment feedback.
|
|
224
|
-
|
|
225
|
-
```tsx
|
|
226
|
-
const { detect, face, alignment, isAligned } = useFaceDetection();
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### `useLiveness(options)`
|
|
230
|
-
|
|
231
|
-
Passive and active liveness detection.
|
|
232
|
-
|
|
233
|
-
```tsx
|
|
234
|
-
const { check, result, isLive } = useLiveness();
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### `useVerification(options)`
|
|
238
|
-
|
|
239
|
-
Full verification workflow state machine.
|
|
240
|
-
|
|
241
|
-
```tsx
|
|
242
|
-
const { step, next, back, submit, isComplete } = useVerification({
|
|
243
|
-
clientSecret,
|
|
244
|
-
onComplete: (data) => console.log("Done", data),
|
|
245
|
-
});
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### `useHandoff()`
|
|
249
|
-
|
|
250
|
-
Cross-device handoff (QR code transfer from desktop to mobile).
|
|
251
|
-
|
|
252
|
-
```tsx
|
|
253
|
-
const { startHandoff, handoffState, handoffUrl } = useHandoff();
|
|
254
|
-
```
|
|
141
|
+
The following hooks are exported. They are used internally by the built-in components and are available for custom integrations. Hooks marked **requires provider** must be used inside `<KwikIDProvider>`.
|
|
142
|
+
|
|
143
|
+
| Hook | Requires provider | Description |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| `useKwikID()` | Yes | Full SDK state and actions (camera, capture, submit) |
|
|
146
|
+
| `useCamera(options)` | No | Camera access and frame capture |
|
|
147
|
+
| `useQuality(options)` | No | Real-time image quality analysis |
|
|
148
|
+
| `useFaceDetection(options)` | No | Face detection and alignment |
|
|
149
|
+
| `useLiveness(options)` | No | Passive liveness detection |
|
|
150
|
+
| `useVerification(options)` | Yes | Verification step state machine |
|
|
151
|
+
| `useHandoff()` | Yes | Cross-device QR handoff |
|
|
255
152
|
|
|
256
153
|
## Utilities
|
|
257
154
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AlignmentResult, DetectedFace, KwikIdSDK, PassiveLivenessResult, QualityResult } from '../../../sdk-core/src/index.ts';
|
|
2
|
-
import { KwikIDConfig } from '../../../types/src
|
|
2
|
+
import { KwikIDConfig } from '../../../types/src';
|
|
3
3
|
/**
|
|
4
4
|
* Extended context value that includes SDK functionality
|
|
5
5
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @packageDocumentation
|
|
7
7
|
*/
|
|
8
|
+
export { openKwikVerification } from './open-kwik-verification';
|
|
9
|
+
export type { OpenVerificationOptions, VerificationOutcome } from './open-kwik-verification';
|
|
8
10
|
export { KwikIDProvider, KwikIDContext, useKwikID } from './hooks/kwik-id-context';
|
|
9
11
|
export { KwikIdProvider, useKwikIdContext } from './context/kwik-id-context';
|
|
10
12
|
export type { KwikIdProviderProps, KwikIdContextState, KwikIdContextActions, KwikIdContextValue, } from './context/kwik-id-context';
|
|
@@ -35,5 +37,5 @@ export { compressImage } from './utils/image-compression';
|
|
|
35
37
|
export { analyzeImageQuality, checkLuminance, checkBlur, getImageDataFromVideo, getImageDataFromFile, type ImageQualityResult, type QualityCheckResult, } from './utils/image-quality';
|
|
36
38
|
export { UploadManager } from './utils/upload-manager';
|
|
37
39
|
export type { KwikIdConfig, KwikIdTheme, QualityResult, QualityGuidance, DetectedFace, BoundingBox, FacePose, AlignmentResult, AlignmentGuidance, PassiveLivenessResult, Challenge, ChallengeType, ChallengeResult, VerificationResult, SDKState, SDKStatus, } from '../../sdk-core/src/index.ts';
|
|
38
|
-
export type { KwikIDConfig, KwikIDTheme, KYCFormData, ConsentData, DocumentData, SelfieData, } from '../../types/src
|
|
40
|
+
export type { KwikIDConfig, KwikIDTheme, KYCFormData, ConsentData, DocumentData, SelfieData, } from '../../types/src';
|
|
39
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,YAAY,EACR,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACH,SAAS,EACT,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EACR,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACH,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAOvD,YAAY,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,SAAS,GACZ,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACR,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,GACb,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG7F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,YAAY,EACR,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACH,SAAS,EACT,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EACR,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACH,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAOvD,YAAY,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,SAAS,GACZ,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACR,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,GACb,MAAM,gBAAgB,CAAC"}
|