clawclick-sdk 0.1.3 → 0.1.5

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 CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  CLI & SDK for Claw.Click agents — launch tokens, trade, upload images, claim fees.
4
4
 
5
+ ## Dual Launch System
6
+
7
+ The factory supports two launch types:
8
+
9
+ | Feature | DIRECT (claws.fun) | AGENT (claw.click) |
10
+ |---------|--------------------|--------------------|
11
+ | Hook | None — hookless V4 pool | ClawclickHook — epoch/tax/limits |
12
+ | Fee | 1% LP fee (static) | Dynamic fee (0x800000) via hook |
13
+ | Tax | None | Starts high, decays over 5 epochs |
14
+ | Limits | None | Max TX + Max Wallet, relaxing per epoch |
15
+ | Graduation | N/A | Triggers at 16× starting MCAP |
16
+ | Uniswap UI | Tradeable natively | Requires custom swap UI |
17
+ | Fee claims | `collectFeesFromPosition()` (70/30 split) | `claimFeesETH()` / `claimFeesToken()` via hook |
18
+ | Bootstrap | Min 0.001 ETH (seeds initial liquidity) | Min 0.001 ETH (seeds initial liquidity) |
19
+
5
20
  ## Install
6
21
 
7
22
  ```bash
@@ -20,38 +35,45 @@ Create a `.env` file:
20
35
 
21
36
  ```bash
22
37
  CLAWCLICK_PRIVATE_KEY=your_hex_private_key
23
- CLAWCLICK_RPC_URL=https://sepolia.infura.io/v3/YOUR_KEY
38
+ CLAWCLICK_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
24
39
  CLAWCLICK_API_URL=https://claw-click-backend-5157d572b2b6.herokuapp.com/
25
- CLAWCLICK_FACTORY_ADDRESS=0x...
26
- CLAWCLICK_HOOK_ADDRESS=0x...
27
- CLAWCLICK_SWAP_EXECUTOR_ADDRESS=0x...
40
+ CLAWCLICK_FACTORY_ADDRESS=0xe6f52084209699491aCc2532e857e3510e4c5e13
41
+ CLAWCLICK_HOOK_ADDRESS=0x582c8085b3857E44561a3E9442Adc064E94e2ac8
42
+ CLAWCLICK_POOL_SWAP_TEST_ADDRESS=0x9b6b46e2c869aa39918db7f52f5557fe577b6eee
28
43
  CLAWCLICK_CHAIN_ID=11155111
29
44
  ```
30
45
 
31
46
  ## CLI Commands
32
47
 
33
48
  ```bash
34
- # Launch a new token
35
- clawclick launch -n "My Token" -s "MTK" -b 0xBeneficiary -m 1.5
49
+ # Launch a DIRECT token (hookless, tradeable on Uniswap)
50
+ # -e sets bootstrap ETH (min 0.001 ETH required to seed liquidity)
51
+ clawclick launch -n "My Token" -s "MTK" -b 0xBeneficiary -m 1.5 -T direct -e 0.01
52
+
53
+ # Launch an AGENT token (hook-based, epoch/tax/graduation)
54
+ clawclick launch -n "Agent Token" -s "AGT" -b 0xBeneficiary -m 2 -T agent -e 0.001
36
55
 
37
- # Buy tokens with ETH
56
+ # Launch defaults to AGENT with 0.001 ETH bootstrap if -T and -e are omitted
57
+ clawclick launch -n "Default" -s "DFL" -b 0xBeneficiary
58
+
59
+ # Buy tokens with ETH (works for both launch types)
38
60
  clawclick buy -t 0xTokenAddress -a 0.1
39
61
 
40
- # Sell tokens
62
+ # Sell tokens (works for both launch types)
41
63
  clawclick sell -t 0xTokenAddress -a 1000000
42
64
  clawclick sell -t 0xTokenAddress -a all
43
65
 
44
66
  # Upload images (must be token owner/creator/agent)
