@formo/analytics 1.11.5-alpha.4 → 1.11.6-alpha.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/README.md +135 -47
- package/dist/cjs/src/FormoAnalytics.d.ts +73 -10
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +296 -103
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +3 -3
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/constants/config.d.ts +1 -1
- package/dist/cjs/src/constants/config.d.ts.map +1 -1
- package/dist/cjs/src/constants/config.js +2 -2
- package/dist/cjs/src/constants/config.js.map +1 -1
- package/dist/cjs/src/constants/events.d.ts +8 -0
- package/dist/cjs/src/constants/events.d.ts.map +1 -0
- package/dist/cjs/src/constants/events.js +12 -0
- package/dist/cjs/src/constants/events.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -1
- package/dist/cjs/src/constants/index.js +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -1
- package/dist/cjs/src/types/base.d.ts +6 -1
- package/dist/cjs/src/types/base.d.ts.map +1 -1
- package/dist/cjs/src/types/index.d.ts +1 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -1
- package/dist/cjs/src/types/index.js +1 -0
- package/dist/cjs/src/types/index.js.map +1 -1
- package/dist/cjs/src/types/wallet.d.ts +11 -0
- package/dist/cjs/src/types/wallet.d.ts.map +1 -0
- package/dist/cjs/src/types/wallet.js +3 -0
- package/dist/cjs/src/types/wallet.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +73 -10
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +297 -104
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +3 -3
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/constants/config.d.ts +1 -1
- package/dist/esm/src/constants/config.d.ts.map +1 -1
- package/dist/esm/src/constants/config.js +1 -1
- package/dist/esm/src/constants/config.js.map +1 -1
- package/dist/esm/src/constants/events.d.ts +8 -0
- package/dist/esm/src/constants/events.d.ts.map +1 -0
- package/dist/esm/src/constants/events.js +9 -0
- package/dist/esm/src/constants/events.js.map +1 -0
- package/dist/esm/src/constants/index.d.ts +1 -0
- package/dist/esm/src/constants/index.d.ts.map +1 -1
- package/dist/esm/src/constants/index.js +1 -0
- package/dist/esm/src/constants/index.js.map +1 -1
- package/dist/esm/src/types/base.d.ts +6 -1
- package/dist/esm/src/types/base.d.ts.map +1 -1
- package/dist/esm/src/types/index.d.ts +1 -0
- package/dist/esm/src/types/index.d.ts.map +1 -1
- package/dist/esm/src/types/index.js +1 -0
- package/dist/esm/src/types/index.js.map +1 -1
- package/dist/esm/src/types/wallet.d.ts +11 -0
- package/dist/esm/src/types/wallet.d.ts.map +1 -0
- package/dist/esm/src/types/wallet.js +2 -0
- package/dist/esm/src/types/wallet.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/FormoAnalytics.ts +338 -114
- package/src/FormoAnalyticsProvider.tsx +3 -6
- package/src/constants/config.ts +1 -1
- package/src/constants/events.ts +7 -0
- package/src/constants/index.ts +1 -0
- package/src/global.d.ts +4 -0
- package/src/types/base.ts +9 -1
- package/src/types/index.ts +1 -0
- package/src/types/wallet.ts +12 -0
- package/dist/cjs/src/utils/index.d.ts +0 -2
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js +0 -18
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/isNotEmptyObject.d.ts +0 -2
- package/dist/cjs/src/utils/isNotEmptyObject.d.ts.map +0 -1
- package/dist/cjs/src/utils/isNotEmptyObject.js +0 -9
- package/dist/cjs/src/utils/isNotEmptyObject.js.map +0 -1
- package/dist/esm/src/utils/index.d.ts +0 -2
- package/dist/esm/src/utils/index.d.ts.map +0 -1
- package/dist/esm/src/utils/index.js +0 -2
- package/dist/esm/src/utils/index.js.map +0 -1
- package/dist/esm/src/utils/isNotEmptyObject.d.ts +0 -2
- package/dist/esm/src/utils/isNotEmptyObject.d.ts.map +0 -1
- package/dist/esm/src/utils/isNotEmptyObject.js +0 -6
- package/dist/esm/src/utils/isNotEmptyObject.js.map +0 -1
- package/src/utils/index.ts +0 -1
- package/src/utils/isNotEmptyObject.ts +0 -5
package/README.md
CHANGED
|
@@ -4,17 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Add the following to your
|
|
7
|
+
Add the following to your page:
|
|
8
8
|
|
|
9
9
|
```html
|
|
10
10
|
<script>
|
|
11
11
|
const script = document.createElement('script');
|
|
12
12
|
const apiKey = 'YOUR_API_KEY';
|
|
13
|
-
const projectId = 'YOUR_PROJECT_ID';
|
|
14
13
|
|
|
15
14
|
script.src = 'https://unpkg.com/@formo/analytics';
|
|
16
15
|
script.onload = function () {
|
|
17
|
-
FormoAnalytics.init(apiKey
|
|
16
|
+
FormoAnalytics.init(apiKey)
|
|
18
17
|
.then((sdkInstance) => {
|
|
19
18
|
window.formo = sdkInstance;
|
|
20
19
|
|
|
@@ -33,21 +32,96 @@ Add the following to your `index.html`:
|
|
|
33
32
|
|
|
34
33
|
---
|
|
35
34
|
|
|
36
|
-
###
|
|
35
|
+
### React Application
|
|
37
36
|
|
|
38
|
-
Install
|
|
37
|
+
**1. Install the SDK**
|
|
38
|
+
Install the Formo Analytics SDK using Yarn or NPM:
|
|
39
39
|
|
|
40
|
-
```
|
|
40
|
+
```jsx
|
|
41
41
|
yarn add @formo/analytics
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
or
|
|
45
45
|
|
|
46
|
+
```jsx
|
|
47
|
+
npm install @formo/analytics --save
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**2. Set up FormoAnalyticsProvider in Your Application**
|
|
51
|
+
|
|
52
|
+
Wrap your entire React application in the `FormoAnalyticsProvider` provided by the SDK.
|
|
53
|
+
|
|
54
|
+
```jsx
|
|
55
|
+
//App.tsx (or App.js)
|
|
56
|
+
import React from 'react';
|
|
57
|
+
import ReactDOM from 'react-dom/client';
|
|
58
|
+
import { FormoAnalyticsProvider } from '@formo/analytics';
|
|
59
|
+
import App from './App';
|
|
60
|
+
|
|
61
|
+
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
|
|
62
|
+
|
|
63
|
+
root.render(
|
|
64
|
+
<React.StrictMode>
|
|
65
|
+
<FormoAnalyticsProvider apiKey="YOUR_API_KEY">
|
|
66
|
+
<App />
|
|
67
|
+
</FormoAnalyticsProvider>
|
|
68
|
+
</React.StrictMode>
|
|
69
|
+
);
|
|
46
70
|
```
|
|
71
|
+
|
|
72
|
+
**3. Tracking Events**
|
|
73
|
+
|
|
74
|
+
You can use the `useFormoAnalytics` hook from the SDK to track user interactions.
|
|
75
|
+
|
|
76
|
+
Example: Tracking a Custom Event
|
|
77
|
+
|
|
78
|
+
```jsx
|
|
79
|
+
import React, { useEffect } from 'react';
|
|
80
|
+
import { useFormoAnalytics } from '@formo/analytics';
|
|
81
|
+
|
|
82
|
+
const HomePage = () => {
|
|
83
|
+
const analytics = useFormoAnalytics();
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
// Track a custom event
|
|
87
|
+
analytics.track('custom_event', { key: 'value' });
|
|
88
|
+
}, [analytics]);
|
|
89
|
+
|
|
90
|
+
return <div>Welcome to the Home Page!</div>;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export default HomePage;
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**4. Folder Structure Example**
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
/src
|
|
100
|
+
├── /components
|
|
101
|
+
│ └── HomePage.tsx
|
|
102
|
+
├── /App.tsx
|
|
103
|
+
└── /index.tsx (or index.js)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Next.js Application
|
|
109
|
+
|
|
110
|
+
**1. Install the npm package:**
|
|
111
|
+
|
|
112
|
+
Install `@formo/analytics` via yarn or npm:
|
|
113
|
+
|
|
114
|
+
```jsx
|
|
115
|
+
yarn add @formo/analytics
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
or
|
|
119
|
+
|
|
120
|
+
```jsx
|
|
47
121
|
npm install @formo/analytics --save
|
|
48
122
|
```
|
|
49
123
|
|
|
50
|
-
|
|
124
|
+
**2. Set up the `FormoAnalyticsProvider` in your application:**
|
|
51
125
|
|
|
52
126
|
```jsx
|
|
53
127
|
// AnalyticsProvider.tsx
|
|
@@ -59,44 +133,16 @@ import React, { FC, useEffect } from 'react';
|
|
|
59
133
|
|
|
60
134
|
type FormoAnalyticsProviderProps = {
|
|
61
135
|
apiKey: string,
|
|
62
|
-
projectId: string,
|
|
63
136
|
children: React.ReactNode,
|
|
64
137
|
};
|
|
65
138
|
|
|
66
139
|
// The provider component
|
|
67
140
|
export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
|
|
68
141
|
apiKey,
|
|
69
|
-
projectId,
|
|
70
142
|
children,
|
|
71
143
|
}) => {
|
|
72
|
-
// Initialize the FormoAnalytics SDK inside useEffect
|
|
73
|
-
const [isInitialized, setIsInitialized] = useState(false);
|
|
74
|
-
|
|
75
|
-
useEffect(() => {
|
|
76
|
-
const initialize = async () => {
|
|
77
|
-
try {
|
|
78
|
-
await FormoAnalytics.init(apiKey, projectId);
|
|
79
|
-
console.log('FormoAnalytics SDK initialized');
|
|
80
|
-
setIsInitialized(true);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
console.error('Failed to initialize FormoAnalytics SDK', error);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
initialize();
|
|
87
|
-
}, [apiKey, projectId]);
|
|
88
|
-
|
|
89
|
-
// To prevent app crashes, render a loading state during initialization
|
|
90
|
-
if (!isInitialized) {
|
|
91
|
-
return (
|
|
92
|
-
<FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
|
|
93
|
-
Loading Content
|
|
94
|
-
</FormoAnalyticsProvider>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
144
|
return (
|
|
99
|
-
<FormoAnalyticsProvider apiKey={apiKey}
|
|
145
|
+
<FormoAnalyticsProvider apiKey={apiKey}>
|
|
100
146
|
{children}
|
|
101
147
|
</FormoAnalyticsProvider>
|
|
102
148
|
);
|
|
@@ -105,7 +151,7 @@ export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
|
|
|
105
151
|
export default AnalyticsProvider;
|
|
106
152
|
```
|
|
107
153
|
|
|
108
|
-
|
|
154
|
+
**3. Integrating the Provider in Your Root Layout**
|
|
109
155
|
|
|
110
156
|
Wrap your application with the newly created `AnalyticsProvider` in your main layout file:
|
|
111
157
|
|
|
@@ -120,7 +166,7 @@ export default function RootLayout({
|
|
|
120
166
|
return (
|
|
121
167
|
<html lang='en'>
|
|
122
168
|
<body>
|
|
123
|
-
<AnalyticsProvider apiKey='YOUR_API_KEY'
|
|
169
|
+
<AnalyticsProvider apiKey='YOUR_API_KEY'>
|
|
124
170
|
Your Page Content
|
|
125
171
|
</AnalyticsProvider>
|
|
126
172
|
</body>
|
|
@@ -129,7 +175,7 @@ export default function RootLayout({
|
|
|
129
175
|
}
|
|
130
176
|
```
|
|
131
177
|
|
|
132
|
-
|
|
178
|
+
**4. Using the SDK**
|
|
133
179
|
|
|
134
180
|
Once the SDK is initialized, you can use its methods to track events and user interactions. Here’s how to do that:
|
|
135
181
|
|
|
@@ -143,11 +189,9 @@ const YourComponent = () => {
|
|
|
143
189
|
useEffect(() => {
|
|
144
190
|
const track = async () => {
|
|
145
191
|
try {
|
|
146
|
-
console.log('Tracking page hit...');
|
|
147
|
-
analytics.page(); // Track the page view
|
|
148
192
|
analytics.track('custom_event', { key: 'value' }); // Track a custom event
|
|
149
193
|
} catch (error) {
|
|
150
|
-
console.error('Failed to track
|
|
194
|
+
console.error('Failed to track event', error);
|
|
151
195
|
}
|
|
152
196
|
};
|
|
153
197
|
|
|
@@ -158,10 +202,54 @@ const YourComponent = () => {
|
|
|
158
202
|
};
|
|
159
203
|
```
|
|
160
204
|
|
|
161
|
-
# Development
|
|
205
|
+
# Development Notes
|
|
206
|
+
|
|
207
|
+
If you want to contribute or run a local version of the Formo Analytics SDK, follow these steps:
|
|
208
|
+
|
|
209
|
+
1. Build the SDK Locally
|
|
210
|
+
|
|
211
|
+
Run the following command to build both CommonJS and ESM versions of the SDK:
|
|
212
|
+
|
|
213
|
+
```jsx
|
|
214
|
+
yarn build-cjs && yarn build-esm && yarn webpack --mode=production
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
or if you're using NPM:
|
|
218
|
+
|
|
219
|
+
```jsx
|
|
220
|
+
npm run build
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
2. Authenticate with NPM
|
|
224
|
+
|
|
225
|
+
To publish a new version of the package, log in to your NPM account:
|
|
226
|
+
|
|
227
|
+
```jsx
|
|
228
|
+
npm login
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
or:
|
|
232
|
+
|
|
233
|
+
```jsx
|
|
234
|
+
npm adduser
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
3. Publish the Package
|
|
238
|
+
|
|
239
|
+
Run the following command to publish the package to NPM:
|
|
240
|
+
|
|
241
|
+
```jsx
|
|
242
|
+
yarn publish
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
or:
|
|
246
|
+
|
|
247
|
+
```jsx
|
|
248
|
+
npm run publish
|
|
249
|
+
```
|
|
162
250
|
|
|
163
|
-
|
|
251
|
+
# Troubleshooting
|
|
164
252
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
253
|
+
**API Key Not Provided:** Ensure you pass a valid apiKey when initializing the SDK.
|
|
254
|
+
**SDK Not Initialized:** If you encounter issues with initialization, check the console logs for errors and ensure the project ID and API key are correct.
|
|
255
|
+
**Network Errors:** Verify that the analytics service URL is accessible from your network.
|
|
@@ -1,28 +1,91 @@
|
|
|
1
|
+
import { ChainID, EIP1193Provider, Options } from './types';
|
|
1
2
|
interface IFormoAnalytics {
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Initializes the FormoAnalytics instance with the provided API key and project ID.
|
|
5
|
+
*/
|
|
6
|
+
init(apiKey: string, options: Options): Promise<FormoAnalytics>;
|
|
7
|
+
/**
|
|
8
|
+
* Tracks page visit events.
|
|
9
|
+
*/
|
|
4
10
|
page(): void;
|
|
5
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Connects to a wallet with the specified chain ID and address.
|
|
13
|
+
*/
|
|
14
|
+
connect(params: {
|
|
15
|
+
chainId: ChainID;
|
|
16
|
+
address: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Disconnects the current wallet and clears the session information.
|
|
20
|
+
*/
|
|
21
|
+
disconnect(params?: {
|
|
22
|
+
chainId?: ChainID;
|
|
23
|
+
address?: string;
|
|
24
|
+
}): void;
|
|
25
|
+
/**
|
|
26
|
+
* Switches the blockchain chain context and optionally logs additional params.
|
|
27
|
+
*/
|
|
28
|
+
chain(params: {
|
|
29
|
+
chainId: ChainID;
|
|
30
|
+
address?: string;
|
|
31
|
+
}): void;
|
|
32
|
+
/**
|
|
33
|
+
* Tracks a specific event with a name and associated data.
|
|
34
|
+
*/
|
|
35
|
+
track(eventName: string, eventData: Record<string, any>): void;
|
|
6
36
|
}
|
|
7
37
|
export declare class FormoAnalytics implements IFormoAnalytics {
|
|
8
38
|
readonly apiKey: string;
|
|
9
|
-
|
|
39
|
+
options: Options;
|
|
40
|
+
private _provider?;
|
|
41
|
+
private _registeredProviderListeners;
|
|
42
|
+
private walletAddressSessionKey;
|
|
10
43
|
private config;
|
|
11
44
|
private sessionIdKey;
|
|
12
45
|
private timezoneToCountry;
|
|
46
|
+
currentChainId?: string | null;
|
|
47
|
+
currentConnectedAddress?: string;
|
|
13
48
|
private constructor();
|
|
14
|
-
static init(apiKey: string,
|
|
15
|
-
|
|
49
|
+
static init(apiKey: string, options: Options): Promise<FormoAnalytics>;
|
|
50
|
+
get provider(): EIP1193Provider | undefined;
|
|
16
51
|
private getSessionId;
|
|
52
|
+
private getOrigin;
|
|
17
53
|
private setSessionCookie;
|
|
18
54
|
private generateSessionId;
|
|
19
55
|
private getCookieValue;
|
|
20
56
|
private trackEvent;
|
|
21
|
-
private maskSensitiveData;
|
|
22
57
|
private trackPageHit;
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
|
|
58
|
+
private trackProvider;
|
|
59
|
+
private getCurrentWallet;
|
|
60
|
+
private getCurrentChainId;
|
|
61
|
+
private registerAddressChangedListener;
|
|
62
|
+
private registerChainChangedListener;
|
|
63
|
+
private onAddressChanged;
|
|
64
|
+
private onAddressConnected;
|
|
65
|
+
private onAddressDisconnected;
|
|
66
|
+
private onChainChanged;
|
|
67
|
+
/**
|
|
68
|
+
* Stores the wallet address in session storage when connected.
|
|
69
|
+
* @param address - The wallet address to store.
|
|
70
|
+
*/
|
|
71
|
+
private storeWalletAddress;
|
|
72
|
+
/**
|
|
73
|
+
* Clears the wallet address from session storage when disconnected.
|
|
74
|
+
*/
|
|
75
|
+
private clearWalletAddress;
|
|
76
|
+
init(apiKey: string, options: Options): Promise<FormoAnalytics>;
|
|
77
|
+
connect({ chainId, address }: {
|
|
78
|
+
chainId: ChainID;
|
|
79
|
+
address: string;
|
|
80
|
+
}): Promise<void>;
|
|
81
|
+
disconnect(params?: {
|
|
82
|
+
chainId?: ChainID;
|
|
83
|
+
address?: string;
|
|
84
|
+
}): Promise<void> | undefined;
|
|
85
|
+
chain({ chainId, address }: {
|
|
86
|
+
chainId: ChainID;
|
|
87
|
+
address?: string;
|
|
88
|
+
}): Promise<void>;
|
|
26
89
|
page(): void;
|
|
27
90
|
track(eventName: string, eventData: any): void;
|
|
28
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,eAAe;IACvB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhE;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnE;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAE5D;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAChE;AAID,qBAAa,cAAe,YAAW,eAAe;aAgBlC,MAAM,EAAE,MAAM;IACvB,OAAO,EAAE,OAAO;IAhBzB,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,4BAA4B,CAG7B;IAEP,OAAO,CAAC,uBAAuB,CAAmB;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,OAAO;WAeM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAU5E,IAAI,QAAQ,IAAI,eAAe,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAUR,UAAU;IA+DxB,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,aAAa;YA0BP,gBAAgB;YAwBhB,iBAAiB;IAiB/B,OAAO,CAAC,8BAA8B;IAYtC,OAAO,CAAC,4BAA4B;YAOtB,gBAAgB;YAWhB,kBAAkB;IAchC,OAAO,CAAC,qBAAqB;YAgBf,cAAc;IA4C5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAK/D,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAiBnE,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAkB3D,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAuBlE,IAAI;IAIJ,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAGxC"}
|