Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 109 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 19781155 | 117 days ago | IN | 0 ETH | 0.00034496 | ||||
Approve | 19235535 | 194 days ago | IN | 0 ETH | 0.00581538 | ||||
Approve | 19235527 | 194 days ago | IN | 0 ETH | 0.00427788 | ||||
Approve | 19216645 | 197 days ago | IN | 0 ETH | 0.00095215 | ||||
Approve | 19201513 | 199 days ago | IN | 0 ETH | 0.00115663 | ||||
Approve | 19192291 | 200 days ago | IN | 0 ETH | 0.00394548 | ||||
Approve | 19188955 | 201 days ago | IN | 0 ETH | 0.00220676 | ||||
Approve | 19188528 | 201 days ago | IN | 0 ETH | 0.00250589 | ||||
Approve | 19188521 | 201 days ago | IN | 0 ETH | 0.00250788 | ||||
Approve | 19188419 | 201 days ago | IN | 0 ETH | 0.0020502 | ||||
Approve | 19188357 | 201 days ago | IN | 0 ETH | 0.00211385 | ||||
Transfer | 19188341 | 201 days ago | IN | 0 ETH | 0.04597235 | ||||
Approve | 19188318 | 201 days ago | IN | 0 ETH | 0.00227041 | ||||
Approve | 19188315 | 201 days ago | IN | 0 ETH | 0.002368 | ||||
Approve | 19188247 | 201 days ago | IN | 0 ETH | 0.00225397 | ||||
Approve | 19188244 | 201 days ago | IN | 0 ETH | 0.00234723 | ||||
Approve | 19188221 | 201 days ago | IN | 0 ETH | 0.00262349 | ||||
Approve | 19188212 | 201 days ago | IN | 0 ETH | 0.00285953 | ||||
Approve | 19188181 | 201 days ago | IN | 0 ETH | 0.00289154 | ||||
Approve | 19188173 | 201 days ago | IN | 0 ETH | 0.0024633 | ||||
Approve | 19188171 | 201 days ago | IN | 0 ETH | 0.00248973 | ||||
Approve | 19188152 | 201 days ago | IN | 0 ETH | 0.00226421 | ||||
Approve | 19188141 | 201 days ago | IN | 0 ETH | 0.00233568 | ||||
Approve | 19188127 | 201 days ago | IN | 0 ETH | 0.0026977 | ||||
Approve | 19188100 | 201 days ago | IN | 0 ETH | 0.00261701 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CryptoFamily
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-09 */ /* SPDX-License-Identifier: UNLICENSED Blending NFTs and ERC20 Tokens together the 404 Crypto Family is ready to take control over the crypto underground. https://twitter.com/404CryptoFamily https://404cryptofamily.com/ https://t.me/CryptoFamily404 */ pragma solidity 0.8.20; library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } contract CryptoFamily is Ownable { // Events event ERC20Transfer( address indexed from, address indexed to, uint256 amount ); event Approval( address indexed owner, address indexed spender, uint256 amount ); event Transfer( address indexed from, address indexed to, uint256 indexed id ); event ERC721Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); error InvalidId(); error IdNotAssigned(); error PoolIsEmpty(); error InvalidSetWhitelistCondition(); bool private Tradingmode = true; // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// NFT Metadata /// @dev Base URI for token metadata string public baseTokenURI; /// max supply of native tokens uint256 public erc721totalSupply; /// @dev Array of available ids uint256[] public tokenIdPool; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public maxMintedId; // Mappings /// @dev Mapping to check if id is assigned mapping(uint256 => bool) private idAssigned; /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) internal _owned; /// @dev Tracks indices for the _owned mapping mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; // Constructor constructor() Ownable(msg.sender) { name = "Crypto Family"; symbol = "404"; decimals = 18; erc721totalSupply = 200; totalSupply = erc721totalSupply * (10 ** decimals); whitelist[msg.sender] = true; balanceOf[msg.sender] = totalSupply; } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { whitelist[target] = state; } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function tokenURI(uint256 id) public view returns (string memory) { if (id >= totalSupply || id <= 0) { revert InvalidId(); } return string.concat( string.concat(baseTokenURI, Strings.toString(id)), ".json" ); } function setTradingmode(bool _Tradingmode) public onlyOwner { Tradingmode = _Tradingmode; } /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve( address spender, uint256 amountOrId ) public returns (bool) { if (amountOrId <= maxMintedId && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom(address from, address to, uint256 amountOrId) public { if (amountOrId <= erc721totalSupply) { if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if ( msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId] ) { revert Unauthorized(); } balanceOf[from] -= _getUnit(); unchecked { balanceOf[to] += _getUnit(); } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); emit ERC20Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amountOrId; _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer(address to, uint256 amount) public returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom(address from, address to, uint256 id) public { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer( address from, address to, uint256 amount ) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } if (!Tradingmode) { //skip burn when we add LP // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 10 ** decimals; } function _randomIdFromPool() private returns (uint256) { if (tokenIdPool.length == 0) { revert PoolIsEmpty(); } uint256 randomIndex = uint256( keccak256(abi.encodePacked(block.timestamp, msg.sender,tokenIdPool.length)) ) % tokenIdPool.length; uint256 id = tokenIdPool[randomIndex]; tokenIdPool[randomIndex] = tokenIdPool[tokenIdPool.length - 1]; tokenIdPool.pop(); idAssigned[id] = true; return id; } function _returnIdToPool(uint256 id) private { if (!idAssigned[id]) { revert IdNotAssigned(); } tokenIdPool.push(id); idAssigned[id] = false; } function _mint(address to) internal { if (to == address(0)) { revert InvalidRecipient(); } uint256 id; if (maxMintedId < erc721totalSupply) { maxMintedId++; id = maxMintedId; idAssigned[id] = true; } else if (tokenIdPool.length > 0) { id = _randomIdFromPool(); } else { revert PoolIsEmpty(); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal { if (from == address(0)) { revert InvalidSender(); } uint256 id = _owned[from][_owned[from].length - 1]; _returnIdToPool(id); _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function setNameSymbol( string memory _name, string memory _symbol ) public onlyOwner { name = _name; symbol = _symbol; } function getTokenIdPool() public view returns (uint256[] memory) { return tokenIdPool; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"IdNotAssigned","type":"error"},{"inputs":[],"name":"InvalidId","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSetWhitelistCondition","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"PoolIsEmpty","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc721totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenIdPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_Tradingmode","type":"bool"}],"name":"setTradingmode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040525f805460ff60a01b1916600160a01b17905534801562000022575f80fd5b50338062000043576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152600d81526c43727970746f2046616d696c7960981b6020820152600190620000be9082620001e0565b506040805180820190915260038152620d0c0d60ea1b6020820152600290620000e89082620001e0565b506012608081905260c86004556200010290600a620003b7565b600454620001119190620003ce565b60a0819052335f908152600f60209081526040808320805460ff191660011790556008909152902055620003e8565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200016957607f821691505b6020821081036200018857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001db575f81815260208120601f850160051c81016020861015620001b65750805b601f850160051c820191505b81811015620001d757828155600101620001c2565b5050505b505050565b81516001600160401b03811115620001fc57620001fc62000140565b62000214816200020d845462000154565b846200018e565b602080601f8311600181146200024a575f8415620002325750858301515b5f19600386901b1c1916600185901b178555620001d7565b5f85815260208120601f198616915b828110156200027a5788860151825594840194600190910190840162000259565b50858210156200029857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620002fc57815f1904821115620002e057620002e0620002a8565b80851615620002ee57918102915b93841c9390800290620002c1565b509250929050565b5f826200031457506001620003b1565b816200032257505f620003b1565b81600181146200033b5760028114620003465762000366565b6001915050620003b1565b60ff8411156200035a576200035a620002a8565b50506001821b620003b1565b5060208310610133831016604e8410600b84101617156200038b575081810a620003b1565b620003978383620002bc565b805f1904821115620003ad57620003ad620002a8565b0290505b92915050565b5f620003c760ff84168362000304565b9392505050565b8082028115828204841417620003b157620003b1620002a8565b60805160a0516120fd620004185f395f81816102670152610f0f01525f81816102b401526110eb01526120fd5ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638da5cb5b116100fe578063b88d4fde1161009e578063dd62ed3e1161006e578063dd62ed3e1461041e578063e0df5b6f14610448578063e985e9c51461045b578063f2fde38b14610488575f80fd5b8063b88d4fde146103dd578063c87b56dd146103f0578063ca4c0e0914610403578063d547cfb714610416575f80fd5b8063a22cb465116100d9578063a22cb4651461038f578063a9059cbb146103a2578063a9e2880e146103b5578063afe0cae1146103ca575f80fd5b80638da5cb5b1461035357806395d89b41146103655780639b19251a1461036d575f80fd5b80632c88797e11610169578063504334c211610144578063504334c2146102fb57806353d6fd591461030e5780636352211e1461032157806370a0823114610334575f80fd5b80632c88797e146102a6578063313ce567146102af57806342842e0e146102e8575f80fd5b8063095ea7b3116101a4578063095ea7b31461023f57806318160ddd1461026257806323b872dd146102895780632b9689581461029e575f80fd5b806306fdde03146101ca57806307c56001146101e8578063081812fc146101ff575b5f80fd5b6101d261049b565b6040516101df919061193c565b60405180910390f35b6101f160065481565b6040519081526020016101df565b61022761020d36600461196e565b600a6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b61025261024d36600461199b565b610527565b60405190151581526020016101df565b6101f17f000000000000000000000000000000000000000000000000000000000000000081565b61029c6102973660046119c3565b61067f565b005b61029c610a3a565b6101f160045481565b6102d67f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101df565b61029c6102f63660046119c3565b610aab565b61029c610309366004611a99565b610bc6565b61029c61031c366004611b08565b610c08565b61022761032f36600461196e565b610c5b565b6101f1610342366004611b39565b60086020525f908152604090205481565b5f54610227906001600160a01b031681565b6101d2610cae565b61025261037b366004611b39565b600f6020525f908152604090205460ff1681565b61029c61039d366004611b08565b610cbb565b6102526103b036600461199b565b610d26565b6103bd610d39565b6040516101df9190611b52565b61029c6103d8366004611b95565b610d8f565b61029c6103eb366004611bae565b610e01565b6101d26103fe36600461196e565b610f0b565b6101f161041136600461196e565b610fc0565b6101d2610fdf565b6101f161042c366004611c41565b600960209081525f928352604080842090915290825290205481565b61029c610456366004611c69565b610fec565b610252610469366004611c41565b600b60209081525f928352604080842090915290825290205460ff1681565b61029c610496366004611b39565b611025565b600180546104a890611ca3565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611ca3565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b505050505081565b5f600654821115801561053957505f82115b1561061a575f828152600c60205260409020546001600160a01b031633811480159061058857506001600160a01b0381165f908152600b6020908152604080832033845290915290205460ff16155b156105a5576040516282b42960e81b815260040160405180910390fd5b5f838152600a6020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610675565b335f8181526009602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60045481116109ce575f818152600c60205260409020546001600160a01b038481169116146106da576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661071a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b0384161480159061075657506001600160a01b0383165f908152600b6020908152604080832033845290915290205460ff16155b801561077857505f818152600a60205260409020546001600160a01b03163314155b15610795576040516282b42960e81b815260040160405180910390fd5b61079d6110e5565b6001600160a01b0384165f90815260086020526040812080549091906107c4908490611cef565b909155506107d290506110e5565b6001600160a01b038084165f8181526008602090815260408083208054909601909555858252600c8152848220805473ffffffffffffffffffffffffffffffffffffffff199081169094179055600a815284822080549093169092559186168252600d9052908120805461084890600190611cef565b8154811061085857610858611d02565b5f9182526020808320909101546001600160a01b0387168352600d82526040808420868552600e9093529092205481549293508392811061089b5761089b611d02565b5f9182526020808320909101929092556001600160a01b0386168152600d909152604090208054806108cf576108cf611d16565b5f828152602080822083015f19908101839055909201909255838252600e8152604080832054848452818420556001600160a01b038616808452600d835290832080546001818101835582865293852001869055925290546109319190611cef565b5f838152600e602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876109b76110e5565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526009602090815260408083203384529091529020545f198114610a2757610a038282611cef565b6001600160a01b0385165f9081526009602090815260408083203384529091529020555b610a32848484611116565b50505b505050565b5f546001600160a01b03163314610a63576040516282b42960e81b815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff1916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ab683838361067f565b6001600160a01b0382163b15801590610b8f57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190611d2a565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610a35576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f546001600160a01b03163314610bef576040516282b42960e81b815260040160405180910390fd5b6001610bfb8382611db6565b506002610a358282611db6565b5f546001600160a01b03163314610c31576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600f60205260409020805460ff1916911515919091179055565b5f818152600c60205260409020546001600160a01b031680610ca9576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104a890611ca3565b335f818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610d32338484611116565b9392505050565b60606005805480602002602001604051908101604052809291908181526020018280548015610d8557602002820191905f5260205f20905b815481526020019060010190808311610d71575b5050505050905090565b5f546001600160a01b03163314610db8576040516282b42960e81b815260040160405180910390fd5b5f805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610e0c85858561067f565b6001600160a01b0384163b15801590610ed457506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290610e6f9033908a90899089908990600401611e72565b6020604051808303815f875af1158015610e8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf9190611d2a565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610a32576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60607f000000000000000000000000000000000000000000000000000000000000000082101580610f3a575081155b15610f71576040517fdfa1a40800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003610f7c836112f8565b604051602001610f8d929190611ec4565b60408051601f1981840301815290829052610faa91602001611f47565b6040516020818303038152906040529050919050565b60058181548110610fcf575f80fd5b5f91825260209091200154905081565b600380546104a890611ca3565b5f546001600160a01b03163314611015576040516282b42960e81b815260040160405180910390fd5b60036110218282611db6565b5050565b5f546001600160a01b0316331461104e576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03811661108e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f6111117f0000000000000000000000000000000000000000000000000000000000000000600a612067565b905090565b5f806111206110e5565b6001600160a01b038087165f818152600860205260408082208054948a168352908220549282529394509192909186919061115b8386611cef565b90915550506001600160a01b0386165f9081526008602052604081208054870190555474010000000000000000000000000000000000000000900460ff1661129e576001600160a01b0387165f908152600f602052604090205460ff1661121d576001600160a01b0387165f908152600860205260408120546111df908590612089565b6111e98585612089565b6111f39190611cef565b90505f5b8181101561121a5761120889611395565b806112128161209c565b9150506111f7565b50505b6001600160a01b0386165f908152600f602052604090205460ff1661129e575f6112478483612089565b6001600160a01b0388165f9081526008602052604090205461126a908690612089565b6112749190611cef565b90505f5b8181101561129b57611289886114d9565b806112938161209c565b915050611278565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516112e391815260200190565b60405180910390a35060019695505050505050565b60605f61130483611653565b60010190505f8167ffffffffffffffff811115611323576113236119fc565b6040519080825280601f01601f19166020018201604052801561134d576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461135757509392505050565b6001600160a01b0381166113d5576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381165f908152600d6020526040812080546113fa90600190611cef565b8154811061140a5761140a611d02565b905f5260205f200154905061141e81611734565b6001600160a01b0382165f908152600d6020526040902080548061144457611444611d16565b5f828152602080822083015f19908101839055909201909255828252600e81526040808320839055600c8252808320805473ffffffffffffffffffffffffffffffffffffffff19908116909155600a9092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116611519576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454600654101561155c5760068054905f6115358361209c565b90915550506006545f818152600760205260409020805460ff1916600117905590506115a5565b600554156115735761156c6117c2565b90506115a5565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f818152600c60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716908117909155808452600d835290832080546001818101835582865293852001859055925290546116099190611cef565b5f828152600e602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061169b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106116c7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106116e557662386f26fc10000830492506010015b6305f5e10083106116fd576305f5e100830492506008015b612710831061171157612710830492506004015b60648310611723576064830492506002015b600a83106106795760010192915050565b5f8181526007602052604090205460ff1661177b576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058054600181019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018190555f908152600760205260409020805460ff19169055565b6005545f9081036117ff576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080514260208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1691810191909152605481018290525f9190607401604051602081830303815290604052805190602001205f1c61186891906120b4565b90505f6005828154811061187e5761187e611d02565b905f5260205f20015490506005600160058054905061189d9190611cef565b815481106118ad576118ad611d02565b905f5260205f200154600583815481106118c9576118c9611d02565b5f9182526020909120015560058054806118e5576118e5611d16565b5f828152602080822083015f199081018390559092019092558282526007905260409020805460ff1916600117905592915050565b5f5b8381101561193457818101518382015260200161191c565b50505f910152565b602081525f825180602084015261195a81604085016020870161191a565b601f01601f19169190910160400192915050565b5f6020828403121561197e575f80fd5b5035919050565b80356001600160a01b0381168114610ca9575f80fd5b5f80604083850312156119ac575f80fd5b6119b583611985565b946020939093013593505050565b5f805f606084860312156119d5575f80fd5b6119de84611985565b92506119ec60208501611985565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611a1f575f80fd5b813567ffffffffffffffff80821115611a3a57611a3a6119fc565b604051601f8301601f19908116603f01168101908282118183101715611a6257611a626119fc565b81604052838152866020858801011115611a7a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aaa575f80fd5b823567ffffffffffffffff80821115611ac1575f80fd5b611acd86838701611a10565b93506020850135915080821115611ae2575f80fd5b50611aef85828601611a10565b9150509250929050565b80358015158114610ca9575f80fd5b5f8060408385031215611b19575f80fd5b611b2283611985565b9150611b3060208401611af9565b90509250929050565b5f60208284031215611b49575f80fd5b610d3282611985565b602080825282518282018190525f9190848201906040850190845b81811015611b8957835183529284019291840191600101611b6d565b50909695505050505050565b5f60208284031215611ba5575f80fd5b610d3282611af9565b5f805f805f60808688031215611bc2575f80fd5b611bcb86611985565b9450611bd960208701611985565b935060408601359250606086013567ffffffffffffffff80821115611bfc575f80fd5b818801915088601f830112611c0f575f80fd5b813581811115611c1d575f80fd5b896020828501011115611c2e575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611c52575f80fd5b611c5b83611985565b9150611b3060208401611985565b5f60208284031215611c79575f80fd5b813567ffffffffffffffff811115611c8f575f80fd5b611c9b84828501611a10565b949350505050565b600181811c90821680611cb757607f821691505b602082108103611cd557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561067957610679611cdb565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611d3a575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610d32575f80fd5b601f821115610a35575f81815260208120601f850160051c81016020861015611d8f5750805b601f850160051c820191505b81811015611dae57828155600101611d9b565b505050505050565b815167ffffffffffffffff811115611dd057611dd06119fc565b611de481611dde8454611ca3565b84611d69565b602080601f831160018114611e17575f8415611e005750858301515b5f19600386901b1c1916600185901b178555611dae565b5f85815260208120601f198616915b82811015611e4557888601518255948401946001909101908401611e26565b5085821015611e6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611ed181611ca3565b60018281168015611ee95760018114611efe57611f2a565b60ff1984168752821515830287019450611f2a565b885f526020805f205f5b85811015611f215781548a820152908401908201611f08565b50505082870194505b505050508351611f3e81836020880161191a565b01949350505050565b5f8251611f5881846020870161191a565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b600181815b80851115611fc157815f1904821115611fa757611fa7611cdb565b80851615611fb457918102915b93841c9390800290611f8c565b509250929050565b5f82611fd757506001610679565b81611fe357505f610679565b8160018114611ff957600281146120035761201f565b6001915050610679565b60ff84111561201457612014611cdb565b50506001821b610679565b5060208310610133831016604e8410600b8410161715612042575081810a610679565b61204c8383611f87565b805f190482111561205f5761205f611cdb565b029392505050565b5f610d3260ff841683611fc9565b634e487b7160e01b5f52601260045260245ffd5b5f8261209757612097612075565b500490565b5f5f1982036120ad576120ad611cdb565b5060010190565b5f826120c2576120c2612075565b50069056fea2646970667358221220b064f9e65c9381f9444ffeebb472870a2e48f70e83c593d06fbabc88044571b564736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638da5cb5b116100fe578063b88d4fde1161009e578063dd62ed3e1161006e578063dd62ed3e1461041e578063e0df5b6f14610448578063e985e9c51461045b578063f2fde38b14610488575f80fd5b8063b88d4fde146103dd578063c87b56dd146103f0578063ca4c0e0914610403578063d547cfb714610416575f80fd5b8063a22cb465116100d9578063a22cb4651461038f578063a9059cbb146103a2578063a9e2880e146103b5578063afe0cae1146103ca575f80fd5b80638da5cb5b1461035357806395d89b41146103655780639b19251a1461036d575f80fd5b80632c88797e11610169578063504334c211610144578063504334c2146102fb57806353d6fd591461030e5780636352211e1461032157806370a0823114610334575f80fd5b80632c88797e146102a6578063313ce567146102af57806342842e0e146102e8575f80fd5b8063095ea7b3116101a4578063095ea7b31461023f57806318160ddd1461026257806323b872dd146102895780632b9689581461029e575f80fd5b806306fdde03146101ca57806307c56001146101e8578063081812fc146101ff575b5f80fd5b6101d261049b565b6040516101df919061193c565b60405180910390f35b6101f160065481565b6040519081526020016101df565b61022761020d36600461196e565b600a6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b61025261024d36600461199b565b610527565b60405190151581526020016101df565b6101f17f00000000000000000000000000000000000000000000000ad78ebc5ac620000081565b61029c6102973660046119c3565b61067f565b005b61029c610a3a565b6101f160045481565b6102d67f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101df565b61029c6102f63660046119c3565b610aab565b61029c610309366004611a99565b610bc6565b61029c61031c366004611b08565b610c08565b61022761032f36600461196e565b610c5b565b6101f1610342366004611b39565b60086020525f908152604090205481565b5f54610227906001600160a01b031681565b6101d2610cae565b61025261037b366004611b39565b600f6020525f908152604090205460ff1681565b61029c61039d366004611b08565b610cbb565b6102526103b036600461199b565b610d26565b6103bd610d39565b6040516101df9190611b52565b61029c6103d8366004611b95565b610d8f565b61029c6103eb366004611bae565b610e01565b6101d26103fe36600461196e565b610f0b565b6101f161041136600461196e565b610fc0565b6101d2610fdf565b6101f161042c366004611c41565b600960209081525f928352604080842090915290825290205481565b61029c610456366004611c69565b610fec565b610252610469366004611c41565b600b60209081525f928352604080842090915290825290205460ff1681565b61029c610496366004611b39565b611025565b600180546104a890611ca3565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611ca3565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b505050505081565b5f600654821115801561053957505f82115b1561061a575f828152600c60205260409020546001600160a01b031633811480159061058857506001600160a01b0381165f908152600b6020908152604080832033845290915290205460ff16155b156105a5576040516282b42960e81b815260040160405180910390fd5b5f838152600a6020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610675565b335f8181526009602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60045481116109ce575f818152600c60205260409020546001600160a01b038481169116146106da576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661071a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b0384161480159061075657506001600160a01b0383165f908152600b6020908152604080832033845290915290205460ff16155b801561077857505f818152600a60205260409020546001600160a01b03163314155b15610795576040516282b42960e81b815260040160405180910390fd5b61079d6110e5565b6001600160a01b0384165f90815260086020526040812080549091906107c4908490611cef565b909155506107d290506110e5565b6001600160a01b038084165f8181526008602090815260408083208054909601909555858252600c8152848220805473ffffffffffffffffffffffffffffffffffffffff199081169094179055600a815284822080549093169092559186168252600d9052908120805461084890600190611cef565b8154811061085857610858611d02565b5f9182526020808320909101546001600160a01b0387168352600d82526040808420868552600e9093529092205481549293508392811061089b5761089b611d02565b5f9182526020808320909101929092556001600160a01b0386168152600d909152604090208054806108cf576108cf611d16565b5f828152602080822083015f19908101839055909201909255838252600e8152604080832054848452818420556001600160a01b038616808452600d835290832080546001818101835582865293852001869055925290546109319190611cef565b5f838152600e602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876109b76110e5565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526009602090815260408083203384529091529020545f198114610a2757610a038282611cef565b6001600160a01b0385165f9081526009602090815260408083203384529091529020555b610a32848484611116565b50505b505050565b5f546001600160a01b03163314610a63576040516282b42960e81b815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff1916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ab683838361067f565b6001600160a01b0382163b15801590610b8f57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190611d2a565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610a35576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f546001600160a01b03163314610bef576040516282b42960e81b815260040160405180910390fd5b6001610bfb8382611db6565b506002610a358282611db6565b5f546001600160a01b03163314610c31576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600f60205260409020805460ff1916911515919091179055565b5f818152600c60205260409020546001600160a01b031680610ca9576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104a890611ca3565b335f818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610d32338484611116565b9392505050565b60606005805480602002602001604051908101604052809291908181526020018280548015610d8557602002820191905f5260205f20905b815481526020019060010190808311610d71575b5050505050905090565b5f546001600160a01b03163314610db8576040516282b42960e81b815260040160405180910390fd5b5f805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610e0c85858561067f565b6001600160a01b0384163b15801590610ed457506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290610e6f9033908a90899089908990600401611e72565b6020604051808303815f875af1158015610e8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf9190611d2a565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610a32576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60607f00000000000000000000000000000000000000000000000ad78ebc5ac620000082101580610f3a575081155b15610f71576040517fdfa1a40800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003610f7c836112f8565b604051602001610f8d929190611ec4565b60408051601f1981840301815290829052610faa91602001611f47565b6040516020818303038152906040529050919050565b60058181548110610fcf575f80fd5b5f91825260209091200154905081565b600380546104a890611ca3565b5f546001600160a01b03163314611015576040516282b42960e81b815260040160405180910390fd5b60036110218282611db6565b5050565b5f546001600160a01b0316331461104e576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03811661108e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f6111117f0000000000000000000000000000000000000000000000000000000000000012600a612067565b905090565b5f806111206110e5565b6001600160a01b038087165f818152600860205260408082208054948a168352908220549282529394509192909186919061115b8386611cef565b90915550506001600160a01b0386165f9081526008602052604081208054870190555474010000000000000000000000000000000000000000900460ff1661129e576001600160a01b0387165f908152600f602052604090205460ff1661121d576001600160a01b0387165f908152600860205260408120546111df908590612089565b6111e98585612089565b6111f39190611cef565b90505f5b8181101561121a5761120889611395565b806112128161209c565b9150506111f7565b50505b6001600160a01b0386165f908152600f602052604090205460ff1661129e575f6112478483612089565b6001600160a01b0388165f9081526008602052604090205461126a908690612089565b6112749190611cef565b90505f5b8181101561129b57611289886114d9565b806112938161209c565b915050611278565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516112e391815260200190565b60405180910390a35060019695505050505050565b60605f61130483611653565b60010190505f8167ffffffffffffffff811115611323576113236119fc565b6040519080825280601f01601f19166020018201604052801561134d576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461135757509392505050565b6001600160a01b0381166113d5576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381165f908152600d6020526040812080546113fa90600190611cef565b8154811061140a5761140a611d02565b905f5260205f200154905061141e81611734565b6001600160a01b0382165f908152600d6020526040902080548061144457611444611d16565b5f828152602080822083015f19908101839055909201909255828252600e81526040808320839055600c8252808320805473ffffffffffffffffffffffffffffffffffffffff19908116909155600a9092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116611519576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454600654101561155c5760068054905f6115358361209c565b90915550506006545f818152600760205260409020805460ff1916600117905590506115a5565b600554156115735761156c6117c2565b90506115a5565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f818152600c60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716908117909155808452600d835290832080546001818101835582865293852001859055925290546116099190611cef565b5f828152600e602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061169b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106116c7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106116e557662386f26fc10000830492506010015b6305f5e10083106116fd576305f5e100830492506008015b612710831061171157612710830492506004015b60648310611723576064830492506002015b600a83106106795760010192915050565b5f8181526007602052604090205460ff1661177b576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058054600181019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018190555f908152600760205260409020805460ff19169055565b6005545f9081036117ff576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080514260208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1691810191909152605481018290525f9190607401604051602081830303815290604052805190602001205f1c61186891906120b4565b90505f6005828154811061187e5761187e611d02565b905f5260205f20015490506005600160058054905061189d9190611cef565b815481106118ad576118ad611d02565b905f5260205f200154600583815481106118c9576118c9611d02565b5f9182526020909120015560058054806118e5576118e5611d16565b5f828152602080822083015f199081018390559092019092558282526007905260409020805460ff1916600117905592915050565b5f5b8381101561193457818101518382015260200161191c565b50505f910152565b602081525f825180602084015261195a81604085016020870161191a565b601f01601f19169190910160400192915050565b5f6020828403121561197e575f80fd5b5035919050565b80356001600160a01b0381168114610ca9575f80fd5b5f80604083850312156119ac575f80fd5b6119b583611985565b946020939093013593505050565b5f805f606084860312156119d5575f80fd5b6119de84611985565b92506119ec60208501611985565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611a1f575f80fd5b813567ffffffffffffffff80821115611a3a57611a3a6119fc565b604051601f8301601f19908116603f01168101908282118183101715611a6257611a626119fc565b81604052838152866020858801011115611a7a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aaa575f80fd5b823567ffffffffffffffff80821115611ac1575f80fd5b611acd86838701611a10565b93506020850135915080821115611ae2575f80fd5b50611aef85828601611a10565b9150509250929050565b80358015158114610ca9575f80fd5b5f8060408385031215611b19575f80fd5b611b2283611985565b9150611b3060208401611af9565b90509250929050565b5f60208284031215611b49575f80fd5b610d3282611985565b602080825282518282018190525f9190848201906040850190845b81811015611b8957835183529284019291840191600101611b6d565b50909695505050505050565b5f60208284031215611ba5575f80fd5b610d3282611af9565b5f805f805f60808688031215611bc2575f80fd5b611bcb86611985565b9450611bd960208701611985565b935060408601359250606086013567ffffffffffffffff80821115611bfc575f80fd5b818801915088601f830112611c0f575f80fd5b813581811115611c1d575f80fd5b896020828501011115611c2e575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611c52575f80fd5b611c5b83611985565b9150611b3060208401611985565b5f60208284031215611c79575f80fd5b813567ffffffffffffffff811115611c8f575f80fd5b611c9b84828501611a10565b949350505050565b600181811c90821680611cb757607f821691505b602082108103611cd557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561067957610679611cdb565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611d3a575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610d32575f80fd5b601f821115610a35575f81815260208120601f850160051c81016020861015611d8f5750805b601f850160051c820191505b81811015611dae57828155600101611d9b565b505050505050565b815167ffffffffffffffff811115611dd057611dd06119fc565b611de481611dde8454611ca3565b84611d69565b602080601f831160018114611e17575f8415611e005750858301515b5f19600386901b1c1916600185901b178555611dae565b5f85815260208120601f198616915b82811015611e4557888601518255948401946001909101908401611e26565b5085821015611e6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611ed181611ca3565b60018281168015611ee95760018114611efe57611f2a565b60ff1984168752821515830287019450611f2a565b885f526020805f205f5b85811015611f215781548a820152908401908201611f08565b50505082870194505b505050508351611f3e81836020880161191a565b01949350505050565b5f8251611f5881846020870161191a565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b600181815b80851115611fc157815f1904821115611fa757611fa7611cdb565b80851615611fb457918102915b93841c9390800290611f8c565b509250929050565b5f82611fd757506001610679565b81611fe357505f610679565b8160018114611ff957600281146120035761201f565b6001915050610679565b60ff84111561201457612014611cdb565b50506001821b610679565b5060208310610133831016604e8410600b8410161715612042575081810a610679565b61204c8383611f87565b805f190482111561205f5761205f611cdb565b029392505050565b5f610d3260ff841683611fc9565b634e487b7160e01b5f52601260045260245ffd5b5f8261209757612097612075565b500490565b5f5f1982036120ad576120ad611cdb565b5060010190565b5f826120c2576120c2612075565b50069056fea2646970667358221220b064f9e65c9381f9444ffeebb472870a2e48f70e83c593d06fbabc88044571b564736f6c63430008140033
Deployed Bytecode Sourcemap
20782:11604:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21807:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22425:26;;;;;;;;;875:25:1;;;863:2;848:18;22425:26:0;729:177:1;22871:46:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;22871:46:0;;;;;;-1:-1:-1;;;;;1260:55:1;;;1242:74;;1230:2;1215:18;22871:46:0;1096:226:1;25067:639:0;;;;;;:::i;:::-;;:::i;:::-;;;1952:14:1;;1945:22;1927:41;;1915:2;1900:18;25067:639:0;1787:187:1;22043:36:0;;;;;26105:1685;;;;;;:::i;:::-;;:::i;:::-;;20365:151;;;:::i;22222:32::-;;;;;;21943:31;;;;;;;;2484:4:1;2472:17;;;2454:36;;2442:2;2427:18;21943:31:0;2312:184:1;28053:363:0;;;;;;:::i;:::-;;:::i;32106:167::-;;;;;;:::i;:::-;;:::i;23999:111::-;;;;;;:::i;:::-;;:::i;24182:185::-;;;;;;:::i;:::-;;:::i;22637:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19806:20;;;;;-1:-1:-1;;;;;19806:20:0;;;21861;;;:::i;23482:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25757:199;;;;;;:::i;:::-;;:::i;27849:127::-;;;;;;:::i;:::-;;:::i;32281:102::-;;;:::i;:::-;;;;;;;:::i;24813:105::-;;;;;;:::i;:::-;;:::i;28511:429::-;;;;;;:::i;:::-;;:::i;24489:316::-;;;;;;:::i;:::-;;:::i;22298:28::-;;;;;;:::i;:::-;;:::i;22152:26::-;;;:::i;22751:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;24375:106;;;;;;:::i;:::-;;:::i;22982:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20138:219;;;;;;:::i;:::-;;:::i;21807:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25067:639::-;25162:4;25197:11;;25183:10;:25;;:43;;;;;25225:1;25212:10;:14;25183:43;25179:496;;;25243:13;25259:20;;;:8;:20;;;;;;-1:-1:-1;;;;;25259:20:0;25300:10;:19;;;;;:59;;-1:-1:-1;;;;;;25324:23:0;;;;;;:16;:23;;;;;;;;25348:10;25324:35;;;;;;;;;;25323:36;25300:59;25296:121;;;25387:14;;-1:-1:-1;;;25387:14:0;;;;;;;;;;;25296:121;25433:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;25433:33:0;-1:-1:-1;;;;;25433:33:0;;;;;;;;;25488:36;;875:25:1;;;25488:36:0;;;;;;848:18:1;25488:36:0;;;;;;;25228:308;25179:496;;;25567:10;25557:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;25557:30:0;;;;;;;;;;;;:43;;;25622:41;875:25:1;;;25557:30:0;;25567:10;25622:41;;848:18:1;25622:41:0;;;;;;;25179:496;-1:-1:-1;25694:4:0;25067:639;;;;;:::o;26105:1685::-;26209:17;;26195:10;:31;26191:1592;;26255:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;26247:28:0;;;26255:20;;26247:28;26243:91;;26303:15;;;;;;;;;;;;;;26243:91;-1:-1:-1;;;;;26354:16:0;;26350:82;;26398:18;;;;;;;;;;;;;;26350:82;26470:10;-1:-1:-1;;;;;26470:18:0;;;;;;:74;;-1:-1:-1;;;;;;26510:22:0;;;;;;:16;:22;;;;;;;;26533:10;26510:34;;;;;;;;;;26509:35;26470:74;:132;;;;-1:-1:-1;26579:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;26579:23:0;26565:10;:37;;26470:132;26448:226;;;26644:14;;-1:-1:-1;;;26644:14:0;;;;;;;;;;;26448:226;26709:10;:8;:10::i;:::-;-1:-1:-1;;;;;26690:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;26782:10:0;;-1:-1:-1;26782:8:0;:10::i;:::-;-1:-1:-1;;;;;26765:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;26824:20;;;:8;:20;;;;;:25;;-1:-1:-1;;26824:25:0;;;;;;;;26871:11;:23;;;;;26864:30;;;;;;;;26972:12;;;;;:6;:12;;;;;26985:19;;:23;;-1:-1:-1;;26985:23:0;:::i;:::-;26972:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27024:12:0;;;;:6;:12;;;;;;27037:23;;;:11;:23;;;;;;;27024:37;;26972;;-1:-1:-1;26972:37:0;;27024;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;27108:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;27108:18:0;;;;;;;;;;;;27212:23;;;:11;:23;;;;;;;27187:22;;;;;;:48;-1:-1:-1;;;;;27289:10:0;;;;;:6;:10;;;;;:27;;27108:18;27289:27;;;;;;;;;;;;;;;27399:10;;:17;;:21;;27108:18;27399:21;:::i;:::-;27373:23;;;;:11;:23;;;;;;:47;;;;27442:30;;27385:10;;-1:-1:-1;;;;;27442:30:0;;;;;;;;;;;27512:2;-1:-1:-1;;;;;27492:35:0;27506:4;-1:-1:-1;;;;;27492:35:0;;27516:10;:8;:10::i;:::-;27492:35;;875:25:1;;;863:2;848:18;27492:35:0;;;;;;;26228:1311;26105:1685;;;:::o;26191:1592::-;-1:-1:-1;;;;;27578:15:0;;27560;27578;;;:9;:15;;;;;;;;27594:10;27578:27;;;;;;;;-1:-1:-1;;27626:28:0;;27622:101;;27703:20;27713:10;27703:7;:20;:::i;:::-;-1:-1:-1;;;;;27673:15:0;;;;;;:9;:15;;;;;;;;27689:10;27673:27;;;;;;;:50;27622:101;27740:31;27750:4;27756:2;27760:10;27740:9;:31::i;:::-;;27545:238;26191:1592;26105:1685;;;:::o;20365:151::-;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;20444:1:::1;20428:18:::0;;-1:-1:-1;;20428:18:0::1;::::0;;20464:44:::1;::::0;20485:10:::1;::::0;20464:44:::1;::::0;20444:1;;20464:44:::1;20365:151::o:0;28053:363::-;28135:26;28148:4;28154:2;28158;28135:12;:26::i;:::-;-1:-1:-1;;;;;28192:14:0;;;:19;;;;:154;;-1:-1:-1;28228:61:0;;28306:40;28228:61;;;28264:10;28228:61;;;8333:34:1;-1:-1:-1;;;;;8403:15:1;;;8383:18;;;8376:43;8435:18;;;8428:34;;;8498:3;8478:18;;;8471:31;-1:-1:-1;8518:19:1;;;8511:30;28306:40:0;;28228:35;;;;28306:40;;8558:19:1;;28228:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;28192:154;28174:235;;;28380:17;;;;;;;;;;;;;;32106:167;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;32226:4:::1;:12;32233:5:::0;32226:4;:12:::1;:::i;:::-;-1:-1:-1::0;32249:6:0::1;:16;32258:7:::0;32249:6;:16:::1;:::i;23999:111::-:0;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;-1:-1:-1;;;;;24077:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;24077:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23999:111::o;24182:185::-;24232:13;24266:12;;;:8;:12;;;;;;-1:-1:-1;;;;;24266:12:0;;24291:69;;24338:10;;;;;;;;;;;;;;24291:69;24182:185;;;:::o;21861:20::-;;;;;;;:::i;25757:199::-;25852:10;25835:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;25835:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;25835:49:0;;;;;;;;;;25902:46;;1927:41:1;;;25835:38:0;;25852:10;25902:46;;1900:18:1;25902:46:0;;;;;;;25757:199;;:::o;27849:127::-;27911:4;27935:33;27945:10;27957:2;27961:6;27935:9;:33::i;:::-;27928:40;27849:127;-1:-1:-1;;;27849:127:0:o;32281:102::-;32328:16;32364:11;32357:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32281:102;:::o;24813:105::-;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;24884:11:::1;:26:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;24813:105::o;28511:429::-;28657:26;28670:4;28676:2;28680;28657:12;:26::i;:::-;-1:-1:-1;;;;;28714:14:0;;;:19;;;;:156;;-1:-1:-1;28750:63:0;;28830:40;28750:63;;;28830:40;-1:-1:-1;;;;;28750:35:0;;;28830:40;;28750:63;;28786:10;;28798:4;;28804:2;;28808:4;;;;28750:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;28714:156;28696:237;;;28904:17;;;;;;;;;;;;;;24489:316;24540:13;24576:11;24570:2;:17;;:28;;;-1:-1:-1;24591:7:0;;24570:28;24566:79;;;24622:11;;;;;;;;;;;;;;24566:79;24721:12;24735:20;24752:2;24735:16;:20::i;:::-;24707:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24707:49:0;;;;;;;;;;24675:122;;24707:49;24675:122;;:::i;:::-;;;;;;;;;;;;;24655:142;;24489:316;;;:::o;22298:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22298:28:0;:::o;22152:26::-;;;;;;;:::i;24375:106::-;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;24449:12:::1;:24;24464:9:::0;24449:12;:24:::1;:::i;:::-;;24375:106:::0;:::o;20138:219::-;19893:5;;-1:-1:-1;;;;;19893:5:0;19879:10;:19;19875:46;;19907:14;;-1:-1:-1;;;19907:14:0;;;;;;;;;;;19875:46;-1:-1:-1;;;;;20221:20:0;::::1;20217:47;;20250:14;;;;;;;;;;;;;;20217:47;20277:5;:14:::0;;-1:-1:-1;;20277:14:0::1;-1:-1:-1::0;;;;;20277:14:0;::::1;::::0;;::::1;::::0;;20309:40:::1;::::0;20277:14;;20330:10:::1;::::0;20309:40:::1;::::0;20277:5;20309:40:::1;20138:219:::0;:::o;30271:92::-;30314:7;30341:14;30347:8;30341:2;:14;:::i;:::-;30334:21;;30271:92;:::o;29008:1224::-;29121:4;29138:12;29153:10;:8;:10::i;:::-;-1:-1:-1;;;;;29204:15:0;;;29174:27;29204:15;;;:9;:15;;;;;;;;29262:13;;;;;;;;;29288:15;;;29138:25;;-1:-1:-1;29204:15:0;;29262:13;;29307:6;;29204:15;29288:25;29307:6;29204:15;29288:25;:::i;:::-;;;;-1:-1:-1;;;;;;;29351:13:0;;;;;;:9;:13;;;;;:23;;;;;;29403:11;;;;;;29398:756;;-1:-1:-1;;;;;29523:15:0;;;;;;:9;:15;;;;;;;;29518:275;;-1:-1:-1;;;;;29637:15:0;;29559:22;29637:15;;;:9;:15;;;;;;:22;;29655:4;;29637:22;:::i;:::-;29585:26;29607:4;29585:19;:26;:::i;:::-;29584:76;;;;:::i;:::-;29559:101;;29684:9;29679:99;29703:14;29699:1;:18;29679:99;;;29747:11;29753:4;29747:5;:11::i;:::-;29719:3;;;;:::i;:::-;;;;29679:99;;;;29540:253;29518:275;-1:-1:-1;;;;;29877:13:0;;;;;;:9;:13;;;;;;;;29872:271;;29911:22;29983:28;30007:4;29983:21;:28;:::i;:::-;-1:-1:-1;;;;;29937:13:0;;;;;;:9;:13;;;;;;:20;;29953:4;;29937:20;:::i;:::-;29936:76;;;;:::i;:::-;29911:101;;30036:9;30031:97;30055:14;30051:1;:18;30031:97;;;30099:9;30105:2;30099:5;:9::i;:::-;30071:3;;;;:::i;:::-;;;;30031:97;;;;29892:251;29872:271;30191:2;-1:-1:-1;;;;;30171:31:0;30185:4;-1:-1:-1;;;;;30171:31:0;;30195:6;30171:31;;;;875:25:1;;863:2;848:18;;729:177;30171:31:0;;;;;;;;-1:-1:-1;30220:4:0;;29008:1224;-1:-1:-1;;;;;;29008:1224:0:o;17099:718::-;17155:13;17206:14;17223:17;17234:5;17223:10;:17::i;:::-;17243:1;17223:21;17206:38;;17259:20;17293:6;17282:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17282:18:0;-1:-1:-1;17259:41:0;-1:-1:-1;17424:28:0;;;17440:2;17424:28;17481:290;-1:-1:-1;;17513:5:0;17655:10;17650:2;17639:14;;17634:32;17513:5;17621:46;17713:2;17704:11;;;-1:-1:-1;17734:21:0;17481:290;17734:21;-1:-1:-1;17792:6:0;17099:718;-1:-1:-1;;;17099:718:0:o;31705:393::-;-1:-1:-1;;;;;31758:18:0;;31754:73;;31800:15;;;;;;;;;;;;;;31754:73;-1:-1:-1;;;;;31850:12:0;;31837:10;31850:12;;;:6;:12;;;;;31863:19;;:23;;31885:1;;31863:23;:::i;:::-;31850:37;;;;;;;;:::i;:::-;;;;;;;;;31837:50;;31898:19;31914:2;31898:15;:19::i;:::-;-1:-1:-1;;;;;31928:12:0;;;;;;:6;:12;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;31928:18:0;;;;;;;;;;;;31964:15;;;:11;:15;;;;;;31957:22;;;31997:8;:12;;;;;31990:19;;-1:-1:-1;;31990:19:0;;;;;;32027:11;:15;;;;;;32020:22;;;;;;;;32060:30;31976:2;;31928:18;-1:-1:-1;;;;;32060:30:0;;;;;31928:18;;32060:30;31743:355;31705:393;:::o;31096:601::-;-1:-1:-1;;;;;31147:16:0;;31143:74;;31187:18;;;;;;;;;;;;;;31143:74;31229:10;31270:17;;31256:11;;:31;31252:282;;;31304:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;31337:11:0;;31363:14;;;;:10;:14;;;;;:21;;-1:-1:-1;;31363:21:0;31380:4;31363:21;;;31337:11;-1:-1:-1;31252:282:0;;;31406:11;:18;:22;31402:132;;31450:19;:17;:19::i;:::-;31445:24;;31402:132;;;31509:13;;;;;;;;;;;;;;31402:132;31546:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;31546:17:0;-1:-1:-1;;;;;31546:17:0;;;;;;;;31574:10;;;:6;:10;;;;;:19;;-1:-1:-1;31574:19:0;;;;;;;;;;;;;;;31622:10;;:17;;:21;;-1:-1:-1;31622:21:0;:::i;:::-;31604:15;;;;:11;:15;;;;;;:39;;;;31661:28;;31616:2;;-1:-1:-1;;;;;31661:28:0;;;;;31604:15;;31661:28;31132:565;31096:601;:::o;12615:948::-;12668:7;;12755:8;12746:17;;12742:106;;12793:8;12784:17;;;-1:-1:-1;12830:2:0;12820:12;12742:106;12875:8;12866:5;:17;12862:106;;12913:8;12904:17;;;-1:-1:-1;12950:2:0;12940:12;12862:106;12995:8;12986:5;:17;12982:106;;13033:8;13024:17;;;-1:-1:-1;13070:2:0;13060:12;12982:106;13115:7;13106:5;:16;13102:103;;13152:7;13143:16;;;-1:-1:-1;13188:1:0;13178:11;13102:103;13232:7;13223:5;:16;13219:103;;13269:7;13260:16;;;-1:-1:-1;13305:1:0;13295:11;13219:103;13349:7;13340:5;:16;13336:103;;13386:7;13377:16;;;-1:-1:-1;13422:1:0;13412:11;13336:103;13466:7;13457:5;:16;13453:68;;13504:1;13494:11;13549:6;12615:948;-1:-1:-1;;12615:948:0:o;30891:197::-;30952:14;;;;:10;:14;;;;;;;;30947:70;;30990:15;;;;;;;;;;;;;;30947:70;31027:11;:20;;;;;;;;;;;;;-1:-1:-1;31058:14:0;;;:10;31027:20;31058:14;;;;:22;;-1:-1:-1;;31058:22:0;;;30891:197::o;30371:512::-;30441:11;:18;30417:7;;30441:23;;30437:76;;30488:13;;;;;;;;;;;;;;30437:76;30656:11;:18;30577:64;;;30594:15;30577:64;;;15796:19:1;15866:66;30611:10:0;15853:2:1;15849:15;15845:88;15831:12;;;15824:110;;;;15950:12;;;15943:28;;;30523:19:0;;30656:18;15987:12:1;;30577:64:0;;;;;;;;;;;;30567:75;;;;;;30545:108;;:129;;;;:::i;:::-;30523:151;;30685:10;30698:11;30710;30698:24;;;;;;;;:::i;:::-;;;;;;;;;30685:37;;30760:11;30793:1;30772:11;:18;;;;:22;;;;:::i;:::-;30760:35;;;;;;;;:::i;:::-;;;;;;;;;30733:11;30745;30733:24;;;;;;;;:::i;:::-;;;;;;;;;;:62;30806:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;30806:17:0;;;;;;;;;;;;30834:14;;;:10;:14;;;;;:21;;-1:-1:-1;;30834:21:0;30806:17;30834:21;;;30845:2;30371:512;-1:-1:-1;;30371:512:0:o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:455::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;640:2;628:15;-1:-1:-1;;624:88:1;609:104;;;;715:2;605:113;;269:455;-1:-1:-1;;269:455:1:o;911:180::-;970:6;1023:2;1011:9;1002:7;998:23;994:32;991:52;;;1039:1;1036;1029:12;991:52;-1:-1:-1;1062:23:1;;911:180;-1:-1:-1;911:180:1:o;1327:196::-;1395:20;;-1:-1:-1;;;;;1444:54:1;;1434:65;;1424:93;;1513:1;1510;1503:12;1528:254;1596:6;1604;1657:2;1645:9;1636:7;1632:23;1628:32;1625:52;;;1673:1;1670;1663:12;1625:52;1696:29;1715:9;1696:29;:::i;:::-;1686:39;1772:2;1757:18;;;;1744:32;;-1:-1:-1;;;1528:254:1:o;1979:328::-;2056:6;2064;2072;2125:2;2113:9;2104:7;2100:23;2096:32;2093:52;;;2141:1;2138;2131:12;2093:52;2164:29;2183:9;2164:29;:::i;:::-;2154:39;;2212:38;2246:2;2235:9;2231:18;2212:38;:::i;:::-;2202:48;;2297:2;2286:9;2282:18;2269:32;2259:42;;1979:328;;;;;:::o;2501:184::-;-1:-1:-1;;;2550:1:1;2543:88;2650:4;2647:1;2640:15;2674:4;2671:1;2664:15;2690:778;2733:5;2786:3;2779:4;2771:6;2767:17;2763:27;2753:55;;2804:1;2801;2794:12;2753:55;2840:6;2827:20;2866:18;2903:2;2899;2896:10;2893:36;;;2909:18;;:::i;:::-;3043:2;3037:9;3105:4;3097:13;;-1:-1:-1;;3093:22:1;;;3117:2;3089:31;3085:40;3073:53;;;3141:18;;;3161:22;;;3138:46;3135:72;;;3187:18;;:::i;:::-;3227:10;3223:2;3216:22;3262:2;3254:6;3247:18;3308:3;3301:4;3296:2;3288:6;3284:15;3280:26;3277:35;3274:55;;;3325:1;3322;3315:12;3274:55;3389:2;3382:4;3374:6;3370:17;3363:4;3355:6;3351:17;3338:54;3436:1;3429:4;3424:2;3416:6;3412:15;3408:26;3401:37;3456:6;3447:15;;;;;;2690:778;;;;:::o;3473:543::-;3561:6;3569;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3678:9;3665:23;3707:18;3748:2;3740:6;3737:14;3734:34;;;3764:1;3761;3754:12;3734:34;3787:50;3829:7;3820:6;3809:9;3805:22;3787:50;:::i;:::-;3777:60;;3890:2;3879:9;3875:18;3862:32;3846:48;;3919:2;3909:8;3906:16;3903:36;;;3935:1;3932;3925:12;3903:36;;3958:52;4002:7;3991:8;3980:9;3976:24;3958:52;:::i;:::-;3948:62;;;3473:543;;;;;:::o;4021:160::-;4086:20;;4142:13;;4135:21;4125:32;;4115:60;;4171:1;4168;4161:12;4186:254;4251:6;4259;4312:2;4300:9;4291:7;4287:23;4283:32;4280:52;;;4328:1;4325;4318:12;4280:52;4351:29;4370:9;4351:29;:::i;:::-;4341:39;;4399:35;4430:2;4419:9;4415:18;4399:35;:::i;:::-;4389:45;;4186:254;;;;;:::o;4445:186::-;4504:6;4557:2;4545:9;4536:7;4532:23;4528:32;4525:52;;;4573:1;4570;4563:12;4525:52;4596:29;4615:9;4596:29;:::i;4636:632::-;4807:2;4859:21;;;4929:13;;4832:18;;;4951:22;;;4778:4;;4807:2;5030:15;;;;5004:2;4989:18;;;4778:4;5073:169;5087:6;5084:1;5081:13;5073:169;;;5148:13;;5136:26;;5217:15;;;;5182:12;;;;5109:1;5102:9;5073:169;;;-1:-1:-1;5259:3:1;;4636:632;-1:-1:-1;;;;;;4636:632:1:o;5273:180::-;5329:6;5382:2;5370:9;5361:7;5357:23;5353:32;5350:52;;;5398:1;5395;5388:12;5350:52;5421:26;5437:9;5421:26;:::i;5458:808::-;5555:6;5563;5571;5579;5587;5640:3;5628:9;5619:7;5615:23;5611:33;5608:53;;;5657:1;5654;5647:12;5608:53;5680:29;5699:9;5680:29;:::i;:::-;5670:39;;5728:38;5762:2;5751:9;5747:18;5728:38;:::i;:::-;5718:48;;5813:2;5802:9;5798:18;5785:32;5775:42;;5868:2;5857:9;5853:18;5840:32;5891:18;5932:2;5924:6;5921:14;5918:34;;;5948:1;5945;5938:12;5918:34;5986:6;5975:9;5971:22;5961:32;;6031:7;6024:4;6020:2;6016:13;6012:27;6002:55;;6053:1;6050;6043:12;6002:55;6093:2;6080:16;6119:2;6111:6;6108:14;6105:34;;;6135:1;6132;6125:12;6105:34;6180:7;6175:2;6166:6;6162:2;6158:15;6154:24;6151:37;6148:57;;;6201:1;6198;6191:12;6148:57;5458:808;;;;-1:-1:-1;5458:808:1;;-1:-1:-1;6232:2:1;6224:11;;6254:6;5458:808;-1:-1:-1;;;5458:808:1:o;6271:260::-;6339:6;6347;6400:2;6388:9;6379:7;6375:23;6371:32;6368:52;;;6416:1;6413;6406:12;6368:52;6439:29;6458:9;6439:29;:::i;:::-;6429:39;;6487:38;6521:2;6510:9;6506:18;6487:38;:::i;6536:322::-;6605:6;6658:2;6646:9;6637:7;6633:23;6629:32;6626:52;;;6674:1;6671;6664:12;6626:52;6714:9;6701:23;6747:18;6739:6;6736:30;6733:50;;;6779:1;6776;6769:12;6733:50;6802;6844:7;6835:6;6824:9;6820:22;6802:50;:::i;:::-;6792:60;6536:322;-1:-1:-1;;;;6536:322:1:o;6863:437::-;6942:1;6938:12;;;;6985;;;7006:61;;7060:4;7052:6;7048:17;7038:27;;7006:61;7113:2;7105:6;7102:14;7082:18;7079:38;7076:218;;-1:-1:-1;;;7147:1:1;7140:88;7251:4;7248:1;7241:15;7279:4;7276:1;7269:15;7076:218;;6863:437;;;:::o;7305:184::-;-1:-1:-1;;;7354:1:1;7347:88;7454:4;7451:1;7444:15;7478:4;7475:1;7468:15;7494:128;7561:9;;;7582:11;;;7579:37;;;7596:18;;:::i;7627:184::-;-1:-1:-1;;;7676:1:1;7669:88;7776:4;7773:1;7766:15;7800:4;7797:1;7790:15;7816:184;-1:-1:-1;;;7865:1:1;7858:88;7965:4;7962:1;7955:15;7989:4;7986:1;7979:15;8588:336;8657:6;8710:2;8698:9;8689:7;8685:23;8681:32;8678:52;;;8726:1;8723;8716:12;8678:52;8758:9;8752:16;8808:66;8801:5;8797:78;8790:5;8787:89;8777:117;;8890:1;8887;8880:12;9055:545;9157:2;9152:3;9149:11;9146:448;;;9193:1;9218:5;9214:2;9207:17;9263:4;9259:2;9249:19;9333:2;9321:10;9317:19;9314:1;9310:27;9304:4;9300:38;9369:4;9357:10;9354:20;9351:47;;;-1:-1:-1;9392:4:1;9351:47;9447:2;9442:3;9438:12;9435:1;9431:20;9425:4;9421:31;9411:41;;9502:82;9520:2;9513:5;9510:13;9502:82;;;9565:17;;;9546:1;9535:13;9502:82;;;9506:3;;;9055:545;;;:::o;9836:1471::-;9962:3;9956:10;9989:18;9981:6;9978:30;9975:56;;;10011:18;;:::i;:::-;10040:97;10130:6;10090:38;10122:4;10116:11;10090:38;:::i;:::-;10084:4;10040:97;:::i;:::-;10192:4;;10256:2;10245:14;;10273:1;10268:782;;;;11094:1;11111:6;11108:89;;;-1:-1:-1;11163:19:1;;;11157:26;11108:89;-1:-1:-1;;9733:1:1;9729:11;;;9725:84;9721:89;9711:100;9817:1;9813:11;;;9708:117;11210:81;;10238:1063;;10268:782;9002:1;8995:14;;;9039:4;9026:18;;-1:-1:-1;;10304:79:1;;;10481:236;10495:7;10492:1;10489:14;10481:236;;;10584:19;;;10578:26;10563:42;;10676:27;;;;10644:1;10632:14;;;;10511:19;;10481:236;;;10485:3;10745:6;10736:7;10733:19;10730:261;;;10806:19;;;10800:26;-1:-1:-1;;10889:1:1;10885:14;;;10901:3;10881:24;10877:97;10873:102;10858:118;10843:134;;10730:261;-1:-1:-1;;;;;11037:1:1;11021:14;;;11017:22;11004:36;;-1:-1:-1;9836:1471:1:o;11312:744::-;11516:4;-1:-1:-1;;;;;11626:2:1;11618:6;11614:15;11603:9;11596:34;11678:2;11670:6;11666:15;11661:2;11650:9;11646:18;11639:43;;11718:6;11713:2;11702:9;11698:18;11691:34;11761:3;11756:2;11745:9;11741:18;11734:31;11802:6;11796:3;11785:9;11781:19;11774:35;11860:6;11852;11846:3;11835:9;11831:19;11818:49;11917:1;11911:3;11902:6;11891:9;11887:22;11883:32;11876:43;12046:3;-1:-1:-1;;11971:2:1;11963:6;11959:15;11955:88;11944:9;11940:104;11936:114;11928:122;;11312:744;;;;;;;;:::o;12061:1078::-;12237:3;12266:1;12299:6;12293:13;12329:36;12355:9;12329:36;:::i;:::-;12384:1;12401:18;;;12428:191;;;;12633:1;12628:356;;;;12394:590;;12428:191;-1:-1:-1;;12465:9:1;12461:82;12456:3;12449:95;12599:6;12592:14;12585:22;12577:6;12573:35;12568:3;12564:45;12557:52;;12428:191;;12628:356;12659:6;12656:1;12649:17;12689:4;12734:2;12731:1;12721:16;12759:1;12773:165;12787:6;12784:1;12781:13;12773:165;;;12865:14;;12852:11;;;12845:35;12908:16;;;;12802:10;;12773:165;;;12777:3;;;12967:6;12962:3;12958:16;12951:23;;12394:590;;;;;13015:6;13009:13;13031:68;13090:8;13085:3;13078:4;13070:6;13066:17;13031:68;:::i;:::-;13115:18;;12061:1078;-1:-1:-1;;;;12061:1078:1:o;13144:445::-;13365:3;13403:6;13397:13;13419:66;13478:6;13473:3;13466:4;13458:6;13454:17;13419:66;:::i;:::-;13546:7;13507:16;;13532:22;;;-1:-1:-1;13581:1:1;13570:13;;13144:445;-1:-1:-1;13144:445:1:o;13594:482::-;13683:1;13726:5;13683:1;13740:330;13761:7;13751:8;13748:21;13740:330;;;13880:4;-1:-1:-1;;13808:77:1;13802:4;13799:87;13796:113;;;13889:18;;:::i;:::-;13939:7;13929:8;13925:22;13922:55;;;13959:16;;;;13922:55;14038:22;;;;13998:15;;;;13740:330;;;13744:3;13594:482;;;;;:::o;14081:866::-;14130:5;14160:8;14150:80;;-1:-1:-1;14201:1:1;14215:5;;14150:80;14249:4;14239:76;;-1:-1:-1;14286:1:1;14300:5;;14239:76;14331:4;14349:1;14344:59;;;;14417:1;14412:130;;;;14324:218;;14344:59;14374:1;14365:10;;14388:5;;;14412:130;14449:3;14439:8;14436:17;14433:43;;;14456:18;;:::i;:::-;-1:-1:-1;;14512:1:1;14498:16;;14527:5;;14324:218;;14626:2;14616:8;14613:16;14607:3;14601:4;14598:13;14594:36;14588:2;14578:8;14575:16;14570:2;14564:4;14561:12;14557:35;14554:77;14551:159;;;-1:-1:-1;14663:19:1;;;14695:5;;14551:159;14742:34;14767:8;14761:4;14742:34;:::i;:::-;14872:6;-1:-1:-1;;14800:79:1;14791:7;14788:92;14785:118;;;14883:18;;:::i;:::-;14921:20;;14081:866;-1:-1:-1;;;14081:866:1:o;14952:140::-;15010:5;15039:47;15080:4;15070:8;15066:19;15060:4;15039:47;:::i;15097:184::-;-1:-1:-1;;;15146:1:1;15139:88;15246:4;15243:1;15236:15;15270:4;15267:1;15260:15;15286:120;15326:1;15352;15342:35;;15357:18;;:::i;:::-;-1:-1:-1;15391:9:1;;15286:120::o;15411:195::-;15450:3;-1:-1:-1;;15474:5:1;15471:77;15468:103;;15551:18;;:::i;:::-;-1:-1:-1;15598:1:1;15587:13;;15411:195::o;16010:112::-;16042:1;16068;16058:35;;16073:18;;:::i;:::-;-1:-1:-1;16107:9:1;;16010:112::o
Swarm Source
ipfs://b064f9e65c9381f9444ffeebb472870a2e48f70e83c593d06fbabc88044571b5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.