@soltracer/nft-staking 0.3.1 → 0.5.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/INTEGRATION.md +203 -112
- package/dist/client.d.ts +17 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -6
- package/dist/client.js.map +1 -1
- package/dist/idl.d.ts +45 -14
- package/dist/idl.d.ts.map +1 -1
- package/dist/idl.json +65 -33
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/traitProof.d.ts +170 -244
- package/dist/traitProof.d.ts.map +1 -1
- package/dist/traitProof.js +108 -174
- package/dist/traitProof.js.map +1 -1
- package/package.json +10 -10
package/dist/idl.json
CHANGED
|
@@ -1565,7 +1565,7 @@
|
|
|
1565
1565
|
{
|
|
1566
1566
|
"name": "stake_config",
|
|
1567
1567
|
"docs": [
|
|
1568
|
-
"Global stake config
|
|
1568
|
+
"Global stake config — holds the platform's default trait authority."
|
|
1569
1569
|
],
|
|
1570
1570
|
"pda": {
|
|
1571
1571
|
"seeds": [
|
|
@@ -2638,7 +2638,7 @@
|
|
|
2638
2638
|
{
|
|
2639
2639
|
"name": "reward_vault",
|
|
2640
2640
|
"docs": [
|
|
2641
|
-
"Reward vault
|
|
2641
|
+
"Reward vault — required for token-reward pools. Must be drained before closure.",
|
|
2642
2642
|
"Pass the pool_authority ATA for the reward mint. Omit for SOL-reward pools."
|
|
2643
2643
|
],
|
|
2644
2644
|
"optional": true
|
|
@@ -2851,14 +2851,14 @@
|
|
|
2851
2851
|
{
|
|
2852
2852
|
"name": "reward_mint",
|
|
2853
2853
|
"docs": [
|
|
2854
|
-
"Reward mint
|
|
2854
|
+
"Reward mint — the token paid out as rewards (can be any SPL token).",
|
|
2855
2855
|
"Ignored if reward_type == Points."
|
|
2856
2856
|
]
|
|
2857
2857
|
},
|
|
2858
2858
|
{
|
|
2859
2859
|
"name": "reward_vault",
|
|
2860
2860
|
"docs": [
|
|
2861
|
-
"Reward vault ATA owned by pool_authority
|
|
2861
|
+
"Reward vault ATA owned by pool_authority — created for token rewards."
|
|
2862
2862
|
],
|
|
2863
2863
|
"writable": true,
|
|
2864
2864
|
"pda": {
|
|
@@ -3070,6 +3070,10 @@
|
|
|
3070
3070
|
{
|
|
3071
3071
|
"name": "allow_unlocked_staking",
|
|
3072
3072
|
"type": "bool"
|
|
3073
|
+
},
|
|
3074
|
+
{
|
|
3075
|
+
"name": "name",
|
|
3076
|
+
"type": "string"
|
|
3073
3077
|
}
|
|
3074
3078
|
]
|
|
3075
3079
|
},
|
|
@@ -6193,7 +6197,7 @@
|
|
|
6193
6197
|
{
|
|
6194
6198
|
"name": "sync_stake_entry_secondary",
|
|
6195
6199
|
"docs": [
|
|
6196
|
-
"re-sync one StakeEntry's contribution to",
|
|
6200
|
+
"STAKE-FRESH-2026-05-11 (F-H4): re-sync one StakeEntry's contribution to",
|
|
6197
6201
|
"`pool_secondary.rewards[secondary_index]`. Permissionless. Lets",
|
|
6198
6202
|
"existing stakers begin accruing on a secondary that was added",
|
|
6199
6203
|
"post-stake (or pick up a rate-update) without unstaking."
|
|
@@ -6383,7 +6387,7 @@
|
|
|
6383
6387
|
{
|
|
6384
6388
|
"name": "payer",
|
|
6385
6389
|
"docs": [
|
|
6386
|
-
"Permissionless
|
|
6390
|
+
"Permissionless — anyone may invoke. Pays no tx fee beyond signer",
|
|
6387
6391
|
"requirement and does not need to match the staker."
|
|
6388
6392
|
],
|
|
6389
6393
|
"signer": true
|
|
@@ -7310,7 +7314,7 @@
|
|
|
7310
7314
|
{
|
|
7311
7315
|
"name": "staker_nft_account",
|
|
7312
7316
|
"docs": [
|
|
7313
|
-
"User's NFT token account
|
|
7317
|
+
"User's NFT token account — destination for unstaked NFT."
|
|
7314
7318
|
],
|
|
7315
7319
|
"writable": true
|
|
7316
7320
|
},
|
|
@@ -7806,6 +7810,12 @@
|
|
|
7806
7810
|
"type": {
|
|
7807
7811
|
"option": "bool"
|
|
7808
7812
|
}
|
|
7813
|
+
},
|
|
7814
|
+
{
|
|
7815
|
+
"name": "name",
|
|
7816
|
+
"type": {
|
|
7817
|
+
"option": "string"
|
|
7818
|
+
}
|
|
7809
7819
|
}
|
|
7810
7820
|
]
|
|
7811
7821
|
},
|
|
@@ -8602,7 +8612,7 @@
|
|
|
8602
8612
|
{
|
|
8603
8613
|
"code": 6038,
|
|
8604
8614
|
"name": "UtilityNotActive",
|
|
8605
|
-
"msg": "Utility is not active for this project
|
|
8615
|
+
"msg": "Utility is not active for this project — check subscription status"
|
|
8606
8616
|
},
|
|
8607
8617
|
{
|
|
8608
8618
|
"code": 6039,
|
|
@@ -8636,56 +8646,66 @@
|
|
|
8636
8646
|
},
|
|
8637
8647
|
{
|
|
8638
8648
|
"code": 6045,
|
|
8649
|
+
"name": "PoolStillActive",
|
|
8650
|
+
"msg": "Pool must be deactivated (is_active = false) before it can be closed"
|
|
8651
|
+
},
|
|
8652
|
+
{
|
|
8653
|
+
"code": 6046,
|
|
8654
|
+
"name": "PoolNameTooLong",
|
|
8655
|
+
"msg": "Pool name exceeds MAX_POOL_NAME_LEN bytes"
|
|
8656
|
+
},
|
|
8657
|
+
{
|
|
8658
|
+
"code": 6047,
|
|
8639
8659
|
"name": "SecondaryRewardRetired",
|
|
8640
8660
|
"msg": "Secondary reward is retired and cannot be modified"
|
|
8641
8661
|
},
|
|
8642
8662
|
{
|
|
8643
|
-
"code":
|
|
8663
|
+
"code": 6048,
|
|
8644
8664
|
"name": "SecondaryRewardAlreadyRetired",
|
|
8645
8665
|
"msg": "Secondary reward is already retired"
|
|
8646
8666
|
},
|
|
8647
8667
|
{
|
|
8648
|
-
"code":
|
|
8668
|
+
"code": 6049,
|
|
8649
8669
|
"name": "SecondaryRewardMintImmutable",
|
|
8650
|
-
"msg": "Secondary reward mint is immutable
|
|
8670
|
+
"msg": "Secondary reward mint is immutable — retire and add a new slot instead"
|
|
8651
8671
|
},
|
|
8652
8672
|
{
|
|
8653
|
-
"code":
|
|
8673
|
+
"code": 6050,
|
|
8654
8674
|
"name": "ClaimLockedUntilExpiry",
|
|
8655
|
-
"msg": "Mid-lock claims are disabled for this tier
|
|
8675
|
+
"msg": "Mid-lock claims are disabled for this tier — rewards are paid out at unstake"
|
|
8656
8676
|
},
|
|
8657
8677
|
{
|
|
8658
|
-
"code":
|
|
8678
|
+
"code": 6051,
|
|
8659
8679
|
"name": "StakerMismatch",
|
|
8660
8680
|
"msg": "Caller is not the staker for this entry"
|
|
8661
8681
|
},
|
|
8662
8682
|
{
|
|
8663
|
-
"code":
|
|
8683
|
+
"code": 6052,
|
|
8664
8684
|
"name": "LockTierConfigMissing",
|
|
8665
8685
|
"msg": "Lock tier config missing - pool was reconfigured with active entries"
|
|
8666
8686
|
},
|
|
8667
8687
|
{
|
|
8668
|
-
"code":
|
|
8688
|
+
"code": 6053,
|
|
8669
8689
|
"name": "NftAlreadyStaked",
|
|
8670
8690
|
"msg": "NFT is already staked"
|
|
8671
8691
|
},
|
|
8672
8692
|
{
|
|
8673
|
-
"code":
|
|
8693
|
+
"code": 6054,
|
|
8674
8694
|
"name": "UserBanned",
|
|
8675
8695
|
"msg": "User profile is banned"
|
|
8676
8696
|
},
|
|
8677
8697
|
{
|
|
8678
|
-
"code":
|
|
8698
|
+
"code": 6055,
|
|
8679
8699
|
"name": "UserProfileMismatch",
|
|
8680
8700
|
"msg": "User profile does not match staker"
|
|
8681
8701
|
},
|
|
8682
8702
|
{
|
|
8683
|
-
"code":
|
|
8703
|
+
"code": 6056,
|
|
8684
8704
|
"name": "InvalidQuantityBonus",
|
|
8685
8705
|
"msg": "Invalid quantity bonus configuration"
|
|
8686
8706
|
},
|
|
8687
8707
|
{
|
|
8688
|
-
"code":
|
|
8708
|
+
"code": 6057,
|
|
8689
8709
|
"name": "BaseStakingDisabled",
|
|
8690
8710
|
"msg": "Unlocked/base staking is disabled for this pool"
|
|
8691
8711
|
}
|
|
@@ -8758,7 +8778,7 @@
|
|
|
8758
8778
|
{
|
|
8759
8779
|
"name": "claim_only_at_end",
|
|
8760
8780
|
"docs": [
|
|
8761
|
-
"If true, mid-lock claims are blocked
|
|
8781
|
+
"If true, mid-lock claims are blocked — rewards are only accessible at unstake.",
|
|
8762
8782
|
"Ensures the early-unstake penalty cannot be bypassed by claiming before unstaking."
|
|
8763
8783
|
],
|
|
8764
8784
|
"type": "bool"
|
|
@@ -8854,7 +8874,7 @@
|
|
|
8854
8874
|
"name": "PoolSecondaryRewards",
|
|
8855
8875
|
"docs": [
|
|
8856
8876
|
"Separate PDA holding secondary reward configs for a pool.",
|
|
8857
|
-
"Exists only when the pool has secondary rewards
|
|
8877
|
+
"Exists only when the pool has secondary rewards — zero migration needed."
|
|
8858
8878
|
],
|
|
8859
8879
|
"type": {
|
|
8860
8880
|
"kind": "struct",
|
|
@@ -8876,7 +8896,7 @@
|
|
|
8876
8896
|
{
|
|
8877
8897
|
"name": "is_initialized",
|
|
8878
8898
|
"docs": [
|
|
8879
|
-
"Explicit init sentinel
|
|
8899
|
+
"Explicit init sentinel — avoids ambiguous pool_id == 0 check for pool 0 (STAKE-H1)"
|
|
8880
8900
|
],
|
|
8881
8901
|
"type": "bool"
|
|
8882
8902
|
},
|
|
@@ -8937,12 +8957,16 @@
|
|
|
8937
8957
|
"type": "i64"
|
|
8938
8958
|
},
|
|
8939
8959
|
{
|
|
8940
|
-
"name": "
|
|
8960
|
+
"name": "trait_bonus_enabled",
|
|
8941
8961
|
"docs": [
|
|
8942
|
-
"
|
|
8943
|
-
"
|
|
8962
|
+
"When `true`, the pool accepts a signed `trait_bonus_rate` from the",
|
|
8963
|
+
"configured trait authority on every claim. The signed `u64` is added",
|
|
8964
|
+
"directly to the staker's effective rate for the accrual window —",
|
|
8965
|
+
"projects compute per-trait math (including any per-NFT multipliers)",
|
|
8966
|
+
"off-chain and sign the final absolute extra rate. When `false`, any",
|
|
8967
|
+
"non-zero `trait_bonus_rate` is rejected on-chain."
|
|
8944
8968
|
],
|
|
8945
|
-
"type": "
|
|
8969
|
+
"type": "bool"
|
|
8946
8970
|
},
|
|
8947
8971
|
{
|
|
8948
8972
|
"name": "quantity_thresholds",
|
|
@@ -9025,7 +9049,7 @@
|
|
|
9025
9049
|
{
|
|
9026
9050
|
"name": "retired_at",
|
|
9027
9051
|
"docs": [
|
|
9028
|
-
"unix timestamp at which the slot was",
|
|
9052
|
+
"STAKE-FRESH-2026-05-11 (F-H3): unix timestamp at which the slot was",
|
|
9029
9053
|
"retired. `0` while active. Used by `accrue_secondary` /",
|
|
9030
9054
|
"`accrue_and_sub_secondary` to cap per-staker accrual at the moment of",
|
|
9031
9055
|
"retirement so the time window between a staker's last interaction and",
|
|
@@ -9068,7 +9092,7 @@
|
|
|
9068
9092
|
{
|
|
9069
9093
|
"name": "StakeEntry",
|
|
9070
9094
|
"docs": [
|
|
9071
|
-
"Per-NFT custody and lock tracking. No reward fields
|
|
9095
|
+
"Per-NFT custody and lock tracking. No reward fields — rewards are",
|
|
9072
9096
|
"accumulated on the parent StakerAccount via `effective_rate`."
|
|
9073
9097
|
],
|
|
9074
9098
|
"type": {
|
|
@@ -9131,7 +9155,7 @@
|
|
|
9131
9155
|
{
|
|
9132
9156
|
"name": "early_unstake_penalty_bps",
|
|
9133
9157
|
"docs": [
|
|
9134
|
-
"early-unstake penalty (bps) captured at",
|
|
9158
|
+
"STAKE2-M3 (audit 2026-05-05): early-unstake penalty (bps) captured at",
|
|
9135
9159
|
"stake time. Read at unstake instead of `pool.lock_configs[tier].early_unstake_penalty_bps`",
|
|
9136
9160
|
"so the authority cannot retroactively raise the penalty after the",
|
|
9137
9161
|
"staker has committed. Zero when the entry has no lock."
|
|
@@ -9144,7 +9168,7 @@
|
|
|
9144
9168
|
{
|
|
9145
9169
|
"name": "StakeEntrySecondarySynced",
|
|
9146
9170
|
"docs": [
|
|
9147
|
-
"emitted when a StakeEntry's",
|
|
9171
|
+
"STAKE-FRESH-2026-05-11 (F-H4): emitted when a StakeEntry's",
|
|
9148
9172
|
"secondary_rate_contributions[index] is re-synced to the pool's current",
|
|
9149
9173
|
"config (e.g. after an admin added a new secondary slot post-stake)."
|
|
9150
9174
|
],
|
|
@@ -9241,6 +9265,14 @@
|
|
|
9241
9265
|
"name": "created_at",
|
|
9242
9266
|
"type": "i64"
|
|
9243
9267
|
},
|
|
9268
|
+
{
|
|
9269
|
+
"name": "name",
|
|
9270
|
+
"docs": [
|
|
9271
|
+
"Human-readable pool name. UTF-8, capped at `MAX_POOL_NAME_LEN`",
|
|
9272
|
+
"bytes (not characters). Empty string is allowed."
|
|
9273
|
+
],
|
|
9274
|
+
"type": "string"
|
|
9275
|
+
},
|
|
9244
9276
|
{
|
|
9245
9277
|
"name": "trait_authority",
|
|
9246
9278
|
"docs": [
|
|
@@ -9309,7 +9341,7 @@
|
|
|
9309
9341
|
{
|
|
9310
9342
|
"name": "total_effective_rate",
|
|
9311
9343
|
"docs": [
|
|
9312
|
-
"aggregate of every active staker's",
|
|
9344
|
+
"STAKE-FRESH-2026-05-11 (F-H1): aggregate of every active staker's",
|
|
9313
9345
|
"`effective_rate`. Maintained at every stake/unstake/burn site.",
|
|
9314
9346
|
"Used by [`pool_settle`] to advance obligation for stakers who have",
|
|
9315
9347
|
"not yet visited the pool since `last_pool_accrual_ts`."
|
|
@@ -9319,7 +9351,7 @@
|
|
|
9319
9351
|
{
|
|
9320
9352
|
"name": "last_pool_accrual_ts",
|
|
9321
9353
|
"docs": [
|
|
9322
|
-
"unix timestamp at which the pool's",
|
|
9354
|
+
"STAKE-FRESH-2026-05-11 (F-H1): unix timestamp at which the pool's",
|
|
9323
9355
|
"total obligation was last advanced. Bumped by every handler that",
|
|
9324
9356
|
"touches the pool (via [`pool_settle`])."
|
|
9325
9357
|
],
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { NftStakingClient, type FeeParams, type NftRewardAmount, type NftRewardSummary, type NftRewardSummaryOptions, } from "./client";
|
|
2
|
-
export { NFT_STAKING_PROGRAM_ID, getStakeConfigPda, getStakePoolPda, getStakeEntryPda, getStakerAccountPda, getCollectionPda, getPoolAuthorityPda, getPoolSecondaryRewardsPda, getStakerSecondaryRewardsPda, StakingMode, NftStandard, RewardType,
|
|
2
|
+
export { NFT_STAKING_PROGRAM_ID, getStakeConfigPda, getStakePoolPda, getStakeEntryPda, getStakerAccountPda, getCollectionPda, getPoolAuthorityPda, getPoolSecondaryRewardsPda, getStakerSecondaryRewardsPda, StakingMode, NftStandard, RewardType, } from "@soltracer/core";
|
|
3
3
|
export { type NftStaking as NftStakingIDLType } from "./idl";
|
|
4
4
|
export { default as NftStakingIDL } from "./idl.json";
|
|
5
5
|
export * from "./errors";
|
|
6
6
|
export * from "./helpers";
|
|
7
|
-
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN,
|
|
7
|
+
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, computeTraitBonusRate, prepareTraitProof, ownershipFromClient, InMemoryTraitBonusStore, type TraitBonusCatalogEntry, type NftTraitInput, type PerNftBonus, type TraitBonusComputation, type TraitBonusStore, type NftTraitResolver, type StakedOwnershipResolver, type PrepareTraitProofInput, type PrepareTraitProofResult, } from "./traitProof";
|
|
8
8
|
export { GATE_TYPE_NONE, GATE_TYPE_WALLET, GATE_TYPE_TOKEN_MINT, type GateType, type MerkleTree, hashLeaf, hashPair, buildMerkleTree, getMerkleProof, proofToAnchorArg, rootToAnchorArg, } from "./merkle";
|
|
9
9
|
//# 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,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,UAAU,IAAI,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { NftStakingClient, } from "./client";
|
|
2
|
-
export { NFT_STAKING_PROGRAM_ID, getStakeConfigPda, getStakePoolPda, getStakeEntryPda, getStakerAccountPda, getCollectionPda, getPoolAuthorityPda, getPoolSecondaryRewardsPda, getStakerSecondaryRewardsPda, StakingMode, NftStandard, RewardType,
|
|
2
|
+
export { NFT_STAKING_PROGRAM_ID, getStakeConfigPda, getStakePoolPda, getStakeEntryPda, getStakerAccountPda, getCollectionPda, getPoolAuthorityPda, getPoolSecondaryRewardsPda, getStakerSecondaryRewardsPda, StakingMode, NftStandard, RewardType, } from "@soltracer/core";
|
|
3
3
|
export { default as NftStakingIDL } from "./idl.json";
|
|
4
4
|
export * from "./errors";
|
|
5
5
|
export * from "./helpers";
|
|
6
|
-
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN,
|
|
6
|
+
export { buildTraitProofMessage, TRAIT_PROOF_MSG_LEN, computeTraitBonusRate, prepareTraitProof, ownershipFromClient, InMemoryTraitBonusStore, } from "./traitProof";
|
|
7
7
|
export { GATE_TYPE_NONE, GATE_TYPE_WALLET, GATE_TYPE_TOKEN_MINT, hashLeaf, hashPair, buildMerkleTree, getMerkleProof, proofToAnchorArg, rootToAnchorArg, } from "./merkle";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACrD,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GAUxB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA"}
|