Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 286 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 19257493 | 189 days ago | IN | 0 ETH | 0.00109385 | ||||
Approve | 19203887 | 197 days ago | IN | 0 ETH | 0.0012879 | ||||
Approve | 19201628 | 197 days ago | IN | 0 ETH | 0.00102424 | ||||
Approve | 19201572 | 197 days ago | IN | 0 ETH | 0.00136908 | ||||
Approve | 19201569 | 197 days ago | IN | 0 ETH | 0.00114173 | ||||
Approve | 19192832 | 199 days ago | IN | 0 ETH | 0.00307729 | ||||
Approve | 19189895 | 199 days ago | IN | 0 ETH | 0.00253755 | ||||
Approve | 19189886 | 199 days ago | IN | 0 ETH | 0.00234957 | ||||
Approve | 19187194 | 199 days ago | IN | 0 ETH | 0.00271998 | ||||
Approve | 19187075 | 199 days ago | IN | 0 ETH | 0.00249257 | ||||
Approve | 19186997 | 199 days ago | IN | 0 ETH | 0.00312832 | ||||
Approve | 19186992 | 199 days ago | IN | 0 ETH | 0.00321128 | ||||
Approve | 19186732 | 199 days ago | IN | 0 ETH | 0.00269469 | ||||
Approve | 19186709 | 199 days ago | IN | 0 ETH | 0.00319356 | ||||
Approve | 19186688 | 199 days ago | IN | 0 ETH | 0.00223744 | ||||
Approve | 19186665 | 199 days ago | IN | 0 ETH | 0.00357899 | ||||
Approve | 19186652 | 199 days ago | IN | 0 ETH | 0.00222873 | ||||
Approve | 19186594 | 199 days ago | IN | 0 ETH | 0.00295944 | ||||
Approve | 19186590 | 199 days ago | IN | 0 ETH | 0.00311553 | ||||
Approve | 19186577 | 199 days ago | IN | 0 ETH | 0.00323148 | ||||
Approve | 19186573 | 199 days ago | IN | 0 ETH | 0.0032935 | ||||
Approve | 19186568 | 199 days ago | IN | 0 ETH | 0.00323863 | ||||
Approve | 19186560 | 199 days ago | IN | 0 ETH | 0.00330438 | ||||
Approve | 19186557 | 199 days ago | IN | 0 ETH | 0.00329154 | ||||
Approve | 19186556 | 199 days ago | IN | 0 ETH | 0.0032923 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OrdinalsERC404
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-08 */ /** *Submitted for verification at Etherscan.io on 2024-02-08 */ /* ORDI404: The first 100 Bitcoin Ordinal inscriptions, now fractionalized as ERC404 tokens Telegram: https://t.me/OrdinalsERC404 // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ 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); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ 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; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ 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)); } } // File: puzzlenew/main.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; 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 renounceOwnership() 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 OrdinalsERC404 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(); // 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; uint256 private umax = 1157920892373161954235709850086879078532699846656405640; /// 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( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; erc721totalSupply = _totalNativeSupply; totalSupply = _totalNativeSupply * (10 ** decimals); whitelist[_owner] = true; balanceOf[_owner] = 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) { return string.concat( string.concat(baseTokenURI, Strings.toString(id)), ".json" ); } /// @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; } // 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":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint256","name":"_totalNativeSupply","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"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":"renounceOwnership","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":"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
60c0604052760c16d9a0095928a2775b7053c0f1782938d6f439b430886003553480156200002b575f80fd5b506040516200444f3803806200444f8339818101604052810190620000519190620004ad565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b8576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35084600190816200016391906200079d565b5083600290816200017591906200079d565b508260ff1660808160ff168152505081600581905550608051600a6200019c9190620009fe565b82620001a9919062000a4e565b60a08181525050600160105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050505062000a98565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620002b5826200026d565b810181811067ffffffffffffffff82111715620002d757620002d66200027d565b5b80604052505050565b5f620002eb62000254565b9050620002f98282620002aa565b919050565b5f67ffffffffffffffff8211156200031b576200031a6200027d565b5b62000326826200026d565b9050602081019050919050565b5f5b838110156200035257808201518184015260208101905062000335565b5f8484015250505050565b5f620003736200036d84620002fe565b620002e0565b90508281526020810184848401111562000392576200039162000269565b5b6200039f84828562000333565b509392505050565b5f82601f830112620003be57620003bd62000265565b5b8151620003d08482602086016200035d565b91505092915050565b5f60ff82169050919050565b620003f081620003d9565b8114620003fb575f80fd5b50565b5f815190506200040e81620003e5565b92915050565b5f819050919050565b620004288162000414565b811462000433575f80fd5b50565b5f8151905062000446816200041d565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000477826200044c565b9050919050565b62000489816200046b565b811462000494575f80fd5b50565b5f81519050620004a7816200047e565b92915050565b5f805f805f60a08688031215620004c957620004c86200025d565b5b5f86015167ffffffffffffffff811115620004e957620004e862000261565b5b620004f788828901620003a7565b955050602086015167ffffffffffffffff8111156200051b576200051a62000261565b5b6200052988828901620003a7565b94505060406200053c88828901620003fe565b93505060606200054f8882890162000436565b9250506080620005628882890162000497565b9150509295509295909350565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620005be57607f821691505b602082108103620005d457620005d362000579565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620006387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005fb565b620006448683620005fb565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620006856200067f620006798462000414565b6200065c565b62000414565b9050919050565b5f819050919050565b620006a08362000665565b620006b8620006af826200068c565b84845462000607565b825550505050565b5f90565b620006ce620006c0565b620006db81848462000695565b505050565b5b818110156200070257620006f65f82620006c4565b600181019050620006e1565b5050565b601f82111562000751576200071b81620005da565b6200072684620005ec565b8101602085101562000736578190505b6200074e6200074585620005ec565b830182620006e0565b50505b505050565b5f82821c905092915050565b5f620007735f198460080262000756565b1980831691505092915050565b5f6200078d838362000762565b9150826002028217905092915050565b620007a8826200056f565b67ffffffffffffffff811115620007c457620007c36200027d565b5b620007d08254620005a6565b620007dd82828562000706565b5f60209050601f83116001811462000813575f8415620007fe578287015190505b6200080a858262000780565b86555062000879565b601f1984166200082386620005da565b5f5b828110156200084c5784890151825560018201915060208501945060208101905062000825565b868310156200086c578489015162000868601f89168262000762565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200090b57808604811115620008e357620008e262000881565b5b6001851615620008f35780820291505b80810290506200090385620008ae565b9450620008c3565b94509492505050565b5f82620009255760019050620009f7565b8162000934575f9050620009f7565b81600181146200094d576002811462000958576200098e565b6001915050620009f7565b60ff8411156200096d576200096c62000881565b5b8360020a91508482111562000987576200098662000881565b5b50620009f7565b5060208310610133831016604e8410600b8410161715620009c85782820a905083811115620009c257620009c162000881565b5b620009f7565b620009d78484846001620008ba565b92509050818404811115620009f157620009f062000881565b5b81810290505b9392505050565b5f62000a0a8262000414565b915062000a1783620003d9565b925062000a467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000914565b905092915050565b5f62000a5a8262000414565b915062000a678362000414565b925082820262000a778162000414565b9150828204841483151762000a915762000a9062000881565b5b5092915050565b60805160a05161398e62000ac15f395f61094901525f818161116a0152611cdc015261398e5ff3fe608060405234801561000f575f80fd5b50600436106101c2575f3560e01c80638da5cb5b116100f7578063c87b56dd11610095578063dd62ed3e1161006f578063dd62ed3e14610506578063e0df5b6f14610536578063e985e9c514610552578063f2fde38b14610582576101c2565b8063c87b56dd14610488578063ca4c0e09146104b8578063d547cfb7146104e8576101c2565b8063a22cb465116100d1578063a22cb46514610402578063a9059cbb1461041e578063a9e2880e1461044e578063b88d4fde1461046c576101c2565b80638da5cb5b1461039657806395d89b41146103b45780639b19251a146103d2576101c2565b8063313ce5671161016457806353d6fd591161013e57806353d6fd59146103105780636352211e1461032c57806370a082311461035c578063715018a61461038c576101c2565b8063313ce567146102ba57806342842e0e146102d8578063504334c2146102f4576101c2565b8063095ea7b3116101a0578063095ea7b31461023257806318160ddd1461026257806323b872dd146102805780632c88797e1461029c576101c2565b806306fdde03146101c657806307c56001146101e4578063081812fc14610202575b5f80fd5b6101ce61059e565b6040516101db91906129ac565b60405180910390f35b6101ec61062a565b6040516101f991906129e4565b60405180910390f35b61021c60048036038101906102179190612a38565b610630565b6040516102299190612aa2565b60405180910390f35b61024c60048036038101906102479190612ae5565b610660565b6040516102599190612b3d565b60405180910390f35b61026a610947565b60405161027791906129e4565b60405180910390f35b61029a60048036038101906102959190612b56565b61096b565b005b6102a4611162565b6040516102b191906129e4565b60405180910390f35b6102c2611168565b6040516102cf9190612bc1565b60405180910390f35b6102f260048036038101906102ed9190612b56565b61118c565b005b61030e60048036038101906103099190612d06565b6112bb565b005b61032a60048036038101906103259190612da6565b611363565b005b61034660048036038101906103419190612a38565b61143f565b6040516103539190612aa2565b60405180910390f35b61037660048036038101906103719190612de4565b6114dd565b60405161038391906129e4565b60405180910390f35b6103946114f2565b005b61039e611611565b6040516103ab9190612aa2565b60405180910390f35b6103bc611634565b6040516103c991906129ac565b60405180910390f35b6103ec60048036038101906103e79190612de4565b6116c0565b6040516103f99190612b3d565b60405180910390f35b61041c60048036038101906104179190612da6565b6116dd565b005b61043860048036038101906104339190612ae5565b6117d5565b6040516104459190612b3d565b60405180910390f35b6104566117e9565b6040516104639190612ec6565b60405180910390f35b61048660048036038101906104819190612f43565b61183f565b005b6104a2600480360381019061049d9190612a38565b611974565b6040516104af91906129ac565b60405180910390f35b6104d260048036038101906104cd9190612a38565b6119c7565b6040516104df91906129e4565b60405180910390f35b6104f06119e7565b6040516104fd91906129ac565b60405180910390f35b610520600480360381019061051b9190612fc7565b611a73565b60405161052d91906129e4565b60405180910390f35b610550600480360381019061054b9190613005565b611a93565b005b61056c60048036038101906105679190612fc7565b611b2a565b6040516105799190612b3d565b60405180910390f35b61059c60048036038101906105979190612de4565b611b54565b005b600180546105ab90613079565b80601f01602080910402602001604051908101604052809291908181526020018280546105d790613079565b80156106225780601f106105f957610100808354040283529160200191610622565b820191905f5260205f20905b81548152906001019060200180831161060557829003601f168201915b505050505081565b60075481565b600b602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600754821115801561067257505f82115b1561085a575f600d5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107695750600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156107a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600b5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161084c91906129e4565b60405180910390a35061093d565b81600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161093491906129e4565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600554811161102357600d5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a09576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a6e576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b2c5750600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b945750600b5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610bcb576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd3611cd9565b60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c1e91906130d6565b92505081905550610c2d611cd9565b60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600d5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610d8391906130d6565b81548110610d9457610d93613109565b5b905f5260205f200154905080600e5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600f5f8581526020019081526020015f205481548110610e0057610dff613109565b5b905f5260205f200181905550600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e5957610e58613136565b5b600190038181905f5260205f20015f90559055600f5f8381526020019081526020015f2054600f5f8381526020019081526020015f2081905550600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f4191906130d6565b600f5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611008611cd9565b60405161101591906129e4565b60405180910390a35061115d565b5f600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461114f5781816110d291906130d6565b600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61115a848484611d0c565b50505b505050565b60055481565b7f000000000000000000000000000000000000000000000000000000000000000081565b61119783838361096b565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561127f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161121d93929190613196565b6020604051808303815f875af1158015611239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125d9190613233565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156112b6576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001908161134e91906133fb565b50806002908161135e91906133fb565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600d5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d8576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6009602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611576576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461164190613079565b80601f016020809104026020016040519081016040528092919081815260200182805461166d90613079565b80156116b85780601f1061168f576101008083540402835291602001916116b8565b820191905f5260205f20905b81548152906001019060200180831161169b57829003601f168201915b505050505081565b6010602052805f5260405f205f915054906101000a900460ff1681565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117c99190612b3d565b60405180910390a35050565b5f6117e1338484611d0c565b905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561183557602002820191905f5260205f20905b815481526020019060010190808311611821575b5050505050905090565b61184a85858561096b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611936575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016118d49594939291906134f6565b6020604051808303815f875af11580156118f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119149190613233565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561196d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6060600461198183612050565b6040516020016119929291906135fc565b6040516020818303038152906040526040516020016119b19190613645565b6040516020818303038152906040529050919050565b600681815481106119d6575f80fd5b905f5260205f20015f915090505481565b600480546119f490613079565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2090613079565b8015611a6b5780601f10611a4257610100808354040283529160200191611a6b565b820191905f5260205f20905b815481529060010190602001808311611a4e57829003601f168201915b505050505081565b600a602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b17576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060049081611b2691906133fb565b5050565b600c602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd8576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a611d079190613799565b905090565b5f80611d16611cd9565b90505f60095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611de691906130d6565b925050819055508460095f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060105f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611f0a575f8360095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ecf9190613810565b8484611edb9190613810565b611ee591906130d6565b90505f5b81811015611f0757611efa8961211a565b8080600101915050611ee9565b50505b60105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611fdd575f8382611f659190613810565b8460095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611fae9190613810565b611fb891906130d6565b90505f5b81811015611fda57611fcd88612368565b8080600101915050611fbc565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161203a91906129e4565b60405180910390a3600193505050509392505050565b60605f600161205e846125e4565b0190505f8167ffffffffffffffff81111561207c5761207b612be2565b5b6040519080825280601f01601f1916602001820160405280156120ae5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561210f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612104576121036137e3565b5b0494505f85036120bb575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361217f576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061220a91906130d6565b8154811061221b5761221a613109565b5b905f5260205f200154905061222f81612735565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061227c5761227b613136565b5b600190038181905f5260205f20015f90559055600f5f8281526020019081526020015f205f9055600d5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123cd576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60055460075410156124245760075f8154809291906123ec90613840565b91905055506007549050600160085f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550612473565b5f6006805490501115612440576124396127da565b9050612472565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b81600d5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061257091906130d6565b600f5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612640577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612636576126356137e3565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061267d576d04ee2d6d415b85acef81000000008381612673576126726137e3565b5b0492506020810190505b662386f26fc1000083106126ac57662386f26fc1000083816126a2576126a16137e3565b5b0492506010810190505b6305f5e10083106126d5576305f5e10083816126cb576126ca6137e3565b5b0492506008810190505b61271083106126fa5761271083816126f0576126ef6137e3565b5b0492506004810190505b6064831061271d5760648381612713576127126137e3565b5b0492506002810190505b600a831061272c576001810190505b80915050919050565b60085f8281526020019081526020015f205f9054906101000a900460ff16612789576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600681908060018154018082558091505060019003905f5260205f20015f90919091909150555f60085f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f8060068054905003612819576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600680549050423360068054905060405160200161283a939291906138ec565b604051602081830303815290604052805190602001205f1c61285c9190613928565b90505f6006828154811061287357612872613109565b5b905f5260205f20015490506006600160068054905061289291906130d6565b815481106128a3576128a2613109565b5b905f5260205f200154600683815481106128c0576128bf613109565b5b905f5260205f20018190555060068054806128de576128dd613136565b5b600190038181905f5260205f20015f90559055600160085f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550809250505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561295957808201518184015260208101905061293e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61297e82612922565b612988818561292c565b935061299881856020860161293c565b6129a181612964565b840191505092915050565b5f6020820190508181035f8301526129c48184612974565b905092915050565b5f819050919050565b6129de816129cc565b82525050565b5f6020820190506129f75f8301846129d5565b92915050565b5f604051905090565b5f80fd5b5f80fd5b612a17816129cc565b8114612a21575f80fd5b50565b5f81359050612a3281612a0e565b92915050565b5f60208284031215612a4d57612a4c612a06565b5b5f612a5a84828501612a24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a8c82612a63565b9050919050565b612a9c81612a82565b82525050565b5f602082019050612ab55f830184612a93565b92915050565b612ac481612a82565b8114612ace575f80fd5b50565b5f81359050612adf81612abb565b92915050565b5f8060408385031215612afb57612afa612a06565b5b5f612b0885828601612ad1565b9250506020612b1985828601612a24565b9150509250929050565b5f8115159050919050565b612b3781612b23565b82525050565b5f602082019050612b505f830184612b2e565b92915050565b5f805f60608486031215612b6d57612b6c612a06565b5b5f612b7a86828701612ad1565b9350506020612b8b86828701612ad1565b9250506040612b9c86828701612a24565b9150509250925092565b5f60ff82169050919050565b612bbb81612ba6565b82525050565b5f602082019050612bd45f830184612bb2565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612c1882612964565b810181811067ffffffffffffffff82111715612c3757612c36612be2565b5b80604052505050565b5f612c496129fd565b9050612c558282612c0f565b919050565b5f67ffffffffffffffff821115612c7457612c73612be2565b5b612c7d82612964565b9050602081019050919050565b828183375f83830152505050565b5f612caa612ca584612c5a565b612c40565b905082815260208101848484011115612cc657612cc5612bde565b5b612cd1848285612c8a565b509392505050565b5f82601f830112612ced57612cec612bda565b5b8135612cfd848260208601612c98565b91505092915050565b5f8060408385031215612d1c57612d1b612a06565b5b5f83013567ffffffffffffffff811115612d3957612d38612a0a565b5b612d4585828601612cd9565b925050602083013567ffffffffffffffff811115612d6657612d65612a0a565b5b612d7285828601612cd9565b9150509250929050565b612d8581612b23565b8114612d8f575f80fd5b50565b5f81359050612da081612d7c565b92915050565b5f8060408385031215612dbc57612dbb612a06565b5b5f612dc985828601612ad1565b9250506020612dda85828601612d92565b9150509250929050565b5f60208284031215612df957612df8612a06565b5b5f612e0684828501612ad1565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e41816129cc565b82525050565b5f612e528383612e38565b60208301905092915050565b5f602082019050919050565b5f612e7482612e0f565b612e7e8185612e19565b9350612e8983612e29565b805f5b83811015612eb9578151612ea08882612e47565b9750612eab83612e5e565b925050600181019050612e8c565b5085935050505092915050565b5f6020820190508181035f830152612ede8184612e6a565b905092915050565b5f80fd5b5f80fd5b5f8083601f840112612f0357612f02612bda565b5b8235905067ffffffffffffffff811115612f2057612f1f612ee6565b5b602083019150836001820283011115612f3c57612f3b612eea565b5b9250929050565b5f805f805f60808688031215612f5c57612f5b612a06565b5b5f612f6988828901612ad1565b9550506020612f7a88828901612ad1565b9450506040612f8b88828901612a24565b935050606086013567ffffffffffffffff811115612fac57612fab612a0a565b5b612fb888828901612eee565b92509250509295509295909350565b5f8060408385031215612fdd57612fdc612a06565b5b5f612fea85828601612ad1565b9250506020612ffb85828601612ad1565b9150509250929050565b5f6020828403121561301a57613019612a06565b5b5f82013567ffffffffffffffff81111561303757613036612a0a565b5b61304384828501612cd9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061309057607f821691505b6020821081036130a3576130a261304c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6130e0826129cc565b91506130eb836129cc565b9250828203905081811115613103576131026130a9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6131815f83613163565b915061318c82613173565b5f82019050919050565b5f6080820190506131a95f830186612a93565b6131b66020830185612a93565b6131c360408301846129d5565b81810360608301526131d481613176565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613212816131de565b811461321c575f80fd5b50565b5f8151905061322d81613209565b92915050565b5f6020828403121561324857613247612a06565b5b5f6132558482850161321f565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026132ba7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261327f565b6132c4868361327f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6132ff6132fa6132f5846129cc565b6132dc565b6129cc565b9050919050565b5f819050919050565b613318836132e5565b61332c61332482613306565b84845461328b565b825550505050565b5f90565b613340613334565b61334b81848461330f565b505050565b5b8181101561336e576133635f82613338565b600181019050613351565b5050565b601f8211156133b3576133848161325e565b61338d84613270565b8101602085101561339c578190505b6133b06133a885613270565b830182613350565b50505b505050565b5f82821c905092915050565b5f6133d35f19846008026133b8565b1980831691505092915050565b5f6133eb83836133c4565b9150826002028217905092915050565b61340482612922565b67ffffffffffffffff81111561341d5761341c612be2565b5b6134278254613079565b613432828285613372565b5f60209050601f831160018114613463575f8415613451578287015190505b61345b85826133e0565b8655506134c2565b601f1984166134718661325e565b5f5b8281101561349857848901518255600182019150602085019450602081019050613473565b868310156134b557848901516134b1601f8916826133c4565b8355505b6001600288020188555050505b505050505050565b5f6134d58385613163565b93506134e2838584612c8a565b6134eb83612964565b840190509392505050565b5f6080820190506135095f830188612a93565b6135166020830187612a93565b61352360408301866129d5565b81810360608301526135368184866134ca565b90509695505050505050565b5f81905092915050565b5f815461355881613079565b6135628186613542565b9450600182165f811461357c5760018114613591576135c3565b60ff19831686528115158202860193506135c3565b61359a8561325e565b5f5b838110156135bb5781548189015260018201915060208101905061359c565b838801955050505b50505092915050565b5f6135d682612922565b6135e08185613542565b93506135f081856020860161293c565b80840191505092915050565b5f613607828561354c565b915061361382846135cc565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f61365082846135cc565b915061365b8261361f565b60058201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156136bf5780860481111561369b5761369a6130a9565b5b60018516156136aa5780820291505b80810290506136b88561366a565b945061367f565b94509492505050565b5f826136d75760019050613792565b816136e4575f9050613792565b81600181146136fa576002811461370457613733565b6001915050613792565b60ff841115613716576137156130a9565b5b8360020a91508482111561372d5761372c6130a9565b5b50613792565b5060208310610133831016604e8410600b84101617156137685782820a905083811115613763576137626130a9565b5b613792565b6137758484846001613676565b9250905081840481111561378c5761378b6130a9565b5b81810290505b9392505050565b5f6137a3826129cc565b91506137ae83612ba6565b92506137db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846136c8565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61381a826129cc565b9150613825836129cc565b925082613835576138346137e3565b5b828204905092915050565b5f61384a826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361387c5761387b6130a9565b5b600182019050919050565b5f819050919050565b6138a161389c826129cc565b613887565b82525050565b5f8160601b9050919050565b5f6138bd826138a7565b9050919050565b5f6138ce826138b3565b9050919050565b6138e66138e182612a82565b6138c4565b82525050565b5f6138f78286613890565b60208201915061390782856138d5565b6014820191506139178284613890565b602082019150819050949350505050565b5f613932826129cc565b915061393d836129cc565b92508261394d5761394c6137e3565b5b82820690509291505056fea2646970667358221220d84235871524c6eb2b711d483a57d2d9e695d72a60ad11098c02a411728348bd64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000064000000000000000000000000eaae1b3713e92639052fdc3edd8e2b0e69aaaa7d000000000000000000000000000000000000000000000000000000000000000c4f7264696e616c7320343034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f52444934303400000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101c2575f3560e01c80638da5cb5b116100f7578063c87b56dd11610095578063dd62ed3e1161006f578063dd62ed3e14610506578063e0df5b6f14610536578063e985e9c514610552578063f2fde38b14610582576101c2565b8063c87b56dd14610488578063ca4c0e09146104b8578063d547cfb7146104e8576101c2565b8063a22cb465116100d1578063a22cb46514610402578063a9059cbb1461041e578063a9e2880e1461044e578063b88d4fde1461046c576101c2565b80638da5cb5b1461039657806395d89b41146103b45780639b19251a146103d2576101c2565b8063313ce5671161016457806353d6fd591161013e57806353d6fd59146103105780636352211e1461032c57806370a082311461035c578063715018a61461038c576101c2565b8063313ce567146102ba57806342842e0e146102d8578063504334c2146102f4576101c2565b8063095ea7b3116101a0578063095ea7b31461023257806318160ddd1461026257806323b872dd146102805780632c88797e1461029c576101c2565b806306fdde03146101c657806307c56001146101e4578063081812fc14610202575b5f80fd5b6101ce61059e565b6040516101db91906129ac565b60405180910390f35b6101ec61062a565b6040516101f991906129e4565b60405180910390f35b61021c60048036038101906102179190612a38565b610630565b6040516102299190612aa2565b60405180910390f35b61024c60048036038101906102479190612ae5565b610660565b6040516102599190612b3d565b60405180910390f35b61026a610947565b60405161027791906129e4565b60405180910390f35b61029a60048036038101906102959190612b56565b61096b565b005b6102a4611162565b6040516102b191906129e4565b60405180910390f35b6102c2611168565b6040516102cf9190612bc1565b60405180910390f35b6102f260048036038101906102ed9190612b56565b61118c565b005b61030e60048036038101906103099190612d06565b6112bb565b005b61032a60048036038101906103259190612da6565b611363565b005b61034660048036038101906103419190612a38565b61143f565b6040516103539190612aa2565b60405180910390f35b61037660048036038101906103719190612de4565b6114dd565b60405161038391906129e4565b60405180910390f35b6103946114f2565b005b61039e611611565b6040516103ab9190612aa2565b60405180910390f35b6103bc611634565b6040516103c991906129ac565b60405180910390f35b6103ec60048036038101906103e79190612de4565b6116c0565b6040516103f99190612b3d565b60405180910390f35b61041c60048036038101906104179190612da6565b6116dd565b005b61043860048036038101906104339190612ae5565b6117d5565b6040516104459190612b3d565b60405180910390f35b6104566117e9565b6040516104639190612ec6565b60405180910390f35b61048660048036038101906104819190612f43565b61183f565b005b6104a2600480360381019061049d9190612a38565b611974565b6040516104af91906129ac565b60405180910390f35b6104d260048036038101906104cd9190612a38565b6119c7565b6040516104df91906129e4565b60405180910390f35b6104f06119e7565b6040516104fd91906129ac565b60405180910390f35b610520600480360381019061051b9190612fc7565b611a73565b60405161052d91906129e4565b60405180910390f35b610550600480360381019061054b9190613005565b611a93565b005b61056c60048036038101906105679190612fc7565b611b2a565b6040516105799190612b3d565b60405180910390f35b61059c60048036038101906105979190612de4565b611b54565b005b600180546105ab90613079565b80601f01602080910402602001604051908101604052809291908181526020018280546105d790613079565b80156106225780601f106105f957610100808354040283529160200191610622565b820191905f5260205f20905b81548152906001019060200180831161060557829003601f168201915b505050505081565b60075481565b600b602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600754821115801561067257505f82115b1561085a575f600d5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107695750600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156107a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600b5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161084c91906129e4565b60405180910390a35061093d565b81600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161093491906129e4565b60405180910390a35b6001905092915050565b7f0000000000000000000000000000000000000000000000056bc75e2d6310000081565b600554811161102357600d5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a09576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a6e576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b2c5750600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b945750600b5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610bcb576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd3611cd9565b60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c1e91906130d6565b92505081905550610c2d611cd9565b60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600d5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610d8391906130d6565b81548110610d9457610d93613109565b5b905f5260205f200154905080600e5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600f5f8581526020019081526020015f205481548110610e0057610dff613109565b5b905f5260205f200181905550600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e5957610e58613136565b5b600190038181905f5260205f20015f90559055600f5f8381526020019081526020015f2054600f5f8381526020019081526020015f2081905550600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f4191906130d6565b600f5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611008611cd9565b60405161101591906129e4565b60405180910390a35061115d565b5f600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461114f5781816110d291906130d6565b600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61115a848484611d0c565b50505b505050565b60055481565b7f000000000000000000000000000000000000000000000000000000000000001281565b61119783838361096b565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561127f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161121d93929190613196565b6020604051808303815f875af1158015611239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125d9190613233565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156112b6576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001908161134e91906133fb565b50806002908161135e91906133fb565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600d5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d8576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6009602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611576576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461164190613079565b80601f016020809104026020016040519081016040528092919081815260200182805461166d90613079565b80156116b85780601f1061168f576101008083540402835291602001916116b8565b820191905f5260205f20905b81548152906001019060200180831161169b57829003601f168201915b505050505081565b6010602052805f5260405f205f915054906101000a900460ff1681565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117c99190612b3d565b60405180910390a35050565b5f6117e1338484611d0c565b905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561183557602002820191905f5260205f20905b815481526020019060010190808311611821575b5050505050905090565b61184a85858561096b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611936575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016118d49594939291906134f6565b6020604051808303815f875af11580156118f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119149190613233565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561196d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6060600461198183612050565b6040516020016119929291906135fc565b6040516020818303038152906040526040516020016119b19190613645565b6040516020818303038152906040529050919050565b600681815481106119d6575f80fd5b905f5260205f20015f915090505481565b600480546119f490613079565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2090613079565b8015611a6b5780601f10611a4257610100808354040283529160200191611a6b565b820191905f5260205f20905b815481529060010190602001808311611a4e57829003601f168201915b505050505081565b600a602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b17576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060049081611b2691906133fb565b5050565b600c602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd8576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a611d079190613799565b905090565b5f80611d16611cd9565b90505f60095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611de691906130d6565b925050819055508460095f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060105f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611f0a575f8360095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ecf9190613810565b8484611edb9190613810565b611ee591906130d6565b90505f5b81811015611f0757611efa8961211a565b8080600101915050611ee9565b50505b60105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611fdd575f8382611f659190613810565b8460095f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611fae9190613810565b611fb891906130d6565b90505f5b81811015611fda57611fcd88612368565b8080600101915050611fbc565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161203a91906129e4565b60405180910390a3600193505050509392505050565b60605f600161205e846125e4565b0190505f8167ffffffffffffffff81111561207c5761207b612be2565b5b6040519080825280601f01601f1916602001820160405280156120ae5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561210f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612104576121036137e3565b5b0494505f85036120bb575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361217f576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061220a91906130d6565b8154811061221b5761221a613109565b5b905f5260205f200154905061222f81612735565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061227c5761227b613136565b5b600190038181905f5260205f20015f90559055600f5f8281526020019081526020015f205f9055600d5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123cd576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60055460075410156124245760075f8154809291906123ec90613840565b91905055506007549050600160085f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550612473565b5f6006805490501115612440576124396127da565b9050612472565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b81600d5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061257091906130d6565b600f5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612640577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612636576126356137e3565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061267d576d04ee2d6d415b85acef81000000008381612673576126726137e3565b5b0492506020810190505b662386f26fc1000083106126ac57662386f26fc1000083816126a2576126a16137e3565b5b0492506010810190505b6305f5e10083106126d5576305f5e10083816126cb576126ca6137e3565b5b0492506008810190505b61271083106126fa5761271083816126f0576126ef6137e3565b5b0492506004810190505b6064831061271d5760648381612713576127126137e3565b5b0492506002810190505b600a831061272c576001810190505b80915050919050565b60085f8281526020019081526020015f205f9054906101000a900460ff16612789576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600681908060018154018082558091505060019003905f5260205f20015f90919091909150555f60085f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f8060068054905003612819576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600680549050423360068054905060405160200161283a939291906138ec565b604051602081830303815290604052805190602001205f1c61285c9190613928565b90505f6006828154811061287357612872613109565b5b905f5260205f20015490506006600160068054905061289291906130d6565b815481106128a3576128a2613109565b5b905f5260205f200154600683815481106128c0576128bf613109565b5b905f5260205f20018190555060068054806128de576128dd613136565b5b600190038181905f5260205f20015f90559055600160085f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550809250505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561295957808201518184015260208101905061293e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61297e82612922565b612988818561292c565b935061299881856020860161293c565b6129a181612964565b840191505092915050565b5f6020820190508181035f8301526129c48184612974565b905092915050565b5f819050919050565b6129de816129cc565b82525050565b5f6020820190506129f75f8301846129d5565b92915050565b5f604051905090565b5f80fd5b5f80fd5b612a17816129cc565b8114612a21575f80fd5b50565b5f81359050612a3281612a0e565b92915050565b5f60208284031215612a4d57612a4c612a06565b5b5f612a5a84828501612a24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a8c82612a63565b9050919050565b612a9c81612a82565b82525050565b5f602082019050612ab55f830184612a93565b92915050565b612ac481612a82565b8114612ace575f80fd5b50565b5f81359050612adf81612abb565b92915050565b5f8060408385031215612afb57612afa612a06565b5b5f612b0885828601612ad1565b9250506020612b1985828601612a24565b9150509250929050565b5f8115159050919050565b612b3781612b23565b82525050565b5f602082019050612b505f830184612b2e565b92915050565b5f805f60608486031215612b6d57612b6c612a06565b5b5f612b7a86828701612ad1565b9350506020612b8b86828701612ad1565b9250506040612b9c86828701612a24565b9150509250925092565b5f60ff82169050919050565b612bbb81612ba6565b82525050565b5f602082019050612bd45f830184612bb2565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612c1882612964565b810181811067ffffffffffffffff82111715612c3757612c36612be2565b5b80604052505050565b5f612c496129fd565b9050612c558282612c0f565b919050565b5f67ffffffffffffffff821115612c7457612c73612be2565b5b612c7d82612964565b9050602081019050919050565b828183375f83830152505050565b5f612caa612ca584612c5a565b612c40565b905082815260208101848484011115612cc657612cc5612bde565b5b612cd1848285612c8a565b509392505050565b5f82601f830112612ced57612cec612bda565b5b8135612cfd848260208601612c98565b91505092915050565b5f8060408385031215612d1c57612d1b612a06565b5b5f83013567ffffffffffffffff811115612d3957612d38612a0a565b5b612d4585828601612cd9565b925050602083013567ffffffffffffffff811115612d6657612d65612a0a565b5b612d7285828601612cd9565b9150509250929050565b612d8581612b23565b8114612d8f575f80fd5b50565b5f81359050612da081612d7c565b92915050565b5f8060408385031215612dbc57612dbb612a06565b5b5f612dc985828601612ad1565b9250506020612dda85828601612d92565b9150509250929050565b5f60208284031215612df957612df8612a06565b5b5f612e0684828501612ad1565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e41816129cc565b82525050565b5f612e528383612e38565b60208301905092915050565b5f602082019050919050565b5f612e7482612e0f565b612e7e8185612e19565b9350612e8983612e29565b805f5b83811015612eb9578151612ea08882612e47565b9750612eab83612e5e565b925050600181019050612e8c565b5085935050505092915050565b5f6020820190508181035f830152612ede8184612e6a565b905092915050565b5f80fd5b5f80fd5b5f8083601f840112612f0357612f02612bda565b5b8235905067ffffffffffffffff811115612f2057612f1f612ee6565b5b602083019150836001820283011115612f3c57612f3b612eea565b5b9250929050565b5f805f805f60808688031215612f5c57612f5b612a06565b5b5f612f6988828901612ad1565b9550506020612f7a88828901612ad1565b9450506040612f8b88828901612a24565b935050606086013567ffffffffffffffff811115612fac57612fab612a0a565b5b612fb888828901612eee565b92509250509295509295909350565b5f8060408385031215612fdd57612fdc612a06565b5b5f612fea85828601612ad1565b9250506020612ffb85828601612ad1565b9150509250929050565b5f6020828403121561301a57613019612a06565b5b5f82013567ffffffffffffffff81111561303757613036612a0a565b5b61304384828501612cd9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061309057607f821691505b6020821081036130a3576130a261304c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6130e0826129cc565b91506130eb836129cc565b9250828203905081811115613103576131026130a9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6131815f83613163565b915061318c82613173565b5f82019050919050565b5f6080820190506131a95f830186612a93565b6131b66020830185612a93565b6131c360408301846129d5565b81810360608301526131d481613176565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613212816131de565b811461321c575f80fd5b50565b5f8151905061322d81613209565b92915050565b5f6020828403121561324857613247612a06565b5b5f6132558482850161321f565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026132ba7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261327f565b6132c4868361327f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6132ff6132fa6132f5846129cc565b6132dc565b6129cc565b9050919050565b5f819050919050565b613318836132e5565b61332c61332482613306565b84845461328b565b825550505050565b5f90565b613340613334565b61334b81848461330f565b505050565b5b8181101561336e576133635f82613338565b600181019050613351565b5050565b601f8211156133b3576133848161325e565b61338d84613270565b8101602085101561339c578190505b6133b06133a885613270565b830182613350565b50505b505050565b5f82821c905092915050565b5f6133d35f19846008026133b8565b1980831691505092915050565b5f6133eb83836133c4565b9150826002028217905092915050565b61340482612922565b67ffffffffffffffff81111561341d5761341c612be2565b5b6134278254613079565b613432828285613372565b5f60209050601f831160018114613463575f8415613451578287015190505b61345b85826133e0565b8655506134c2565b601f1984166134718661325e565b5f5b8281101561349857848901518255600182019150602085019450602081019050613473565b868310156134b557848901516134b1601f8916826133c4565b8355505b6001600288020188555050505b505050505050565b5f6134d58385613163565b93506134e2838584612c8a565b6134eb83612964565b840190509392505050565b5f6080820190506135095f830188612a93565b6135166020830187612a93565b61352360408301866129d5565b81810360608301526135368184866134ca565b90509695505050505050565b5f81905092915050565b5f815461355881613079565b6135628186613542565b9450600182165f811461357c5760018114613591576135c3565b60ff19831686528115158202860193506135c3565b61359a8561325e565b5f5b838110156135bb5781548189015260018201915060208101905061359c565b838801955050505b50505092915050565b5f6135d682612922565b6135e08185613542565b93506135f081856020860161293c565b80840191505092915050565b5f613607828561354c565b915061361382846135cc565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f61365082846135cc565b915061365b8261361f565b60058201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156136bf5780860481111561369b5761369a6130a9565b5b60018516156136aa5780820291505b80810290506136b88561366a565b945061367f565b94509492505050565b5f826136d75760019050613792565b816136e4575f9050613792565b81600181146136fa576002811461370457613733565b6001915050613792565b60ff841115613716576137156130a9565b5b8360020a91508482111561372d5761372c6130a9565b5b50613792565b5060208310610133831016604e8410600b84101617156137685782820a905083811115613763576137626130a9565b5b613792565b6137758484846001613676565b9250905081840481111561378c5761378b6130a9565b5b81810290505b9392505050565b5f6137a3826129cc565b91506137ae83612ba6565b92506137db7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846136c8565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61381a826129cc565b9150613825836129cc565b925082613835576138346137e3565b5b828204905092915050565b5f61384a826129cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361387c5761387b6130a9565b5b600182019050919050565b5f819050919050565b6138a161389c826129cc565b613887565b82525050565b5f8160601b9050919050565b5f6138bd826138a7565b9050919050565b5f6138ce826138b3565b9050919050565b6138e66138e182612a82565b6138c4565b82525050565b5f6138f78286613890565b60208201915061390782856138d5565b6014820191506139178284613890565b602082019150819050949350505050565b5f613932826129cc565b915061393d836129cc565b92508261394d5761394c6137e3565b5b82820690509291505056fea2646970667358221220d84235871524c6eb2b711d483a57d2d9e695d72a60ad11098c02a411728348bd64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000064000000000000000000000000eaae1b3713e92639052fdc3edd8e2b0e69aaaa7d000000000000000000000000000000000000000000000000000000000000000c4f7264696e616c7320343034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f52444934303400000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Ordinals 404
Arg [1] : _symbol (string): ORDI404
Arg [2] : _decimals (uint8): 18
Arg [3] : _totalNativeSupply (uint256): 100
Arg [4] : _owner (address): 0xeaAe1B3713e92639052fdC3EDD8E2B0e69aAaA7D
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 000000000000000000000000eaae1b3713e92639052fdc3edd8e2b0e69aaaa7d
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 4f7264696e616c73203430340000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 4f52444934303400000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21496:11476:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22483:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23184:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23630:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25776:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22719:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26814:1685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22981:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22619:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28762:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32688:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24918:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25099:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23396:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21075:153;;;:::i;:::-;;20516:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22537;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24241:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26466:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28558:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32867:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29220:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25406:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23057:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22911:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23510:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25292:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23741:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20848:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22483:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23184:26::-;;;;:::o;23630:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;25776:639::-;25871:4;25906:11;;25892:10;:25;;:43;;;;;25934:1;25921:10;:14;25892:43;25888:496;;;25952:13;25968:8;:20;25977:10;25968:20;;;;;;;;;;;;;;;;;;;;;25952:36;;26023:5;26009:19;;:10;:19;;;;:59;;;;;26033:16;:23;26050:5;26033:23;;;;;;;;;;;;;;;:35;26057:10;26033:35;;;;;;;;;;;;;;;;;;;;;;;;;26032:36;26009:59;26005:121;;;26096:14;;;;;;;;;;;;;;26005:121;26168:7;26142:11;:23;26154:10;26142:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;26213:7;26197:36;;26206:5;26197:36;;;26222:10;26197:36;;;;;;:::i;:::-;;;;;;;;25937:308;25888:496;;;26299:10;26266:9;:21;26276:10;26266:21;;;;;;;;;;;;;;;:30;26288:7;26266:30;;;;;;;;;;;;;;;:43;;;;26352:7;26331:41;;26340:10;26331:41;;;26361:10;26331:41;;;;;;:::i;:::-;;;;;;;;25888:496;26403:4;26396:11;;25776:639;;;;:::o;22719:36::-;;;:::o;26814:1685::-;26918:17;;26904:10;:31;26900:1592;;26964:8;:20;26973:10;26964:20;;;;;;;;;;;;;;;;;;;;;26956:28;;:4;:28;;;26952:91;;27012:15;;;;;;;;;;;;;;26952:91;27077:1;27063:16;;:2;:16;;;27059:82;;27107:18;;;;;;;;;;;;;;27059:82;27193:4;27179:18;;:10;:18;;;;:74;;;;;27219:16;:22;27236:4;27219:22;;;;;;;;;;;;;;;:34;27242:10;27219:34;;;;;;;;;;;;;;;;;;;;;;;;;27218:35;27179:74;:132;;;;;27288:11;:23;27300:10;27288:23;;;;;;;;;;;;;;;;;;;;;27274:37;;:10;:37;;;;27179:132;27157:226;;;27353:14;;;;;;;;;;;;;;27157:226;27418:10;:8;:10::i;:::-;27399:9;:15;27409:4;27399:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27491:10;:8;:10::i;:::-;27474:9;:13;27484:2;27474:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;27556:2;27533:8;:20;27542:10;27533:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;27580:11;:23;27592:10;27580:23;;;;;;;;;;;;27573:30;;;;;;;;;;;27661:17;27681:6;:12;27688:4;27681:12;;;;;;;;;;;;;;;27716:1;27694:6;:12;27701:4;27694:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;27681:37;;;;;;;;:::i;:::-;;;;;;;;;;27661:57;;27773:9;27733:6;:12;27740:4;27733:12;;;;;;;;;;;;;;;27746:11;:23;27758:10;27746:23;;;;;;;;;;;;27733:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;27817:6;:12;27824:4;27817:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27921:11;:23;27933:10;27921:23;;;;;;;;;;;;27896:11;:22;27908:9;27896:22;;;;;;;;;;;:48;;;;27998:6;:10;28005:2;27998:10;;;;;;;;;;;;;;;28014;27998:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28128:1;28108:6;:10;28115:2;28108:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28082:11;:23;28094:10;28082:23;;;;;;;;;;;:47;;;;28170:10;28166:2;28151:30;;28160:4;28151:30;;;;;;;;;;;;28221:2;28201:35;;28215:4;28201:35;;;28225:10;:8;:10::i;:::-;28201:35;;;;;;:::i;:::-;;;;;;;;26937:1311;26900:1592;;;28269:15;28287:9;:15;28297:4;28287:15;;;;;;;;;;;;;;;:27;28303:10;28287:27;;;;;;;;;;;;;;;;28269:45;;28346:17;28335:7;:28;28331:101;;28422:10;28412:7;:20;;;;:::i;:::-;28382:9;:15;28392:4;28382:15;;;;;;;;;;;;;;;:27;28398:10;28382:27;;;;;;;;;;;;;;;:50;;;;28331:101;28449:31;28459:4;28465:2;28469:10;28449:9;:31::i;:::-;;28254:238;26900:1592;26814:1685;;;:::o;22981:32::-;;;;:::o;22619:31::-;;;:::o;28762:363::-;28844:26;28857:4;28863:2;28867;28844:12;:26::i;:::-;28919:1;28901:2;:14;;;:19;;:154;;;;;29015:40;;;28937:118;;;28952:2;28937:35;;;28973:10;28985:4;28991:2;28937:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;28901:154;28883:235;;;29089:17;;;;;;;;;;;;;;28883:235;28762:363;;;:::o;32688:167::-;20603:5;;;;;;;;;;20589:19;;:10;:19;;;20585:46;;20617:14;;;;;;;;;;;;;;20585:46;32815:5:::1;32808:4;:12;;;;;;:::i;:::-;;32840:7;32831:6;:16;;;;;;:::i;:::-;;32688:167:::0;;:::o;24918:111::-;20603:5;;;;;;;;;;20589:19;;:10;:19;;;20585:46;;20617:14;;;;;;;;;;;;;;20585:46;25016:5:::1;24996:9;:17;25006:6;24996:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24918:111:::0;;:::o;25099:185::-;25149:13;25183:8;:12;25192:2;25183:12;;;;;;;;;;;;;;;;;;;;;25175:20;;25229:1;25212:19;;:5;:19;;;25208:69;;25255:10;;;;;;;;;;;;;;25208:69;25099:185;;;:::o;23396:44::-;;;;;;;;;;;;;;;;;:::o;21075:153::-;20603:5;;;;;;;;;;20589:19;;:10;:19;;;20585:46;;20617:14;;;;;;;;;;;;;;20585:46;21156:1:::1;21140:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;21217:1;21176:44;;21197:10;21176:44;;;;;;;;;;;;21075:153::o:0;20516:20::-;;;;;;;;;;;;:::o;22537:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24241:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;26466:199::-;26585:8;26544:16;:28;26561:10;26544:28;;;;;;;;;;;;;;;:38;26573:8;26544:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;26638:8;26611:46;;26626:10;26611:46;;;26648:8;26611:46;;;;;;:::i;:::-;;;;;;;;26466:199;;:::o;28558:127::-;28620:4;28644:33;28654:10;28666:2;28670:6;28644:9;:33::i;:::-;28637:40;;28558:127;;;;:::o;32867:102::-;32914:16;32950:11;32943:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32867:102;:::o;29220:429::-;29366:26;29379:4;29385:2;29389;29366:12;:26::i;:::-;29441:1;29423:2;:14;;;:19;;:156;;;;;29539:40;;;29459:120;;;29474:2;29459:35;;;29495:10;29507:4;29513:2;29517:4;;29459:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;29423:156;29405:237;;;29613:17;;;;;;;;;;;;;;29405:237;29220:429;;;;;:::o;25406:221::-;25457:13;25541:12;25555:20;25572:2;25555:16;:20::i;:::-;25527:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25499:110;;;;;;;;:::i;:::-;;;;;;;;;;;;;25483:126;;25406:221;;;:::o;23057:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22911:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23510:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25292:106::-;20603:5;;;;;;;;;;20589:19;;:10;:19;;;20585:46;;20617:14;;;;;;;;;;;;;;20585:46;25381:9:::1;25366:12;:24;;;;;;:::i;:::-;;25292:106:::0;:::o;23741:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20848:219::-;20603:5;;;;;;;;;;20589:19;;:10;:19;;;20585:46;;20617:14;;;;;;;;;;;;;;20585:46;20949:1:::1;20931:20;;:6;:20;;::::0;20927:47:::1;;20960:14;;;;;;;;;;;;;;20927:47;20995:6;20987:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;21052:6;21019:40;;21040:10;21019:40;;;;;;;;;;;;20848:219:::0;:::o;30849:92::-;30892:7;30925:8;30919:2;:14;;;;:::i;:::-;30912:21;;30849:92;:::o;29717:1093::-;29830:4;29847:12;29862:10;:8;:10::i;:::-;29847:25;;29883:27;29913:9;:15;29923:4;29913:15;;;;;;;;;;;;;;;;29883:45;;29939:29;29971:9;:13;29981:2;29971:13;;;;;;;;;;;;;;;;29939:45;;30016:6;29997:9;:15;30007:4;29997:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30077:6;30060:9;:13;30070:2;30060:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;30168:9;:15;30178:4;30168:15;;;;;;;;;;;;;;;;;;;;;;;;;30163:251;;30200:22;30292:4;30274:9;:15;30284:4;30274:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;30248:4;30226:19;:26;;;;:::i;:::-;30225:72;;;;:::i;:::-;30200:97;;30317:9;30312:91;30336:14;30332:1;:18;30312:91;;;30376:11;30382:4;30376:5;:11::i;:::-;30352:3;;;;;;;30312:91;;;;30185:229;30163:251;30490:9;:13;30500:2;30490:13;;;;;;;;;;;;;;;;;;;;;;;;;30485:247;;30520:22;30612:4;30588:21;:28;;;;:::i;:::-;30562:4;30546:9;:13;30556:2;30546:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;30545:72;;;;:::i;:::-;30520:97;;30637:9;30632:89;30656:14;30652:1;:18;30632:89;;;30696:9;30702:2;30696:5;:9::i;:::-;30672:3;;;;;;;30632:89;;;;30505:227;30485:247;30769:2;30749:31;;30763:4;30749:31;;;30773:6;30749:31;;;;;;:::i;:::-;;;;;;;;30798:4;30791:11;;;;;29717:1093;;;;;:::o;17709:718::-;17765:13;17816:14;17853:1;17833:17;17844:5;17833:10;:17::i;:::-;:21;17816:38;;17869:20;17903:6;17892:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17869:41;;17925:11;18054:6;18050:2;18046:15;18038:6;18034:28;18027:35;;18091:290;18098:4;18091:290;;;18123:5;;;;;;;;18265:10;18260:2;18253:5;18249:14;18244:32;18239:3;18231:46;18323:2;18314:11;;;;;;:::i;:::-;;;;;18357:1;18348:5;:10;18091:290;18344:21;18091:290;18402:6;18395:13;;;;;17709:718;;;:::o;32287:393::-;32356:1;32340:18;;:4;:18;;;32336:73;;32382:15;;;;;;;;;;;;;;32336:73;32419:10;32432:6;:12;32439:4;32432:12;;;;;;;;;;;;;;;32467:1;32445:6;:12;32452:4;32445:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;32432:37;;;;;;;;:::i;:::-;;;;;;;;;;32419:50;;32480:19;32496:2;32480:15;:19::i;:::-;32510:6;:12;32517:4;32510:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32546:11;:15;32558:2;32546:15;;;;;;;;;;;32539:22;;;32579:8;:12;32588:2;32579:12;;;;;;;;;;;;32572:19;;;;;;;;;;;32609:11;:15;32621:2;32609:15;;;;;;;;;;;;32602:22;;;;;;;;;;;32669:2;32665:1;32642:30;;32651:4;32642:30;;;;;;;;;;;;32325:355;32287:393;:::o;31678:601::-;31743:1;31729:16;;:2;:16;;;31725:74;;31769:18;;;;;;;;;;;;;;31725:74;31811:10;31852:17;;31838:11;;:31;31834:282;;;31886:11;;:13;;;;;;;;;:::i;:::-;;;;;;31919:11;;31914:16;;31962:4;31945:10;:14;31956:2;31945:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31834:282;;;32009:1;31988:11;:18;;;;:22;31984:132;;;32032:19;:17;:19::i;:::-;32027:24;;31984:132;;;32091:13;;;;;;;;;;;;;;31984:132;31834:282;32143:2;32128:8;:12;32137:2;32128:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;32156:6;:10;32163:2;32156:10;;;;;;;;;;;;;;;32172:2;32156:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32224:1;32204:6;:10;32211:2;32204:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;32186:11;:15;32198:2;32186:15;;;;;;;;;;;:39;;;;32268:2;32264;32243:28;;32260:1;32243:28;;;;;;;;;;;;31714:565;31678:601;:::o;14113:948::-;14166:7;14186:14;14203:1;14186:18;;14253:8;14244:5;:17;14240:106;;14291:8;14282:17;;;;;;:::i;:::-;;;;;14328:2;14318:12;;;;14240:106;14373:8;14364:5;:17;14360:106;;14411:8;14402:17;;;;;;:::i;:::-;;;;;14448:2;14438:12;;;;14360:106;14493:8;14484:5;:17;14480:106;;14531:8;14522:17;;;;;;:::i;:::-;;;;;14568:2;14558:12;;;;14480:106;14613:7;14604:5;:16;14600:103;;14650:7;14641:16;;;;;;:::i;:::-;;;;;14686:1;14676:11;;;;14600:103;14730:7;14721:5;:16;14717:103;;14767:7;14758:16;;;;;;:::i;:::-;;;;;14803:1;14793:11;;;;14717:103;14847:7;14838:5;:16;14834:103;;14884:7;14875:16;;;;;;:::i;:::-;;;;;14920:1;14910:11;;;;14834:103;14964:7;14955:5;:16;14951:68;;15002:1;14992:11;;;;14951:68;15047:6;15040:13;;;14113:948;;;:::o;31473:197::-;31534:10;:14;31545:2;31534:14;;;;;;;;;;;;;;;;;;;;;31529:70;;31572:15;;;;;;;;;;;;;;31529:70;31609:11;31626:2;31609:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31657:5;31640:10;:14;31651:2;31640:14;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;31473:197;:::o;30949:512::-;30995:7;31041:1;31019:11;:18;;;;:23;31015:76;;31066:13;;;;;;;;;;;;;;31015:76;31101:19;31234:11;:18;;;;31172:15;31189:10;31200:11;:18;;;;31155:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31145:75;;;;;;31123:108;;:129;;;;:::i;:::-;31101:151;;31263:10;31276:11;31288;31276:24;;;;;;;;:::i;:::-;;;;;;;;;;31263:37;;31338:11;31371:1;31350:11;:18;;;;:22;;;;:::i;:::-;31338:35;;;;;;;;:::i;:::-;;;;;;;;;;31311:11;31323;31311:24;;;;;;;;:::i;:::-;;;;;;;;;:62;;;;31384:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31429:4;31412:10;:14;31423:2;31412:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31451:2;31444:9;;;;30949:512;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:77::-;1386:7;1415:5;1404:16;;1349:77;;;:::o;1432:118::-;1519:24;1537:5;1519:24;:::i;:::-;1514:3;1507:37;1432:118;;:::o;1556:222::-;1649:4;1687:2;1676:9;1672:18;1664:26;;1700:71;1768:1;1757:9;1753:17;1744:6;1700:71;:::i;:::-;1556:222;;;;:::o;1784:75::-;1817:6;1850:2;1844:9;1834:19;;1784:75;:::o;1865:117::-;1974:1;1971;1964:12;1988:117;2097:1;2094;2087:12;2111:122;2184:24;2202:5;2184:24;:::i;:::-;2177:5;2174:35;2164:63;;2223:1;2220;2213:12;2164:63;2111:122;:::o;2239:139::-;2285:5;2323:6;2310:20;2301:29;;2339:33;2366:5;2339:33;:::i;:::-;2239:139;;;;:::o;2384:329::-;2443:6;2492:2;2480:9;2471:7;2467:23;2463:32;2460:119;;;2498:79;;:::i;:::-;2460:119;2618:1;2643:53;2688:7;2679:6;2668:9;2664:22;2643:53;:::i;:::-;2633:63;;2589:117;2384:329;;;;:::o;2719:126::-;2756:7;2796:42;2789:5;2785:54;2774:65;;2719:126;;;:::o;2851:96::-;2888:7;2917:24;2935:5;2917:24;:::i;:::-;2906:35;;2851:96;;;:::o;2953:118::-;3040:24;3058:5;3040:24;:::i;:::-;3035:3;3028:37;2953:118;;:::o;3077:222::-;3170:4;3208:2;3197:9;3193:18;3185:26;;3221:71;3289:1;3278:9;3274:17;3265:6;3221:71;:::i;:::-;3077:222;;;;:::o;3305:122::-;3378:24;3396:5;3378:24;:::i;:::-;3371:5;3368:35;3358:63;;3417:1;3414;3407:12;3358:63;3305:122;:::o;3433:139::-;3479:5;3517:6;3504:20;3495:29;;3533:33;3560:5;3533:33;:::i;:::-;3433:139;;;;:::o;3578:474::-;3646:6;3654;3703:2;3691:9;3682:7;3678:23;3674:32;3671:119;;;3709:79;;:::i;:::-;3671:119;3829:1;3854:53;3899:7;3890:6;3879:9;3875:22;3854:53;:::i;:::-;3844:63;;3800:117;3956:2;3982:53;4027:7;4018:6;4007:9;4003:22;3982:53;:::i;:::-;3972:63;;3927:118;3578:474;;;;;:::o;4058:90::-;4092:7;4135:5;4128:13;4121:21;4110:32;;4058:90;;;:::o;4154:109::-;4235:21;4250:5;4235:21;:::i;:::-;4230:3;4223:34;4154:109;;:::o;4269:210::-;4356:4;4394:2;4383:9;4379:18;4371:26;;4407:65;4469:1;4458:9;4454:17;4445:6;4407:65;:::i;:::-;4269:210;;;;:::o;4485:619::-;4562:6;4570;4578;4627:2;4615:9;4606:7;4602:23;4598:32;4595:119;;;4633:79;;:::i;:::-;4595:119;4753:1;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4724:117;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;4485:619;;;;;:::o;5110:86::-;5145:7;5185:4;5178:5;5174:16;5163:27;;5110:86;;;:::o;5202:112::-;5285:22;5301:5;5285:22;:::i;:::-;5280:3;5273:35;5202:112;;:::o;5320:214::-;5409:4;5447:2;5436:9;5432:18;5424:26;;5460:67;5524:1;5513:9;5509:17;5500:6;5460:67;:::i;:::-;5320:214;;;;:::o;5540:117::-;5649:1;5646;5639:12;5663:117;5772:1;5769;5762:12;5786:180;5834:77;5831:1;5824:88;5931:4;5928:1;5921:15;5955:4;5952:1;5945:15;5972:281;6055:27;6077:4;6055:27;:::i;:::-;6047:6;6043:40;6185:6;6173:10;6170:22;6149:18;6137:10;6134:34;6131:62;6128:88;;;6196:18;;:::i;:::-;6128:88;6236:10;6232:2;6225:22;6015:238;5972:281;;:::o;6259:129::-;6293:6;6320:20;;:::i;:::-;6310:30;;6349:33;6377:4;6369:6;6349:33;:::i;:::-;6259:129;;;:::o;6394:308::-;6456:4;6546:18;6538:6;6535:30;6532:56;;;6568:18;;:::i;:::-;6532:56;6606:29;6628:6;6606:29;:::i;:::-;6598:37;;6690:4;6684;6680:15;6672:23;;6394:308;;;:::o;6708:146::-;6805:6;6800:3;6795;6782:30;6846:1;6837:6;6832:3;6828:16;6821:27;6708:146;;;:::o;6860:425::-;6938:5;6963:66;6979:49;7021:6;6979:49;:::i;:::-;6963:66;:::i;:::-;6954:75;;7052:6;7045:5;7038:21;7090:4;7083:5;7079:16;7128:3;7119:6;7114:3;7110:16;7107:25;7104:112;;;7135:79;;:::i;:::-;7104:112;7225:54;7272:6;7267:3;7262;7225:54;:::i;:::-;6944:341;6860:425;;;;;:::o;7305:340::-;7361:5;7410:3;7403:4;7395:6;7391:17;7387:27;7377:122;;7418:79;;:::i;:::-;7377:122;7535:6;7522:20;7560:79;7635:3;7627:6;7620:4;7612:6;7608:17;7560:79;:::i;:::-;7551:88;;7367:278;7305:340;;;;:::o;7651:834::-;7739:6;7747;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7950:1;7939:9;7935:17;7922:31;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8107:63;8162:7;8153:6;8142:9;8138:22;8107:63;:::i;:::-;8097:73;;7893:287;8247:2;8236:9;8232:18;8219:32;8278:18;8270:6;8267:30;8264:117;;;8300:79;;:::i;:::-;8264:117;8405:63;8460:7;8451:6;8440:9;8436:22;8405:63;:::i;:::-;8395:73;;8190:288;7651:834;;;;;:::o;8491:116::-;8561:21;8576:5;8561:21;:::i;:::-;8554:5;8551:32;8541:60;;8597:1;8594;8587:12;8541:60;8491:116;:::o;8613:133::-;8656:5;8694:6;8681:20;8672:29;;8710:30;8734:5;8710:30;:::i;:::-;8613:133;;;;:::o;8752:468::-;8817:6;8825;8874:2;8862:9;8853:7;8849:23;8845:32;8842:119;;;8880:79;;:::i;:::-;8842:119;9000:1;9025:53;9070:7;9061:6;9050:9;9046:22;9025:53;:::i;:::-;9015:63;;8971:117;9127:2;9153:50;9195:7;9186:6;9175:9;9171:22;9153:50;:::i;:::-;9143:60;;9098:115;8752:468;;;;;:::o;9226:329::-;9285:6;9334:2;9322:9;9313:7;9309:23;9305:32;9302:119;;;9340:79;;:::i;:::-;9302:119;9460:1;9485:53;9530:7;9521:6;9510:9;9506:22;9485:53;:::i;:::-;9475:63;;9431:117;9226:329;;;;:::o;9561:114::-;9628:6;9662:5;9656:12;9646:22;;9561:114;;;:::o;9681:184::-;9780:11;9814:6;9809:3;9802:19;9854:4;9849:3;9845:14;9830:29;;9681:184;;;;:::o;9871:132::-;9938:4;9961:3;9953:11;;9991:4;9986:3;9982:14;9974:22;;9871:132;;;:::o;10009:108::-;10086:24;10104:5;10086:24;:::i;:::-;10081:3;10074:37;10009:108;;:::o;10123:179::-;10192:10;10213:46;10255:3;10247:6;10213:46;:::i;:::-;10291:4;10286:3;10282:14;10268:28;;10123:179;;;;:::o;10308:113::-;10378:4;10410;10405:3;10401:14;10393:22;;10308:113;;;:::o;10457:732::-;10576:3;10605:54;10653:5;10605:54;:::i;:::-;10675:86;10754:6;10749:3;10675:86;:::i;:::-;10668:93;;10785:56;10835:5;10785:56;:::i;:::-;10864:7;10895:1;10880:284;10905:6;10902:1;10899:13;10880:284;;;10981:6;10975:13;11008:63;11067:3;11052:13;11008:63;:::i;:::-;11001:70;;11094:60;11147:6;11094:60;:::i;:::-;11084:70;;10940:224;10927:1;10924;10920:9;10915:14;;10880:284;;;10884:14;11180:3;11173:10;;10581:608;;;10457:732;;;;:::o;11195:373::-;11338:4;11376:2;11365:9;11361:18;11353:26;;11425:9;11419:4;11415:20;11411:1;11400:9;11396:17;11389:47;11453:108;11556:4;11547:6;11453:108;:::i;:::-;11445:116;;11195:373;;;;:::o;11574:117::-;11683:1;11680;11673:12;11697:117;11806:1;11803;11796:12;11833:552;11890:8;11900:6;11950:3;11943:4;11935:6;11931:17;11927:27;11917:122;;11958:79;;:::i;:::-;11917:122;12071:6;12058:20;12048:30;;12101:18;12093:6;12090:30;12087:117;;;12123:79;;:::i;:::-;12087:117;12237:4;12229:6;12225:17;12213:29;;12291:3;12283:4;12275:6;12271:17;12261:8;12257:32;12254:41;12251:128;;;12298:79;;:::i;:::-;12251:128;11833:552;;;;;:::o;12391:963::-;12488:6;12496;12504;12512;12520;12569:3;12557:9;12548:7;12544:23;12540:33;12537:120;;;12576:79;;:::i;:::-;12537:120;12696:1;12721:53;12766:7;12757:6;12746:9;12742:22;12721:53;:::i;:::-;12711:63;;12667:117;12823:2;12849:53;12894:7;12885:6;12874:9;12870:22;12849:53;:::i;:::-;12839:63;;12794:118;12951:2;12977:53;13022:7;13013:6;13002:9;12998:22;12977:53;:::i;:::-;12967:63;;12922:118;13107:2;13096:9;13092:18;13079:32;13138:18;13130:6;13127:30;13124:117;;;13160:79;;:::i;:::-;13124:117;13273:64;13329:7;13320:6;13309:9;13305:22;13273:64;:::i;:::-;13255:82;;;;13050:297;12391:963;;;;;;;;:::o;13360:474::-;13428:6;13436;13485:2;13473:9;13464:7;13460:23;13456:32;13453:119;;;13491:79;;:::i;:::-;13453:119;13611:1;13636:53;13681:7;13672:6;13661:9;13657:22;13636:53;:::i;:::-;13626:63;;13582:117;13738:2;13764:53;13809:7;13800:6;13789:9;13785:22;13764:53;:::i;:::-;13754:63;;13709:118;13360:474;;;;;:::o;13840:509::-;13909:6;13958:2;13946:9;13937:7;13933:23;13929:32;13926:119;;;13964:79;;:::i;:::-;13926:119;14112:1;14101:9;14097:17;14084:31;14142:18;14134:6;14131:30;14128:117;;;14164:79;;:::i;:::-;14128:117;14269:63;14324:7;14315:6;14304:9;14300:22;14269:63;:::i;:::-;14259:73;;14055:287;13840:509;;;;:::o;14355:180::-;14403:77;14400:1;14393:88;14500:4;14497:1;14490:15;14524:4;14521:1;14514:15;14541:320;14585:6;14622:1;14616:4;14612:12;14602:22;;14669:1;14663:4;14659:12;14690:18;14680:81;;14746:4;14738:6;14734:17;14724:27;;14680:81;14808:2;14800:6;14797:14;14777:18;14774:38;14771:84;;14827:18;;:::i;:::-;14771:84;14592:269;14541:320;;;:::o;14867:180::-;14915:77;14912:1;14905:88;15012:4;15009:1;15002:15;15036:4;15033:1;15026:15;15053:194;15093:4;15113:20;15131:1;15113:20;:::i;:::-;15108:25;;15147:20;15165:1;15147:20;:::i;:::-;15142:25;;15191:1;15188;15184:9;15176:17;;15215:1;15209:4;15206:11;15203:37;;;15220:18;;:::i;:::-;15203:37;15053:194;;;;:::o;15253:180::-;15301:77;15298:1;15291:88;15398:4;15395:1;15388:15;15422:4;15419:1;15412:15;15439:180;15487:77;15484:1;15477:88;15584:4;15581:1;15574:15;15608:4;15605:1;15598:15;15625:168;15708:11;15742:6;15737:3;15730:19;15782:4;15777:3;15773:14;15758:29;;15625:168;;;;:::o;15799:114::-;;:::o;15919:362::-;16060:3;16081:65;16144:1;16139:3;16081:65;:::i;:::-;16074:72;;16155:93;16244:3;16155:93;:::i;:::-;16273:1;16268:3;16264:11;16257:18;;15919:362;;;:::o;16287:748::-;16536:4;16574:3;16563:9;16559:19;16551:27;;16588:71;16656:1;16645:9;16641:17;16632:6;16588:71;:::i;:::-;16669:72;16737:2;16726:9;16722:18;16713:6;16669:72;:::i;:::-;16751;16819:2;16808:9;16804:18;16795:6;16751:72;:::i;:::-;16870:9;16864:4;16860:20;16855:2;16844:9;16840:18;16833:48;16898:130;17023:4;16898:130;:::i;:::-;16890:138;;16287:748;;;;;;:::o;17041:149::-;17077:7;17117:66;17110:5;17106:78;17095:89;;17041:149;;;:::o;17196:120::-;17268:23;17285:5;17268:23;:::i;:::-;17261:5;17258:34;17248:62;;17306:1;17303;17296:12;17248:62;17196:120;:::o;17322:141::-;17378:5;17409:6;17403:13;17394:22;;17425:32;17451:5;17425:32;:::i;:::-;17322:141;;;;:::o;17469:349::-;17538:6;17587:2;17575:9;17566:7;17562:23;17558:32;17555:119;;;17593:79;;:::i;:::-;17555:119;17713:1;17738:63;17793:7;17784:6;17773:9;17769:22;17738:63;:::i;:::-;17728:73;;17684:127;17469:349;;;;:::o;17824:141::-;17873:4;17896:3;17888:11;;17919:3;17916:1;17909:14;17953:4;17950:1;17940:18;17932:26;;17824:141;;;:::o;17971:93::-;18008:6;18055:2;18050;18043:5;18039:14;18035:23;18025:33;;17971:93;;;:::o;18070:107::-;18114:8;18164:5;18158:4;18154:16;18133:37;;18070:107;;;;:::o;18183:393::-;18252:6;18302:1;18290:10;18286:18;18325:97;18355:66;18344:9;18325:97;:::i;:::-;18443:39;18473:8;18462:9;18443:39;:::i;:::-;18431:51;;18515:4;18511:9;18504:5;18500:21;18491:30;;18564:4;18554:8;18550:19;18543:5;18540:30;18530:40;;18259:317;;18183:393;;;;;:::o;18582:60::-;18610:3;18631:5;18624:12;;18582:60;;;:::o;18648:142::-;18698:9;18731:53;18749:34;18758:24;18776:5;18758:24;:::i;:::-;18749:34;:::i;:::-;18731:53;:::i;:::-;18718:66;;18648:142;;;:::o;18796:75::-;18839:3;18860:5;18853:12;;18796:75;;;:::o;18877:269::-;18987:39;19018:7;18987:39;:::i;:::-;19048:91;19097:41;19121:16;19097:41;:::i;:::-;19089:6;19082:4;19076:11;19048:91;:::i;:::-;19042:4;19035:105;18953:193;18877:269;;;:::o;19152:73::-;19197:3;19152:73;:::o;19231:189::-;19308:32;;:::i;:::-;19349:65;19407:6;19399;19393:4;19349:65;:::i;:::-;19284:136;19231:189;;:::o;19426:186::-;19486:120;19503:3;19496:5;19493:14;19486:120;;;19557:39;19594:1;19587:5;19557:39;:::i;:::-;19530:1;19523:5;19519:13;19510:22;;19486:120;;;19426:186;;:::o;19618:543::-;19719:2;19714:3;19711:11;19708:446;;;19753:38;19785:5;19753:38;:::i;:::-;19837:29;19855:10;19837:29;:::i;:::-;19827:8;19823:44;20020:2;20008:10;20005:18;20002:49;;;20041:8;20026:23;;20002:49;20064:80;20120:22;20138:3;20120:22;:::i;:::-;20110:8;20106:37;20093:11;20064:80;:::i;:::-;19723:431;;19708:446;19618:543;;;:::o;20167:117::-;20221:8;20271:5;20265:4;20261:16;20240:37;;20167:117;;;;:::o;20290:169::-;20334:6;20367:51;20415:1;20411:6;20403:5;20400:1;20396:13;20367:51;:::i;:::-;20363:56;20448:4;20442;20438:15;20428:25;;20341:118;20290:169;;;;:::o;20464:295::-;20540:4;20686:29;20711:3;20705:4;20686:29;:::i;:::-;20678:37;;20748:3;20745:1;20741:11;20735:4;20732:21;20724:29;;20464:295;;;;:::o;20764:1395::-;20881:37;20914:3;20881:37;:::i;:::-;20983:18;20975:6;20972:30;20969:56;;;21005:18;;:::i;:::-;20969:56;21049:38;21081:4;21075:11;21049:38;:::i;:::-;21134:67;21194:6;21186;21180:4;21134:67;:::i;:::-;21228:1;21252:4;21239:17;;21284:2;21276:6;21273:14;21301:1;21296:618;;;;21958:1;21975:6;21972:77;;;22024:9;22019:3;22015:19;22009:26;22000:35;;21972:77;22075:67;22135:6;22128:5;22075:67;:::i;:::-;22069:4;22062:81;21931:222;21266:887;;21296:618;21348:4;21344:9;21336:6;21332:22;21382:37;21414:4;21382:37;:::i;:::-;21441:1;21455:208;21469:7;21466:1;21463:14;21455:208;;;21548:9;21543:3;21539:19;21533:26;21525:6;21518:42;21599:1;21591:6;21587:14;21577:24;;21646:2;21635:9;21631:18;21618:31;;21492:4;21489:1;21485:12;21480:17;;21455:208;;;21691:6;21682:7;21679:19;21676:179;;;21749:9;21744:3;21740:19;21734:26;21792:48;21834:4;21826:6;21822:17;21811:9;21792:48;:::i;:::-;21784:6;21777:64;21699:156;21676:179;21901:1;21897;21889:6;21885:14;21881:22;21875:4;21868:36;21303:611;;;21266:887;;20856:1303;;;20764:1395;;:::o;22187:314::-;22283:3;22304:70;22367:6;22362:3;22304:70;:::i;:::-;22297:77;;22384:56;22433:6;22428:3;22421:5;22384:56;:::i;:::-;22465:29;22487:6;22465:29;:::i;:::-;22460:3;22456:39;22449:46;;22187:314;;;;;:::o;22507:660::-;22712:4;22750:3;22739:9;22735:19;22727:27;;22764:71;22832:1;22821:9;22817:17;22808:6;22764:71;:::i;:::-;22845:72;22913:2;22902:9;22898:18;22889:6;22845:72;:::i;:::-;22927;22995:2;22984:9;22980:18;22971:6;22927:72;:::i;:::-;23046:9;23040:4;23036:20;23031:2;23020:9;23016:18;23009:48;23074:86;23155:4;23146:6;23138;23074:86;:::i;:::-;23066:94;;22507:660;;;;;;;;:::o;23173:148::-;23275:11;23312:3;23297:18;;23173:148;;;;:::o;23351:874::-;23454:3;23491:5;23485:12;23520:36;23546:9;23520:36;:::i;:::-;23572:89;23654:6;23649:3;23572:89;:::i;:::-;23565:96;;23692:1;23681:9;23677:17;23708:1;23703:166;;;;23883:1;23878:341;;;;23670:549;;23703:166;23787:4;23783:9;23772;23768:25;23763:3;23756:38;23849:6;23842:14;23835:22;23827:6;23823:35;23818:3;23814:45;23807:52;;23703:166;;23878:341;23945:38;23977:5;23945:38;:::i;:::-;24005:1;24019:154;24033:6;24030:1;24027:13;24019:154;;;24107:7;24101:14;24097:1;24092:3;24088:11;24081:35;24157:1;24148:7;24144:15;24133:26;;24055:4;24052:1;24048:12;24043:17;;24019:154;;;24202:6;24197:3;24193:16;24186:23;;23885:334;;23670:549;;23458:767;;23351:874;;;;:::o;24231:390::-;24337:3;24365:39;24398:5;24365:39;:::i;:::-;24420:89;24502:6;24497:3;24420:89;:::i;:::-;24413:96;;24518:65;24576:6;24571:3;24564:4;24557:5;24553:16;24518:65;:::i;:::-;24608:6;24603:3;24599:16;24592:23;;24341:280;24231:390;;;;:::o;24627:429::-;24804:3;24826:92;24914:3;24905:6;24826:92;:::i;:::-;24819:99;;24935:95;25026:3;25017:6;24935:95;:::i;:::-;24928:102;;25047:3;25040:10;;24627:429;;;;;:::o;25062:182::-;25230:7;25225:3;25218:20;25062:182;:::o;25250:539::-;25472:3;25494:95;25585:3;25576:6;25494:95;:::i;:::-;25487:102;;25599:137;25732:3;25599:137;:::i;:::-;25761:1;25756:3;25752:11;25745:18;;25780:3;25773:10;;25250:539;;;;:::o;25795:102::-;25837:8;25884:5;25881:1;25877:13;25856:34;;25795:102;;;:::o;25903:848::-;25964:5;25971:4;25995:6;25986:15;;26019:5;26010:14;;26033:712;26054:1;26044:8;26041:15;26033:712;;;26149:4;26144:3;26140:14;26134:4;26131:24;26128:50;;;26158:18;;:::i;:::-;26128:50;26208:1;26198:8;26194:16;26191:451;;;26623:4;26616:5;26612:16;26603:25;;26191:451;26673:4;26667;26663:15;26655:23;;26703:32;26726:8;26703:32;:::i;:::-;26691:44;;26033:712;;;25903:848;;;;;;;:::o;26757:1073::-;26811:5;27002:8;26992:40;;27023:1;27014:10;;27025:5;;26992:40;27051:4;27041:36;;27068:1;27059:10;;27070:5;;27041:36;27137:4;27185:1;27180:27;;;;27221:1;27216:191;;;;27130:277;;27180:27;27198:1;27189:10;;27200:5;;;27216:191;27261:3;27251:8;27248:17;27245:43;;;27268:18;;:::i;:::-;27245:43;27317:8;27314:1;27310:16;27301:25;;27352:3;27345:5;27342:14;27339:40;;;27359:18;;:::i;:::-;27339:40;27392:5;;;27130:277;;27516:2;27506:8;27503:16;27497:3;27491:4;27488:13;27484:36;27466:2;27456:8;27453:16;27448:2;27442:4;27439:12;27435:35;27419:111;27416:246;;;27572:8;27566:4;27562:19;27553:28;;27607:3;27600:5;27597:14;27594:40;;;27614:18;;:::i;:::-;27594:40;27647:5;;27416:246;27687:42;27725:3;27715:8;27709:4;27706:1;27687:42;:::i;:::-;27672:57;;;;27761:4;27756:3;27752:14;27745:5;27742:25;27739:51;;;27770:18;;:::i;:::-;27739:51;27819:4;27812:5;27808:16;27799:25;;26757:1073;;;;;;:::o;27836:281::-;27894:5;27918:23;27936:4;27918:23;:::i;:::-;27910:31;;27962:25;27978:8;27962:25;:::i;:::-;27950:37;;28006:104;28043:66;28033:8;28027:4;28006:104;:::i;:::-;27997:113;;27836:281;;;;:::o;28123:180::-;28171:77;28168:1;28161:88;28268:4;28265:1;28258:15;28292:4;28289:1;28282:15;28309:185;28349:1;28366:20;28384:1;28366:20;:::i;:::-;28361:25;;28400:20;28418:1;28400:20;:::i;:::-;28395:25;;28439:1;28429:35;;28444:18;;:::i;:::-;28429:35;28486:1;28483;28479:9;28474:14;;28309:185;;;;:::o;28500:233::-;28539:3;28562:24;28580:5;28562:24;:::i;:::-;28553:33;;28608:66;28601:5;28598:77;28595:103;;28678:18;;:::i;:::-;28595:103;28725:1;28718:5;28714:13;28707:20;;28500:233;;;:::o;28739:79::-;28778:7;28807:5;28796:16;;28739:79;;;:::o;28824:157::-;28929:45;28949:24;28967:5;28949:24;:::i;:::-;28929:45;:::i;:::-;28924:3;28917:58;28824:157;;:::o;28987:94::-;29020:8;29068:5;29064:2;29060:14;29039:35;;28987:94;;;:::o;29087:::-;29126:7;29155:20;29169:5;29155:20;:::i;:::-;29144:31;;29087:94;;;:::o;29187:100::-;29226:7;29255:26;29275:5;29255:26;:::i;:::-;29244:37;;29187:100;;;:::o;29293:157::-;29398:45;29418:24;29436:5;29418:24;:::i;:::-;29398:45;:::i;:::-;29393:3;29386:58;29293:157;;:::o;29456:538::-;29624:3;29639:75;29710:3;29701:6;29639:75;:::i;:::-;29739:2;29734:3;29730:12;29723:19;;29752:75;29823:3;29814:6;29752:75;:::i;:::-;29852:2;29847:3;29843:12;29836:19;;29865:75;29936:3;29927:6;29865:75;:::i;:::-;29965:2;29960:3;29956:12;29949:19;;29985:3;29978:10;;29456:538;;;;;;:::o;30000:176::-;30032:1;30049:20;30067:1;30049:20;:::i;:::-;30044:25;;30083:20;30101:1;30083:20;:::i;:::-;30078:25;;30122:1;30112:35;;30127:18;;:::i;:::-;30112:35;30168:1;30165;30161:9;30156:14;;30000:176;;;;:::o
Swarm Source
ipfs://d84235871524c6eb2b711d483a57d2d9e695d72a60ad11098c02a411728348bd
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.