@unirep/contracts
Version:
Client library for contracts related functions which are used in UniRep protocol.
1,200 lines • 95.4 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "Unirep",
"sourceName": "contracts/Unirep.sol",
"abi": [
{
"inputs": [
{
"components": [
{
"internalType": "uint8",
"name": "stateTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "epochTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "historyTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "fieldCount",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "sumFieldCount",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "numEpochKeyNoncePerEpoch",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "replNonceBits",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "replFieldBits",
"type": "uint8"
}
],
"internalType": "struct IUnirep.Config",
"name": "_config",
"type": "tuple"
},
{
"internalType": "contract IVerifier",
"name": "_signupVerifier",
"type": "address"
},
{
"internalType": "contract IVerifier",
"name": "_userStateTransitionVerifier",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attester",
"type": "uint160"
}
],
"name": "AttesterAlreadySignUp",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "AttesterIdNotMatch",
"type": "error"
},
{
"inputs": [],
"name": "AttesterInvalid",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attester",
"type": "uint160"
}
],
"name": "AttesterNotSignUp",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint48",
"name": "chainId",
"type": "uint48"
}
],
"name": "ChainIdNotMatch",
"type": "error"
},
{
"inputs": [],
"name": "EpochKeyNotProcessed",
"type": "error"
},
{
"inputs": [],
"name": "EpochNotMatch",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "epoch",
"type": "uint256"
}
],
"name": "InvalidEpoch",
"type": "error"
},
{
"inputs": [],
"name": "InvalidEpochKey",
"type": "error"
},
{
"inputs": [],
"name": "InvalidField",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "historyTreeRoot",
"type": "uint256"
}
],
"name": "InvalidHistoryTreeRoot",
"type": "error"
},
{
"inputs": [],
"name": "InvalidProof",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSignature",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "nullilier",
"type": "uint256"
}
],
"name": "NullifierAlreadyUsed",
"type": "error"
},
{
"inputs": [],
"name": "OutOfRange",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
}
],
"name": "UserAlreadySignedUp",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint256",
"name": "epochKey",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": false,
"internalType": "uint256",
"name": "fieldIndex",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "change",
"type": "uint256"
}
],
"name": "Attestation",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": false,
"internalType": "uint48",
"name": "epochLength",
"type": "uint48"
},
{
"indexed": false,
"internalType": "uint48",
"name": "timestamp",
"type": "uint48"
}
],
"name": "AttesterSignedUp",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "EpochEnded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "leaf",
"type": "uint256"
}
],
"name": "EpochTreeLeaf",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": false,
"internalType": "uint256",
"name": "leaf",
"type": "uint256"
}
],
"name": "HistoryTreeLeaf",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "leaf",
"type": "uint256"
}
],
"name": "StateTreeLeaf",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": false,
"internalType": "uint256",
"name": "leafIndex",
"type": "uint256"
}
],
"name": "UserSignedUp",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"indexed": true,
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"indexed": true,
"internalType": "uint256",
"name": "leafIndex",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "hashedLeaf",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nullifier",
"type": "uint256"
}
],
"name": "UserStateTransitioned",
"type": "event"
},
{
"inputs": [],
"name": "SNARK_SCALAR_FIELD",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "attesterId",
"type": "uint256"
}
],
"name": "_updateEpochIfNeeded",
"outputs": [
{
"internalType": "uint256",
"name": "epoch",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "epochKey",
"type": "uint256"
},
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"internalType": "uint256",
"name": "fieldIndex",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "change",
"type": "uint256"
}
],
"name": "attest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "attestationCount",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterCurrentEpoch",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterEpochLength",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterEpochRemainingTime",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
}
],
"name": "attesterEpochRoot",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterMemberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterSemaphoreGroupRoot",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint48",
"name": "epochLength",
"type": "uint48"
}
],
"name": "attesterSignUp",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "attester",
"type": "address"
},
{
"internalType": "uint48",
"name": "epochLength",
"type": "uint48"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "attesterSignUpViaRelayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterStartTimestamp",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterStateTreeLeafCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "attesterStateTreeRoot",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"internalType": "uint256",
"name": "root",
"type": "uint256"
}
],
"name": "attesterStateTreeRootExists",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "chainid",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "config",
"outputs": [
{
"components": [
{
"internalType": "uint8",
"name": "stateTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "epochTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "historyTreeDepth",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "fieldCount",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "sumFieldCount",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "numEpochKeyNoncePerEpoch",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "replNonceBits",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "replFieldBits",
"type": "uint8"
}
],
"internalType": "struct IUnirep.Config",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "control",
"type": "uint256"
}
],
"name": "decodeSignupControl",
"outputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "chainId",
"type": "uint48"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "publicSignals",
"type": "uint256[]"
}
],
"name": "decodeSignupSignals",
"outputs": [
{
"components": [
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "chainId",
"type": "uint48"
},
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint256",
"name": "stateTreeLeaf",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
}
],
"internalType": "struct IUnirep.SignupSignals",
"name": "",
"type": "tuple"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "control",
"type": "uint256"
}
],
"name": "decodeUserStateTransitionControl",
"outputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "toEpoch",
"type": "uint48"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "publicSignals",
"type": "uint256[]"
}
],
"name": "decodeUserStateTransitionSignals",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "historyTreeRoot",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "stateTreeLeaf",
"type": "uint256"
},
{
"internalType": "uint48",
"name": "toEpoch",
"type": "uint48"
},
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
},
{
"internalType": "uint256[]",
"name": "epochKeys",
"type": "uint256[]"
}
],
"internalType": "struct IUnirep.UserStateTransitionSignals",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "defaultDataHash",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "epochTreeDepth",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "fieldCount",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "historyTreeDepth",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "leafIdentityHash",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "initialData",
"type": "uint256[]"
}
],
"name": "manualUserSignUp",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "numEpochKeyNoncePerEpoch",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "replFieldBits",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "replNonceBits",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "signupVerifier",
"outputs": [
{
"internalType": "contract IVerifier",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "stateTreeDepth",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "sumFieldCount",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint160",
"name": "attesterId",
"type": "uint160"
}
],
"name": "updateEpochIfNeeded",
"outputs": [
{
"internalType": "uint48",
"name": "epoch",
"type": "uint48"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "usedNullifiers",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "publicSignals",
"type": "uint256[]"
},
{
"internalType": "uint256[8]",
"name": "proof",
"type": "uint256[8]"
}
],
"name": "userSignUp",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "publicSignals",
"type": "uint256[]"
},
{
"internalType": "uint256[8]",
"name": "proof",
"type": "uint256[8]"
}
],
"name": "userStateTransition",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "userStateTransitionVerifier",
"outputs": [
{
"internalType": "contract IVerifier",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x6102006040526002805465ffffffffffff191660011790553480156200002457600080fd5b506040516200433b3803806200433b8339810160408190526200004791620002a6565b6080836060015160ff16106200008e5760405162461bcd60e51b81526020600482015260086024820152676461746173697a6560c01b604482015260640160405180910390fd5b825160ff90811660c0908152602080860151831660e0908152604080880151851661010052606088015185166101205260808089015186166101405260a0808a015187166101605294890151861661018052918801519094166101a05265ffffffffffff468181166101c0526001600160a01b0388811690935291861690935283518381524290931691830191909152916000917f01f6bdf3a22f8751bad62953107a99b8239b40791f2e14216b48c1d279f649cd910160405180910390a2600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580544265ffffffffffff1665ffffffffffff65ffffffffffff60601b01199091161771ffffffffffff00000000000000000000000017905560015b6101205160ff168110156200026757604080518082018252838152600060208201529051632b0aac7f60e11b815273__$75f79a42d9bcbdbb69ad79ebd80f556f39$__9163561558fe916200020c9190600401620003c2565b602060405180830381865af41580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002509190620003f5565b9150806200025e816200040f565b915050620001b3565b506101e052506200043792505050565b805160ff811681146200028957600080fd5b919050565b80516001600160a01b03811681146200028957600080fd5b6000806000838503610140811215620002be57600080fd5b61010080821215620002cf57600080fd5b60405191508082016001600160401b03811183821017156200030157634e487b7160e01b600052604160045260246000fd5b6040526200030f8662000277565b82526200031f6020870162000277565b6020830152620003326040870162000277565b6040830152620003456060870162000277565b6060830152620003586080870162000277565b60808301526200036b60a0870162000277565b60a08301526200037e60c0870162000277565b60c08301526200039160e0870162000277565b60e0830152819450620003a68187016200028e565b93505050620003b961012085016200028e565b90509250925092565b60408101818360005b6002811015620003ec578151835260209283019290910190600101620003cb565b50505092915050565b6000602082840312156200040857600080fd5b5051919050565b6000600182016200043057634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051613d99620005a2600039600081816105780152610b2e015260008181610a010152610f6601526000818161053c0152818161084e01528181610c28015261241c0152600081816105130152818161059f01528181610cdd015261248d0152600081816104ea015281816107f1015281816111ce0152818161123c01526116dd0152600081816104c101528181610a8701528181610bf401528181610ca8015261238b0152600081816104980152818161091701528181610ad301528181612268015261255c01526000818161029c0152818161046f01526130510152600081816104460152818161075701528181611acf01528181611c210152612f030152600081816103a90152818161041d01528181612e5e0152612faa015260008181610706015261142c0152600081816106ba015261101e0152613d996000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c8063a32775da11610160578063bc1aa2dc116100d8578063d9d241dc1161008c578063e84ae0a811610071578063e84ae0a814610a82578063f50f062c14610aa9578063f9fe630914610abc57600080fd5b8063d9d241dc14610a5c578063e065453314610a6f57600080fd5b8063cb9ea7bc116100bd578063cb9ea7bc146109e9578063cd84980e146109fc578063d028291014610a2357600080fd5b8063bc1aa2dc14610939578063c0e05a2a1461097257600080fd5b8063ad7033681161012f578063b1f712af11610114578063b1f712af146108ec578063b29660d4146108ff578063bb485bbd1461091257600080fd5b8063ad70336814610849578063b1c089f31461087057600080fd5b8063a32775da1461079e578063a7c264ca146107ec578063aacdee3d14610813578063aad240611461082657600080fd5b806380f248a31161020e5780639101ebae116101c257806399c353c8116101a757806399c353c814610752578063a09bb6d914610779578063a15b93211461078c57600080fd5b80639101ebae14610701578063983c9cdb1461072857600080fd5b806386bebd90116101f357806386bebd901461062b5780638a46ea12146106955780638b113dc7146106b557600080fd5b806380f248a31461059a578063849a51c7146105c157600080fd5b806325c2cd1211610265578063652c76e41161024a578063652c76e4146103a457806379502c55146103cb5780637d5a42991461057357600080fd5b806325c2cd121461036a5780634144f0511461039157600080fd5b80630458b3ae1461029757806308239f79146102d55780630fcda1121461031c5780631713cf9b14610331575b600080fd5b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020015b60405180910390f35b61030e6102e3366004613578565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090206013015490565b6040519081526020016102cc565b61032f61032a3660046135fc565b610acf565b005b61030e61033f366004613578565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090206014015490565b61030e7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b61032f61039f366004613664565b610ee6565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b6105666040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526040518061010001604052807f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff1681526020017f000000000000000000000000000000000000000000000000000000000000000060ff16815250905090565b6040516102cc91906136c1565b61030e7f000000000000000000000000000000000000000000000000000000000000000081565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b61061b6105cf36600461373f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020818152604080832065ffffffffffff86168452600101825280832084845290915290205460ff169392505050565b60405190151581526020016102cc565b61066261063936600461377d565b73ffffffffffffffffffffffffffffffffffffffff81169160a09190911c65ffffffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835265ffffffffffff9091166020830152016102cc565b6106a86106a3366004613796565b6110eb565b6040516102cc91906137d8565b6106dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102cc565b6106dc7f000000000000000000000000000000000000000000000000000000000000000081565b61073b610736366004613578565b61133f565b60405165ffffffffffff90911681526020016102cc565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b61032f610787366004613664565b6113ef565b60025461073b9065ffffffffffff1681565b61073b6107ac366004613578565b73ffffffffffffffffffffffffffffffffffffffff166000908152602081905260409020546c01000000000000000000000000900465ffffffffffff1690565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b61030e610821366004613870565b611a58565b61061b61083436600461377d565b60016020526000908152604090205460ff1681565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b6108b161087e36600461377d565b73ffffffffffffffffffffffffffffffffffffffff81169160a082901c65ffffffffffff169160d01c640fffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845265ffffffffffff92831660208501529116908201526060016102cc565b61032f6108fa3660046138a5565b611b7f565b61073b61090d366004613578565b611b8c565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b61030e610947366004613578565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090206007015490565b610985610980366004613796565b612032565b6040516102cc9190600060a08201905065ffffffffffff8084511683528060208501511660208401525073ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015160608301526080830151608083015292915050565b61030e6109f736600461377d565b612151565b61073b7f000000000000000000000000000000000000000000000000000000000000000081565b61030e610a31366004613578565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090206006015490565b61032f610a6a3660046138c0565b6121b7565b61030e610a7d366004613578565b612813565b6102be7f000000000000000000000000000000000000000000000000000000000000000081565b61073b610ab7366004613578565b61285c565b61032f610aca3660046138fb565b61293e565b60ff7f000000000000000000000000000000000000000000000000000000000000000016811115610b2c576040517f7db3aba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008115610b705782826000818110610b6657610b6661398b565b9050602002013590505b60005b60ff8116831115610e2b577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184848360ff16818110610bb457610bb461398b565b9050602002013510610bf2576040517f7fa0b33700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff1610158015610c6d5750610c4e7f00000000000000000000000000000000000000000000000000000000000000006002613b09565b84848360ff16818110610c6357610c6361398b565b9050602002013510155b15610ca4576040517f7db3aba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff161015610cdb576000610cfd565b7f00000000000000000000000000000000000000000000000000000000000000005b60ff1685858460ff16818110610d1557610d1561398b565b90506020020135901b90508160ff16600014610dd0576040805180820182528481526020810183905290517f561558fe00000000000000000000000000000000000000000000000000000000815273__$75f79a42d9bcbdbb69ad79ebd80f556f39$__9163561558fe91610d8c9190600401613b18565b602060405180830381865af4158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190613b49565b92505b6040805160ff84168152602081018390523391899165ffffffffffff917f53972e4f6d91817068c9b44a677c823be6a43847e114a630e610215a665014e0910160405180910390a45080610e2381613b62565b915050610b73565b506040805180820182528581526020810183905290517f561558fe00000000000000000000000000000000000000000000000000000000815260009173__$75f79a42d9bcbdbb69ad79ebd80f556f39$__9163561558fe91610e8f91600401613b18565b602060405180830381865af4158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed09190613b49565b9050610edd8787836129c7565b50505050505050565b6000610ef28484612032565b9050806040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f64576040517fedc650d70000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000065ffffffffffff16816020015165ffffffffffff1614610fe15760208101516040517f4c4783a800000000000000000000000000000000000000000000000000000000815265ffffffffffff9091166004820152602401610f5b565b6040517f7004914400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063700491449061105790879087908790600401613b81565b602060405180830381865afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110989190613bde565b6110ce576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110e58160000151826080015183606001516129c7565b50505050565b61113b6040518060a001604052806000815260200160008152602001600065ffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b61118b6040518060a001604052806000815260200160008152602001600065ffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b8383600081811061119e5761119e61398b565b6020029190910135825250838360018181106111bc576111bc61398b565b905060200201358160200181815250507f000000000000000000000000000000000000000000000000000000000000000060ff1667ffffffffffffffff81111561120857611208613c00565b604051908082528060200260200182016040528015611231578160200160208202803683370190505b50608082015260005b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff1610156112c4578484611275836002613c2f565b60ff168181106112875761128761398b565b9050602002013582608001518260ff16815181106112a7576112a761398b565b6020908102919091010152806112bc81613b62565b91505061123a565b5061130e848460058181106112db576112db61398b565b9050602002013573ffffffffffffffffffffffffffffffffffffffff81169165ffffffffffff60a09290921c9190911690565b65ffffffffffff16604083015273ffffffffffffffffffffffffffffffffffffffff16606082015290505b92915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205465ffffffffffff808216916c010000000000000000000000009004168183036113d2576040517fd724105a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610f5b565b806113dd8342613c48565b6113e79190613c67565b949350505050565b6040517f7004914400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063700491449061146590869086908690600401613b81565b602060405180830381865afa158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a69190613bde565b6114dc576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114e884846110eb565b905073ffffffffffffffffffffffffffffffffffffffff8016816060015173ffffffffffffffffffffffffffffffffffffffff1610611553576040517fd7aa584700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115608160600151611b8c565b50606081015173ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040812060808301518051919260019290919082906115a7576115a761398b565b60209081029190910181015182528101919091526040016000205460ff161561161e5781608001516000815181106115e1576115e161398b565b60200260200101516040517fdc215c0a000000000000000000000000000000000000000000000000000000008152600401610f5b91815260200190565b6001806000846080015160008151811061163a5761163a61398b565b6020908102919091018101518252810191909152604090810160002080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009093169290921790915582015181546601000000000000900465ffffffffffff9081169116146116d8576040517f53d3ff5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff1610156117f057826040015165ffffffffffff1682600b01600085608001518460ff16815181106117355761173561398b565b60209081029190910181015182528101919091526040016000205465010000000000900465ffffffffffff161080156117a7575081600b01600084608001518360ff16815181106117885761178861398b565b6020026020010151815260200190815260200160002060010154600014155b156117de576040517fb4802d1d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806117e881613b62565b9150506116db565b508151600090815260028201602052604090205460ff166118435781516040517fd542f6690000000000000000000000000000000000000000000000000000000081526004810191909152602401610f5b565b60148101546060830151825460208086015160405190815273ffffffffffffffffffffffffffffffffffffffff90931692660100000000000090920465ffffffffffff16917f8075e2eb7c2db44721c36becb8f6dc167d36baf92492c38f9e46def2a23f623c910160405180910390a48060120160020154826060015173ffffffffffffffffffffffffffffffffffffffff168260000160069054906101000a900465ffffffffffff1665ffffffffffff167f85b19f2589182342a97cb096284576a2aa7d3552c8cccef29cc320fb6139b878856020015186608001516000815181106119325761193261398b565b6020026020010151604051611951929190918252602082015260400190565b60405180910390a460208201516040517f226ab5d4000000000000000000000000000000000000000000000000000000008152601283016004820152602481019190915260009073__$7091785c4e08a29a969db2a728005f35a2$__9063226ab5d490604401602060405180830381865af41580156119d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f89190613b49565b82546601000000000000900465ffffffffffff1660009081526001938401602090815260408083209383529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120611a868461133f565b65ffffffffffff168365ffffffffffff1603611b5c576040517ff330445500000000000000000000000000000000000000000000000000000000815260168201600482015260ff7f000000000000000000000000000000000000000000000000000000000000000016602482015273__$1fb0d694a3c1e0496466c56a438cb5e7fb$__9063f330445590604401602060405180830381865af4158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b549190613b49565b915050611339565b65ffffffffffff8316600090815260039091016020526040902054905092915050565b611b893382612d7d565b50565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260408120611bba8361133f565b815490925065ffffffffffff66010000000000009091048116908316819003611be4575050919050565b601482015415611f1d576040517ff330445500000000000000000000000000000000000000000000000000000000815260168301600482015260ff7f000000000000000000000000000000000000000000000000000000000000000016602482015260009073__$1fb0d694a3c1e0496466c56a438cb5e7fb$__9063f330445590604401602060405180830381865af4158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca99190613b49565b604080518082018252601386015481526020810183905290517f561558fe00000000000000000000000000000000000000000000000000000000815291925060009173__$75f79a42d9bcbdbb69ad79ebd80f556f39$__9163561558fe91611d149190600401613b18565b602060405180830381865af4158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190613b49565b6040517f168703fa000000000000000000000000000000000000000000000000000000008152600c860160048201526024810182905290915060009073__$0c6eb7207c37accf1552a1c47686411ac0$__9063168703fa90604401602060405180830381865af4158015611dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df19190613b49565b60008181526002870160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fa85be61700000000000000000000000000000000000000000000000000000000815260128701600482015290915073__$7091785c4e08a29a969db2a728005f35a2$__9063a85be6179060240160006040518083038186803b158015611e9357600080fd5b505af4158015611ea7573d6000803e3d6000fd5b50505065ffffffffffff85166000908152600387016020526040908190208590555173ffffffffffffffffffffffffffffffffffffffff891691507f17d91f8a353dd835a3eba10e4c4edb965a9a096c1e79eda6a87c1c87a4baf2ac90611f119085815260200190565b60405180910390a25050505b6040517fffc2a0af00000000000000000000000000000000000000000000000000000000815260168301600482015273__$1fb0d694a3c1e0496466c56a438cb5e7fb$__9063ffc2a0af9060240160006040518083038186803b158015611f8357600080fd5b505af4158015611f97573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16600184611fbf9190613c48565b65ffffffffffff167fa9d759e3abbb66f4f5b1de2129632028c3639ad570df1b13bd752155361ec6b660405160405180910390a35080547fffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff16660100000000000065ffffffffffff841602179055919050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526000808252602082018190529181018290526060810182905260808101919091528383600081811061209b5761209b61398b565b6020029190910135608083015250838360018181106120bc576120bc61398b565b602002919091013560608301525061211d848460028181106120e0576120e061398b565b9050602002013573ffffffffffffffffffffffffffffffffffffffff81169165ffffffffffff60a083901c1691640fffffffff60d09190911c1690565b65ffffffffffff908116602085015216825273ffffffffffffffffffffffffffffffffffffffff1660408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff82106121a0576040517fd7aa584700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a982611b8c565b65ffffffffffff1692915050565b60006121c233611b8c565b90508065ffffffffffff168465ffffffffffff161461220d576040517f53d3ff5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018510612266576040517f2217bbbc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060ff1683106122c2576040517f7fa0b33700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260208181526040808320888452600b019091529020805465010000000000900465ffffffffffff16801580159061230757508265ffffffffffff168114155b15612341576040517fa225656d00000000000000000000000000000000000000000000000000000000815260048101829052602401610f5b565b8265ffffffffffff1681146123895781547fffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff166501000000000065ffffffffffff8516021782555b7f000000000000000000000000000000000000000000000000000000000000000060ff168510156124175760008260020186608081106123cb576123cb61398b565b0154905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186830890508084600201886080811061240d5761240d61398b565b0155506124d09050565b6124427f00000000000000000000000000000000000000000000000000000000000000006002613b09565b841061247a576040517f7db3aba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546124b59065ffffffffffff1660ff7f00000000000000000000000000000000000000000000000000000000000000001686901b613cb3565b9350838260020186608081106124cd576124cd61398b565b01555b60408051868152602081018690523391899165ffffffffffff8a16917f53972e4f6d91817068c9b44a677c823be6a43847e114a630e610215a665014e0910160405180910390a46002805465ffffffffffff1690600061252f83613cc6565b91906101000a81548165ffffffffffff021916908365ffffffffffff16021790555050600087905060005b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff1610156126415773__$75f79a42d9bcbdbb69ad79ebd80f556f39$__63561558fe6040518060400160405280858152602001876002018560ff16608081106125cb576125cb61398b565b01548152506040518263ffffffff1660e01b81526004016125ec9190613b18565b602060405180830381865af4158015612609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262d9190613b49565b91508061263981613b62565b91505061255a565b50600183018054908290553360009081526020819052604090209015906016018115612728578054855464010000000090910464ffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009091161785556040517e081944000000000000000000000000000000000000000000000000000000008152600481018290526024810184905273__$1fb0d694a3c1e0496466c56a438cb5e7fb$__90620819449060440160006040518083038186803b15801561270b57600080fd5b505af415801561271f573d6000803e3d6000fd5b505050506127bc565b84546040517f2cbda923000000000000000000000000000000000000000000000000000000008152600481018390526024810185905264ffffffffff909116604482015273__$1fb0d694a3c1e0496466c56a438cb5e7fb$__90632cbda9239060640160006040518083038186803b1580156127a357600080fd5b505af41580156127b7573d6000803e3d6000fd5b505050505b845460405184815264ffffffffff90911690339065ffffffffffff8c16907fc576d248e5f3b6a9055283bcf5f8c5043c6d2a3ee75e64860b6912ddd499c5909060200160405180910390a450505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260408120805465ffffffffffff16820361284d57600080fd5b5465ffffffffffff1692915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205465ffffffffffff808216916c010000000000000000000000009004168183036128ef576040517fd724105a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610f5b565b426000826128fd8584613c48565b6129079190613c67565b90508183612916836001613ceb565b6129209190613d0a565b61292a9086613ceb565b6129349190613c48565b969550505050505056