More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,954 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 18495454 | 455 days ago | IN | 0 ETH | 0.00357104 | ||||
Unstake | 18378008 | 471 days ago | IN | 0 ETH | 0.0023833 | ||||
Unstake | 18365354 | 473 days ago | IN | 0 ETH | 0.00138684 | ||||
Unstake | 18362898 | 473 days ago | IN | 0 ETH | 0.00114044 | ||||
Stake | 18362838 | 473 days ago | IN | 0 ETH | 0.00142439 | ||||
Unstake | 18357160 | 474 days ago | IN | 0 ETH | 0.00191386 | ||||
Unstake As Owner | 18150942 | 503 days ago | IN | 0 ETH | 0.00099512 | ||||
Unstake As Owner | 18150942 | 503 days ago | IN | 0 ETH | 0.00099512 | ||||
Unstake As Owner | 18150941 | 503 days ago | IN | 0 ETH | 0.000985 | ||||
Unstake As Owner | 18150941 | 503 days ago | IN | 0 ETH | 0.00215965 | ||||
Unstake As Owner | 18150940 | 503 days ago | IN | 0 ETH | 0.00248894 | ||||
Unstake As Owner | 18150940 | 503 days ago | IN | 0 ETH | 0.00584975 | ||||
Unstake As Owner | 18150617 | 503 days ago | IN | 0 ETH | 0.00095489 | ||||
Unstake As Owner | 18150616 | 503 days ago | IN | 0 ETH | 0.00185696 | ||||
Unstake As Owner | 18150616 | 503 days ago | IN | 0 ETH | 0.00095489 | ||||
Unstake As Owner | 18150616 | 503 days ago | IN | 0 ETH | 0.02499977 | ||||
Unstake As Owner | 18150615 | 503 days ago | IN | 0 ETH | 0.00095489 | ||||
Unstake As Owner | 18150615 | 503 days ago | IN | 0 ETH | 0.00269502 | ||||
Unstake As Owner | 18150615 | 503 days ago | IN | 0 ETH | 0.00212564 | ||||
Unstake As Owner | 18150615 | 503 days ago | IN | 0 ETH | 0.00176096 | ||||
Unstake As Owner | 18150614 | 503 days ago | IN | 0 ETH | 0.00095489 | ||||
Unstake As Owner | 18150614 | 503 days ago | IN | 0 ETH | 0.00122358 | ||||
Unstake As Owner | 18150614 | 503 days ago | IN | 0 ETH | 0.00152427 | ||||
Unstake As Owner | 18150613 | 503 days ago | IN | 0 ETH | 0.00266302 | ||||
Unstake As Owner | 18150613 | 503 days ago | IN | 0 ETH | 0.00155627 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DealerStaking
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.12 <0.9.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; // The NFT that can be staked here. interface IPPADealers { function transferFrom( address from, address to, uint256 tokenId ) external; function ownerOf(uint256 tokenId) external view returns (address); } interface IPPASurrealestateStaking { struct SurrealestateStakingAccountInfo { uint256 numStaked; } function accounts(address) external view returns (SurrealestateStakingAccountInfo calldata); } // A listening contract can implement this function to get notified any time a user stakes or unstakes. interface IStakingListener { function notifyChange(address account) external; } contract DealerStaking is ERC721Holder, Ownable { IPPADealers dealers; address public dealerContractAddress; IPPASurrealestateStaking surrealestateStaking; address public surrealestateStakingAddress; constructor() { _setContractAddresses(); } function _setContractAddresses() internal { address _dealers; address _surreals; assembly { switch chainid() case 1 { // mainnet _dealers := 0x99120d128a5f7cb81c318a24fa1f60f66d9777d7 _surreals := 0x3bc4af76990a1e64fed1a22ab72242e7cd2d40d9 } case 4 { // rinkeby _dealers := 0x7551dc208fdb308c52a27cae25e9ba8e76ef2733 _surreals := 0x053D12507c7bE738fb6be8403Fe4b5aa610F2e50 } } dealerContractAddress = _dealers; surrealestateStakingAddress = _surreals; dealers = IPPADealers(dealerContractAddress); surrealestateStaking = IPPASurrealestateStaking( surrealestateStakingAddress ); } // This is equivalent to the pointsByTokenId() function for the SurrealestatesStaking. uint256 public pointsPerDealer = 200; // The period which people can lock their funds up for to get an extra multiplier on rewards earned. uint256 stakingLockPeriod = 7776000; // 90 days in seconds. struct StakingMultiplier { uint256 numeratorMinus1; // Store as "minus 1" because we want this to default to 1, but uninitialized vars default to 0. uint256 denominatorMinus1; } struct AccountInfo { uint256 numStaked; uint256 pointsStaked; uint256 lastRefreshTimestamp; uint256 tokensEarnedBeforeLastRefresh; // A multiplier defaults to 1 but can be set by a manager in the future for a particular address. This increases // the overall rate of earning. StakingMultiplier stakingMultiplier; } mapping(address => AccountInfo) public accounts; struct TokenInfo { bool isLocked; uint256 lockedUntil; address owner; } mapping(uint256 => TokenInfo) public tokens; // Addresses that are allowed to do things like deduct tokens from a user's account or award earning multipliers. mapping(address => bool) public approvedManagers; IStakingListener[] listeners; // Earning period for a dealer. Default to 10 hours. uint256 public earnPeriodSeconds = 36000; modifier onlyApprovedManager() { require( owner() == msg.sender || approvedManagers[msg.sender], "Caller is not an approved manager" ); _; } function _notifyAllListeners(address account) internal { for (uint256 i = 0; i < listeners.length; i++) { listeners[i].notifyChange(account); } } function numSurrealestatesStaked(address addr) public view returns (uint256) { return surrealestateStaking.accounts(addr).numStaked; } /** User must setApprovalForAll on the contract before staking. */ function stake(uint256[] calldata tokenIds, bool lock) public { refreshTokensEarned(msg.sender); require( numSurrealestatesStaked(msg.sender) >= tokenIds.length + accounts[msg.sender].numStaked, "Cannot stake more Dealers than you have Surrealestates staked" ); for (uint256 i = 0; i < tokenIds.length; i++) { require( dealers.ownerOf(tokenIds[i]) == msg.sender, "Not your token" ); dealers.transferFrom(msg.sender, address(this), tokenIds[i]); tokens[tokenIds[i]].owner = msg.sender; accounts[msg.sender].pointsStaked += pointsPerDealer; } accounts[msg.sender].numStaked += tokenIds.length; if (lock) { uint256 lockUntil = block.timestamp + stakingLockPeriod; for (uint256 i = 0; i < tokenIds.length; i++) { tokens[tokenIds[i]].lockedUntil = lockUntil; tokens[tokenIds[i]].isLocked = true; accounts[msg.sender].pointsStaked += pointsPerDealer; } } _notifyAllListeners(msg.sender); } /** * User can lock their staking in for the stakingLockPeriod, which increases their multiplier. */ function lockStaking(uint256[] calldata tokenIds) public { refreshTokensEarned(msg.sender); uint256 lockUntil = block.timestamp + stakingLockPeriod; for (uint256 i = 0; i < tokenIds.length; i++) { require( tokens[tokenIds[i]].owner == msg.sender, "Token is not currently staked" ); require( tokens[tokenIds[i]].lockedUntil < block.timestamp, "Token is already locked" ); if (!tokens[tokenIds[i]].isLocked) { tokens[tokenIds[i]].isLocked = true; accounts[msg.sender].pointsStaked += pointsPerDealer; } tokens[tokenIds[i]].lockedUntil = lockUntil; } _notifyAllListeners(msg.sender); } function refreshTokensEarned(address addr) internal { if (block.timestamp == accounts[addr].lastRefreshTimestamp) { // No need to refresh anything if we're up to date. return; } if (accounts[addr].lastRefreshTimestamp == 0) { // If this is the first refresh ever done, then just set the timestamp and return. accounts[addr].lastRefreshTimestamp = block.timestamp; return; } uint256 totalTokensEarned = calculateTokensEarned(addr); accounts[addr].tokensEarnedBeforeLastRefresh = totalTokensEarned; accounts[addr].lastRefreshTimestamp = block.timestamp; } function calculateTokensEarned(address addr) public view returns (uint256) { uint256 secondsStakedSinceLastRefresh = block.timestamp - accounts[addr].lastRefreshTimestamp; uint256 tokensEarnedSinceLastRefresh = (secondsStakedSinceLastRefresh * (accounts[addr].pointsStaked) * (accounts[addr].stakingMultiplier.numeratorMinus1 + 1)) / (accounts[addr].stakingMultiplier.denominatorMinus1 + 1) / earnPeriodSeconds; return accounts[addr].tokensEarnedBeforeLastRefresh + tokensEarnedSinceLastRefresh; } /** * To unstake, the user calls this function with the tokenIds they want to unstake. */ function unstake(uint256[] calldata tokenIds) public { refreshTokensEarned(msg.sender); for (uint256 i = 0; i < tokenIds.length; i++) { require( tokens[tokenIds[i]].owner == msg.sender, "Caller is not currently staking the provided tokenId" ); _unstakeSingle(tokenIds[i]); } accounts[msg.sender].numStaked -= tokenIds.length; _notifyAllListeners(msg.sender); } // Caller is responsible for deducted accounts[addr].numStaked function _unstakeSingle(uint256 tokenId) internal { require( tokens[tokenId].lockedUntil < block.timestamp, "Token is still locked" ); accounts[tokens[tokenId].owner].pointsStaked -= pointsPerDealer; // If we are past the token locktime, then we need to update the the lockedTokens map as well. if (tokens[tokenId].isLocked) { tokens[tokenId].isLocked = false; // Deduct again because it was locked, so it was earning double. accounts[tokens[tokenId].owner].pointsStaked -= pointsPerDealer; } dealers.transferFrom(address(this), msg.sender, tokenId); tokens[tokenId].owner = address(0); } function addApprovedManager(address managerAddr) public onlyOwner { approvedManagers[managerAddr] = true; } function removeApprovedManager(address managerAddr) public onlyOwner { approvedManagers[managerAddr] = false; } function setStakingLockPeriod(uint256 newPeriod) public onlyApprovedManager { stakingLockPeriod = newPeriod; } function setEarnPeriod(uint256 newSeconds) public onlyApprovedManager { earnPeriodSeconds = newSeconds; } function setEarningMultiplier( address addr, uint256 numerator, uint256 denominator ) public onlyApprovedManager { refreshTokensEarned(addr); accounts[addr].stakingMultiplier = StakingMultiplier( numerator - 1, denominator - 1 ); } function addStakingListener(address contractAddress) public onlyOwner { listeners.push(IStakingListener(contractAddress)); } function resetStakingListeners() public onlyOwner { delete listeners; } // Do not use in actual transaction due to massive gas cost. function stakedTokensOfOwner( address addr, uint256 start, uint256 stop ) public view returns (uint256[] memory) { if (accounts[addr].numStaked == 0) { return new uint256[](0); } uint256 index = 0; uint256[] memory ownedTokens = new uint256[](accounts[addr].numStaked); for (uint256 tokenId = start; tokenId <= stop; tokenId++) { if (tokens[tokenId].owner == addr) { ownedTokens[index] = tokenId; index++; if (index == accounts[addr].numStaked) { break; } } } return ownedTokens; } function setDealerContractAddress(address addr) public onlyOwner { dealerContractAddress = addr; dealers = IPPADealers(addr); } // Only for use in emergency. Can be called by owner to unstake. Does not update the rest of the contract state. function unstakeAsOwner(address addr, uint256[] calldata tokenIds) public onlyOwner { for (uint256 i = 0; i < tokenIds.length; i++) { dealers.transferFrom(address(this), addr, tokenIds[i]); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint256","name":"numStaked","type":"uint256"},{"internalType":"uint256","name":"pointsStaked","type":"uint256"},{"internalType":"uint256","name":"lastRefreshTimestamp","type":"uint256"},{"internalType":"uint256","name":"tokensEarnedBeforeLastRefresh","type":"uint256"},{"components":[{"internalType":"uint256","name":"numeratorMinus1","type":"uint256"},{"internalType":"uint256","name":"denominatorMinus1","type":"uint256"}],"internalType":"struct DealerStaking.StakingMultiplier","name":"stakingMultiplier","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"managerAddr","type":"address"}],"name":"addApprovedManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"addStakingListener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedManagers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"calculateTokensEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dealerContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earnPeriodSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"lockStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numSurrealestatesStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pointsPerDealer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"managerAddr","type":"address"}],"name":"removeApprovedManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetStakingListeners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDealerContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSeconds","type":"uint256"}],"name":"setEarnPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setEarningMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setStakingLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"stakedTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"surrealestateStakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bool","name":"isLocked","type":"bool"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260c86005556276a700600655618ca0600b553480156200002357600080fd5b5062000044620000386200005a60201b60201c565b6200006260201b60201c565b620000546200012660201b60201c565b620002f2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008046600181146200014257600481146200017657620001a5565b7399120d128a5f7cb81c318a24fa1f60f66d9777d79250733bc4af76990a1e64fed1a22ab72242e7cd2d40d99150620001a5565b737551dc208fdb308c52a27cae25e9ba8e76ef2733925073053d12507c7be738fb6be8403fe4b5aa610f2e5091505b5081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61329a80620003026000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806363c0f133116100de578063da92ba5811610097578063ebe110c911610071578063ebe110c914610473578063f2fde38b1461048f578063f89dfc2c146104ab578063fb1e2c38146104c75761018e565b8063da92ba581461042f578063e449f3411461044d578063e462cb44146104695761018e565b806363c0f1331461036f578063715018a61461039f5780638da5cb5b146103a9578063a8878bf0146103c7578063b3961af6146103f7578063d60e1217146104135761018e565b80632f2874641161014b5780633f497488116101255780633f497488146102bd5780634f64b2be146102ed5780635e5c06e21461031f5780635ea0ba9d146103535761018e565b80632f2874641461026757806333a7b3cd1461028357806337473bc01461029f5761018e565b806303cd15fe1461019357806307c851c3146101b157806307d8391d146101cf578063150b7a02146101ff5780631f45f5011461022f5780632ee73d411461024b575b600080fd5b61019b6104e3565b6040516101a891906123f1565b60405180910390f35b6101b96104e9565b6040516101c6919061244d565b60405180910390f35b6101e960048036038101906101e491906124d4565b61050f565b6040516101f691906125e5565b60405180910390f35b6102196004803603810190610214919061274d565b610753565b604051610226919061280b565b60405180910390f35b61024960048036038101906102449190612826565b610767565b005b610265600480360381019061026091906128eb565b61083a565b005b610281600480360381019061027c91906124d4565b610d12565b005b61029d6004803603810190610298919061294b565b610e6f565b005b6102a7610f51565b6040516102b4919061244d565b60405180910390f35b6102d760048036038101906102d2919061294b565b610f77565b6040516102e491906123f1565b60405180910390f35b61030760048036038101906103029190612826565b611138565b60405161031693929190612987565b60405180910390f35b6103396004803603810190610334919061294b565b61118f565b60405161034a9594939291906129ed565b60405180910390f35b61036d60048036038101906103689190612a40565b6111e3565b005b6103896004803603810190610384919061294b565b611475565b6040516103969190612a8d565b60405180910390f35b6103a7611495565b005b6103b161151d565b6040516103be919061244d565b60405180910390f35b6103e160048036038101906103dc919061294b565b611546565b6040516103ee91906123f1565b60405180910390f35b610411600480360381019061040c919061294b565b6115ef565b005b61042d6004803603810190610428919061294b565b6116c6565b005b61043761179d565b60405161044491906123f1565b60405180910390f35b61046760048036038101906104629190612a40565b6117a3565b005b610471611916565b005b61048d6004803603810190610488919061294b565b6119a2565b005b6104a960048036038101906104a4919061294b565b611aa3565b005b6104c560048036038101906104c09190612aa8565b611b9b565b005b6104e160048036038101906104dc9190612826565b611ce8565b005b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156105ad57600067ffffffffffffffff81111561057757610576612622565b5b6040519080825280602002602001820160405280156105a55781602001602082028036833780820191505090505b50905061074c565b600080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff81111561060c5761060b612622565b5b60405190808252806020026020018201604052801561063a5781602001602082028036833780820191505090505b50905060008590505b848111610745578673ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561073257808284815181106106c8576106c7612b08565b5b60200260200101818152505082806106df90612b66565b935050600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483141561073157610745565b5b808061073d90612b66565b915050610643565b5080925050505b9392505050565b600063150b7a0260e01b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1661078661151d565b73ffffffffffffffffffffffffffffffffffffffff1614806107f15750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082790612c32565b60405180910390fd5b8060068190555050565b61084333611dbb565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838390506108949190612c52565b61089d33611546565b10156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590612d1a565b60405180910390fd5b60005b83839050811015610b94573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061095457610953612b08565b5b905060200201356040518263ffffffff1660e01b815260040161097791906123f1565b602060405180830381865afa158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612d4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590612dc8565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330878786818110610a6157610a60612b08565b5b905060200201356040518463ffffffff1660e01b8152600401610a8693929190612de8565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505050503360086000868685818110610ad057610acf612b08565b5b90506020020135815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610b7a9190612c52565b925050819055508080610b8c90612b66565b9150506108e1565b5082829050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610bea9190612c52565b925050819055508015610d0457600060065442610c079190612c52565b905060005b84849050811015610d01578160086000878785818110610c2f57610c2e612b08565b5b90506020020135815260200190815260200160002060010181905550600160086000878785818110610c6457610c63612b08565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610ce79190612c52565b925050819055508080610cf990612b66565b915050610c0c565b50505b610d0d33611f41565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d3161151d565b73ffffffffffffffffffffffffffffffffffffffff161480610d9c5750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612c32565b60405180910390fd5b610de483611dbb565b6040518060400160405280600184610dfc9190612e1f565b8152602001600183610e0e9190612e1f565b815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000820151816000015560208201518160010155905050505050565b610e77612011565b73ffffffffffffffffffffffffffffffffffffffff16610e9561151d565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612e9f565b60405180910390fd5b600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442610fc89190612e1f565b90506000600b546001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600101546110219190612c52565b6001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600001546110739190612c52565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154856110c19190612ebf565b6110cb9190612ebf565b6110d59190612f48565b6110df9190612f48565b905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461112f9190612c52565b92505050919050565b60086020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180604001604052908160008201548152602001600182015481525050905085565b6111ec33611dbb565b6000600654426111fc9190612c52565b905060005b83839050811015611466573373ffffffffffffffffffffffffffffffffffffffff166008600086868581811061123a57611239612b08565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090612fc5565b60405180910390fd5b42600860008686858181106112e1576112e0612b08565b5b905060200201358152602001908152602001600020600101541061133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190613031565b60405180910390fd5b6008600085858481811061135157611350612b08565b5b90506020020135815260200190815260200160002060000160009054906101000a900460ff1661141f5760016008600086868581811061139457611393612b08565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546114179190612c52565b925050819055505b816008600086868581811061143757611436612b08565b5b90506020020135815260200190815260200160002060010181905550808061145e90612b66565b915050611201565b5061147033611f41565b505050565b60096020528060005260406000206000915054906101000a900460ff1681565b61149d612011565b73ffffffffffffffffffffffffffffffffffffffff166114bb61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890612e9f565b60405180910390fd5b61151b6000612019565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635e5c06e2836040518263ffffffff1660e01b81526004016115a3919061244d565b602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906130a7565b600001519050919050565b6115f7612011565b73ffffffffffffffffffffffffffffffffffffffff1661161561151d565b73ffffffffffffffffffffffffffffffffffffffff161461166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290612e9f565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6116ce612011565b73ffffffffffffffffffffffffffffffffffffffff166116ec61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990612e9f565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b5481565b6117ac33611dbb565b60005b828290508110156118ac573373ffffffffffffffffffffffffffffffffffffffff16600860008585858181106117e8576117e7612b08565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90613146565b60405180910390fd5b61189983838381811061188d5761188c612b08565b5b905060200201356120dd565b80806118a490612b66565b9150506117af565b5081819050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546119029190612e1f565b9250508190555061191233611f41565b5050565b61191e612011565b73ffffffffffffffffffffffffffffffffffffffff1661193c61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990612e9f565b60405180910390fd5b600a60006119a0919061239a565b565b6119aa612011565b73ffffffffffffffffffffffffffffffffffffffff166119c861151d565b73ffffffffffffffffffffffffffffffffffffffff1614611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1590612e9f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611aab612011565b73ffffffffffffffffffffffffffffffffffffffff16611ac961151d565b73ffffffffffffffffffffffffffffffffffffffff1614611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690612e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b86906131d8565b60405180910390fd5b611b9881612019565b50565b611ba3612011565b73ffffffffffffffffffffffffffffffffffffffff16611bc161151d565b73ffffffffffffffffffffffffffffffffffffffff1614611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90612e9f565b60405180910390fd5b60005b82829050811015611ce257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3086868686818110611c7857611c77612b08565b5b905060200201356040518463ffffffff1660e01b8152600401611c9d93929190612de8565b600060405180830381600087803b158015611cb757600080fd5b505af1158015611ccb573d6000803e3d6000fd5b505050508080611cda90612b66565b915050611c1a565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611d0761151d565b73ffffffffffffffffffffffffffffffffffffffff161480611d725750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890612c32565b60405180910390fd5b80600b8190555050565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421415611e0a57611f3e565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415611ea15742600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611f3e565b6000611eac82610f77565b905080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555042600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550505b50565b60005b600a8054905081101561200d57600a8181548110611f6557611f64612b08565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c79d6136836040518263ffffffff1660e01b8152600401611fc8919061244d565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50505050808061200590612b66565b915050611f44565b5050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b42600860008381526020019081526020016000206001015410612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90613244565b60405180910390fd5b600554600760006008600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546121bf9190612e1f565b925050819055506008600082815260200190815260200160002060000160009054906101000a900460ff16156122b05760006008600083815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760006008600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546122a89190612e1f565b925050819055505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161230f93929190612de8565b600060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b5050505060006008600083815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b50805460008255906000526020600020908101906123b891906123bb565b50565b5b808211156123d45760008160009055506001016123bc565b5090565b6000819050919050565b6123eb816123d8565b82525050565b600060208201905061240660008301846123e2565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124378261240c565b9050919050565b6124478161242c565b82525050565b6000602082019050612462600083018461243e565b92915050565b6000604051905090565b600080fd5b600080fd5b6124858161242c565b811461249057600080fd5b50565b6000813590506124a28161247c565b92915050565b6124b1816123d8565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000806000606084860312156124ed576124ec612472565b5b60006124fb86828701612493565b935050602061250c868287016124bf565b925050604061251d868287016124bf565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61255c816123d8565b82525050565b600061256e8383612553565b60208301905092915050565b6000602082019050919050565b600061259282612527565b61259c8185612532565b93506125a783612543565b8060005b838110156125d85781516125bf8882612562565b97506125ca8361257a565b9250506001810190506125ab565b5085935050505092915050565b600060208201905081810360008301526125ff8184612587565b905092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61265a82612611565b810181811067ffffffffffffffff8211171561267957612678612622565b5b80604052505050565b600061268c612468565b90506126988282612651565b919050565b600067ffffffffffffffff8211156126b8576126b7612622565b5b6126c182612611565b9050602081019050919050565b82818337600083830152505050565b60006126f06126eb8461269d565b612682565b90508281526020810184848401111561270c5761270b61260c565b5b6127178482856126ce565b509392505050565b600082601f83011261273457612733612607565b5b81356127448482602086016126dd565b91505092915050565b6000806000806080858703121561276757612766612472565b5b600061277587828801612493565b945050602061278687828801612493565b9350506040612797878288016124bf565b925050606085013567ffffffffffffffff8111156127b8576127b7612477565b5b6127c48782880161271f565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612805816127d0565b82525050565b600060208201905061282060008301846127fc565b92915050565b60006020828403121561283c5761283b612472565b5b600061284a848285016124bf565b91505092915050565b600080fd5b600080fd5b60008083601f84011261287357612872612607565b5b8235905067ffffffffffffffff8111156128905761288f612853565b5b6020830191508360208202830111156128ac576128ab612858565b5b9250929050565b60008115159050919050565b6128c8816128b3565b81146128d357600080fd5b50565b6000813590506128e5816128bf565b92915050565b60008060006040848603121561290457612903612472565b5b600084013567ffffffffffffffff81111561292257612921612477565b5b61292e8682870161285d565b93509350506020612941868287016128d6565b9150509250925092565b60006020828403121561296157612960612472565b5b600061296f84828501612493565b91505092915050565b612981816128b3565b82525050565b600060608201905061299c6000830186612978565b6129a960208301856123e2565b6129b6604083018461243e565b949350505050565b6040820160008201516129d46000850182612553565b5060208201516129e76020850182612553565b50505050565b600060c082019050612a0260008301886123e2565b612a0f60208301876123e2565b612a1c60408301866123e2565b612a2960608301856123e2565b612a3660808301846129be565b9695505050505050565b60008060208385031215612a5757612a56612472565b5b600083013567ffffffffffffffff811115612a7557612a74612477565b5b612a818582860161285d565b92509250509250929050565b6000602082019050612aa26000830184612978565b92915050565b600080600060408486031215612ac157612ac0612472565b5b6000612acf86828701612493565b935050602084013567ffffffffffffffff811115612af057612aef612477565b5b612afc8682870161285d565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b71826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ba457612ba3612b37565b5b600182019050919050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420616e20617070726f766564206d616e61676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c1c602183612baf565b9150612c2782612bc0565b604082019050919050565b60006020820190508181036000830152612c4b81612c0f565b9050919050565b6000612c5d826123d8565b9150612c68836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9d57612c9c612b37565b5b828201905092915050565b7f43616e6e6f74207374616b65206d6f7265204465616c657273207468616e207960008201527f6f752068617665205375727265616c65737461746573207374616b6564000000602082015250565b6000612d04603d83612baf565b9150612d0f82612ca8565b604082019050919050565b60006020820190508181036000830152612d3381612cf7565b9050919050565b600081519050612d498161247c565b92915050565b600060208284031215612d6557612d64612472565b5b6000612d7384828501612d3a565b91505092915050565b7f4e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000612db2600e83612baf565b9150612dbd82612d7c565b602082019050919050565b60006020820190508181036000830152612de181612da5565b9050919050565b6000606082019050612dfd600083018661243e565b612e0a602083018561243e565b612e1760408301846123e2565b949350505050565b6000612e2a826123d8565b9150612e35836123d8565b925082821015612e4857612e47612b37565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e89602083612baf565b9150612e9482612e53565b602082019050919050565b60006020820190508181036000830152612eb881612e7c565b9050919050565b6000612eca826123d8565b9150612ed5836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f0e57612f0d612b37565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f53826123d8565b9150612f5e836123d8565b925082612f6e57612f6d612f19565b5b828204905092915050565b7f546f6b656e206973206e6f742063757272656e746c79207374616b6564000000600082015250565b6000612faf601d83612baf565b9150612fba82612f79565b602082019050919050565b60006020820190508181036000830152612fde81612fa2565b9050919050565b7f546f6b656e20697320616c7265616479206c6f636b6564000000000000000000600082015250565b600061301b601783612baf565b915061302682612fe5565b602082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b600080fd5b600081519050613065816124a8565b92915050565b60006020828403121561308157613080613051565b5b61308b6020612682565b9050600061309b84828501613056565b60008301525092915050565b6000602082840312156130bd576130bc612472565b5b60006130cb8482850161306b565b91505092915050565b7f43616c6c6572206973206e6f742063757272656e746c79207374616b696e672060008201527f7468652070726f766964656420746f6b656e4964000000000000000000000000602082015250565b6000613130603483612baf565b915061313b826130d4565b604082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131c2602683612baf565b91506131cd82613166565b604082019050919050565b600060208201905081810360008301526131f1816131b5565b9050919050565b7f546f6b656e206973207374696c6c206c6f636b65640000000000000000000000600082015250565b600061322e601583612baf565b9150613239826131f8565b602082019050919050565b6000602082019050818103600083015261325d81613221565b905091905056fea2646970667358221220f748b708bc7aed8233b5b7e4975051a02e1da1def8c2f3d5b658fb6c0359aba064736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806363c0f133116100de578063da92ba5811610097578063ebe110c911610071578063ebe110c914610473578063f2fde38b1461048f578063f89dfc2c146104ab578063fb1e2c38146104c75761018e565b8063da92ba581461042f578063e449f3411461044d578063e462cb44146104695761018e565b806363c0f1331461036f578063715018a61461039f5780638da5cb5b146103a9578063a8878bf0146103c7578063b3961af6146103f7578063d60e1217146104135761018e565b80632f2874641161014b5780633f497488116101255780633f497488146102bd5780634f64b2be146102ed5780635e5c06e21461031f5780635ea0ba9d146103535761018e565b80632f2874641461026757806333a7b3cd1461028357806337473bc01461029f5761018e565b806303cd15fe1461019357806307c851c3146101b157806307d8391d146101cf578063150b7a02146101ff5780631f45f5011461022f5780632ee73d411461024b575b600080fd5b61019b6104e3565b6040516101a891906123f1565b60405180910390f35b6101b96104e9565b6040516101c6919061244d565b60405180910390f35b6101e960048036038101906101e491906124d4565b61050f565b6040516101f691906125e5565b60405180910390f35b6102196004803603810190610214919061274d565b610753565b604051610226919061280b565b60405180910390f35b61024960048036038101906102449190612826565b610767565b005b610265600480360381019061026091906128eb565b61083a565b005b610281600480360381019061027c91906124d4565b610d12565b005b61029d6004803603810190610298919061294b565b610e6f565b005b6102a7610f51565b6040516102b4919061244d565b60405180910390f35b6102d760048036038101906102d2919061294b565b610f77565b6040516102e491906123f1565b60405180910390f35b61030760048036038101906103029190612826565b611138565b60405161031693929190612987565b60405180910390f35b6103396004803603810190610334919061294b565b61118f565b60405161034a9594939291906129ed565b60405180910390f35b61036d60048036038101906103689190612a40565b6111e3565b005b6103896004803603810190610384919061294b565b611475565b6040516103969190612a8d565b60405180910390f35b6103a7611495565b005b6103b161151d565b6040516103be919061244d565b60405180910390f35b6103e160048036038101906103dc919061294b565b611546565b6040516103ee91906123f1565b60405180910390f35b610411600480360381019061040c919061294b565b6115ef565b005b61042d6004803603810190610428919061294b565b6116c6565b005b61043761179d565b60405161044491906123f1565b60405180910390f35b61046760048036038101906104629190612a40565b6117a3565b005b610471611916565b005b61048d6004803603810190610488919061294b565b6119a2565b005b6104a960048036038101906104a4919061294b565b611aa3565b005b6104c560048036038101906104c09190612aa8565b611b9b565b005b6104e160048036038101906104dc9190612826565b611ce8565b005b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156105ad57600067ffffffffffffffff81111561057757610576612622565b5b6040519080825280602002602001820160405280156105a55781602001602082028036833780820191505090505b50905061074c565b600080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff81111561060c5761060b612622565b5b60405190808252806020026020018201604052801561063a5781602001602082028036833780820191505090505b50905060008590505b848111610745578673ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561073257808284815181106106c8576106c7612b08565b5b60200260200101818152505082806106df90612b66565b935050600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483141561073157610745565b5b808061073d90612b66565b915050610643565b5080925050505b9392505050565b600063150b7a0260e01b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff1661078661151d565b73ffffffffffffffffffffffffffffffffffffffff1614806107f15750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082790612c32565b60405180910390fd5b8060068190555050565b61084333611dbb565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838390506108949190612c52565b61089d33611546565b10156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590612d1a565b60405180910390fd5b60005b83839050811015610b94573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061095457610953612b08565b5b905060200201356040518263ffffffff1660e01b815260040161097791906123f1565b602060405180830381865afa158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612d4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590612dc8565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330878786818110610a6157610a60612b08565b5b905060200201356040518463ffffffff1660e01b8152600401610a8693929190612de8565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505050503360086000868685818110610ad057610acf612b08565b5b90506020020135815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610b7a9190612c52565b925050819055508080610b8c90612b66565b9150506108e1565b5082829050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610bea9190612c52565b925050819055508015610d0457600060065442610c079190612c52565b905060005b84849050811015610d01578160086000878785818110610c2f57610c2e612b08565b5b90506020020135815260200190815260200160002060010181905550600160086000878785818110610c6457610c63612b08565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610ce79190612c52565b925050819055508080610cf990612b66565b915050610c0c565b50505b610d0d33611f41565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d3161151d565b73ffffffffffffffffffffffffffffffffffffffff161480610d9c5750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612c32565b60405180910390fd5b610de483611dbb565b6040518060400160405280600184610dfc9190612e1f565b8152602001600183610e0e9190612e1f565b815250600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000820151816000015560208201518160010155905050505050565b610e77612011565b73ffffffffffffffffffffffffffffffffffffffff16610e9561151d565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612e9f565b60405180910390fd5b600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442610fc89190612e1f565b90506000600b546001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600101546110219190612c52565b6001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600001546110739190612c52565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154856110c19190612ebf565b6110cb9190612ebf565b6110d59190612f48565b6110df9190612f48565b905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461112f9190612c52565b92505050919050565b60086020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180604001604052908160008201548152602001600182015481525050905085565b6111ec33611dbb565b6000600654426111fc9190612c52565b905060005b83839050811015611466573373ffffffffffffffffffffffffffffffffffffffff166008600086868581811061123a57611239612b08565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090612fc5565b60405180910390fd5b42600860008686858181106112e1576112e0612b08565b5b905060200201358152602001908152602001600020600101541061133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190613031565b60405180910390fd5b6008600085858481811061135157611350612b08565b5b90506020020135815260200190815260200160002060000160009054906101000a900460ff1661141f5760016008600086868581811061139457611393612b08565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546114179190612c52565b925050819055505b816008600086868581811061143757611436612b08565b5b90506020020135815260200190815260200160002060010181905550808061145e90612b66565b915050611201565b5061147033611f41565b505050565b60096020528060005260406000206000915054906101000a900460ff1681565b61149d612011565b73ffffffffffffffffffffffffffffffffffffffff166114bb61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890612e9f565b60405180910390fd5b61151b6000612019565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635e5c06e2836040518263ffffffff1660e01b81526004016115a3919061244d565b602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906130a7565b600001519050919050565b6115f7612011565b73ffffffffffffffffffffffffffffffffffffffff1661161561151d565b73ffffffffffffffffffffffffffffffffffffffff161461166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290612e9f565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6116ce612011565b73ffffffffffffffffffffffffffffffffffffffff166116ec61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990612e9f565b60405180910390fd5b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b5481565b6117ac33611dbb565b60005b828290508110156118ac573373ffffffffffffffffffffffffffffffffffffffff16600860008585858181106117e8576117e7612b08565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90613146565b60405180910390fd5b61189983838381811061188d5761188c612b08565b5b905060200201356120dd565b80806118a490612b66565b9150506117af565b5081819050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546119029190612e1f565b9250508190555061191233611f41565b5050565b61191e612011565b73ffffffffffffffffffffffffffffffffffffffff1661193c61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990612e9f565b60405180910390fd5b600a60006119a0919061239a565b565b6119aa612011565b73ffffffffffffffffffffffffffffffffffffffff166119c861151d565b73ffffffffffffffffffffffffffffffffffffffff1614611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1590612e9f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611aab612011565b73ffffffffffffffffffffffffffffffffffffffff16611ac961151d565b73ffffffffffffffffffffffffffffffffffffffff1614611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690612e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b86906131d8565b60405180910390fd5b611b9881612019565b50565b611ba3612011565b73ffffffffffffffffffffffffffffffffffffffff16611bc161151d565b73ffffffffffffffffffffffffffffffffffffffff1614611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90612e9f565b60405180910390fd5b60005b82829050811015611ce257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3086868686818110611c7857611c77612b08565b5b905060200201356040518463ffffffff1660e01b8152600401611c9d93929190612de8565b600060405180830381600087803b158015611cb757600080fd5b505af1158015611ccb573d6000803e3d6000fd5b505050508080611cda90612b66565b915050611c1a565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611d0761151d565b73ffffffffffffffffffffffffffffffffffffffff161480611d725750600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890612c32565b60405180910390fd5b80600b8190555050565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421415611e0a57611f3e565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415611ea15742600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611f3e565b6000611eac82610f77565b905080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555042600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550505b50565b60005b600a8054905081101561200d57600a8181548110611f6557611f64612b08565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c79d6136836040518263ffffffff1660e01b8152600401611fc8919061244d565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50505050808061200590612b66565b915050611f44565b5050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b42600860008381526020019081526020016000206001015410612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90613244565b60405180910390fd5b600554600760006008600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546121bf9190612e1f565b925050819055506008600082815260200190815260200160002060000160009054906101000a900460ff16156122b05760006008600083815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600554600760006008600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546122a89190612e1f565b925050819055505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161230f93929190612de8565b600060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b5050505060006008600083815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b50805460008255906000526020600020908101906123b891906123bb565b50565b5b808211156123d45760008160009055506001016123bc565b5090565b6000819050919050565b6123eb816123d8565b82525050565b600060208201905061240660008301846123e2565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124378261240c565b9050919050565b6124478161242c565b82525050565b6000602082019050612462600083018461243e565b92915050565b6000604051905090565b600080fd5b600080fd5b6124858161242c565b811461249057600080fd5b50565b6000813590506124a28161247c565b92915050565b6124b1816123d8565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000806000606084860312156124ed576124ec612472565b5b60006124fb86828701612493565b935050602061250c868287016124bf565b925050604061251d868287016124bf565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61255c816123d8565b82525050565b600061256e8383612553565b60208301905092915050565b6000602082019050919050565b600061259282612527565b61259c8185612532565b93506125a783612543565b8060005b838110156125d85781516125bf8882612562565b97506125ca8361257a565b9250506001810190506125ab565b5085935050505092915050565b600060208201905081810360008301526125ff8184612587565b905092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61265a82612611565b810181811067ffffffffffffffff8211171561267957612678612622565b5b80604052505050565b600061268c612468565b90506126988282612651565b919050565b600067ffffffffffffffff8211156126b8576126b7612622565b5b6126c182612611565b9050602081019050919050565b82818337600083830152505050565b60006126f06126eb8461269d565b612682565b90508281526020810184848401111561270c5761270b61260c565b5b6127178482856126ce565b509392505050565b600082601f83011261273457612733612607565b5b81356127448482602086016126dd565b91505092915050565b6000806000806080858703121561276757612766612472565b5b600061277587828801612493565b945050602061278687828801612493565b9350506040612797878288016124bf565b925050606085013567ffffffffffffffff8111156127b8576127b7612477565b5b6127c48782880161271f565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612805816127d0565b82525050565b600060208201905061282060008301846127fc565b92915050565b60006020828403121561283c5761283b612472565b5b600061284a848285016124bf565b91505092915050565b600080fd5b600080fd5b60008083601f84011261287357612872612607565b5b8235905067ffffffffffffffff8111156128905761288f612853565b5b6020830191508360208202830111156128ac576128ab612858565b5b9250929050565b60008115159050919050565b6128c8816128b3565b81146128d357600080fd5b50565b6000813590506128e5816128bf565b92915050565b60008060006040848603121561290457612903612472565b5b600084013567ffffffffffffffff81111561292257612921612477565b5b61292e8682870161285d565b93509350506020612941868287016128d6565b9150509250925092565b60006020828403121561296157612960612472565b5b600061296f84828501612493565b91505092915050565b612981816128b3565b82525050565b600060608201905061299c6000830186612978565b6129a960208301856123e2565b6129b6604083018461243e565b949350505050565b6040820160008201516129d46000850182612553565b5060208201516129e76020850182612553565b50505050565b600060c082019050612a0260008301886123e2565b612a0f60208301876123e2565b612a1c60408301866123e2565b612a2960608301856123e2565b612a3660808301846129be565b9695505050505050565b60008060208385031215612a5757612a56612472565b5b600083013567ffffffffffffffff811115612a7557612a74612477565b5b612a818582860161285d565b92509250509250929050565b6000602082019050612aa26000830184612978565b92915050565b600080600060408486031215612ac157612ac0612472565b5b6000612acf86828701612493565b935050602084013567ffffffffffffffff811115612af057612aef612477565b5b612afc8682870161285d565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b71826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ba457612ba3612b37565b5b600182019050919050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420616e20617070726f766564206d616e61676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c1c602183612baf565b9150612c2782612bc0565b604082019050919050565b60006020820190508181036000830152612c4b81612c0f565b9050919050565b6000612c5d826123d8565b9150612c68836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9d57612c9c612b37565b5b828201905092915050565b7f43616e6e6f74207374616b65206d6f7265204465616c657273207468616e207960008201527f6f752068617665205375727265616c65737461746573207374616b6564000000602082015250565b6000612d04603d83612baf565b9150612d0f82612ca8565b604082019050919050565b60006020820190508181036000830152612d3381612cf7565b9050919050565b600081519050612d498161247c565b92915050565b600060208284031215612d6557612d64612472565b5b6000612d7384828501612d3a565b91505092915050565b7f4e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000612db2600e83612baf565b9150612dbd82612d7c565b602082019050919050565b60006020820190508181036000830152612de181612da5565b9050919050565b6000606082019050612dfd600083018661243e565b612e0a602083018561243e565b612e1760408301846123e2565b949350505050565b6000612e2a826123d8565b9150612e35836123d8565b925082821015612e4857612e47612b37565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e89602083612baf565b9150612e9482612e53565b602082019050919050565b60006020820190508181036000830152612eb881612e7c565b9050919050565b6000612eca826123d8565b9150612ed5836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f0e57612f0d612b37565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f53826123d8565b9150612f5e836123d8565b925082612f6e57612f6d612f19565b5b828204905092915050565b7f546f6b656e206973206e6f742063757272656e746c79207374616b6564000000600082015250565b6000612faf601d83612baf565b9150612fba82612f79565b602082019050919050565b60006020820190508181036000830152612fde81612fa2565b9050919050565b7f546f6b656e20697320616c7265616479206c6f636b6564000000000000000000600082015250565b600061301b601783612baf565b915061302682612fe5565b602082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b600080fd5b600081519050613065816124a8565b92915050565b60006020828403121561308157613080613051565b5b61308b6020612682565b9050600061309b84828501613056565b60008301525092915050565b6000602082840312156130bd576130bc612472565b5b60006130cb8482850161306b565b91505092915050565b7f43616c6c6572206973206e6f742063757272656e746c79207374616b696e672060008201527f7468652070726f766964656420746f6b656e4964000000000000000000000000602082015250565b6000613130603483612baf565b915061313b826130d4565b604082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131c2602683612baf565b91506131cd82613166565b604082019050919050565b600060208201905081810360008301526131f1816131b5565b9050919050565b7f546f6b656e206973207374696c6c206c6f636b65640000000000000000000000600082015250565b600061322e601583612baf565b9150613239826131f8565b602082019050919050565b6000602082019050818103600083015261325d81613221565b905091905056fea2646970667358221220f748b708bc7aed8233b5b7e4975051a02e1da1def8c2f3d5b658fb6c0359aba064736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.