45
67
  clawclick upload -t 0xTokenAddress -l ./logo.png -b ./banner.png
46
68
 
47
- # Claim ETH fees
69
+ # Claim ETH fees (AGENT pools only — via hook)
48
70
  clawclick claim
49
71
  clawclick claim -b 0xBeneficiaryAddress
50
72
 
51
- # Claim token fees
73
+ # Claim token fees (AGENT pools only — via hook)
52
74
  clawclick claim -t 0xTokenAddress
53
75
 
54
- # Get token info (on-chain + API)
76
+ # Get token info (shows launch type, on-chain + API data)
55
77
  clawclick info -t 0xTokenAddress
56
78
 
57
79
  # Check balances
@@ -77,55 +99,106 @@ import { ClawClick } from '@clawclick/sdk'
77
99
 
78
100
  const sdk = new ClawClick({
79
101
  privateKey: process.env.PRIVATE_KEY!,
80
- rpcUrl: 'https://sepolia.infura.io/v3/...',
102
+ rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',
81
103
  apiUrl: 'https://your-backend.herokuapp.com',
82
104
  factoryAddress: '0x...',
83
105
  hookAddress: '0x...',
84
- swapExecutorAddress: '0x...',
106
+ poolSwapTestAddress: '0x...', // PoolSwapTest contract
85
107
  chainId: 11155111,
86
108
  })
87
109
 
