@effectstream/sm 0.100.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.
Files changed (60) hide show
  1. package/Stm.ts +88 -0
  2. package/delegate-wallet.ts +431 -0
  3. package/mod.ts +4 -0
  4. package/package.json +27 -0
  5. package/primitives/Primitive.ts +80 -0
  6. package/primitives/PrimitiveRegistry.ts +59 -0
  7. package/primitives/mod.ts +5 -0
  8. package/primitives/processing.ts +72 -0
  9. package/primitives/src/README.md +3 -0
  10. package/primitives/src/avail-generic/avail-generic-grammar.ts +5 -0
  11. package/primitives/src/avail-generic/avail-primitive.ts +103 -0
  12. package/primitives/src/bitcoin-address/bitcoin-grammar.ts +16 -0
  13. package/primitives/src/bitcoin-address/bitcoin-primitive.ts +113 -0
  14. package/primitives/src/builtin.ts +47 -0
  15. package/primitives/src/celestia-generic/celestia-generic-grammar.ts +5 -0
  16. package/primitives/src/celestia-generic/celestia-primitive.ts +97 -0
  17. package/primitives/src/evm-effectstream-l2/effectstream-l2-abi.ts +1 -0
  18. package/primitives/src/evm-effectstream-l2/effectstream-l2-primitive.ts +484 -0
  19. package/primitives/src/evm-erc1155/erc1155-abi.ts +1 -0
  20. package/primitives/src/evm-erc1155/erc1155-grammar.ts +13 -0
  21. package/primitives/src/evm-erc1155/erc1155-ivm.ts +104 -0
  22. package/primitives/src/evm-erc1155/erc1155-primitive.ts +242 -0
  23. package/primitives/src/evm-erc20/erc20-abi.ts +1 -0
  24. package/primitives/src/evm-erc20/erc20-grammar.ts +7 -0
  25. package/primitives/src/evm-erc20/erc20-ivm.ts +93 -0
  26. package/primitives/src/evm-erc20/erc20-primitive.test.ts +123 -0
  27. package/primitives/src/evm-erc20/erc20-primitive.ts +152 -0
  28. package/primitives/src/evm-erc721/erc721-abi.ts +1 -0
  29. package/primitives/src/evm-erc721/erc721-grammar.ts +9 -0
  30. package/primitives/src/evm-erc721/erc721-ivm.ts +85 -0
  31. package/primitives/src/evm-erc721/erc721-primitive.ts +149 -0
  32. package/primitives/src/evm-generic/evm-generic-primitive.ts +124 -0
  33. package/primitives/src/grammar.ts +34 -0
  34. package/primitives/src/midnight-generic/midnight-genetic-grammar.ts +8 -0
  35. package/primitives/src/midnight-generic/midnight-genetic.ts +271 -0
  36. package/primitives/src/midnight-nullifier/midnight-nullifier-grammar.ts +8 -0
  37. package/primitives/src/midnight-nullifier/midnight-nullifier.ts +114 -0
  38. package/primitives/src/mod.ts +81 -0
  39. package/primitives/src/near-account-watch/near-account-watch-grammar.ts +10 -0
  40. package/primitives/src/near-account-watch/near-account-watch-primitive.ts +106 -0
  41. package/primitives/src/near-generic/near-generic-grammar.ts +5 -0
  42. package/primitives/src/near-generic/near-generic-primitive.ts +105 -0
  43. package/primitives/src/near-intent/near-intent-grammar.ts +10 -0
  44. package/primitives/src/near-intent/near-intent-ivm.ts +71 -0
  45. package/primitives/src/near-intent/near-intent-primitive.ts +149 -0
  46. package/primitives/src/near-intent/near-intent-token-id-parser.ts +47 -0
  47. package/primitives/src/near-nep141/nep141-grammar.ts +7 -0
  48. package/primitives/src/near-nep141/nep141-ivm.ts +70 -0
  49. package/primitives/src/near-nep141/nep141-primitive.ts +117 -0
  50. package/primitives/src/near-nep171/nep171-grammar.ts +8 -0
  51. package/primitives/src/near-nep171/nep171-ivm.ts +71 -0
  52. package/primitives/src/near-nep171/nep171-primitive.ts +138 -0
  53. package/primitives/src/near-nep245/nep245-grammar.ts +11 -0
  54. package/primitives/src/near-nep245/nep245-ivm.ts +84 -0
  55. package/primitives/src/near-nep245/nep245-primitive.ts +147 -0
  56. package/primitives/src/utxorpc-generic/utxorpc-generic-grammar.ts +6 -0
  57. package/primitives/src/utxorpc-generic/utxorpc-generic.ts +88 -0
  58. package/primitives/types.ts +14 -0
  59. package/types.ts +28 -0
  60. package/verify-signature.ts +51 -0
