Address Details
contract
0x05F450F71C4FB334d280DA2CBa4024964f2a5faF
- Contract Name
- GetCrypto
- Creator
- 0x3451e6–ae720a at 0xde0258–257b74
- Balance
- 0.24768392281508 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- 26 Transactions
- Transfers
- 29 Transfers
- Gas Used
- 1,815,896
- Last Balance Update
- 24842090
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- GetCrypto
- Optimization enabled
- false
- Compiler version
- v0.8.9+commit.e5eed63a
- EVM Version
- london
- Verified at
- 2023-02-28T23:33:02.324006Z
contracts/GetCrypto.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; library Constants { bytes32 constant PLASTIKSELL_TYPEHASH = keccak256("PlastikSell(address buyer,uint256 price,uint256 timestamp,address tokenAddress)"); } contract GetCrypto is EIP712 { event TokenBought(address from, uint256 amount, uint256 price); event WithDraw(uint256 amount, uint256 balance); event Transfer(address _from, uint256 amount, uint256 balance); IERC20 internal _token; address internal tokenPool; address internal priceSigner; address private owner; uint256 public fee; uint256 public minTokensToBuy; uint256 public maxTokensToBuy; mapping(address => bool) public whitelistedTokens; /* An ECDSA signature. */ struct Sign { uint8 v; bytes32 r; bytes32 s; } struct PlastikSell { address buyer; uint256 price; uint256 timestamp; address tokenAddress; } constructor( address tokenAddress, address _tokenPool, address _priceSigner ) payable EIP712("PLASTIKSELL", "1.0") { _token = IERC20(tokenAddress); owner = msg.sender; tokenPool = _tokenPool; priceSigner = _priceSigner; fee = 0; // 10.00% fee is multipliee by 100 minTokensToBuy = 0; maxTokensToBuy = 0; whitelistedTokens[0x765DE816845861e75A25fCA122bb6898B8B1282a] = true; } modifier onlyOwner() { require(msg.sender == owner, "Not Owner"); _; } fallback() external payable {} receive() external payable {} function setTokenPool(address pool) public virtual onlyOwner { tokenPool = pool; } function setFee(uint256 _fee) public virtual onlyOwner { fee = _fee; } function setWhitelistedToken(address _tokenAdress, bool isAllowed) public virtual onlyOwner { whitelistedTokens[_tokenAdress] = isAllowed; } function setMinTokensToBuy(uint256 _minToBuy) public virtual onlyOwner { minTokensToBuy = _minToBuy; } function setMaxTokensToBuy(uint256 _maxToBuy) public virtual onlyOwner { maxTokensToBuy = _maxToBuy; } function setPriceSigner(address _priceSigner) public virtual onlyOwner { priceSigner = _priceSigner; } function buyTokensWithAnotherToken( address _tokenAddress, uint256 _amount, PlastikSell calldata _sell, bytes calldata _signature ) public virtual returns (bool) { require(whitelistedTokens[_tokenAddress], "This token is not allowed"); //verify signature address signer = verify(_sell, _signature); require(_tokenAddress == _sell.tokenAddress, "Token address does not match"); //verify sender with _sell.buyer require(msg.sender == _sell.buyer, "Buyer Address does not match"); require(priceSigner == signer, "Price Signer does not match"); //verify time send require( block.timestamp < _sell.timestamp + 5 minutes, "Buy request is expired" ); IERC20 coinToken = IERC20(_tokenAddress); require(_amount > 0, "You need to send amount > 0"); require( coinToken.balanceOf(msg.sender) >= _amount, "There is not enough balance" ); uint256 poolBalance = _token.balanceOf(tokenPool); uint256 amountOfTokens = calculateAmountOfTokens(_amount, _sell.price); require( amountOfTokens <= poolBalance, "Not enough tokens in the reserve" ); if (minTokensToBuy > 0) { require( amountOfTokens >= minTokensToBuy, "You need to buy more tokens" ); } if (maxTokensToBuy > 0) { require( amountOfTokens <= maxTokensToBuy, "You need to buy less tokens" ); } require( coinToken.transferFrom(msg.sender, address(this), _amount), "Payment failed" ); require( _token.transferFrom(tokenPool, msg.sender, amountOfTokens), "Transfer failed" ); emit TokenBought(msg.sender, amountOfTokens, _sell.price); return true; } function buyTokens(PlastikSell calldata _sell, bytes calldata _signature) public payable virtual returns (bool) { //verify signature address signer = verify(_sell, _signature); //verify sender with _sell.buyer require(msg.sender == _sell.buyer, "Buyer Address does not match"); require(priceSigner == signer, "Price Signer does not match"); //verify time send require( block.timestamp < _sell.timestamp + 5 minutes, "Buy request is expired" ); uint256 amountToBuy = msg.value; uint256 poolBalance = _token.balanceOf(tokenPool); require(amountToBuy > 0, "You need to send some ether or bnb"); uint256 amountOfTokens = calculateAmountOfTokens( amountToBuy, _sell.price ); require( amountOfTokens <= poolBalance, "Not enough tokens in the reserve" ); if (minTokensToBuy > 0) { require( amountOfTokens >= minTokensToBuy, "You need to buy more tokens" ); } if (maxTokensToBuy > 0) { require( amountOfTokens <= maxTokensToBuy, "You need to buy less tokens" ); } // transfer token from contract wallet to sender wallet require( _token.transferFrom(tokenPool, msg.sender, amountOfTokens), "Transfer failed" ); emit TokenBought(msg.sender, amountOfTokens, _sell.price); return true; } function calculateAmountOfTokens(uint256 _amount, uint256 _price) public view returns (uint256) { // the tokens must have 18 decimals uint256 amountAfterFee = _amount - ((_amount * fee) / 10000); return (1000000000 * amountAfterFee) / (_price); } function getContractTokens() public view returns (uint256) { return _token.balanceOf(address(this)); } function withDraw(uint256 _amount) public onlyOwner returns (bool) { require(_amount <= contractBalance(), "Not enough BNB in the reserve"); payable(owner).transfer(_amount); emit WithDraw(_amount, address(this).balance); return true; } function withDrawToken(address _tokenAddress, uint256 _amount) public onlyOwner returns (bool) { require(whitelistedTokens[_tokenAddress], "This token is not allowed"); require( _amount <= contractTokenBalance(_tokenAddress), "Not enough BNB in the reserve" ); require( IERC20(_tokenAddress).transfer(owner, _amount), "Withdraw failed" ); return true; } function transfer(address payable _to, uint256 _amount) public onlyOwner returns (bool) { require(_amount <= contractBalance(), "Not enough BNB in the reserve"); _to.transfer(_amount); emit Transfer(_to, _amount, address(this).balance); return true; } function transferToken( address _tokenAddress, address payable _to, uint256 _amount ) public onlyOwner returns (bool) { require(whitelistedTokens[_tokenAddress], "This token is not allowed"); require( _amount <= contractTokenBalance(_tokenAddress), "Not enough in the reserve" ); require( IERC20(_tokenAddress).transfer(_to, _amount), "Withdraw failed" ); return true; } function contractBalance() public view returns (uint256) { return address(this).balance; } function contractTokenBalance(address _tokenAddress) public view returns (uint256) { return IERC20(_tokenAddress).balanceOf(address(this)); } function availableTokens() public view returns (uint256) { uint256 tokens = _token.balanceOf(tokenPool); uint256 allowedToSell = _token.allowance(tokenPool, address(this)); if (tokens <= allowedToSell) { return tokens; } return allowedToSell; } function verify(PlastikSell calldata plastikSell, bytes memory signature) public view returns (address) { bytes32 digest = _hashTypedDataV4( keccak256( abi.encode( Constants.PLASTIKSELL_TYPEHASH, plastikSell.buyer, plastikSell.price, plastikSell.timestamp, plastikSell.tokenAddress ) ) ); return ECDSA.recover(digest, signature); } }
/_openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
/_openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
/_openzeppelin/contracts/utils/cryptography/ECDSA.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
/_openzeppelin/contracts/utils/cryptography/draft-EIP712.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
Contract ABI
[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"address","name":"_tokenPool","internalType":"address"},{"type":"address","name":"_priceSigner","internalType":"address"}]},{"type":"event","name":"TokenBought","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"price","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"balance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WithDraw","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"balance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"availableTokens","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"buyTokens","inputs":[{"type":"tuple","name":"_sell","internalType":"struct GetCrypto.PlastikSell","components":[{"type":"address","name":"buyer","internalType":"address"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"}]},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"buyTokensWithAnotherToken","inputs":[{"type":"address","name":"_tokenAddress","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"tuple","name":"_sell","internalType":"struct GetCrypto.PlastikSell","components":[{"type":"address","name":"buyer","internalType":"address"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"}]},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateAmountOfTokens","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"contractBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"contractTokenBalance","inputs":[{"type":"address","name":"_tokenAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getContractTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTokensToBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minTokensToBuy","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFee","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTokensToBuy","inputs":[{"type":"uint256","name":"_maxToBuy","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinTokensToBuy","inputs":[{"type":"uint256","name":"_minToBuy","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPriceSigner","inputs":[{"type":"address","name":"_priceSigner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTokenPool","inputs":[{"type":"address","name":"pool","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhitelistedToken","inputs":[{"type":"address","name":"_tokenAdress","internalType":"address"},{"type":"bool","name":"isAllowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"_to","internalType":"address payable"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferToken","inputs":[{"type":"address","name":"_tokenAddress","internalType":"address"},{"type":"address","name":"_to","internalType":"address payable"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"verify","inputs":[{"type":"tuple","name":"plastikSell","internalType":"struct GetCrypto.PlastikSell","components":[{"type":"address","name":"buyer","internalType":"address"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"}]},{"type":"bytes","name":"signature","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"whitelistedTokens","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withDraw","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withDrawToken","inputs":[{"type":"address","name":"_tokenAddress","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x610140604052604051620042743803806200427483398181016040528101906200002a91906200037e565b6040518060400160405280600b81526020017f504c415354494b53454c4c0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000ff818484620002d860201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006004819055506000600581905550600060068190555060016007600073765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050506200047e565b60008383834630604051602001620002f595949392919062000421565b6040516020818303038152906040528051906020012090509392505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003468262000319565b9050919050565b620003588162000339565b81146200036457600080fd5b50565b60008151905062000378816200034d565b92915050565b6000806000606084860312156200039a576200039962000314565b5b6000620003aa8682870162000367565b9350506020620003bd8682870162000367565b9250506040620003d08682870162000367565b9150509250925092565b6000819050919050565b620003ef81620003da565b82525050565b6000819050919050565b6200040a81620003f5565b82525050565b6200041b8162000339565b82525050565b600060a082019050620004386000830188620003e4565b620004476020830187620003e4565b620004566040830186620003e4565b620004656060830185620003ff565b62000474608083018462000410565b9695505050505050565b60805160a05160c05160e0516101005161012051613da6620004ce6000396000612380015260006123c2015260006123a1015260006122d60152600061232c015260006123550152613da66000f3fe6080604052600436106101395760003560e01c80638bfbda73116100ab578063b8c90b341161006f578063b8c90b3414610445578063c3ffb88414610482578063c4af3b86146104ad578063daf9c210146104ea578063ddca3f4314610527578063f5537ede1461055257610140565b80638bfbda731461035b5780639cfa0f7c1461038b578063a9059cbb146103b6578063aa9c641b146103f3578063b3eed54b1461041c57610140565b806369bb4dc2116100fd57806369bb4dc21461024d57806369fe0e2d1461027857806376ce28f1146102a15780637764b4d2146102ca57806385bc7071146102f35780638b7afe2e1461033057610140565b806314174f33146101425780633b574beb1461017f57806363323ddd146101aa5780636515886a146101d357806366e3e5e41461021057610140565b3661014057005b005b34801561014e57600080fd5b5061016960048036038101906101649190612867565b61058f565b60405161017691906128af565b60405180910390f35b34801561018b57600080fd5b50610194610716565b6040516101a191906128d9565b60405180910390f35b3480156101b657600080fd5b506101d160048036038101906101cc9190612952565b61071c565b005b3480156101df57600080fd5b506101fa60048036038101906101f59190612a08565b6107f0565b60405161020791906128af565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612952565b610fbb565b60405161024491906128d9565b60405180910390f35b34801561025957600080fd5b5061026261104d565b60405161026f91906128d9565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190612867565b611209565b005b3480156102ad57600080fd5b506102c860048036038101906102c39190612abc565b6112a3565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190612952565b61138e565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190612afc565b611462565b60405161032791906128af565b60405180910390f35b34801561033c57600080fd5b506103456116c3565b60405161035291906128d9565b60405180910390f35b61037560048036038101906103709190612b3c565b6116cb565b60405161038291906128af565b60405180910390f35b34801561039757600080fd5b506103a0611bee565b6040516103ad91906128d9565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190612bda565b611bf4565b6040516103ea91906128af565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190612867565b611d5c565b005b34801561042857600080fd5b50610443600480360381019061043e9190612867565b611df6565b005b34801561045157600080fd5b5061046c60048036038101906104679190612c1a565b611e90565b60405161047991906128d9565b60405180910390f35b34801561048e57600080fd5b50610497611edf565b6040516104a491906128d9565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612d9b565b611f90565b6040516104e19190612e06565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612952565b61202b565b60405161051e91906128af565b60405180910390f35b34801561053357600080fd5b5061053c61204b565b60405161054991906128d9565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190612e21565b612051565b60405161058691906128af565b60405180910390f35b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061890612ed1565b60405180910390fd5b6106296116c3565b82111561066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066290612f3d565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156106d3573d6000803e3d6000fd5b507fcd0c1bd6f3d36134628c5a399036d519d4dd51678a085a425a750d6ebf119c038247604051610705929190612f5d565b60405180910390a160019050919050565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a390612ed1565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612fd2565b60405180910390fd5b60006108ce8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f90565b90508460600160208101906108e39190612952565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109479061303e565b60405180910390fd5b8460000160208101906109639190612952565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906130aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613116565b60405180910390fd5b61012c8560400135610a729190613165565b4210610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613207565b60405180910390fd5b600087905060008711610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af290613273565b60405180910390fd5b868173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610b359190612e06565b60206040518083038186803b158015610b4d57600080fd5b505afa158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8591906132a8565b1015610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90613321565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610c449190612e06565b60206040518083038186803b158015610c5c57600080fd5b505afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906132a8565b90506000610ca6898960200135611e90565b905081811115610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce29061338d565b60405180910390fd5b60006005541115610d3c57600554811015610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d32906133f9565b60405180910390fd5b5b60006006541115610d8d57600654811115610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390613465565b60405180910390fd5b5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd33308c6040518463ffffffff1660e01b8152600401610dca93929190613485565b602060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1c91906134d1565b610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061354a565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401610eda93929190613485565b602060405180830381600087803b158015610ef457600080fd5b505af1158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906134d1565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906135b6565b60405180910390fd5b7f28cab0d660ed8aedd61a8c9db00b97f6a2d67e07d87795994f440b18bc5f1aa333828a60200135604051610fa2939291906135d6565b60405180910390a1600194505050505095945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ff69190612e06565b60206040518083038186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104691906132a8565b9050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016110cb9190612e06565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b91906132a8565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b815260040161119d92919061360d565b60206040518083038186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906132a8565b9050808211611200578192505050611206565b80925050505b90565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090612ed1565b60405180910390fd5b8060048190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90612ed1565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612ed1565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90612ed1565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790612fd2565b60405180910390fd5b61158983610fbb565b8211156115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290612f3d565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611628929190613636565b602060405180830381600087803b15801561164257600080fd5b505af1158015611656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167a91906134d1565b6116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b0906136ab565b60405180910390fd5b6001905092915050565b600047905090565b60008061171c8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f90565b90508460000160208101906117319190612952565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611795906130aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613116565b60405180910390fd5b61012c85604001356118409190613165565b4210611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613207565b60405180910390fd5b600034905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119049190612e06565b60206040518083038186803b15801561191c57600080fd5b505afa158015611930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195491906132a8565b905060008211611999576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119909061373d565b60405180910390fd5b60006119a9838960200135611e90565b9050818111156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061338d565b60405180910390fd5b60006005541115611a3f57600554811015611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906133f9565b60405180910390fd5b5b60006006541115611a9057600654811115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613465565b60405180910390fd5b5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401611b0f93929190613485565b602060405180830381600087803b158015611b2957600080fd5b505af1158015611b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6191906134d1565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906135b6565b60405180910390fd5b7f28cab0d660ed8aedd61a8c9db00b97f6a2d67e07d87795994f440b18bc5f1aa333828a60200135604051611bd7939291906135d6565b60405180910390a160019450505050509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90612ed1565b60405180910390fd5b611c8e6116c3565b821115611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790612f3d565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611d16573d6000803e3d6000fd5b507f7fa9aafeb8bb803d77de5d84bc2f2edbd842ca91b20cd5020aa21dfe26ab0be9838347604051611d4a939291906137bc565b60405180910390a16001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390612ed1565b60405180910390fd5b8060068190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90612ed1565b60405180910390fd5b8060058190555050565b60008061271060045485611ea491906137f3565b611eae919061387c565b84611eb991906138ad565b90508281633b9aca00611ecc91906137f3565b611ed6919061387c565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f3b9190612e06565b60206040518083038186803b158015611f5357600080fd5b505afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b91906132a8565b905090565b6000806120167f4133195bc7940f798f6c0d2769029a7998f082e11142f33a6ab26fd3fa5d92ca856000016020810190611fca9190612952565b86602001358760400135886060016020810190611fe79190612952565b604051602001611ffb9594939291906138fa565b60405160208183030381529060405280519060200120612291565b905061202281846122ab565b91505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b60045481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da90612ed1565b60405180910390fd5b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690612fd2565b60405180910390fd5b61217884610fbb565b8211156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190613999565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016121f59291906139b9565b602060405180830381600087803b15801561220f57600080fd5b505af1158015612223573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224791906134d1565b612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906136ab565b60405180910390fd5b600190509392505050565b60006122a461229e6122d2565b836123ec565b9050919050565b60008060006122ba858561241f565b915091506122c7816124a2565b819250505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561234e57507f000000000000000000000000000000000000000000000000000000000000000046145b1561237b577f000000000000000000000000000000000000000000000000000000000000000090506123e9565b6123e67f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612677565b90505b90565b60008282604051602001612401929190613a5a565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156124615760008060006020860151925060408601519150606086015160001a9050612455878285856126b1565b9450945050505061249b565b6040835114156124925760008060208501519150604085015190506124878683836127be565b93509350505061249b565b60006002915091505b9250929050565b600060048111156124b6576124b5613a91565b5b8160048111156124c9576124c8613a91565b5b14156124d457612674565b600160048111156124e8576124e7613a91565b5b8160048111156124fb576124fa613a91565b5b141561253c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390613b0c565b60405180910390fd5b600260048111156125505761254f613a91565b5b81600481111561256357612562613a91565b5b14156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90613b78565b60405180910390fd5b600360048111156125b8576125b7613a91565b5b8160048111156125cb576125ca613a91565b5b141561260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260390613c0a565b60405180910390fd5b60048081111561261f5761261e613a91565b5b81600481111561263257612631613a91565b5b1415612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90613c9c565b60405180910390fd5b5b50565b60008383834630604051602001612692959493929190613cbc565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156126ec5760006003915091506127b5565b601b8560ff16141580156127045750601c8560ff1614155b156127165760006004915091506127b5565b60006001878787876040516000815260200160405260405161273b9493929190613d2b565b6020604051602081039080840390855afa15801561275d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127ac576000600192509250506127b5565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6128019190613165565b905061280f878288856126b1565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61284481612831565b811461284f57600080fd5b50565b6000813590506128618161283b565b92915050565b60006020828403121561287d5761287c612827565b5b600061288b84828501612852565b91505092915050565b60008115159050919050565b6128a981612894565b82525050565b60006020820190506128c460008301846128a0565b92915050565b6128d381612831565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291f826128f4565b9050919050565b61292f81612914565b811461293a57600080fd5b50565b60008135905061294c81612926565b92915050565b60006020828403121561296857612967612827565b5b60006129768482850161293d565b91505092915050565b600080fd5b60006080828403121561299a5761299961297f565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129c8576129c76129a3565b5b8235905067ffffffffffffffff8111156129e5576129e46129a8565b5b602083019150836001820283011115612a0157612a006129ad565b5b9250929050565b600080600080600060e08688031215612a2457612a23612827565b5b6000612a328882890161293d565b9550506020612a4388828901612852565b9450506040612a5488828901612984565b93505060c086013567ffffffffffffffff811115612a7557612a7461282c565b5b612a81888289016129b2565b92509250509295509295909350565b612a9981612894565b8114612aa457600080fd5b50565b600081359050612ab681612a90565b92915050565b60008060408385031215612ad357612ad2612827565b5b6000612ae18582860161293d565b9250506020612af285828601612aa7565b9150509250929050565b60008060408385031215612b1357612b12612827565b5b6000612b218582860161293d565b9250506020612b3285828601612852565b9150509250929050565b600080600060a08486031215612b5557612b54612827565b5b6000612b6386828701612984565b935050608084013567ffffffffffffffff811115612b8457612b8361282c565b5b612b90868287016129b2565b92509250509250925092565b6000612ba7826128f4565b9050919050565b612bb781612b9c565b8114612bc257600080fd5b50565b600081359050612bd481612bae565b92915050565b60008060408385031215612bf157612bf0612827565b5b6000612bff85828601612bc5565b9250506020612c1085828601612852565b9150509250929050565b60008060408385031215612c3157612c30612827565b5b6000612c3f85828601612852565b9250506020612c5085828601612852565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ca882612c5f565b810181811067ffffffffffffffff82111715612cc757612cc6612c70565b5b80604052505050565b6000612cda61281d565b9050612ce68282612c9f565b919050565b600067ffffffffffffffff821115612d0657612d05612c70565b5b612d0f82612c5f565b9050602081019050919050565b82818337600083830152505050565b6000612d3e612d3984612ceb565b612cd0565b905082815260208101848484011115612d5a57612d59612c5a565b5b612d65848285612d1c565b509392505050565b600082601f830112612d8257612d816129a3565b5b8135612d92848260208601612d2b565b91505092915050565b60008060a08385031215612db257612db1612827565b5b6000612dc085828601612984565b925050608083013567ffffffffffffffff811115612de157612de061282c565b5b612ded85828601612d6d565b9150509250929050565b612e0081612914565b82525050565b6000602082019050612e1b6000830184612df7565b92915050565b600080600060608486031215612e3a57612e39612827565b5b6000612e488682870161293d565b9350506020612e5986828701612bc5565b9250506040612e6a86828701612852565b9150509250925092565b600082825260208201905092915050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b6000612ebb600983612e74565b9150612ec682612e85565b602082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b7f4e6f7420656e6f75676820424e4220696e207468652072657365727665000000600082015250565b6000612f27601d83612e74565b9150612f3282612ef1565b602082019050919050565b60006020820190508181036000830152612f5681612f1a565b9050919050565b6000604082019050612f7260008301856128ca565b612f7f60208301846128ca565b9392505050565b7f5468697320746f6b656e206973206e6f7420616c6c6f77656400000000000000600082015250565b6000612fbc601983612e74565b9150612fc782612f86565b602082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f546f6b656e206164647265737320646f6573206e6f74206d6174636800000000600082015250565b6000613028601c83612e74565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f4275796572204164647265737320646f6573206e6f74206d6174636800000000600082015250565b6000613094601c83612e74565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b9050919050565b7f5072696365205369676e657220646f6573206e6f74206d617463680000000000600082015250565b6000613100601b83612e74565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317082612831565b915061317b83612831565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b0576131af613136565b5b828201905092915050565b7f4275792072657175657374206973206578706972656400000000000000000000600082015250565b60006131f1601683612e74565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f596f75206e65656420746f2073656e6420616d6f756e74203e20300000000000600082015250565b600061325d601b83612e74565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b6000815190506132a28161283b565b92915050565b6000602082840312156132be576132bd612827565b5b60006132cc84828501613293565b91505092915050565b7f5468657265206973206e6f7420656e6f7567682062616c616e63650000000000600082015250565b600061330b601b83612e74565b9150613316826132d5565b602082019050919050565b6000602082019050818103600083015261333a816132fe565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665600082015250565b6000613377602083612e74565b915061338282613341565b602082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f596f75206e65656420746f20627579206d6f726520746f6b656e730000000000600082015250565b60006133e3601b83612e74565b91506133ee826133ad565b602082019050919050565b60006020820190508181036000830152613412816133d6565b9050919050565b7f596f75206e65656420746f20627579206c65737320746f6b656e730000000000600082015250565b600061344f601b83612e74565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b600060608201905061349a6000830186612df7565b6134a76020830185612df7565b6134b460408301846128ca565b949350505050565b6000815190506134cb81612a90565b92915050565b6000602082840312156134e7576134e6612827565b5b60006134f5848285016134bc565b91505092915050565b7f5061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000613534600e83612e74565b915061353f826134fe565b602082019050919050565b6000602082019050818103600083015261356381613527565b9050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006135a0600f83612e74565b91506135ab8261356a565b602082019050919050565b600060208201905081810360008301526135cf81613593565b9050919050565b60006060820190506135eb6000830186612df7565b6135f860208301856128ca565b61360560408301846128ca565b949350505050565b60006040820190506136226000830185612df7565b61362f6020830184612df7565b9392505050565b600060408201905061364b6000830185612df7565b61365860208301846128ca565b9392505050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b6000613695600f83612e74565b91506136a08261365f565b602082019050919050565b600060208201905081810360008301526136c481613688565b9050919050565b7f596f75206e65656420746f2073656e6420736f6d65206574686572206f72206260008201527f6e62000000000000000000000000000000000000000000000000000000000000602082015250565b6000613727602283612e74565b9150613732826136cb565b604082019050919050565b600060208201905081810360008301526137568161371a565b9050919050565b6000819050919050565b600061378261377d613778846128f4565b61375d565b6128f4565b9050919050565b600061379482613767565b9050919050565b60006137a682613789565b9050919050565b6137b68161379b565b82525050565b60006060820190506137d160008301866137ad565b6137de60208301856128ca565b6137eb60408301846128ca565b949350505050565b60006137fe82612831565b915061380983612831565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561384257613841613136565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061388782612831565b915061389283612831565b9250826138a2576138a161384d565b5b828204905092915050565b60006138b882612831565b91506138c383612831565b9250828210156138d6576138d5613136565b5b828203905092915050565b6000819050919050565b6138f4816138e1565b82525050565b600060a08201905061390f60008301886138eb565b61391c6020830187612df7565b61392960408301866128ca565b61393660608301856128ca565b6139436080830184612df7565b9695505050505050565b7f4e6f7420656e6f75676820696e20746865207265736572766500000000000000600082015250565b6000613983601983612e74565b915061398e8261394d565b602082019050919050565b600060208201905081810360008301526139b281613976565b9050919050565b60006040820190506139ce60008301856137ad565b6139db60208301846128ca565b9392505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a236002836139e2565b9150613a2e826139ed565b600282019050919050565b6000819050919050565b613a54613a4f826138e1565b613a39565b82525050565b6000613a6582613a16565b9150613a718285613a43565b602082019150613a818284613a43565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613af6601883612e74565b9150613b0182613ac0565b602082019050919050565b60006020820190508181036000830152613b2581613ae9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613b62601f83612e74565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf4602283612e74565b9150613bff82613b98565b604082019050919050565b60006020820190508181036000830152613c2381613be7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c86602283612e74565b9150613c9182613c2a565b604082019050919050565b60006020820190508181036000830152613cb581613c79565b9050919050565b600060a082019050613cd160008301886138eb565b613cde60208301876138eb565b613ceb60408301866138eb565b613cf860608301856128ca565b613d056080830184612df7565b9695505050505050565b600060ff82169050919050565b613d2581613d0f565b82525050565b6000608082019050613d4060008301876138eb565b613d4d6020830186613d1c565b613d5a60408301856138eb565b613d6760608301846138eb565b9594505050505056fea26469706673582212203a386fceedd9bb9510cc9d6003eb9fc4e4c164942ed2e7e4d9cdd3e7ff295e3e64736f6c6343000809003300000000000000000000000027cd006548df7c8c8e9fdc4a67fa05c2e3ca5cf9000000000000000000000000d4cebf272461513bfb4e12100d0533dad4afdbc00000000000000000000000001f7d3277fe30e3cf8710b90520338f1d18564e9a
Deployed ByteCode
0x6080604052600436106101395760003560e01c80638bfbda73116100ab578063b8c90b341161006f578063b8c90b3414610445578063c3ffb88414610482578063c4af3b86146104ad578063daf9c210146104ea578063ddca3f4314610527578063f5537ede1461055257610140565b80638bfbda731461035b5780639cfa0f7c1461038b578063a9059cbb146103b6578063aa9c641b146103f3578063b3eed54b1461041c57610140565b806369bb4dc2116100fd57806369bb4dc21461024d57806369fe0e2d1461027857806376ce28f1146102a15780637764b4d2146102ca57806385bc7071146102f35780638b7afe2e1461033057610140565b806314174f33146101425780633b574beb1461017f57806363323ddd146101aa5780636515886a146101d357806366e3e5e41461021057610140565b3661014057005b005b34801561014e57600080fd5b5061016960048036038101906101649190612867565b61058f565b60405161017691906128af565b60405180910390f35b34801561018b57600080fd5b50610194610716565b6040516101a191906128d9565b60405180910390f35b3480156101b657600080fd5b506101d160048036038101906101cc9190612952565b61071c565b005b3480156101df57600080fd5b506101fa60048036038101906101f59190612a08565b6107f0565b60405161020791906128af565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612952565b610fbb565b60405161024491906128d9565b60405180910390f35b34801561025957600080fd5b5061026261104d565b60405161026f91906128d9565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190612867565b611209565b005b3480156102ad57600080fd5b506102c860048036038101906102c39190612abc565b6112a3565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190612952565b61138e565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190612afc565b611462565b60405161032791906128af565b60405180910390f35b34801561033c57600080fd5b506103456116c3565b60405161035291906128d9565b60405180910390f35b61037560048036038101906103709190612b3c565b6116cb565b60405161038291906128af565b60405180910390f35b34801561039757600080fd5b506103a0611bee565b6040516103ad91906128d9565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190612bda565b611bf4565b6040516103ea91906128af565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190612867565b611d5c565b005b34801561042857600080fd5b50610443600480360381019061043e9190612867565b611df6565b005b34801561045157600080fd5b5061046c60048036038101906104679190612c1a565b611e90565b60405161047991906128d9565b60405180910390f35b34801561048e57600080fd5b50610497611edf565b6040516104a491906128d9565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612d9b565b611f90565b6040516104e19190612e06565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612952565b61202b565b60405161051e91906128af565b60405180910390f35b34801561053357600080fd5b5061053c61204b565b60405161054991906128d9565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190612e21565b612051565b60405161058691906128af565b60405180910390f35b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061890612ed1565b60405180910390fd5b6106296116c3565b82111561066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066290612f3d565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156106d3573d6000803e3d6000fd5b507fcd0c1bd6f3d36134628c5a399036d519d4dd51678a085a425a750d6ebf119c038247604051610705929190612f5d565b60405180910390a160019050919050565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a390612ed1565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612fd2565b60405180910390fd5b60006108ce8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f90565b90508460600160208101906108e39190612952565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109479061303e565b60405180910390fd5b8460000160208101906109639190612952565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906130aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613116565b60405180910390fd5b61012c8560400135610a729190613165565b4210610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90613207565b60405180910390fd5b600087905060008711610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af290613273565b60405180910390fd5b868173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610b359190612e06565b60206040518083038186803b158015610b4d57600080fd5b505afa158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8591906132a8565b1015610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd90613321565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610c449190612e06565b60206040518083038186803b158015610c5c57600080fd5b505afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906132a8565b90506000610ca6898960200135611e90565b905081811115610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce29061338d565b60405180910390fd5b60006005541115610d3c57600554811015610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d32906133f9565b60405180910390fd5b5b60006006541115610d8d57600654811115610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390613465565b60405180910390fd5b5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd33308c6040518463ffffffff1660e01b8152600401610dca93929190613485565b602060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1c91906134d1565b610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061354a565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401610eda93929190613485565b602060405180830381600087803b158015610ef457600080fd5b505af1158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906134d1565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906135b6565b60405180910390fd5b7f28cab0d660ed8aedd61a8c9db00b97f6a2d67e07d87795994f440b18bc5f1aa333828a60200135604051610fa2939291906135d6565b60405180910390a1600194505050505095945050505050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ff69190612e06565b60206040518083038186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104691906132a8565b9050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016110cb9190612e06565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b91906132a8565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b815260040161119d92919061360d565b60206040518083038186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906132a8565b9050808211611200578192505050611206565b80925050505b90565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090612ed1565b60405180910390fd5b8060048190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90612ed1565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612ed1565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90612ed1565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790612fd2565b60405180910390fd5b61158983610fbb565b8211156115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290612f3d565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611628929190613636565b602060405180830381600087803b15801561164257600080fd5b505af1158015611656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167a91906134d1565b6116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b0906136ab565b60405180910390fd5b6001905092915050565b600047905090565b60008061171c8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f90565b90508460000160208101906117319190612952565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611795906130aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613116565b60405180910390fd5b61012c85604001356118409190613165565b4210611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613207565b60405180910390fd5b600034905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119049190612e06565b60206040518083038186803b15801561191c57600080fd5b505afa158015611930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195491906132a8565b905060008211611999576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119909061373d565b60405180910390fd5b60006119a9838960200135611e90565b9050818111156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061338d565b60405180910390fd5b60006005541115611a3f57600554811015611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906133f9565b60405180910390fd5b5b60006006541115611a9057600654811115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613465565b60405180910390fd5b5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401611b0f93929190613485565b602060405180830381600087803b158015611b2957600080fd5b505af1158015611b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6191906134d1565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906135b6565b60405180910390fd5b7f28cab0d660ed8aedd61a8c9db00b97f6a2d67e07d87795994f440b18bc5f1aa333828a60200135604051611bd7939291906135d6565b60405180910390a160019450505050509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90612ed1565b60405180910390fd5b611c8e6116c3565b821115611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790612f3d565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611d16573d6000803e3d6000fd5b507f7fa9aafeb8bb803d77de5d84bc2f2edbd842ca91b20cd5020aa21dfe26ab0be9838347604051611d4a939291906137bc565b60405180910390a16001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390612ed1565b60405180910390fd5b8060068190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90612ed1565b60405180910390fd5b8060058190555050565b60008061271060045485611ea491906137f3565b611eae919061387c565b84611eb991906138ad565b90508281633b9aca00611ecc91906137f3565b611ed6919061387c565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f3b9190612e06565b60206040518083038186803b158015611f5357600080fd5b505afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b91906132a8565b905090565b6000806120167f4133195bc7940f798f6c0d2769029a7998f082e11142f33a6ab26fd3fa5d92ca856000016020810190611fca9190612952565b86602001358760400135886060016020810190611fe79190612952565b604051602001611ffb9594939291906138fa565b60405160208183030381529060405280519060200120612291565b905061202281846122ab565b91505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b60045481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da90612ed1565b60405180910390fd5b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690612fd2565b60405180910390fd5b61217884610fbb565b8211156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190613999565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016121f59291906139b9565b602060405180830381600087803b15801561220f57600080fd5b505af1158015612223573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224791906134d1565b612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906136ab565b60405180910390fd5b600190509392505050565b60006122a461229e6122d2565b836123ec565b9050919050565b60008060006122ba858561241f565b915091506122c7816124a2565b819250505092915050565b60007f00000000000000000000000005f450f71c4fb334d280da2cba4024964f2a5faf73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561234e57507f000000000000000000000000000000000000000000000000000000000000a4ec46145b1561237b577f2394a436edaa2c38609daa81acf7d2cab4c74871668b5045d6ac139c57ebbc8890506123e9565b6123e67f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f9c2c68b57ab1cfca59356e3729c93612ae1d9dda98539cfe43ce2a882584b0d77fe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b3612677565b90505b90565b60008282604051602001612401929190613a5a565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156124615760008060006020860151925060408601519150606086015160001a9050612455878285856126b1565b9450945050505061249b565b6040835114156124925760008060208501519150604085015190506124878683836127be565b93509350505061249b565b60006002915091505b9250929050565b600060048111156124b6576124b5613a91565b5b8160048111156124c9576124c8613a91565b5b14156124d457612674565b600160048111156124e8576124e7613a91565b5b8160048111156124fb576124fa613a91565b5b141561253c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390613b0c565b60405180910390fd5b600260048111156125505761254f613a91565b5b81600481111561256357612562613a91565b5b14156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90613b78565b60405180910390fd5b600360048111156125b8576125b7613a91565b5b8160048111156125cb576125ca613a91565b5b141561260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260390613c0a565b60405180910390fd5b60048081111561261f5761261e613a91565b5b81600481111561263257612631613a91565b5b1415612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90613c9c565b60405180910390fd5b5b50565b60008383834630604051602001612692959493929190613cbc565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156126ec5760006003915091506127b5565b601b8560ff16141580156127045750601c8560ff1614155b156127165760006004915091506127b5565b60006001878787876040516000815260200160405260405161273b9493929190613d2b565b6020604051602081039080840390855afa15801561275d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127ac576000600192509250506127b5565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6128019190613165565b905061280f878288856126b1565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61284481612831565b811461284f57600080fd5b50565b6000813590506128618161283b565b92915050565b60006020828403121561287d5761287c612827565b5b600061288b84828501612852565b91505092915050565b60008115159050919050565b6128a981612894565b82525050565b60006020820190506128c460008301846128a0565b92915050565b6128d381612831565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291f826128f4565b9050919050565b61292f81612914565b811461293a57600080fd5b50565b60008135905061294c81612926565b92915050565b60006020828403121561296857612967612827565b5b60006129768482850161293d565b91505092915050565b600080fd5b60006080828403121561299a5761299961297f565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126129c8576129c76129a3565b5b8235905067ffffffffffffffff8111156129e5576129e46129a8565b5b602083019150836001820283011115612a0157612a006129ad565b5b9250929050565b600080600080600060e08688031215612a2457612a23612827565b5b6000612a328882890161293d565b9550506020612a4388828901612852565b9450506040612a5488828901612984565b93505060c086013567ffffffffffffffff811115612a7557612a7461282c565b5b612a81888289016129b2565b92509250509295509295909350565b612a9981612894565b8114612aa457600080fd5b50565b600081359050612ab681612a90565b92915050565b60008060408385031215612ad357612ad2612827565b5b6000612ae18582860161293d565b9250506020612af285828601612aa7565b9150509250929050565b60008060408385031215612b1357612b12612827565b5b6000612b218582860161293d565b9250506020612b3285828601612852565b9150509250929050565b600080600060a08486031215612b5557612b54612827565b5b6000612b6386828701612984565b935050608084013567ffffffffffffffff811115612b8457612b8361282c565b5b612b90868287016129b2565b92509250509250925092565b6000612ba7826128f4565b9050919050565b612bb781612b9c565b8114612bc257600080fd5b50565b600081359050612bd481612bae565b92915050565b60008060408385031215612bf157612bf0612827565b5b6000612bff85828601612bc5565b9250506020612c1085828601612852565b9150509250929050565b60008060408385031215612c3157612c30612827565b5b6000612c3f85828601612852565b9250506020612c5085828601612852565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ca882612c5f565b810181811067ffffffffffffffff82111715612cc757612cc6612c70565b5b80604052505050565b6000612cda61281d565b9050612ce68282612c9f565b919050565b600067ffffffffffffffff821115612d0657612d05612c70565b5b612d0f82612c5f565b9050602081019050919050565b82818337600083830152505050565b6000612d3e612d3984612ceb565b612cd0565b905082815260208101848484011115612d5a57612d59612c5a565b5b612d65848285612d1c565b509392505050565b600082601f830112612d8257612d816129a3565b5b8135612d92848260208601612d2b565b91505092915050565b60008060a08385031215612db257612db1612827565b5b6000612dc085828601612984565b925050608083013567ffffffffffffffff811115612de157612de061282c565b5b612ded85828601612d6d565b9150509250929050565b612e0081612914565b82525050565b6000602082019050612e1b6000830184612df7565b92915050565b600080600060608486031215612e3a57612e39612827565b5b6000612e488682870161293d565b9350506020612e5986828701612bc5565b9250506040612e6a86828701612852565b9150509250925092565b600082825260208201905092915050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b6000612ebb600983612e74565b9150612ec682612e85565b602082019050919050565b60006020820190508181036000830152612eea81612eae565b9050919050565b7f4e6f7420656e6f75676820424e4220696e207468652072657365727665000000600082015250565b6000612f27601d83612e74565b9150612f3282612ef1565b602082019050919050565b60006020820190508181036000830152612f5681612f1a565b9050919050565b6000604082019050612f7260008301856128ca565b612f7f60208301846128ca565b9392505050565b7f5468697320746f6b656e206973206e6f7420616c6c6f77656400000000000000600082015250565b6000612fbc601983612e74565b9150612fc782612f86565b602082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f546f6b656e206164647265737320646f6573206e6f74206d6174636800000000600082015250565b6000613028601c83612e74565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f4275796572204164647265737320646f6573206e6f74206d6174636800000000600082015250565b6000613094601c83612e74565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b9050919050565b7f5072696365205369676e657220646f6573206e6f74206d617463680000000000600082015250565b6000613100601b83612e74565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317082612831565b915061317b83612831565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b0576131af613136565b5b828201905092915050565b7f4275792072657175657374206973206578706972656400000000000000000000600082015250565b60006131f1601683612e74565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b7f596f75206e65656420746f2073656e6420616d6f756e74203e20300000000000600082015250565b600061325d601b83612e74565b915061326882613227565b602082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b6000815190506132a28161283b565b92915050565b6000602082840312156132be576132bd612827565b5b60006132cc84828501613293565b91505092915050565b7f5468657265206973206e6f7420656e6f7567682062616c616e63650000000000600082015250565b600061330b601b83612e74565b9150613316826132d5565b602082019050919050565b6000602082019050818103600083015261333a816132fe565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665600082015250565b6000613377602083612e74565b915061338282613341565b602082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f596f75206e65656420746f20627579206d6f726520746f6b656e730000000000600082015250565b60006133e3601b83612e74565b91506133ee826133ad565b602082019050919050565b60006020820190508181036000830152613412816133d6565b9050919050565b7f596f75206e65656420746f20627579206c65737320746f6b656e730000000000600082015250565b600061344f601b83612e74565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b600060608201905061349a6000830186612df7565b6134a76020830185612df7565b6134b460408301846128ca565b949350505050565b6000815190506134cb81612a90565b92915050565b6000602082840312156134e7576134e6612827565b5b60006134f5848285016134bc565b91505092915050565b7f5061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000613534600e83612e74565b915061353f826134fe565b602082019050919050565b6000602082019050818103600083015261356381613527565b9050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006135a0600f83612e74565b91506135ab8261356a565b602082019050919050565b600060208201905081810360008301526135cf81613593565b9050919050565b60006060820190506135eb6000830186612df7565b6135f860208301856128ca565b61360560408301846128ca565b949350505050565b60006040820190506136226000830185612df7565b61362f6020830184612df7565b9392505050565b600060408201905061364b6000830185612df7565b61365860208301846128ca565b9392505050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b6000613695600f83612e74565b91506136a08261365f565b602082019050919050565b600060208201905081810360008301526136c481613688565b9050919050565b7f596f75206e65656420746f2073656e6420736f6d65206574686572206f72206260008201527f6e62000000000000000000000000000000000000000000000000000000000000602082015250565b6000613727602283612e74565b9150613732826136cb565b604082019050919050565b600060208201905081810360008301526137568161371a565b9050919050565b6000819050919050565b600061378261377d613778846128f4565b61375d565b6128f4565b9050919050565b600061379482613767565b9050919050565b60006137a682613789565b9050919050565b6137b68161379b565b82525050565b60006060820190506137d160008301866137ad565b6137de60208301856128ca565b6137eb60408301846128ca565b949350505050565b60006137fe82612831565b915061380983612831565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561384257613841613136565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061388782612831565b915061389283612831565b9250826138a2576138a161384d565b5b828204905092915050565b60006138b882612831565b91506138c383612831565b9250828210156138d6576138d5613136565b5b828203905092915050565b6000819050919050565b6138f4816138e1565b82525050565b600060a08201905061390f60008301886138eb565b61391c6020830187612df7565b61392960408301866128ca565b61393660608301856128ca565b6139436080830184612df7565b9695505050505050565b7f4e6f7420656e6f75676820696e20746865207265736572766500000000000000600082015250565b6000613983601983612e74565b915061398e8261394d565b602082019050919050565b600060208201905081810360008301526139b281613976565b9050919050565b60006040820190506139ce60008301856137ad565b6139db60208301846128ca565b9392505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a236002836139e2565b9150613a2e826139ed565b600282019050919050565b6000819050919050565b613a54613a4f826138e1565b613a39565b82525050565b6000613a6582613a16565b9150613a718285613a43565b602082019150613a818284613a43565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613af6601883612e74565b9150613b0182613ac0565b602082019050919050565b60006020820190508181036000830152613b2581613ae9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613b62601f83612e74565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf4602283612e74565b9150613bff82613b98565b604082019050919050565b60006020820190508181036000830152613c2381613be7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c86602283612e74565b9150613c9182613c2a565b604082019050919050565b60006020820190508181036000830152613cb581613c79565b9050919050565b600060a082019050613cd160008301886138eb565b613cde60208301876138eb565b613ceb60408301866138eb565b613cf860608301856128ca565b613d056080830184612df7565b9695505050505050565b600060ff82169050919050565b613d2581613d0f565b82525050565b6000608082019050613d4060008301876138eb565b613d4d6020830186613d1c565b613d5a60408301856138eb565b613d6760608301846138eb565b9594505050505056fea26469706673582212203a386fceedd9bb9510cc9d6003eb9fc4e4c164942ed2e7e4d9cdd3e7ff295e3e64736f6c63430008090033