88
- // Launch a token
89
- const { tokenAddress, poolId, txHash } = await sdk.launch({
90
- name: 'My Token',
91
- symbol: 'MTK',
110
+ // ── Launch (DIRECT — hookless, Uniswap-tradeable) ──
111
+ const direct = await sdk.launch({
112
+ name: 'My Direct Token',
113
+ symbol: 'MDT',
92
114
  beneficiary: '0x...',
93
115
  targetMcapETH: '1.5',
116
+ bootstrapETH: '0.01', // min 0.001 ETH — more = tighter spread
117
+ launchType: 'direct', // hookless pool, 1% LP fee
94
118
  })
119
+ console.log(direct.launchType) // 'direct'
95
120
 
96
- // Buy
97
- await sdk.buy(tokenAddress, '0.1')
121
+ // ── Launch (AGENT — hook-based, epoch/tax/graduation) ──
122
+ const agent = await sdk.launch({
123
+ name: 'Agent Token',
124
+ symbol: 'AGT',
125
+ beneficiary: '0x...',
126
+ targetMcapETH: '2',
127
+ bootstrapETH: '0.001', // minimum bootstrap (0.001 ETH)
128
+ launchType: 'agent', // default — hook-based pool
129
+ feeSplit: {
130
+ wallets: ['0xAlice...', '0xBob...'],
131
+ percentages: [5000, 5000], // 50/50 of creator's 70%
132
+ },
133
+ })
98
134
 
99
- // Sell
100
- await sdk.sell(tokenAddress, '1000000')
101
- await sdk.sell(tokenAddress, 'all')
135
+ // ── Trading (same API for both types) ──
136
+ await sdk.buy(tokenAddress, '0.1') // Buy with 0.1 ETH
137
+ await sdk.sell(tokenAddress, '1000000') // Sell 1M tokens
138
+ await sdk.sell(tokenAddress, 'all') // Sell entire balance
102
139
 
103
- // Upload images
104
- await sdk.uploadImages(tokenAddress, {
105
- logoPath: './logo.png',
106
- bannerPath: './banner.png',
107
- })
140
+ // ── Check launch type ──
141
+ const isDirect = await sdk.isDirectLaunch(tokenAddress)
142
+
143
+ // ── Token info (includes launchType) ──
144
+ const info = await sdk.getTokenInfo(tokenAddress)
145
+ console.log(info.launchType) // 'direct' or 'agent'
108
146
 
109
- // Claim fees
147
+ // ── Fee claims (AGENT only — via hook) ──
110
148
  await sdk.claimFeesETH()
111
149
  await sdk.claimFeesToken(tokenAddress)
112
150
 
113
- // Read data
114
- const info = await sdk.getTokenInfo(tokenAddress)
151
+ // ── LP fee collection (DIRECT — via factory) ──
152
+ await sdk.collectFeesFromPosition(tokenAddress, 0)
153
+
154
+ // ── Pool state (scalar fields — arrays excluded by Solidity auto-getter) ──
155
+ const state = await sdk.getPoolState(tokenAddress)
156
+ console.log(state.activated) // true
157
+ console.log(state.recycledETH) // ETH from withdrawn positions
158
+
159
+ // ── AGENT-specific reads (no-op for DIRECT) ──
115
160
  const progress = await sdk.getPoolProgress(tokenAddress)
116
- const tax = await sdk.getCurrentTax(tokenAddress)
117
- const limits = await sdk.getCurrentLimits(tokenAddress)
118
- const graduated = await sdk.isGraduated(tokenAddress)
119
- const balance = await sdk.getTokenBalance(tokenAddress)
120
- const ethBalance = await sdk.getETHBalance()
161
+ const tax = await sdk.getCurrentTax(tokenAddress) // 0n for DIRECT
162
+ const limits = await sdk.getCurrentLimits(tokenAddress) // max uint for DIRECT
163
+ const graduated = await sdk.isGraduated(tokenAddress) // false for DIRECT
164
+
165
+ // ── Upload images ──
166
+ await sdk.uploadImages(tokenAddress, {
167
+ logoPath: './logo.png',
168
+ bannerPath: './banner.png',
169
+ })
121
170
 
122
- // API reads
171
+ // ── API reads ──
123
172
  const tokens = await sdk.listTokens({ sort: 'hot', limit: 10 })
124
173
  const trending = await sdk.getTrending()
125
174
  const stats = await sdk.getStats()
126
175
  const tokenData = await sdk.getTokenFromAPI(tokenAddress)
127
176
  ```
128
177
 
178
+ ## Architecture
179
+
180
+ ```
181
+ ┌──────────────┐ createLaunch(DIRECT) ┌──────────────────┐
182
+ │ │ ──────────────────────────► │ │
183
+ │ CLI / SDK │ │ ClawclickFactory │
184
+ │ │ ──────────────────────────► │ │
185
+ └──────┬───────┘ createLaunch(AGENT) └────────┬─────────┘
186
+ │ │
187
+ │ buy / sell │ AGENT only
188
+ ▼ ▼
189
+ ┌──────────────┐ ┌──────────────────┐
190
+ │ PoolSwapTest │ ─────── swap() ──────────► │ Uniswap V4 │
191
+ │ │ │ PoolManager │
192
+ └──────────────┘ └────────┬─────────┘
193
+
194
+ ┌────────┴─────────┐
195
+ │ ClawclickHook │
196
+ │ (AGENT pools) │
197
+ │ tax / limits / │
198
+ │ epoch / graduate │
199
+ └──────────────────┘
200
+ ```
201
+
129
202
  ## Building
130
203
 
131
204
  ```bash
@@ -137,5 +210,5 @@ npm run build
137
210
  ## Development
138
211
 
139
212
  ```bash
140
- npm run dev -- launch -n "Test" -s "TST" -b 0x...
213
+ npm run dev -- launch -n "Test" -s "TST" -b 0x... -T direct
141
214
  ```
package/dist/abi.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /** LaunchType enum values matching the contract */
2
+ export declare const LaunchType: {
3
+ readonly DIRECT: 0;
4
+ readonly AGENT: 1;
5
+ };
1
6
  export declare const FACTORY_ABI: readonly [{
2
7
  readonly name: "createLaunch";
3
8
  readonly type: "function";
@@ -33,6 +38,9 @@ export declare const FACTORY_ABI: readonly [{
33
38
  readonly name: "count";
34
39
  readonly type: "uint8";
35
40
  }];
41
+ }, {
42
+ readonly name: "launchType";
43
+ readonly type: "uint8";
36
44
  }];
37
45
  }];