@@ -0,0 +1,123 @@
1
+ import { test, expect } from "bun:test";
2
+ import type { EvmAddress } from "@effectstream/utils";
3
+ import { run } from "effection";
4
+ import type { ConfigSyncProtocolType, FlattenSyncProtocolIOFor } from "@effectstream/config";
5
+ import { Erc20Primitive } from "./../mod.ts";
6
+ import { PrimitiveRegistry } from "../../PrimitiveRegistry.ts";
7
+
8
+ // Mock data
9
+ const MOCK_CONTRACT_ADDRESS = "0x1234567890123456789012345678901234567890" as EvmAddress;
10
+ const MOCK_FROM = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
11
+ const MOCK_TO = "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
12
+ const MOCK_VALUE = 100n; // bigint
13
+
14
+ const PrimitiveTypeEVMERC20 = "EVM:ERC20";
15
+
16
+ function cleanup() {
17
+ // Reset registry between tests
18
+ PrimitiveRegistry.primitives = {};
19
+ }
20
+
21
+ test("Erc20Primitive - initializes correctly", () => {
22
+ cleanup();
23
+ const primitive = new Erc20Primitive({
24
+ instanceName: "test-token",
25
+ startBlockHeight: 100,
26
+ contractAddress: MOCK_CONTRACT_ADDRESS,
27
+ stateMachinePrefix: "transfer",
28
+ });
29
+
30
+ expect(primitive.instanceName).toEqual("test-token");
31
+ expect(primitive.startBlockHeight).toEqual(100);
32
+ expect(primitive.contractAddress).toEqual(MOCK_CONTRACT_ADDRESS);
33
+ expect(primitive.internalTypeName).toEqual(PrimitiveTypeEVMERC20);
34
+
35
+ const config = primitive.getConfig();
36
+ expect(config.name).toEqual("test-token");
37
+ expect(config.type).toEqual(PrimitiveTypeEVMERC20);
38
+ expect(config.contractAddress).toEqual(MOCK_CONTRACT_ADDRESS);
39
+ });
40
+
41
+ test("Erc20Primitive - throws on invalid address", () => {
42
+ cleanup();
43
+ expect(() => {
44
+ new Erc20Primitive({
45
+ instanceName: "test-token",
46
+ startBlockHeight: 100,
47
+ contractAddress: "invalid-address" as EvmAddress,
48
+ stateMachinePrefix: "transfer",
49
+ });
50
+ }).toThrow();
51
+ });
52
+
53
+ test("Erc20Primitive - getPayload generates correct state update", async () => {
54
+ cleanup();
55
+ const primitive = new Erc20Primitive({
56
+ instanceName: "test-token",
57
+ startBlockHeight: 100,
58
+ contractAddress: MOCK_CONTRACT_ADDRESS,
59
+ stateMachinePrefix: "transfer",
60
+ });
61
+
62
+ const mockTxData = {
63
+ output: {
64
+ payload: {
65
+ from: MOCK_FROM,
66
+ to: MOCK_TO,
67
+ value: MOCK_VALUE,
68
+ },
69
+ },
70
+ } as unknown as FlattenSyncProtocolIOFor<ConfigSyncProtocolType.EVM_RPC_PARALLEL>;
71
+
72
+ await run(function* () {
73
+ const generator = primitive.getPayload(123, mockTxData);
74
+ const result = generator.next().value;
75
+
76
+ if (!result) throw new Error("No payload generated");
77
+ if (!('isBatched' in result)) throw new Error("Result is not a SyncStateUpdate");
78
+
79
+ expect(result.isBatched).toEqual(false);
80
+ expect(result.data.length).toEqual(1);
81
+
82
+ const item = result.data[0];
83
+ expect(item.accountingPayload.from).toEqual(MOCK_FROM);
84
+ expect(item.accountingPayload.to).toEqual(MOCK_TO);
85
+ // Compare string values to handle BigInt vs String mismatches in JSON serialization simulation
86
+ expect(String(item.accountingPayload.value)).toEqual(String(MOCK_VALUE));
87
+
88
+ expect(Array.isArray(item.stateMachinePayload)).toEqual(true);
89
+ // @ts-ignore: safe to access
90
+ expect(item.stateMachinePayload?.[0]).toEqual("transfer");
91
+ });
92
+ });
93
+
94
+ test("Erc20Primitive - getPayload skips state machine payload if no prefix", async () => {
95
+ cleanup();
96
+ const primitive = new Erc20Primitive({
97
+ instanceName: "test-token",
98
+ startBlockHeight: 100,
99
+ contractAddress: MOCK_CONTRACT_ADDRESS,
100
+ stateMachinePrefix: undefined,
101
+ });
102
+
103
+ const mockTxData = {
104
+ output: {
105
+ payload: {
106
+ from: MOCK_FROM,
107
+ to: MOCK_TO,
108
+ value: MOCK_VALUE,
109
+ },
110
+ },
111
+ } as unknown as FlattenSyncProtocolIOFor<ConfigSyncProtocolType.EVM_RPC_PARALLEL>;
112
+
113
+ await run(function* () {
114
+ const generator = primitive.getPayload(123, mockTxData);
115
+ const result = generator.next().value;
116
+
117
+ if (!result) throw new Error("No payload generated");
118
+ if (!('isBatched' in result)) throw new Error("Result is not a SyncStateUpdate");
119
+
120
+ const item = result.data[0];
121
+ expect(item.stateMachinePayload).toEqual(null);
122
+ });
123
+ });
@@ -0,0 +1,152 @@
1
+ import type { StaticDecode } from "@sinclair/typebox";
2
+ import {
3
+ type ConfigSyncProtocolType,
4
+ type FlattenSyncProtocolIOFor,
5
+ getEvmEvent,
6
+ type ProtocolPrimitiveMap,
7
+ } from "@effectstream/config";
8
+ import {
9
+ type AddressAndType,
10
+ AddressType,
11
+ type EvmAddress,
12
+ type EffectstreamBlockNumber,
13
+ TypeboxHelpers,
14
+ } from "@effectstream/utils";
15
+ import { type JsonObject, Primitive } from "@effectstream/sm";
16
+ import { Value } from "@sinclair/typebox/value";
17
+ import {
18
+ type CommandTuple,
19
+ generateRawStmInput,
20
+ type ParamToData,
21
+ } from "@effectstream/concise";
22
+ import type { StateUpdateStream } from "@effectstream/coroutine";
23
+ import { erc20 } from "./erc20-abi.ts";
24
+ import { erc20Grammar } from "./erc20-grammar.ts";
25
+ import {
26
+ ERC20_INTERMEDIATE_PREFIX,
27
+ ERC20_VIEW_PREFIX,
28
+ erc20Ivm,
29
+ } from "./erc20-ivm.ts";
30
+ import { PrimitiveTypeEVMERC20 } from "../builtin.ts";
31
+
32
+ /**
33
+ * Erc20 Primitive
34
+ *
35
+ * This is a concrete implementation of the Primitive class for ERC20.
36
+ */
37
+
38
+ export class Erc20Primitive extends Primitive<
39
+ ConfigSyncProtocolType.EVM_RPC_PARALLEL,
40
+ typeof erc20Grammar
41
+ > {
42
+ // Primitive defined
43
+ readonly internalTypeName = PrimitiveTypeEVMERC20;
44
+ readonly abi: ReturnType<typeof getEvmEvent> = getEvmEvent(
45
+ erc20.abi,
46
+ "Transfer(address,address,uint256)",
47
+ );
48
+ override grammar = erc20Grammar;
49
+ readonly contractAddress: EvmAddress;
50
+
51
+ // Dynamic table to track the owner of each token.
52
+ override dynamicTables = erc20Ivm;
53
+ override getIntermediatePrefix(): string[] {
54
+ return [ERC20_INTERMEDIATE_PREFIX];
55
+ }
56
+ override getViewPrefix(): string[] {
57
+ return [ERC20_VIEW_PREFIX];
58
+ }
59
+
60
+ constructor(config: {
61
+ instanceName: string;
62
+ startBlockHeight: number;
63
+ contractAddress: EvmAddress;
64
+ stateMachinePrefix: string | undefined;
65
+ }) {
66
+ super(config);
67
+ this.contractAddress = Value.Decode(
68
+ TypeboxHelpers.Evm.Address,
69
+ config.contractAddress,
70
+ );
71
+ }
72
+
73
+ override *getPayload(
74
+ _: EffectstreamBlockNumber,
75
+ primitiveTransactionData: FlattenSyncProtocolIOFor<
76
+ ConfigSyncProtocolType.EVM_RPC_PARALLEL
77
+ >,
78
+ ): StateUpdateStream<{
79
+ isBatched: boolean;
80
+ data: {
81
+ fromAddressAndType: AddressAndType;
82
+ stateMachinePayload:
83
+ | StaticDecode<
84
+ CommandTuple<string, typeof erc20Grammar>
85
+ >
86
+ | null;
87
+ accountingPayload: JsonObject;
88
+ }[];
89
+ }> {
90
+ const { to, from } = primitiveTransactionData.output.payload;
91
+ const toAddr = Value.Decode(TypeboxHelpers.Evm.Address, to.toLowerCase());
92
+ const fromAddr = Value.Decode(
93
+ TypeboxHelpers.Evm.Address,
94
+ from.toLowerCase(),
95
+ );
96
+ // const isBurn = Boolean(toAddr.toLocaleLowerCase().match(/^0x0+(dead)?$/g));
97
+ const value = Value.Decode(
98
+ TypeboxHelpers.Uint256,
99
+ primitiveTransactionData.output.payload.value,
100
+ );
101
+ const isBatched = false;
102
+ const accountingPayload: ParamToData<typeof erc20Grammar> = {
103
+ to: toAddr,
104
+ from: fromAddr,
105
+ value: value,
106
+ };
107
+ const stateMachinePayload:
108
+ | StaticDecode<
109
+ CommandTuple<string, typeof this.grammar>
110
+ >
111
+ | null = this.stateMachinePrefix
112
+ ? generateRawStmInput(
113
+ this.grammar,
114
+ this.stateMachinePrefix,
115
+ accountingPayload,
116
+ )
117
+ : null;
118
+
119
+ return {
120
+ isBatched,
121
+ data: [
122
+ {
123
+ fromAddressAndType: {
124
+ type: AddressType.NONE,
125
+ address: "0x0",
126
+ },
127
+ accountingPayload,
128
+ stateMachinePayload,
129
+ },
130
+ ],
131
+ };
132
+ }
133
+
134
+ override getConfig(): ProtocolPrimitiveMap[
135
+ ConfigSyncProtocolType.EVM_RPC_PARALLEL
136
+ ] {
137
+ return {
138
+ name: this.instanceName,
139
+ type: this.internalTypeName,
140
+ startBlockHeight: this.startBlockHeight,
141
+ contractAddress: this.contractAddress as EvmAddress,
142
+ abi: this.abi,
143
+ scheduledPrefix: this.stateMachinePrefix,
144
+ } as const;
145
+ }
146
+ }
147
+
148
+ // declare module "@effectstream/sm" {
149
+ // interface PrimitiveGlobalDefinitions {
150
+ // Erc20Primitive: typeof Erc20Primitive;
151
+ // }
152
+ // }
@@ -0,0 +1 @@
1
+ export const erc721 = {"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ERC721IncorrectOwner","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InsufficientApproval","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC721InvalidApprover","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidReceiver","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidSender","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721NonexistentToken","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506040518060400160405280600b81526020017f4d6f636b204552433732310000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d45524300000000000000000000000000000000000000000000000000000000815250816000908161008c91906102f4565b50806001908161009c91906102f4565b5050506103c6565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061012557607f821691505b602082108103610138576101376100de565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610163565b6101aa8683610163565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006101f16101ec6101e7846101c2565b6101cc565b6101c2565b9050919050565b6000819050919050565b61020b836101d6565b61021f610217826101f8565b848454610170565b825550505050565b600090565b610234610227565b61023f818484610202565b505050565b5b818110156102635761025860008261022c565b600181019050610245565b5050565b601f8211156102a8576102798161013e565b61028284610153565b81016020851015610291578190505b6102a561029d85610153565b830182610244565b50505b505050565b600082821c905092915050565b60006102cb600019846008026102ad565b1980831691505092915050565b60006102e483836102ba565b9150826002028217905092915050565b6102fd826100a4565b67ffffffffffffffff811115610316576103156100af565b5b610320825461010d565b61032b828285610267565b600060209050601f83116001811461035e576000841561034c578287015190505b61035685826102d8565b8655506103be565b601f19841661036c8661013e565b60005b828110156103945784890151825560018201915060208501945060208101905061036f565b868310156103b157848901516103ad601f8916826102ba565b8355505b6001600288020188555050505b505050505050565b611dbc806103d56000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636352211e146101dd57806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806340c10f19146101a557806342842e0e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611606565b6102f3565b604051610116919061164e565b60405180910390f35b6101276103d5565b60405161013491906116f9565b60405180910390f35b61015760048036038101906101529190611751565b610467565b60405161016491906117bf565b60405180910390f35b61018760048036038101906101829190611806565b610483565b005b6101a3600480360381019061019e9190611846565b610499565b005b6101bf60048036038101906101ba9190611806565b61059b565b005b6101db60048036038101906101d69190611846565b6105a9565b005b6101f760048036038101906101f29190611751565b6105c9565b60405161020491906117bf565b60405180910390f35b61022760048036038101906102229190611899565b6105db565b60405161023491906118d5565b60405180910390f35b610245610695565b60405161025291906116f9565b60405180910390f35b6102756004803603810190610270919061191c565b610727565b005b610291600480360381019061028c9190611a91565b61073d565b005b6102ad60048036038101906102a89190611751565b610762565b6040516102ba91906116f9565b60405180910390f35b6102dd60048036038101906102d89190611b14565b6107cb565b6040516102ea919061164e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd8261085f565b5b9050919050565b6060600080546103e490611b83565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611b83565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b6000610472826108c9565b5061047c82610951565b9050919050565b610495828261049061098e565b610996565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361050b5760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161050291906117bf565b60405180910390fd5b600061051f838361051a61098e565b6109a8565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610595578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161058c93929190611bb4565b60405180910390fd5b50505050565b6105a58282610bc2565b5050565b6105c48383836040518060200160405280600081525061073d565b505050565b60006105d4826108c9565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361064e5760006040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161064591906117bf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546106a490611b83565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611b83565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b61073961073261098e565b8383610cbb565b5050565b610748848484610499565b61075c61075361098e565b85858585610e2a565b50505050565b606061076d826108c9565b506000610778610fdb565b9050600081511161079857604051806020016040528060008152506107c3565b806107a284610ff2565b6040516020016107b3929190611c27565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806108d5836110c0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094857826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161093f91906118d5565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6109a383838360016110fd565b505050565b6000806109b4846110c0565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146109f6576109f58184866112c2565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a8757610a386000856000806110fd565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610b0a576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c345760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c2b91906117bf565b60405180910390fd5b6000610c42838360006109a8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb65760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610cad91906117bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2c57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610d2391906117bf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e1d919061164e565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115610fd4578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401610e899493929190611ca0565b6020604051808303816000875af1925050508015610ec557506040513d601f19601f82011682018060405250810190610ec29190611d01565b60015b610f49573d8060008114610ef5576040519150601f19603f3d011682016040523d82523d6000602084013e610efa565b606091505b506000815103610f4157836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610f3891906117bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fd257836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fc991906117bf565b60405180910390fd5b505b5050505050565b606060405180602001604052806000815250905090565b60606000600161100184611386565b01905060008167ffffffffffffffff8111156110205761101f611966565b5b6040519080825280601f01601f1916602001820160405280156110525781602001600182028036833780820191505090505b509050600082602001820190505b6001156110b5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110a9576110a8611d2e565b5b04945060008503611060575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806111365750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576000611146846108c9565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111b157508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156111c457506111c281846107cb565b155b1561120657826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016111fd91906117bf565b60405180910390fd5b811561126857838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6112cd8383836114d9565b61138157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361134257806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161133991906118d5565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611378929190611d5d565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106113e4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816113da576113d9611d2e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611421576d04ee2d6d415b85acef8100000000838161141757611416611d2e565b5b0492506020810190505b662386f26fc10000831061145057662386f26fc10000838161144657611445611d2e565b5b0492506010810190505b6305f5e1008310611479576305f5e100838161146f5761146e611d2e565b5b0492506008810190505b612710831061149e57612710838161149457611493611d2e565b5b0492506004810190505b606483106114c157606483816114b7576114b6611d2e565b5b0492506002810190505b600a83106114d0576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561159157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611552575061155184846107cb565b5b8061159057508273ffffffffffffffffffffffffffffffffffffffff1661157883610951565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115e3816115ae565b81146115ee57600080fd5b50565b600081359050611600816115da565b92915050565b60006020828403121561161c5761161b6115a4565b5b600061162a848285016115f1565b91505092915050565b60008115159050919050565b61164881611633565b82525050565b6000602082019050611663600083018461163f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116a3578082015181840152602081019050611688565b60008484015250505050565b6000601f19601f8301169050919050565b60006116cb82611669565b6116d58185611674565b93506116e5818560208601611685565b6116ee816116af565b840191505092915050565b6000602082019050818103600083015261171381846116c0565b905092915050565b6000819050919050565b61172e8161171b565b811461173957600080fd5b50565b60008135905061174b81611725565b92915050565b600060208284031215611767576117666115a4565b5b60006117758482850161173c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117a98261177e565b9050919050565b6117b98161179e565b82525050565b60006020820190506117d460008301846117b0565b92915050565b6117e38161179e565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b6000806040838503121561181d5761181c6115a4565b5b600061182b858286016117f1565b925050602061183c8582860161173c565b9150509250929050565b60008060006060848603121561185f5761185e6115a4565b5b600061186d868287016117f1565b935050602061187e868287016117f1565b925050604061188f8682870161173c565b9150509250925092565b6000602082840312156118af576118ae6115a4565b5b60006118bd848285016117f1565b91505092915050565b6118cf8161171b565b82525050565b60006020820190506118ea60008301846118c6565b92915050565b6118f981611633565b811461190457600080fd5b50565b600081359050611916816118f0565b92915050565b60008060408385031215611933576119326115a4565b5b6000611941858286016117f1565b925050602061195285828601611907565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61199e826116af565b810181811067ffffffffffffffff821117156119bd576119bc611966565b5b80604052505050565b60006119d061159a565b90506119dc8282611995565b919050565b600067ffffffffffffffff8211156119fc576119fb611966565b5b611a05826116af565b9050602081019050919050565b82818337600083830152505050565b6000611a34611a2f846119e1565b6119c6565b905082815260208101848484011115611a5057611a4f611961565b5b611a5b848285611a12565b509392505050565b600082601f830112611a7857611a7761195c565b5b8135611a88848260208601611a21565b91505092915050565b60008060008060808587031215611aab57611aaa6115a4565b5b6000611ab9878288016117f1565b9450506020611aca878288016117f1565b9350506040611adb8782880161173c565b925050606085013567ffffffffffffffff811115611afc57611afb6115a9565b5b611b0887828801611a63565b91505092959194509250565b60008060408385031215611b2b57611b2a6115a4565b5b6000611b39858286016117f1565b9250506020611b4a858286016117f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611b9b57607f821691505b602082108103611bae57611bad611b54565b5b50919050565b6000606082019050611bc960008301866117b0565b611bd660208301856118c6565b611be360408301846117b0565b949350505050565b600081905092915050565b6000611c0182611669565b611c0b8185611beb565b9350611c1b818560208601611685565b80840191505092915050565b6000611c338285611bf6565b9150611c3f8284611bf6565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000611c7282611c4b565b611c7c8185611c56565b9350611c8c818560208601611685565b611c95816116af565b840191505092915050565b6000608082019050611cb560008301876117b0565b611cc260208301866117b0565b611ccf60408301856118c6565b8181036060830152611ce18184611c67565b905095945050505050565b600081519050611cfb816115da565b92915050565b600060208284031215611d1757611d166115a4565b5b6000611d2584828501611cec565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000604082019050611d7260008301856117b0565b611d7f60208301846118c6565b939250505056fea264697066735822122040223f82a7d3cbb02b0857c62f18c8cfa6fcee25550545eacb0661d70e53ce5364736f6c634300081e0033","sourceMap":"132:180:38:-:0;;;167:46;;;;;;;;;;1380:113:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1454:5;1446;:13;;;;;;:::i;:::-;;1479:7;1469;:17;;;;;;:::i;:::-;;1380:113;;132:180:38;;7:99:42;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:180::-;160:77;157:1;150:88;257:4;254:1;247:15;281:4;278:1;271:15;298:180;346:77;343:1;336:88;443:4;440:1;433:15;467:4;464:1;457:15;484:320;528:6;565:1;559:4;555:12;545:22;;612:1;606:4;602:12;633:18;623:81;;689:4;681:6;677:17;667:27;;623:81;751:2;743:6;740:14;720:18;717:38;714:84;;770:18;;:::i;:::-;714:84;535:269;484:320;;;:::o;810:141::-;859:4;882:3;874:11;;905:3;902:1;895:14;939:4;936:1;926:18;918:26;;810:141;;;:::o;957:93::-;994:6;1041:2;1036;1029:5;1025:14;1021:23;1011:33;;957:93;;;:::o;1056:107::-;1100:8;1150:5;1144:4;1140:16;1119:37;;1056:107;;;;:::o;1169:393::-;1238:6;1288:1;1276:10;1272:18;1311:97;1341:66;1330:9;1311:97;:::i;:::-;1429:39;1459:8;1448:9;1429:39;:::i;:::-;1417:51;;1501:4;1497:9;1490:5;1486:21;1477:30;;1550:4;1540:8;1536:19;1529:5;1526:30;1516:40;;1245:317;;1169:393;;;;;:::o;1568:77::-;1605:7;1634:5;1623:16;;1568:77;;;:::o;1651:60::-;1679:3;1700:5;1693:12;;1651:60;;;:::o;1717:142::-;1767:9;1800:53;1818:34;1827:24;1845:5;1827:24;:::i;:::-;1818:34;:::i;:::-;1800:53;:::i;:::-;1787:66;;1717:142;;;:::o;1865:75::-;1908:3;1929:5;1922:12;;1865:75;;;:::o;1946:269::-;2056:39;2087:7;2056:39;:::i;:::-;2117:91;2166:41;2190:16;2166:41;:::i;:::-;2158:6;2151:4;2145:11;2117:91;:::i;:::-;2111:4;2104:105;2022:193;1946:269;;;:::o;2221:73::-;2266:3;2221:73;:::o;2300:189::-;2377:32;;:::i;:::-;2418:65;2476:6;2468;2462:4;2418:65;:::i;:::-;2353:136;2300:189;;:::o;2495:186::-;2555:120;2572:3;2565:5;2562:14;2555:120;;;2626:39;2663:1;2656:5;2626:39;:::i;:::-;2599:1;2592:5;2588:13;2579:22;;2555:120;;;2495:186;;:::o;2687:543::-;2788:2;2783:3;2780:11;2777:446;;;2822:38;2854:5;2822:38;:::i;:::-;2906:29;2924:10;2906:29;:::i;:::-;2896:8;2892:44;3089:2;3077:10;3074:18;3071:49;;;3110:8;3095:23;;3071:49;3133:80;3189:22;3207:3;3189:22;:::i;:::-;3179:8;3175:37;3162:11;3133:80;:::i;:::-;2792:431;;2777:446;2687:543;;;:::o;3236:117::-;3290:8;3340:5;3334:4;3330:16;3309:37;;3236:117;;;;:::o;3359:169::-;3403:6;3436:51;3484:1;3480:6;3472:5;3469:1;3465:13;3436:51;:::i;:::-;3432:56;3517:4;3511;3507:15;3497:25;;3410:118;3359:169;;;;:::o;3533:295::-;3609:4;3755:29;3780:3;3774:4;3755:29;:::i;:::-;3747:37;;3817:3;3814:1;3810:11;3804:4;3801:21;3793:29;;3533:295;;;;:::o;3833:1395::-;3950:37;3983:3;3950:37;:::i;:::-;4052:18;4044:6;4041:30;4038:56;;;4074:18;;:::i;:::-;4038:56;4118:38;4150:4;4144:11;4118:38;:::i;:::-;4203:67;4263:6;4255;4249:4;4203:67;:::i;:::-;4297:1;4321:4;4308:17;;4353:2;4345:6;4342:14;4370:1;4365:618;;;;5027:1;5044:6;5041:77;;;5093:9;5088:3;5084:19;5078:26;5069:35;;5041:77;5144:67;5204:6;5197:5;5144:67;:::i;:::-;5138:4;5131:81;5000:222;4335:887;;4365:618;4417:4;4413:9;4405:6;4401:22;4451:37;4483:4;4451:37;:::i;:::-;4510:1;4524:208;4538:7;4535:1;4532:14;4524:208;;;4617:9;4612:3;4608:19;4602:26;4594:6;4587:42;4668:1;4660:6;4656:14;4646:24;;4715:2;4704:9;4700:18;4687:31;;4561:4;4558:1;4554:12;4549:17;;4524:208;;;4760:6;4751:7;4748:19;4745:179;;;4818:9;4813:3;4809:19;4803:26;4861:48;4903:4;4895:6;4891:17;4880:9;4861:48;:::i;:::-;4853:6;4846:64;4768:156;4745:179;4970:1;4966;4958:6;4954:14;4950:22;4944:4;4937:36;4372:611;;;4335:887;;3925:1303;;;3833:1395;;:::o;132:180:38:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636352211e146101dd57806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806340c10f19146101a557806342842e0e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611606565b6102f3565b604051610116919061164e565b60405180910390f35b6101276103d5565b60405161013491906116f9565b60405180910390f35b61015760048036038101906101529190611751565b610467565b60405161016491906117bf565b60405180910390f35b61018760048036038101906101829190611806565b610483565b005b6101a3600480360381019061019e9190611846565b610499565b005b6101bf60048036038101906101ba9190611806565b61059b565b005b6101db60048036038101906101d69190611846565b6105a9565b005b6101f760048036038101906101f29190611751565b6105c9565b60405161020491906117bf565b60405180910390f35b61022760048036038101906102229190611899565b6105db565b60405161023491906118d5565b60405180910390f35b610245610695565b60405161025291906116f9565b60405180910390f35b6102756004803603810190610270919061191c565b610727565b005b610291600480360381019061028c9190611a91565b61073d565b005b6102ad60048036038101906102a89190611751565b610762565b6040516102ba91906116f9565b60405180910390f35b6102dd60048036038101906102d89190611b14565b6107cb565b6040516102ea919061164e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd8261085f565b5b9050919050565b6060600080546103e490611b83565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611b83565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b6000610472826108c9565b5061047c82610951565b9050919050565b610495828261049061098e565b610996565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361050b5760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161050291906117bf565b60405180910390fd5b600061051f838361051a61098e565b6109a8565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610595578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161058c93929190611bb4565b60405180910390fd5b50505050565b6105a58282610bc2565b5050565b6105c48383836040518060200160405280600081525061073d565b505050565b60006105d4826108c9565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361064e5760006040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161064591906117bf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546106a490611b83565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611b83565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b61073961073261098e565b8383610cbb565b5050565b610748848484610499565b61075c61075361098e565b85858585610e2a565b50505050565b606061076d826108c9565b506000610778610fdb565b9050600081511161079857604051806020016040528060008152506107c3565b806107a284610ff2565b6040516020016107b3929190611c27565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806108d5836110c0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094857826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161093f91906118d5565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6109a383838360016110fd565b505050565b6000806109b4846110c0565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146109f6576109f58184866112c2565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a8757610a386000856000806110fd565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610b0a576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c345760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c2b91906117bf565b60405180910390fd5b6000610c42838360006109a8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb65760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610cad91906117bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2c57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610d2391906117bf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e1d919061164e565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115610fd4578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401610e899493929190611ca0565b6020604051808303816000875af1925050508015610ec557506040513d601f19601f82011682018060405250810190610ec29190611d01565b60015b610f49573d8060008114610ef5576040519150601f19603f3d011682016040523d82523d6000602084013e610efa565b606091505b506000815103610f4157836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610f3891906117bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fd257836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fc991906117bf565b60405180910390fd5b505b5050505050565b606060405180602001604052806000815250905090565b60606000600161100184611386565b01905060008167ffffffffffffffff8111156110205761101f611966565b5b6040519080825280601f01601f1916602001820160405280156110525781602001600182028036833780820191505090505b509050600082602001820190505b6001156110b5578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110a9576110a8611d2e565b5b04945060008503611060575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806111365750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576000611146846108c9565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111b157508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156111c457506111c281846107cb565b155b1561120657826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016111fd91906117bf565b60405180910390fd5b811561126857838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6112cd8383836114d9565b61138157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361134257806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161133991906118d5565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611378929190611d5d565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106113e4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816113da576113d9611d2e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611421576d04ee2d6d415b85acef8100000000838161141757611416611d2e565b5b0492506020810190505b662386f26fc10000831061145057662386f26fc10000838161144657611445611d2e565b5b0492506010810190505b6305f5e1008310611479576305f5e100838161146f5761146e611d2e565b5b0492506008810190505b612710831061149e57612710838161149457611493611d2e565b5b0492506004810190505b606483106114c157606483816114b7576114b6611d2e565b5b0492506002810190505b600a83106114d0576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561159157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611552575061155184846107cb565b5b8061159057508273ffffffffffffffffffffffffffffffffffffffff1661157883610951565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115e3816115ae565b81146115ee57600080fd5b50565b600081359050611600816115da565b92915050565b60006020828403121561161c5761161b6115a4565b5b600061162a848285016115f1565b91505092915050565b60008115159050919050565b61164881611633565b82525050565b6000602082019050611663600083018461163f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116a3578082015181840152602081019050611688565b60008484015250505050565b6000601f19601f8301169050919050565b60006116cb82611669565b6116d58185611674565b93506116e5818560208601611685565b6116ee816116af565b840191505092915050565b6000602082019050818103600083015261171381846116c0565b905092915050565b6000819050919050565b61172e8161171b565b811461173957600080fd5b50565b60008135905061174b81611725565b92915050565b600060208284031215611767576117666115a4565b5b60006117758482850161173c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117a98261177e565b9050919050565b6117b98161179e565b82525050565b60006020820190506117d460008301846117b0565b92915050565b6117e38161179e565b81146117ee57600080fd5b50565b600081359050611800816117da565b92915050565b6000806040838503121561181d5761181c6115a4565b5b600061182b858286016117f1565b925050602061183c8582860161173c565b9150509250929050565b60008060006060848603121561185f5761185e6115a4565b5b600061186d868287016117f1565b935050602061187e868287016117f1565b925050604061188f8682870161173c565b9150509250925092565b6000602082840312156118af576118ae6115a4565b5b60006118bd848285016117f1565b91505092915050565b6118cf8161171b565b82525050565b60006020820190506118ea60008301846118c6565b92915050565b6118f981611633565b811461190457600080fd5b50565b600081359050611916816118f0565b92915050565b60008060408385031215611933576119326115a4565b5b6000611941858286016117f1565b925050602061195285828601611907565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61199e826116af565b810181811067ffffffffffffffff821117156119bd576119bc611966565b5b80604052505050565b60006119d061159a565b90506119dc8282611995565b919050565b600067ffffffffffffffff8211156119fc576119fb611966565b5b611a05826116af565b9050602081019050919050565b82818337600083830152505050565b6000611a34611a2f846119e1565b6119c6565b905082815260208101848484011115611a5057611a4f611961565b5b611a5b848285611a12565b509392505050565b600082601f830112611a7857611a7761195c565b5b8135611a88848260208601611a21565b91505092915050565b60008060008060808587031215611aab57611aaa6115a4565b5b6000611ab9878288016117f1565b9450506020611aca878288016117f1565b9350506040611adb8782880161173c565b925050606085013567ffffffffffffffff811115611afc57611afb6115a9565b5b611b0887828801611a63565b91505092959194509250565b60008060408385031215611b2b57611b2a6115a4565b5b6000611b39858286016117f1565b9250506020611b4a858286016117f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611b9b57607f821691505b602082108103611bae57611bad611b54565b5b50919050565b6000606082019050611bc960008301866117b0565b611bd660208301856118c6565b611be360408301846117b0565b949350505050565b600081905092915050565b6000611c0182611669565b611c0b8185611beb565b9350611c1b818560208601611685565b80840191505092915050565b6000611c338285611bf6565b9150611c3f8284611bf6565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000611c7282611c4b565b611c7c8185611c56565b9350611c8c818560208601611685565b611c95816116af565b840191505092915050565b6000608082019050611cb560008301876117b0565b611cc260208301866117b0565b611ccf60408301856118c6565b8181036060830152611ce18184611c67565b905095945050505050565b600081519050611cfb816115da565b92915050565b600060208284031215611d1757611d166115a4565b5b6000611d2584828501611cec565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000604082019050611d7260008301856117b0565b611d7f60208301846118c6565b939250505056fea264697066735822122040223f82a7d3cbb02b0857c62f18c8cfa6fcee25550545eacb0661d70e53ce5364736f6c634300081e0033","sourceMap":"132:180:38:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1560:300:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2364:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3496:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3322:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4142:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;219:91:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4786:132:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2184:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1919:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2517:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3717:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4984:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2676:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3927:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1560:300;1662:4;1712:25;1697:40;;;:11;:40;;;;:104;;;;1768:33;1753:48;;;:11;:48;;;;1697:104;:156;;;;1817:36;1841:11;1817:23;:36::i;:::-;1697:156;1678:175;;1560:300;;;:::o;2364:89::-;2409:13;2441:5;2434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2364:89;:::o;3496:154::-;3563:7;3582:22;3596:7;3582:13;:22::i;:::-;;3622:21;3635:7;3622:12;:21::i;:::-;3615:28;;3496:154;;;:::o;3322:113::-;3393:35;3402:2;3406:7;3415:12;:10;:12::i;:::-;3393:8;:35::i;:::-;3322:113;;:::o;4142:578::-;4250:1;4236:16;;:2;:16;;;4232:87;;4305:1;4275:33;;;;;;;;;;;:::i;:::-;;;;;;;;4232:87;4537:21;4561:34;4569:2;4573:7;4582:12;:10;:12::i;:::-;4561:7;:34::i;:::-;4537:58;;4626:4;4609:21;;:13;:21;;;4605:109;;4674:4;4680:7;4689:13;4653:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;4605:109;4222:498;4142:578;;;:::o;219:91:38:-;283:20;289:3;294:8;283:5;:20::i;:::-;219:91;;:::o;4786:132:4:-;4872:39;4889:4;4895:2;4899:7;4872:39;;;;;;;;;;;;:16;:39::i;:::-;4786:132;;;:::o;2184:118::-;2247:7;2273:22;2287:7;2273:13;:22::i;:::-;2266:29;;2184:118;;;:::o;1919:208::-;1982:7;2022:1;2005:19;;:5;:19;;;2001:87;;2074:1;2047:30;;;;;;;;;;;:::i;:::-;;;;;;;;2001:87;2104:9;:16;2114:5;2104:16;;;;;;;;;;;;;;;;2097:23;;1919:208;;;:::o;2517:93::-;2564:13;2596:7;2589:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:93;:::o;3717:144::-;3802:52;3821:12;:10;:12::i;:::-;3835:8;3845;3802:18;:52::i;:::-;3717:144;;:::o;4984:233::-;5097:31;5110:4;5116:2;5120:7;5097:12;:31::i;:::-;5138:72;5172:12;:10;:12::i;:::-;5186:4;5192:2;5196:7;5205:4;5138:33;:72::i;:::-;4984:233;;;;:::o;2676:255::-;2740:13;2765:22;2779:7;2765:13;:22::i;:::-;;2798:21;2822:10;:8;:10::i;:::-;2798:34;;2873:1;2855:7;2849:21;:25;:75;;;;;;;;;;;;;;;;;2891:7;2900:18;:7;:16;:18::i;:::-;2877:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2849:75;2842:82;;;2676:255;;;:::o;3927:153::-;4015:4;4038:18;:25;4057:5;4038:25;;;;;;;;;;;;;;;:35;4064:8;4038:35;;;;;;;;;;;;;;;;;;;;;;;;;4031:42;;3927:153;;;;:::o;763:146:14:-;839:4;877:25;862:40;;;:11;:40;;;;855:47;;763:146;;;:::o;16212:241:4:-;16275:7;16294:13;16310:17;16319:7;16310:8;:17::i;:::-;16294:33;;16358:1;16341:19;;:5;:19;;;16337:88;;16406:7;16383:31;;;;;;;;;;;:::i;:::-;;;;;;;;16337:88;16441:5;16434:12;;;16212:241;;;:::o;5963:127::-;6033:7;6059:15;:24;6075:7;6059:24;;;;;;;;;;;;;;;;;;;;;6052:31;;5963:127;;;:::o;656:96:10:-;709:7;735:10;728:17;;656:96;:::o;14492:120:4:-;14572:33;14581:2;14585:7;14594:4;14600;14572:8;:33::i;:::-;14492:120;;;:::o;8861:795::-;8947:7;8966:12;8981:17;8990:7;8981:8;:17::i;:::-;8966:32;;9074:1;9058:18;;:4;:18;;;9054:86;;9092:37;9109:4;9115;9121:7;9092:16;:37::i;:::-;9054:86;9200:1;9184:18;;:4;:18;;;9180:256;;9300:48;9317:1;9321:7;9338:1;9342:5;9300:8;:48::i;:::-;9410:1;9391:9;:15;9401:4;9391:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;9180:256;9464:1;9450:16;;:2;:16;;;9446:107;;9527:1;9510:9;:13;9520:2;9510:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9446:107;9582:2;9563:7;:16;9571:7;9563:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9619:7;9615:2;9600:27;;9609:4;9600:27;;;;;;;;;;;;9645:4;9638:11;;;8861:795;;;;;:::o;9978:327::-;10059:1;10045:16;;:2;:16;;;10041:87;;10114:1;10084:33;;;;;;;;;;;:::i;:::-;;;;;;;;10041:87;10137:21;10161:32;10169:2;10173:7;10190:1;10161:7;:32::i;:::-;10137:56;;10232:1;10207:27;;:13;:27;;;10203:96;;10285:1;10257:31;;;;;;;;;;;:::i;:::-;;;;;;;;10203:96;10031:274;9978:327;;:::o;15665:312::-;15792:1;15772:22;;:8;:22;;;15768:91;;15839:8;15817:31;;;;;;;;;;;:::i;:::-;;;;;;;;15768:91;15906:8;15868:18;:25;15887:5;15868:25;;;;;;;;;;;;;;;:35;15894:8;15868:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;15951:8;15929:41;;15944:5;15929:41;;;15961:8;15929:41;;;;;;:::i;:::-;;;;;;;;15665:312;;;:::o;985:924:8:-;1182:1;1165:2;:14;;;:18;1161:742;;;1219:2;1203:36;;;1240:8;1250:4;1256:7;1265:4;1203:67;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1199:694;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1577:1;1560:6;:13;:18;1556:323;;1700:2;1664:39;;;;;;;;;;;:::i;:::-;;;;;;;;1556:323;1831:6;1825:13;1816:6;1812:2;1808:15;1801:38;1199:694;1327:41;;;1317:51;;;:6;:51;;;;1313:182;;1473:2;1437:39;;;;;;;;;;;:::i;:::-;;;;;;;;1313:182;1271:238;1161:742;985:924;;;;;:::o;3173:92:4:-;3224:13;3249:9;;;;;;;;;;;;;;3173:92;:::o;637:632:13:-;693:13;742:14;779:1;759:17;770:5;759:10;:17::i;:::-;:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;794:41;;849:11;944:6;940:2;936:15;928:6;924:28;917:35;;979:247;986:4;979:247;;;1010:5;;;;;;;;1114:10;1109:2;1102:5;1098:14;1093:32;1088:3;1080:46;1170:2;1161:11;;;;;;:::i;:::-;;;;;1203:1;1194:5;:10;979:247;1190:21;979:247;1246:6;1239:13;;;;;637:632;;;:::o;5732:115:4:-;5798:7;5824;:16;5832:7;5824:16;;;;;;;;;;;;;;;;;;;;;5817:23;;5732:115;;;:::o;14794:662::-;14954:9;:31;;;;14983:1;14967:18;;:4;:18;;;;14954:31;14950:460;;;15001:13;15017:22;15031:7;15017:13;:22::i;:::-;15001:38;;15183:1;15167:18;;:4;:18;;;;:35;;;;;15198:4;15189:13;;:5;:13;;;;15167:35;:69;;;;;15207:29;15224:5;15231:4;15207:16;:29::i;:::-;15206:30;15167:69;15163:142;;;15285:4;15263:27;;;;;;;;;;;:::i;:::-;;;;;;;;15163:142;15323:9;15319:81;;;15377:7;15373:2;15357:28;;15366:5;15357:28;;;;;;;;;;;;15319:81;14987:423;14950:460;15447:2;15420:15;:24;15436:7;15420:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;14794:662;;;;:::o;7105:368::-;7217:38;7231:5;7238:7;7247;7217:13;:38::i;:::-;7212:255;;7292:1;7275:19;;:5;:19;;;7271:186;;7344:7;7321:31;;;;;;;;;;;:::i;:::-;;;;;;;;7271:186;7425:7;7434;7398:44;;;;;;;;;;;;:::i;:::-;;;;;;;;7212:255;7105:368;;;:::o;25316:916:16:-;25369:7;25388:14;25405:1;25388:18;;25453:8;25444:5;:17;25440:103;;25490:8;25481:17;;;;;;:::i;:::-;;;;;25526:2;25516:12;;;;25440:103;25569:8;25560:5;:17;25556:103;;25606:8;25597:17;;;;;;:::i;:::-;;;;;25642:2;25632:12;;;;25556:103;25685:8;25676:5;:17;25672:103;;25722:8;25713:17;;;;;;:::i;:::-;;;;;25758:2;25748:12;;;;25672:103;25801:7;25792:5;:16;25788:100;;25837:7;25828:16;;;;;;:::i;:::-;;;;;25872:1;25862:11;;;;25788:100;25914:7;25905:5;:16;25901:100;;25950:7;25941:16;;;;;;:::i;:::-;;;;;25985:1;25975:11;;;;25901:100;26027:7;26018:5;:16;26014:100;;26063:7;26054:16;;;;;;:::i;:::-;;;;;26098:1;26088:11;;;;26014:100;26140:7;26131:5;:16;26127:66;;26177:1;26167:11;;;;26127:66;26219:6;26212:13;;;25316:916;;;:::o;6401:272:4:-;6504:4;6558:1;6539:21;;:7;:21;;;;:127;;;;;6586:7;6577:16;;:5;:16;;;:52;;;;6597:32;6614:5;6621:7;6597:16;:32::i;:::-;6577:52;:88;;;;6658:7;6633:32;;:21;6646:7;6633:12;:21::i;:::-;:32;;;6577:88;6539:127;6520:146;;6401:272;;;;;:::o;7:75:42:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:248::-;1880:1;1890:113;1904:6;1901:1;1898:13;1890:113;;;1989:1;1984:3;1980:11;1974:18;1970:1;1965:3;1961:11;1954:39;1926:2;1923:1;1919:10;1914:15;;1890:113;;;2037:1;2028:6;2023:3;2019:16;2012:27;1860:186;1798:248;;;:::o;2052:102::-;2093:6;2144:2;2140:7;2135:2;2128:5;2124:14;2120:28;2110:38;;2052:102;;;:::o;2160:377::-;2248:3;2276:39;2309:5;2276:39;:::i;:::-;2331:71;2395:6;2390:3;2331:71;:::i;:::-;2324:78;;2411:65;2469:6;2464:3;2457:4;2450:5;2446:16;2411:65;:::i;:::-;2501:29;2523:6;2501:29;:::i;:::-;2496:3;2492:39;2485:46;;2252:285;2160:377;;;;:::o;2543:313::-;2656:4;2694:2;2683:9;2679:18;2671:26;;2743:9;2737:4;2733:20;2729:1;2718:9;2714:17;2707:47;2771:78;2844:4;2835:6;2771:78;:::i;:::-;2763:86;;2543:313;;;;:::o;2862:77::-;2899:7;2928:5;2917:16;;2862:77;;;:::o;2945:122::-;3018:24;3036:5;3018:24;:::i;:::-;3011:5;3008:35;2998:63;;3057:1;3054;3047:12;2998:63;2945:122;:::o;3073:139::-;3119:5;3157:6;3144:20;3135:29;;3173:33;3200:5;3173:33;:::i;:::-;3073:139;;;;:::o;3218:329::-;3277:6;3326:2;3314:9;3305:7;3301:23;3297:32;3294:119;;;3332:79;;:::i;:::-;3294:119;3452:1;3477:53;3522:7;3513:6;3502:9;3498:22;3477:53;:::i;:::-;3467:63;;3423:117;3218:329;;;;:::o;3553:126::-;3590:7;3630:42;3623:5;3619:54;3608:65;;3553:126;;;:::o;3685:96::-;3722:7;3751:24;3769:5;3751:24;:::i;:::-;3740:35;;3685:96;;;:::o;3787:118::-;3874:24;3892:5;3874:24;:::i;:::-;3869:3;3862:37;3787:118;;:::o;3911:222::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:71;4123:1;4112:9;4108:17;4099:6;4055:71;:::i;:::-;3911:222;;;;:::o;4139:122::-;4212:24;4230:5;4212:24;:::i;:::-;4205:5;4202:35;4192:63;;4251:1;4248;4241:12;4192:63;4139:122;:::o;4267:139::-;4313:5;4351:6;4338:20;4329:29;;4367:33;4394:5;4367:33;:::i;:::-;4267:139;;;;:::o;4412:474::-;4480:6;4488;4537:2;4525:9;4516:7;4512:23;4508:32;4505:119;;;4543:79;;:::i;:::-;4505:119;4663:1;4688:53;4733:7;4724:6;4713:9;4709:22;4688:53;:::i;:::-;4678:63;;4634:117;4790:2;4816:53;4861:7;4852:6;4841:9;4837:22;4816:53;:::i;:::-;4806:63;;4761:118;4412:474;;;;;:::o;4892:619::-;4969:6;4977;4985;5034:2;5022:9;5013:7;5009:23;5005:32;5002:119;;;5040:79;;:::i;:::-;5002:119;5160:1;5185:53;5230:7;5221:6;5210:9;5206:22;5185:53;:::i;:::-;5175:63;;5131:117;5287:2;5313:53;5358:7;5349:6;5338:9;5334:22;5313:53;:::i;:::-;5303:63;;5258:118;5415:2;5441:53;5486:7;5477:6;5466:9;5462:22;5441:53;:::i;:::-;5431:63;;5386:118;4892:619;;;;;:::o;5517:329::-;5576:6;5625:2;5613:9;5604:7;5600:23;5596:32;5593:119;;;5631:79;;:::i;:::-;5593:119;5751:1;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5722:117;5517:329;;;;:::o;5852:118::-;5939:24;5957:5;5939:24;:::i;:::-;5934:3;5927:37;5852:118;;:::o;5976:222::-;6069:4;6107:2;6096:9;6092:18;6084:26;;6120:71;6188:1;6177:9;6173:17;6164:6;6120:71;:::i;:::-;5976:222;;;;:::o;6204:116::-;6274:21;6289:5;6274:21;:::i;:::-;6267:5;6264:32;6254:60;;6310:1;6307;6300:12;6254:60;6204:116;:::o;6326:133::-;6369:5;6407:6;6394:20;6385:29;;6423:30;6447:5;6423:30;:::i;:::-;6326:133;;;;:::o;6465:468::-;6530:6;6538;6587:2;6575:9;6566:7;6562:23;6558:32;6555:119;;;6593:79;;:::i;:::-;6555:119;6713:1;6738:53;6783:7;6774:6;6763:9;6759:22;6738:53;:::i;:::-;6728:63;;6684:117;6840:2;6866:50;6908:7;6899:6;6888:9;6884:22;6866:50;:::i;:::-;6856:60;;6811:115;6465:468;;;;;:::o;6939:117::-;7048:1;7045;7038:12;7062:117;7171:1;7168;7161:12;7185:180;7233:77;7230:1;7223:88;7330:4;7327:1;7320:15;7354:4;7351:1;7344:15;7371:281;7454:27;7476:4;7454:27;:::i;:::-;7446:6;7442:40;7584:6;7572:10;7569:22;7548:18;7536:10;7533:34;7530:62;7527:88;;;7595:18;;:::i;:::-;7527:88;7635:10;7631:2;7624:22;7414:238;7371:281;;:::o;7658:129::-;7692:6;7719:20;;:::i;:::-;7709:30;;7748:33;7776:4;7768:6;7748:33;:::i;:::-;7658:129;;;:::o;7793:307::-;7854:4;7944:18;7936:6;7933:30;7930:56;;;7966:18;;:::i;:::-;7930:56;8004:29;8026:6;8004:29;:::i;:::-;7996:37;;8088:4;8082;8078:15;8070:23;;7793:307;;;:::o;8106:148::-;8204:6;8199:3;8194;8181:30;8245:1;8236:6;8231:3;8227:16;8220:27;8106:148;;;:::o;8260:423::-;8337:5;8362:65;8378:48;8419:6;8378:48;:::i;:::-;8362:65;:::i;:::-;8353:74;;8450:6;8443:5;8436:21;8488:4;8481:5;8477:16;8526:3;8517:6;8512:3;8508:16;8505:25;8502:112;;;8533:79;;:::i;:::-;8502:112;8623:54;8670:6;8665:3;8660;8623:54;:::i;:::-;8343:340;8260:423;;;;;:::o;8702:338::-;8757:5;8806:3;8799:4;8791:6;8787:17;8783:27;8773:122;;8814:79;;:::i;:::-;8773:122;8931:6;8918:20;8956:78;9030:3;9022:6;9015:4;9007:6;9003:17;8956:78;:::i;:::-;8947:87;;8763:277;8702:338;;;;:::o;9046:943::-;9141:6;9149;9157;9165;9214:3;9202:9;9193:7;9189:23;9185:33;9182:120;;;9221:79;;:::i;:::-;9182:120;9341:1;9366:53;9411:7;9402:6;9391:9;9387:22;9366:53;:::i;:::-;9356:63;;9312:117;9468:2;9494:53;9539:7;9530:6;9519:9;9515:22;9494:53;:::i;:::-;9484:63;;9439:118;9596:2;9622:53;9667:7;9658:6;9647:9;9643:22;9622:53;:::i;:::-;9612:63;;9567:118;9752:2;9741:9;9737:18;9724:32;9783:18;9775:6;9772:30;9769:117;;;9805:79;;:::i;:::-;9769:117;9910:62;9964:7;9955:6;9944:9;9940:22;9910:62;:::i;:::-;9900:72;;9695:287;9046:943;;;;;;;:::o;9995:474::-;10063:6;10071;10120:2;10108:9;10099:7;10095:23;10091:32;10088:119;;;10126:79;;:::i;:::-;10088:119;10246:1;10271:53;10316:7;10307:6;10296:9;10292:22;10271:53;:::i;:::-;10261:63;;10217:117;10373:2;10399:53;10444:7;10435:6;10424:9;10420:22;10399:53;:::i;:::-;10389:63;;10344:118;9995:474;;;;;:::o;10475:180::-;10523:77;10520:1;10513:88;10620:4;10617:1;10610:15;10644:4;10641:1;10634:15;10661:320;10705:6;10742:1;10736:4;10732:12;10722:22;;10789:1;10783:4;10779:12;10810:18;10800:81;;10866:4;10858:6;10854:17;10844:27;;10800:81;10928:2;10920:6;10917:14;10897:18;10894:38;10891:84;;10947:18;;:::i;:::-;10891:84;10712:269;10661:320;;;:::o;10987:442::-;11136:4;11174:2;11163:9;11159:18;11151:26;;11187:71;11255:1;11244:9;11240:17;11231:6;11187:71;:::i;:::-;11268:72;11336:2;11325:9;11321:18;11312:6;11268:72;:::i;:::-;11350;11418:2;11407:9;11403:18;11394:6;11350:72;:::i;:::-;10987:442;;;;;;:::o;11435:148::-;11537:11;11574:3;11559:18;;11435:148;;;;:::o;11589:390::-;11695:3;11723:39;11756:5;11723:39;:::i;:::-;11778:89;11860:6;11855:3;11778:89;:::i;:::-;11771:96;;11876:65;11934:6;11929:3;11922:4;11915:5;11911:16;11876:65;:::i;:::-;11966:6;11961:3;11957:16;11950:23;;11699:280;11589:390;;;;:::o;11985:435::-;12165:3;12187:95;12278:3;12269:6;12187:95;:::i;:::-;12180:102;;12299:95;12390:3;12381:6;12299:95;:::i;:::-;12292:102;;12411:3;12404:10;;11985:435;;;;;:::o;12426:98::-;12477:6;12511:5;12505:12;12495:22;;12426:98;;;:::o;12530:168::-;12613:11;12647:6;12642:3;12635:19;12687:4;12682:3;12678:14;12663:29;;12530:168;;;;:::o;12704:373::-;12790:3;12818:38;12850:5;12818:38;:::i;:::-;12872:70;12935:6;12930:3;12872:70;:::i;:::-;12865:77;;12951:65;13009:6;13004:3;12997:4;12990:5;12986:16;12951:65;:::i;:::-;13041:29;13063:6;13041:29;:::i;:::-;13036:3;13032:39;13025:46;;12794:283;12704:373;;;;:::o;13083:640::-;13278:4;13316:3;13305:9;13301:19;13293:27;;13330:71;13398:1;13387:9;13383:17;13374:6;13330:71;:::i;:::-;13411:72;13479:2;13468:9;13464:18;13455:6;13411:72;:::i;:::-;13493;13561:2;13550:9;13546:18;13537:6;13493:72;:::i;:::-;13612:9;13606:4;13602:20;13597:2;13586:9;13582:18;13575:48;13640:76;13711:4;13702:6;13640:76;:::i;:::-;13632:84;;13083:640;;;;;;;:::o;13729:141::-;13785:5;13816:6;13810:13;13801:22;;13832:32;13858:5;13832:32;:::i;:::-;13729:141;;;;:::o;13876:349::-;13945:6;13994:2;13982:9;13973:7;13969:23;13965:32;13962:119;;;14000:79;;:::i;:::-;13962:119;14120:1;14145:63;14200:7;14191:6;14180:9;14176:22;14145:63;:::i;:::-;14135:73;;14091:127;13876:349;;;;:::o;14231:180::-;14279:77;14276:1;14269:88;14376:4;14373:1;14366:15;14400:4;14397:1;14390:15;14417:332;14538:4;14576:2;14565:9;14561:18;14553:26;;14589:71;14657:1;14646:9;14642:17;14633:6;14589:71;:::i;:::-;14670:72;14738:2;14727:9;14723:18;14714:6;14670:72;:::i;:::-;14417:332;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","mint(address,uint256)":"40c10f19","name()":"06fdde03","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/contracts/ERC721Dev.sol\":\"Erc721Dev\"},\"evmVersion\":\"berlin\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=../../../../node_modules/@openzeppelin/\",\":@paima/=../../../../node_modules/@paima/\"]},\"sources\":{\"../../../../node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x880da465c203cec76b10d72dbd87c80f387df4102274f23eea1f9c9b0918792b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://399594cd8bb0143bc9e55e0f1d071d0d8c850a394fb7a319d50edd55d9ed822b\",\"dweb:/ipfs/QmbPZzgtT6LEm9CMqWfagQFwETbV1ztpECBB1DtQHrKiRz\"]},\"../../../../node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x39ed367e54765186281efcfe83e47cf0ad62cc879f10e191360712507125f29a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2c5ae6d85bd48cca8d6d2fcec8c63efd86f56f8a5832577a47e403ce0e65cb09\",\"dweb:/ipfs/QmUtcS8AbRSWhuc61puYet58os8FvSqm329ChoW8wwZXZk\"]},\"../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5dc63d1c6a12fe1b17793e1745877b2fcbe1964c3edfd0a482fac21ca8f18261\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b7f97c5960a50fd1822cb298551ffc908e37b7893a68d6d08bce18a11cb0f11\",\"dweb:/ipfs/QmQQvxBytoY1eBt3pRQDmvH2hZ2yjhs12YqVfzGm7KSURq\"]},\"../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0xb5afb8e8eebc4d1c6404df2f5e1e6d2c3d24fd01e5dfc855314951ecfaae462d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://78586466c424f076c6a2a551d848cfbe3f7c49e723830807598484a1047b3b34\",\"dweb:/ipfs/Qmb717ovcFxm7qgNKEShiV6M9SPR3v1qnNpAGH84D6w29p\"]},\"../../../../node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02\",\"dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE\"]},\"../../../../node_modules/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol\":{\"keccak256\":\"0x40399695922383778f9f540a620bec475a2f8e0f08d41f0005682842e28a9855\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://746d295e403931aeb9d6065fd5a0871f43ab5459814a60623611e4b6641a09fd\",\"dweb:/ipfs/QmWrgT8YJrQ9FfD1o3YYArwo57e7MGdpFKuM74qJ4qE34E\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x725209b582291bb83058e3078624b53d15a133f7401c30295e7f3704181d2aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0564ddb19c6d870e27b789d8f985283d815267ad7224883c2d5243c8bacc7dc0\",\"dweb:/ipfs/QmeC953H4sj88ZRFdJNFdmpf7J9SksP1wK4jyMHLo66z49\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287\",\"dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d\",\"dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"../../../../node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/contracts/ERC721Dev.sol\":{\"keccak256\":\"0xe4d5f149060f4c37a7c1ff87046a8cff9a8c6cb33fe38c69fe1c483c9f488ec0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://17793ad3673916c03e6c72ea8215f1aeef7fe92b60a7bb05f7d42a5e03491977\",\"dweb:/ipfs/QmWECtPw5xh1hyPLzZqcumPSr9BTBirMMiHdVt5sWYiypK\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721IncorrectOwner"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721InsufficientApproval"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"type":"error","name":"ERC721InvalidApprover"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"type":"error","name":"ERC721InvalidOperator"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721InvalidOwner"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"type":"error","name":"ERC721InvalidReceiver"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"ERC721InvalidSender"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721NonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mint"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"See {IERC721-approve}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"name()":{"details":"See {IERC721Metadata-name}."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"tokenURI(uint256)":{"details":"See {IERC721Metadata-tokenURI}."},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=../../../../node_modules/@openzeppelin/","@paima/=../../../../node_modules/@paima/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/contracts/ERC721Dev.sol":"Erc721Dev"},"evmVersion":"berlin","libraries":{}},"sources":{"../../../../node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x880da465c203cec76b10d72dbd87c80f387df4102274f23eea1f9c9b0918792b","urls":["bzz-raw://399594cd8bb0143bc9e55e0f1d071d0d8c850a394fb7a319d50edd55d9ed822b","dweb:/ipfs/QmbPZzgtT6LEm9CMqWfagQFwETbV1ztpECBB1DtQHrKiRz"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol":{"keccak256":"0x39ed367e54765186281efcfe83e47cf0ad62cc879f10e191360712507125f29a","urls":["bzz-raw://2c5ae6d85bd48cca8d6d2fcec8c63efd86f56f8a5832577a47e403ce0e65cb09","dweb:/ipfs/QmUtcS8AbRSWhuc61puYet58os8FvSqm329ChoW8wwZXZk"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5dc63d1c6a12fe1b17793e1745877b2fcbe1964c3edfd0a482fac21ca8f18261","urls":["bzz-raw://6b7f97c5960a50fd1822cb298551ffc908e37b7893a68d6d08bce18a11cb0f11","dweb:/ipfs/QmQQvxBytoY1eBt3pRQDmvH2hZ2yjhs12YqVfzGm7KSURq"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"keccak256":"0xb5afb8e8eebc4d1c6404df2f5e1e6d2c3d24fd01e5dfc855314951ecfaae462d","urls":["bzz-raw://78586466c424f076c6a2a551d848cfbe3f7c49e723830807598484a1047b3b34","dweb:/ipfs/Qmb717ovcFxm7qgNKEShiV6M9SPR3v1qnNpAGH84D6w29p"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"keccak256":"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1","urls":["bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02","dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"keccak256":"0x40399695922383778f9f540a620bec475a2f8e0f08d41f0005682842e28a9855","urls":["bzz-raw://746d295e403931aeb9d6065fd5a0871f43ab5459814a60623611e4b6641a09fd","dweb:/ipfs/QmWrgT8YJrQ9FfD1o3YYArwo57e7MGdpFKuM74qJ4qE34E"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x725209b582291bb83058e3078624b53d15a133f7401c30295e7f3704181d2aed","urls":["bzz-raw://0564ddb19c6d870e27b789d8f985283d815267ad7224883c2d5243c8bacc7dc0","dweb:/ipfs/QmeC953H4sj88ZRFdJNFdmpf7J9SksP1wK4jyMHLo66z49"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa","urls":["bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287","dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea","urls":["bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d","dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"../../../../node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/contracts/ERC721Dev.sol":{"keccak256":"0xe4d5f149060f4c37a7c1ff87046a8cff9a8c6cb33fe38c69fe1c483c9f488ec0","urls":["bzz-raw://17793ad3673916c03e6c72ea8215f1aeef7fe92b60a7bb05f7d42a5e03491977","dweb:/ipfs/QmWECtPw5xh1hyPLzZqcumPSr9BTBirMMiHdVt5sWYiypK"],"license":"MIT"}},"version":1},"id":38} as const;
@@ -0,0 +1,9 @@
1
+ import { Type } from "@sinclair/typebox";
2
+
3
+ export const erc721Grammar = [
4
+ ["to", Type.String()],
5
+ ["from", Type.String()],
6
+ ["tokenId", Type.String()],
7
+ ["isBurn", Type.Boolean()],
8
+ ] as const;
9
+
@@ -0,0 +1,85 @@
1
+ import { PrimitiveTypeEVMERC721 } from "../builtin.ts";
2
+
3
+ /**
4
+ * Creates a new IVM for the ERC721 token with the given name.
5
+ * This will track the current owner of each token.
6
+ * @param name - The name of the ERC721 token.
7
+ * @returns A string containing the SQL script to create the IVM.
8
+ */
9
+ export function erc721Ivm(name: string) {
10
+ const lowerName = name.toLowerCase();
11
+ const validSQLName = lowerName.replace(/[^a-zA-Z0-9_]/g, "");
12
+ if (validSQLName !== lowerName) {
13
+ throw new Error(`Invalid name: ${name}`);
14
+ }
15
+
16
+ const ownershipTable =
17
+ `primitives.erc721_ownership_intermediate_${validSQLName}`;
18
+
19
+ return `
20
+ -- Intermediate table for current ERC721 ownership (maintained by triggers)
21
+ CREATE TABLE ${ownershipTable} (
22
+ primitive_name TEXT NOT NULL,
23
+ token_id TEXT NOT NULL,
24
+ current_owner TEXT NOT NULL,
25
+ last_transfer_block_height INTEGER NOT NULL,
26
+ last_transfer_id INTEGER NOT NULL,
27
+ PRIMARY KEY (primitive_name, token_id)
28
+ );
29
+
30
+ -- Trigger function to maintain current ownership
31
+ CREATE OR REPLACE FUNCTION update_erc721_ownership_${validSQLName}() RETURNS TRIGGER AS $$
32
+ BEGIN
33
+ -- Only process ERC721 transfers
34
+ IF NEW.payload_type = '${PrimitiveTypeEVMERC721}'
35
+ AND NEW.primitive_name = '${name}'
36
+ AND NEW.payload->>'to' IS NOT NULL
37
+ AND NEW.payload->>'to' != '' THEN
38
+
39
+ INSERT INTO ${ownershipTable} (
40
+ primitive_name,
41
+ token_id,
42
+ current_owner,
43
+ last_transfer_block_height,
44
+ last_transfer_id
45
+ ) VALUES (
46
+ NEW.primitive_name,
47
+ NEW.payload->>'tokenId',
48
+ lower(NEW.payload->>'to'),
49
+ NEW.effectstream_block_height,
50
+ NEW.id
51
+ )
52
+ ON CONFLICT (primitive_name, token_id) DO UPDATE SET
53
+ current_owner = lower(NEW.payload->>'to'),
54
+ last_transfer_block_height = NEW.effectstream_block_height,
55
+ last_transfer_id = NEW.id
56
+ WHERE NEW.effectstream_block_height > ${ownershipTable}.last_transfer_block_height
57
+ OR (NEW.effectstream_block_height = ${ownershipTable}.last_transfer_block_height
58
+ AND NEW.id > ${ownershipTable}.last_transfer_id);
59
+ END IF;
60
+
61
+ RETURN NEW;
62
+ END;
63
+ $$ LANGUAGE plpgsql;
64
+
65
+ -- Create trigger on primitive_accounting
66
+ CREATE TRIGGER trigger_update_erc721_ownership_${validSQLName}
67
+ AFTER INSERT ON effectstream.primitive_accounting
68
+ FOR EACH ROW
69
+ EXECUTE FUNCTION update_erc721_ownership_${validSQLName}();
70
+
71
+ -- Simple incrementally maintained view on the intermediate table
72
+ SELECT pgivm.create_immv('primitives.erc721_ownership_view_${validSQLName}',
73
+ 'SELECT
74
+ primitive_name,
75
+ token_id,
76
+ current_owner
77
+ FROM ${ownershipTable};
78
+ ');
79
+ `;
80
+ }
81
+
82
+ // Naming helpers kept in this file to co-locate schema naming with IVM DDL
83
+ export const ERC721_VIEW_PREFIX = "erc721_ownership_view_" as const;
84
+ export const ERC721_INTERMEDIATE_PREFIX =
85
+ "erc721_ownership_intermediate_" as const;