mustafair-carvid-package-hackathon
Version:
CARV ID implementation files for MustaFair decentralized social media platform
1,266 lines • 123 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "ReputationNFT",
"sourceName": "contracts/ReputationNFT.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_carvIdContract",
"type": "address"
}
],
"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"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "OwnableInvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "OwnableUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"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": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "oldScore",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newScore",
"type": "uint256"
}
],
"name": "ContributionScoreUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "postId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bool",
"name": "passed",
"type": "bool"
}
],
"name": "PostExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "postId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "voter",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "support",
"type": "bool"
}
],
"name": "PostVoteCast",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "contributionScore",
"type": "uint256"
},
{
"indexed": false,
"internalType": "enum ReputationNFT.Tier",
"name": "tier",
"type": "uint8"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "carvIdHash",
"type": "bytes32"
}
],
"name": "ReputationNFTMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "enum ReputationNFT.Tier",
"name": "currentTier",
"type": "uint8"
},
{
"indexed": false,
"internalType": "enum ReputationNFT.Tier",
"name": "proposedTier",
"type": "uint8"
},
{
"indexed": false,
"internalType": "address",
"name": "proposer",
"type": "address"
}
],
"name": "TierUpgradeProposed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "enum ReputationNFT.Tier",
"name": "oldTier",
"type": "uint8"
},
{
"indexed": false,
"internalType": "enum ReputationNFT.Tier",
"name": "newTier",
"type": "uint8"
}
],
"name": "TierUpgraded",
"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"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "voter",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "support",
"type": "bool"
},
{
"indexed": false,
"internalType": "string",
"name": "reason",
"type": "string"
}
],
"name": "VoteCast",
"type": "event"
},
{
"inputs": [],
"name": "MIN_VOTES_REQUIRED",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "POST_VOTING_PERIOD",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "VOTING_PERIOD",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"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": [],
"name": "carvIdContract",
"outputs": [
{
"internalType": "contract IModularCarvID",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "votingDeadline",
"type": "uint256"
}
],
"name": "createPost",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "deactivateNFT",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "postId",
"type": "uint256"
}
],
"name": "executePost",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "executeTierUpgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "postId",
"type": "uint256"
}
],
"name": "getPostVote",
"outputs": [
{
"internalType": "uint256",
"name": "votesFor",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votesAgainst",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votingDeadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isExecuted",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "getProposal",
"outputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "proposedTier",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "votesFor",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votesAgainst",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "proposalDeadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isExecuted",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "wallet",
"type": "address"
}
],
"name": "getReputationByWallet",
"outputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "contributionScore",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "tier",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "creationDate",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "carvIdHash",
"type": "bytes32"
},
{
"internalType": "bool",
"name": "isActive",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "postId",
"type": "uint256"
},
{
"internalType": "address",
"name": "voter",
"type": "address"
}
],
"name": "hasVotedOnPost",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "address",
"name": "voter",
"type": "address"
}
],
"name": "hasVotedOnProposal",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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": "uint256",
"name": "contributionScore",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "tier",
"type": "uint8"
}
],
"name": "mintReputationNFT",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"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": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "postVotes",
"outputs": [
{
"internalType": "uint256",
"name": "votesFor",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votesAgainst",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votingDeadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isExecuted",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "proposedTier",
"type": "uint8"
}
],
"name": "proposeTierUpgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "reputations",
"outputs": [
{
"internalType": "uint256",
"name": "contributionScore",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "tier",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "creationDate",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "carvIdHash",
"type": "bytes32"
},
{
"internalType": "bool",
"name": "isActive",
"type": "bool"
}
],
"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": "enum ReputationNFT.Tier",
"name": "tier",
"type": "uint8"
}
],
"name": "tierToString",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "tierUpgradeProposals",
"outputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "enum ReputationNFT.Tier",
"name": "proposedTier",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "votesFor",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "votesAgainst",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "proposalDeadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isExecuted",
"type": "bool"
}
],
"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"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_carvIdContract",
"type": "address"
}
],
"name": "updateCarvIdContract",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newScore",
"type": "uint256"
}
],
"name": "updateContributionScore",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "postId",
"type": "uint256"
},
{
"internalType": "bool",
"name": "support",
"type": "bool"
}
],
"name": "voteOnPost",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "bool",
"name": "support",
"type": "bool"
},
{
"internalType": "string",
"name": "reason",
"type": "string"
}
],
"name": "voteOnTierUpgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "walletToRepNFT",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x60806040526001600d556001600e556001600f5534801561001f57600080fd5b506040516160bc3803806160bc833981810160405281019061004191906102ca565b336040518060400160405280600e81526020017f52657075746174696f6e204e46540000000000000000000000000000000000008152506040518060400160405280600681526020017f5245504e4654000000000000000000000000000000000000000000000000000081525081600090816100bd9190610547565b5080600190816100cd9190610547565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101425760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101399190610628565b60405180910390fd5b610151816101a160201b60201c565b50600160078190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610643565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102978261026c565b9050919050565b6102a78161028c565b81146102b257600080fd5b50565b6000815190506102c48161029e565b92915050565b6000602082840312156102e0576102df610267565b5b60006102ee848285016102b5565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061037857607f821691505b60208210810361038b5761038a610331565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026103f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103b6565b6103fd86836103b6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061044461043f61043a84610415565b61041f565b610415565b9050919050565b6000819050919050565b61045e83610429565b61047261046a8261044b565b8484546103c3565b825550505050565b600090565b61048761047a565b610492818484610455565b505050565b5b818110156104b6576104ab60008261047f565b600181019050610498565b5050565b601f8211156104fb576104cc81610391565b6104d5846103a6565b810160208510156104e4578190505b6104f86104f0856103a6565b830182610497565b50505b505050565b600082821c905092915050565b600061051e60001984600802610500565b1980831691505092915050565b6000610537838361050d565b9150826002028217905092915050565b610550826102f7565b67ffffffffffffffff81111561056957610568610302565b5b6105738254610360565b61057e8282856104ba565b600060209050601f8311600181146105b1576000841561059f578287015190505b6105a9858261052b565b865550610611565b601f1984166105bf86610391565b60005b828110156105e7578489015182556001820191506020850194506020810190506105c2565b868310156106045784890151610600601f89168261050d565b8355505b6001600288020188555050505b505050505050565b6106228161028c565b82525050565b600060208201905061063d6000830184610619565b92915050565b615a6a806106526000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806372fa9b851161013b578063a7c934ca116100b8578063c7f758a81161007c578063c7f758a814610735578063c87b56dd1461076a578063e985e9c51461079a578063f2fde38b146107ca578063f457d97f146107e657610248565b8063a7c934ca146106a5578063b1610d7e146106c1578063b88d4fde146106df578063bc7dd1ff146106fb578063c58b51291461071757610248565b80638da5cb5b116100ff5780638da5cb5b1461060157806395d89b411461061f5780639769dbd71461063d578063a22cb4651461066d578063a72479491461068957610248565b806372fa9b85146105195780637491a59a1461054d578063793d8a51146105695780638225f1851461059c5780638a1f77e3146105d157610248565b8063211b2197116101c9578063600303d81161018d578063600303d8146104635780636352211e146104935780636ccea228146104c357806370a08231146104df578063715018a61461050f57610248565b8063211b2197146103bc57806323b872dd146103da57806327fa31d1146103f657806342842e0e146104145780634b259d371461043057610248565b80630a6ffb00116102105780630a6ffb00146103035780630bfb29b714610333578063181e4157146103685780631d69bd48146103845780631f68937b146103a057610248565b806301ffc9a71461024d57806306fdde031461027d57806307d25a091461029b578063081812fc146102b7578063095ea7b3146102e7575b600080fd5b61026760048036038101906102629190613abc565b610802565b6040516102749190613b04565b60405180910390f35b6102856108e4565b6040516102929190613baf565b60405180910390f35b6102b560048036038101906102b09190613c2f565b610976565b005b6102d160048036038101906102cc9190613c92565b6109c2565b6040516102de9190613cce565b60405180910390f35b61030160048036038101906102fc9190613ce9565b6109de565b005b61031d60048036038101906103189190613c2f565b6109f4565b60405161032a9190613d38565b60405180910390f35b61034d60048036038101906103489190613c92565b610a0c565b60405161035f96959493929190613dca565b60405180910390f35b610382600480360381019061037d9190613e2b565b610a62565b005b61039e60048036038101906103999190613c92565b610bed565b005b6103ba60048036038101906103b59190613e97565b610cd7565b005b6103c4610f4f565b6040516103d19190613d38565b60405180910390f35b6103f460048036038101906103ef9190613ed7565b610f56565b005b6103fe611058565b60405161040b9190613f89565b60405180910390f35b61042e60048036038101906104299190613ed7565b61107e565b005b61044a60048036038101906104459190613c92565b61109e565b60405161045a9493929190613fa4565b60405180910390f35b61047d60048036038101906104789190613fe9565b6110db565b60405161048a9190613b04565b60405180910390f35b6104ad60048036038101906104a89190613c92565b611146565b6040516104ba9190613cce565b60405180910390f35b6104dd60048036038101906104d89190613c92565b611158565b005b6104f960048036038101906104f49190613c2f565b6112bc565b6040516105069190613d38565b60405180910390f35b610517611376565b005b610533600480360381019061052e9190613c92565b61138a565b604051610544959493929190614042565b60405180910390f35b610567600480360381019061056291906141ca565b6113da565b005b610583600480360381019061057e9190613c92565b611655565b6040516105939493929190613fa4565b60405180910390f35b6105b660048036038101906105b19190613c2f565b6116a3565b6040516105c896959493929190614239565b60405180910390f35b6105eb60048036038101906105e69190613fe9565b6117f7565b6040516105f89190613b04565b60405180910390f35b610609611862565b6040516106169190613cce565b60405180910390f35b61062761188c565b6040516106349190613baf565b60405180910390f35b610657600480360381019061065291906142bf565b61191e565b6040516106649190613baf565b60405180910390f35b610687600480360381019061068291906142ec565b611b01565b005b6106a3600480360381019061069e919061432c565b611b17565b005b6106bf60048036038101906106ba919061432c565b611e0b565b005b6106c961206f565b6040516106d69190613d38565b60405180910390f35b6106f960048036038101906106f4919061440d565b612076565b005b61071560048036038101906107109190613c92565b61209b565b005b61071f612295565b60405161072c9190613d38565b60405180910390f35b61074f600480360381019061074a9190613c92565b61229a565b60405161076196959493929190613dca565b60405180910390f35b610784600480360381019061077f9190613c92565b612308565b6040516107919190613baf565b60405180910390f35b6107b460048036038101906107af9190614490565b6125de565b6040516107c19190613b04565b60405180910390f35b6107e460048036038101906107df9190613c2f565b612672565b005b61080060048036038101906107fb9190613c92565b6126f8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108cd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108dd57506108dc826127a9565b5b9050919050565b6060600080546108f3906144ff565b80601f016020809104026020016040519081016040528092919081815260200182805461091f906144ff565b801561096c5780601f106109415761010080835404028352916020019161096c565b820191906000526020600020905b81548152906001019060200180831161094f57829003601f168201915b5050505050905090565b61097e612813565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006109cd8261289a565b506109d782612922565b9050919050565b6109f082826109eb61295f565b612967565b5050565b60096020528060005260406000206000915090505481565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b3373ffffffffffffffffffffffffffffffffffffffff16610a8283611146565b73ffffffffffffffffffffffffffffffffffffffff161480610ad657503373ffffffffffffffffffffffffffffffffffffffff16610abe611862565b73ffffffffffffffffffffffffffffffffffffffff16145b610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c9061457c565b60405180910390fd5b6008600083815260200190815260200160002060040160009054906101000a900460ff16610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906145e8565b60405180910390fd5b600060086000848152602001908152602001600020600001549050816008600085815260200190815260200160002060000181905550827fd7b54992d4a5345909e4c258de7e3391a4411ada7d74a66fb854a8182b873ddc8284604051610be0929190614608565b60405180910390a2505050565b428111610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c269061467d565b60405180910390fd5b6000610c3a336112bc565b11610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c719061470f565b60405180910390fd5b6000600f6000815480929190610c8f9061475e565b9190505590506000600b6000838152602001908152602001600020905082816002018190555060008160030160006101000a81548160ff021916908315150217905550505050565b6000600b600084815260200190815260200160002090508060020154421115610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c906147f2565b60405180910390fd5b8060030160009054906101000a900460ff1615610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e9061485e565b60405180910390fd5b8060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906148ca565b60405180910390fd5b6000610e21336112bc565b11610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e589061495c565b60405180910390fd5b60018160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508115610ee057806000016000815480929190610ed69061475e565b9190505550610efb565b806001016000815480929190610ef59061475e565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff16837f66483dd85d319543af5176d9e5c29584a3c8ef2a9f71061078b571b3461f74d684604051610f429190613b04565b60405180910390a3505050565b62093a8081565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fc85760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fbf9190613cce565b60405180910390fd5b6000610fdc8383610fd761295f565b612979565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611052578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016110499392919061497c565b60405180910390fd5b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61109983838360405180602001604052806000815250612076565b505050565b600b6020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b6000600a600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006111518261289a565b9050919050565b6000600b60008381526020019081526020016000209050806002015442116111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac906149ff565b60405180910390fd5b8060030160009054906101000a900460ff1615611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe9061485e565b60405180910390fd5b8060010154816000015411801561122357506003816000015410155b611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614a6b565b60405180910390fd5b60018160030160006101000a81548160ff021916908315150217905550817fe833d65c71131ee1357ff57ae05918b4a25f1993df3d6b0f09e063a27d992df960016040516112b09190613b04565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361132f5760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016113269190613cce565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61137e612813565b6113886000612b93565b565b60086020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060020154908060030154908060040160009054906101000a900460ff16905085565b6000600a600085815260200190815260200160002090508060040154421115611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906147f2565b60405180910390fd5b8060050160009054906101000a900460ff161561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190614ad7565b60405180910390fd5b8060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906148ca565b60405180910390fd5b6000611524336112bc565b11611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b9061495c565b60405180910390fd5b60018160060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082156115e3578060020160008154809291906115d99061475e565b91905055506115fe565b8060030160008154809291906115f89061475e565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff16847fc4ce3f0cdcc6c3a55938650ba7706e6b5d9f686f108fdce6a6bb68424fe1ed758585604051611647929190614af7565b60405180910390a350505050565b6000806000806000600b600087815260200190815260200160002090508060000154816001015482600201548360030160009054906101000a900460ff169450945094509450509193509193565b600080600080600080600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054955060008603611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890614b73565b60405180910390fd5b6000600860008881526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156117805761177f613d53565b5b600381111561179257611791613d53565b5b815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905086816000015182602001518360400151846060015185608001519650965096509650965096505091939550919395565b6000600b600084815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461189b906144ff565b80601f01602080910402602001604051908101604052809291908181526020018280546118c7906144ff565b80156119145780601f106118e957610100808354040283529160200191611914565b820191906000526020600020905b8154815290600101906020018083116118f757829003601f168201915b5050505050905090565b60606000600381111561193457611933613d53565b5b82600381111561194757611946613d53565b5b03611989576040518060400160405280600681526020017f42726f6e7a6500000000000000000000000000000000000000000000000000008152509050611afc565b6001600381111561199d5761199c613d53565b5b8260038111156119b0576119af613d53565b5b036119f2576040518060400160405280600681526020017f53696c76657200000000000000000000000000000000000000000000000000008152509050611afc565b60026003811115611a0657611a05613d53565b5b826003811115611a1957611a18613d53565b5b03611a5b576040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152509050611afc565b600380811115611a6e57611a6d613d53565b5b826003811115611a8157611a80613d53565b5b03611ac3576040518060400160405280600881526020017f506c6174696e756d0000000000000000000000000000000000000000000000008152509050611afc565b6040518060400160405280600781526020017f556e6b6e6f776e0000000000000000000000000000000000000000000000000081525090505b919050565b611b13611b0c61295f565b8383612c59565b5050565b611b1f612dc8565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890614bdf565b60405180910390fd5b60008060001b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637a00d3c4336040518263ffffffff1660e01b8152600401611c049190613cce565b600060405180830381865afa925050508015611c4357506040513d6000823e3d601f19601f82011682018060405250810190611c409190614cb0565b60015b15611c815760008414611c7c578282604051602001611c63929190614d54565b6040516020818303038152906040528051906020012094505b505050505b6000600d6000815480929190611c969061475e565b919050559050611ca63382612e0e565b6040518060a00160405280858152602001846003811115611cca57611cc9613d53565b5b815260200142815260200183815260200160011515815250600860008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690836003811115611d2a57611d29613d53565b5b0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555090505080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550803373ffffffffffffffffffffffffffffffffffffffff167fbecf74f4144e0a1cc2ad6842d3c4d15f96cd50c860b3cb01fadcdd36f0e81e64868686604051611df593929190614d80565b60405180910390a35050611e07612e2c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16611e2c83612e36565b73ffffffffffffffffffffffffffffffffffffffff1603611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614e03565b60405180910390fd5b6008600083815260200190815260200160002060040160009054906101000a900460ff16611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906145e8565b60405180910390fd5b6008600083815260200190815260200160002060010160009054906101000a900460ff166003811115611f1b57611f1a613d53565b5b816003811115611f2e57611f2d613d53565b5b11611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6590614e6f565b60405180910390fd5b6000600e6000815480929190611f839061475e565b9190505590506000600a60008381526020019081526020016000209050838160000181905550828160010160006101000a81548160ff02191690836003811115611fd057611fcf613d53565b5b021790555062093a8042611fe49190614e8f565b816004018190555060008160050160006101000a81548160ff02191690831515021790555083827fc1cdca689d3668705c91e7e09315fd08f649ec6e7a56449cac4c594bf0b558556008600088815260200190815260200160002060010160009054906101000a900460ff16863360405161206193929190614ec3565b60405180910390a350505050565b62093a8081565b612081848484610f56565b61209561208c61295f565b85858585612e73565b50505050565b6000600a60008381526020019081526020016000209050806004015442116120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149ff565b60405180910390fd5b8060050160009054906101000a900460ff161561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190614ad7565b60405180910390fd5b8060030154816002015411801561216657506003816002015410155b6121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614f46565b60405180910390fd5b60018160050160006101000a81548160ff0219169083151502179055506000600860008360000154815260200190815260200160002060010160009054906101000a900460ff1690508160010160009054906101000a900460ff16600860008460000154815260200190815260200160002060010160006101000a81548160ff0219169083600381111561223c5761223b613d53565b5b021790555081600001547f57ceb88011b120a0441a16383dc232e775510168ab27978582d21c610a6e4247828460010160009054906101000a900460ff16604051612288929190614f66565b60405180910390a2505050565b600381565b6000806000806000806000600a6000898152602001908152602001600020905080600001548160010160009054906101000a900460ff168260020154836003015484600401548560050160009054906101000a900460ff169650965096509650965096505091939550919395565b6060600073ffffffffffffffffffffffffffffffffffffffff1661232b83612e36565b73ffffffffffffffffffffffffffffffffffffffff1603612381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237890615001565b60405180910390fd5b6000600860008481526020019081526020016000206040518060a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156123d0576123cf613d53565b5b60038111156123e2576123e1613d53565b5b815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000612426826020015161191e565b9050600061243385613024565b61244084602001516130f2565b60405160200161245192919061511b565b604051602081830303815290604052905060006125b161247087613024565b8361247e8760000151613024565b8661248c8960400151613024565b6000801b8a60600151036124d5576040518060400160405280600281526020017f4e6f00000000000000000000000000000000000000000000000000000000000081525061250c565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b8a60800151612550576040518060400160405280600881526020017f496e616374697665000000000000000000000000000000000000000000000000815250612587565b6040518060400160405280600681526020017f41637469766500000000000000000000000000000000000000000000000000008152505b60405160200161259d97969594939291906156ad565b6040516020818303038152906040526132d5565b9050806040516020016125c49190615824565b604051602081830303815290604052945050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61267a612813565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126ec5760006040517f1e4fbdf70000000000000000000000000000000000000