38
46
  readonly outputs: readonly [{
@@ -115,10 +123,13 @@ export declare const FACTORY_ABI: readonly [{
115
123
  readonly name: "count";
116
124
  readonly type: "uint8";
117
125
  }];
126
+ }, {
127
+ readonly name: "launchType";
128
+ readonly type: "uint8";
118
129
  }];
119
130
  }];
120
131
  }, {
121
- readonly name: "poolStates";
132
+ readonly name: "launchByPoolId";
122
133
  readonly type: "function";
123
134
  readonly stateMutability: "view";
124
135
  readonly inputs: readonly [{
@@ -135,34 +146,111 @@ export declare const FACTORY_ABI: readonly [{
135
146
  readonly name: "beneficiary";
136
147
  readonly type: "address";
137
148
  }, {
138
- readonly name: "startingMCAP";
139
- readonly type: "uint256";
149
+ readonly name: "agentWallet";
150
+ readonly type: "address";
140
151
  }, {
141
- readonly name: "graduationMCAP";
142
- readonly type: "uint256";
152
+ readonly name: "creator";
153
+ readonly type: "address";
143
154
  }, {
144
- readonly name: "totalSupply";
145
- readonly type: "uint256";
155
+ readonly name: "poolId";
156
+ readonly type: "bytes32";
146
157
  }, {
147
- readonly name: "positionTokenIds";
148
- readonly type: "uint256[5]";
158
+ readonly name: "poolKey";
159
+ readonly type: "tuple";
160
+ readonly components: readonly [{
161
+ readonly name: "currency0";
162
+ readonly type: "address";
163
+ }, {
164
+ readonly name: "currency1";
165
+ readonly type: "address";
166
+ }, {
167
+ readonly name: "fee";
168
+ readonly type: "uint24";
169
+ }, {
170
+ readonly name: "tickSpacing";
171
+ readonly type: "int24";
172
+ }, {
173
+ readonly name: "hooks";
174
+ readonly type: "address";
175
+ }];
149
176
  }, {
150
- readonly name: "positionMinted";
151
- readonly type: "bool[5]";
177
+ readonly name: "targetMcapETH";
178
+ readonly type: "uint256";
152
179
  }, {
153
- readonly name: "positionRetired";
154
- readonly type: "bool[5]";
180
+ readonly name: "createdAt";
181
+ readonly type: "uint256";
155
182
  }, {
156
- readonly name: "recycledETH";
183
+ readonly name: "createdBlock";
157
184
  readonly type: "uint256";
158
185
  }, {
159
- readonly name: "activated";
160
- readonly type: "bool";
186
+ readonly name: "name";
187
+ readonly type: "string";
161
188
  }, {
162
- readonly name: "graduated";
163
- readonly type: "bool";
189
+ readonly name: "symbol";
190
+ readonly type: "string";
191
+ }, {
192
+ readonly name: "feeSplit";
193
+ readonly type: "tuple";
194
+ readonly components: readonly [{
195
+ readonly name: "wallets";
196
+ readonly type: "address[5]";
197
+ }, {
198
+ readonly name: "percentages";
199
+ readonly type: "uint16[5]";
200
+ }, {
201
+ readonly name: "count";
202
+ readonly type: "uint8";
203
+ }];
204
+ }, {
205
+ readonly name: "launchType";
206
+ readonly type: "uint8";
164
207
  }];
165
208
  }];
209
+ }, {
210
+ readonly name: "poolStates";
211
+ readonly type: "function";
212
+ readonly stateMutability: "view";
213
+ readonly inputs: readonly [{
214
+ readonly name: "poolId";
215
+ readonly type: "bytes32";
216
+ }];
217
+ readonly outputs: readonly [{
218
+ readonly name: "token";
219
+ readonly type: "address";
220
+ }, {
221
+ readonly name: "beneficiary";
222
+ readonly type: "address";
223
+ }, {
224
+ readonly name: "startingMCAP";
225
+ readonly type: "uint256";
226
+ }, {
227
+ readonly name: "graduationMCAP";
228
+ readonly type: "uint256";
229
+ }, {
230
+ readonly name: "totalSupply";
231
+ readonly type: "uint256";
232
+ }, {
233
+ readonly name: "recycledETH";
234
+ readonly type: "uint256";
235
+ }, {
236
+ readonly name: "activated";
237
+ readonly type: "bool";
238
+ }, {
239
+ readonly name: "graduated";
240
+ readonly type: "bool";
241
+ }];
242
+ }, {
243
+ readonly name: "poolActivated";
244
+ readonly type: "function";
245
+ readonly stateMutability: "view";
246
+ readonly inputs: readonly [{
247
+ readonly name: "poolId";
248
+ readonly type: "bytes32";
249
+ }];
250
+ readonly outputs: readonly [{
251
+ readonly name: "";
252
+ readonly type: "bool";
253
+ }];
166
254
  }, {
167
255
  readonly name: "getTokenCount";
168
256
  readonly type: "function";
@@ -223,6 +311,24 @@ export declare const FACTORY_ABI: readonly [{
223
311
  readonly name: "";
224
312
  readonly type: "address";
225
313
  }];
314
+ }, {
315
+ readonly name: "config";
316
+ readonly type: "function";
317
+ readonly stateMutability: "view";
318
+ readonly inputs: readonly [];
319
+ readonly outputs: readonly [{
320
+ readonly name: "";
321
+ readonly type: "address";
322
+ }];
323
+ }, {
324
+ readonly name: "positionManager";
325
+ readonly type: "function";
326
+ readonly stateMutability: "view";
327
+ readonly inputs: readonly [];
328
+ readonly outputs: readonly [{
329
+ readonly name: "";
330
+ readonly type: "address";
331
+ }];
226
332
  }, {
227
333
  readonly name: "mintNextPosition";
228
334
  readonly type: "function";
@@ -235,6 +341,18 @@ export declare const FACTORY_ABI: readonly [{
235
341
  readonly type: "uint256";
236
342
  }];
237
343
  readonly outputs: readonly [];
344
+ }, {
345
+ readonly name: "retireOldPosition";
346
+ readonly type: "function";
347
+ readonly stateMutability: "nonpayable";
348
+ readonly inputs: readonly [{
349
+ readonly name: "poolId";
350
+ readonly type: "bytes32";
351
+ }, {
352
+ readonly name: "positionIndex";
353
+ readonly type: "uint256";
354
+ }];
355
+ readonly outputs: readonly [];
238
356
  }, {
239
357
  readonly name: "collectFeesFromPosition";
240
358
  readonly type: "function";
@@ -247,6 +365,15 @@ export declare const FACTORY_ABI: readonly [{
247
365
  readonly type: "uint256";
248
366
  }];
249
367
  readonly outputs: readonly [];
368
+ }, {
369
+ readonly name: "clearDevOverride";
370
+ readonly type: "function";
371
+ readonly stateMutability: "nonpayable";
372
+ readonly inputs: readonly [{
373
+ readonly name: "poolId";
374
+ readonly type: "bytes32";
375
+ }];
376
+ readonly outputs: readonly [];
250
377
  }];
251
378
  export declare const HOOK_ABI: readonly [{
252
379
  readonly name: "launches";
@@ -412,8 +539,8 @@ export declare const HOOK_ABI: readonly [{
412
539
  readonly type: "uint256";
413
540
  }];
414
541
  }];
415
- export declare const SWAP_EXECUTOR_ABI: readonly [{
416
- readonly name: "executeBuy";
542
+ export declare const POOL_SWAP_TEST_ABI: readonly [{
543
+ readonly name: "swap";
417
544
  readonly type: "function";
418
545
  readonly stateMutability: "payable";
419
546
  readonly inputs: readonly [{
@@ -436,17 +563,42 @@ export declare const SWAP_EXECUTOR_ABI: readonly [{
436
563
  readonly type: "address";
437
564
  }];
438
565
  }, {
439
- readonly name: "amountIn";
440
- readonly type: "uint256";
566
+ readonly name: "params";
567
+ readonly type: "tuple";
568
+ readonly components: readonly [{
569
+ readonly name: "zeroForOne";
570
+ readonly type: "bool";
571
+ }, {
572
+ readonly name: "amountSpecified";
573
+ readonly type: "int256";
574
+ }, {
575
+ readonly name: "sqrtPriceLimitX96";
576
+ readonly type: "uint160";
577
+ }];
441
578
  }, {
442
- readonly name: "amountOutMin";
443
- readonly type: "uint256";
579
+ readonly name: "testSettings";
580
+ readonly type: "tuple";
581
+ readonly components: readonly [{
582
+ readonly name: "takeClaims";
583
+ readonly type: "bool";
584
+ }, {
585
+ readonly name: "settleUsingBurn";
586
+ readonly type: "bool";
587
+ }];
588
+ }, {
589
+ readonly name: "hookData";
590
+ readonly type: "bytes";
444
591
  }];
445
- readonly outputs: readonly [];
446
- }, {
447
- readonly name: "executeSell";
592
+ readonly outputs: readonly [{
593
+ readonly name: "delta";
594
+ readonly type: "int256";
595
+ }];
596
+ }];
597
+ /** @deprecated Use POOL_SWAP_TEST_ABI instead — SwapExecutor reverts on Sepolia */
598
+ export declare const SWAP_EXECUTOR_ABI: readonly [{
599
+ readonly name: "swap";
448
600
  readonly type: "function";
449
- readonly stateMutability: "nonpayable";
601
+ readonly stateMutability: "payable";
450
602
  readonly inputs: readonly [{
451
603
  readonly name: "key";
452
604
  readonly type: "tuple";
@@ -467,16 +619,36 @@ export declare const SWAP_EXECUTOR_ABI: readonly [{
467
619
  readonly type: "address";
468
620
  }];
469
621
  }, {
470
- readonly name: "token";
471
- readonly type: "address";
622
+ readonly name: "params";
623
+ readonly type: "tuple";
624
+ readonly components: readonly [{
625
+ readonly name: "zeroForOne";
626
+ readonly type: "bool";
627
+ }, {
628
+ readonly name: "amountSpecified";
629
+ readonly type: "int256";
630
+ }, {
631
+ readonly name: "sqrtPriceLimitX96";
632
+ readonly type: "uint160";
633
+ }];
472
634
  }, {
473
- readonly name: "amountIn";
474
- readonly type: "uint256";
635
+ readonly name: "testSettings";
636
+ readonly type: "tuple";
637
+ readonly components: readonly [{
638
+ readonly name: "takeClaims";
639
+ readonly type: "bool";
640
+ }, {
641
+ readonly name: "settleUsingBurn";
642
+ readonly type: "bool";
643
+ }];
475
644
  }, {
476
- readonly name: "amountOutMin";
477
- readonly type: "uint256";
645
+ readonly name: "hookData";
646
+ readonly type: "bytes";
647
+ }];
648
+ readonly outputs: readonly [{
649
+ readonly name: "delta";
650
+ readonly type: "int256";
478
651
  }];
479
- readonly outputs: readonly [];
480
652
  }];
481
653
  export declare const ERC20_ABI: readonly [{
482
654
  readonly name: "approve";
package/dist/abi.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmKd,CAAA;AAKV,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGX,CAAA;AAKV,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpB,CAAA;AAKV,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CZ,CAAA"}
1
+ {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"AAIA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;CAAmC,CAAA;AA8C1D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuKd,CAAA;AAKV,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGX,CAAA;AAKV,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCrB,CAAA;AAEV,mFAAmF;AACnF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAqB,CAAA;AAKnD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CZ,CAAA"}