ETH Price: $2,520.88 (+2.89%)

Recursive Cats (RECAT)
 

Overview

TokenID

11

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RecursiveCats

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-18
*/

// SPDX-License-Identifier: MIT AND UNLICENSED

// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)


// The inverted ERC-404 (ERC404i) lets you mint ERC721 tokens first 
// and get a matching amount of ERC20 tokens without 
// having to buy them on decentralized exchanges. 

// The name stays the same - ERC404, without any extra letters, 
// because nothing crucial has been altered.

// A big shoutout to ???.
// x.com/RecursiveCats
// tg.me/recats 
// recats.xyz

// /$$$$$$$  /$$$$$$$$  /$$$$$$   /$$$$$$  /$$$$$$$$
// | $$__  $$| $$_____/ /$$__  $$ /$$__  $$|__  $$__/
// | $$  \ $$| $$      | $$  \__/| $$  \ $$   | $$   
// | $$$$$$$/| $$$$$   | $$      | $$$$$$$$   | $$   
// | $$__  $$| $$__/   | $$      | $$__  $$   | $$   
// | $$  \ $$| $$      | $$    $$| $$  | $$   | $$   
// | $$  | $$| $$$$$$$$|  $$$$$$/| $$  | $$   | $$   
// |__/  |__/|________/ \______/ |__/  |__/   |__/   
                                                  

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @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 up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (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; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                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.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 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.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            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 (rounding == Rounding.Up && 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 down.
     *
     * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @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), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(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) {
        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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        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 keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


// File contracts/ERC404/ERC404.sol

// Original license: SPDX_License_Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 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();

    // 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;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @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;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @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 virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @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 virtual returns (bool) {
        if (amountOrId <= minted && 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 virtual {
        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 virtual {
        if (amountOrId <= minted) {
            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 virtual 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 virtual {
        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 virtual {
        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 _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _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
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}


// File contracts/RecursiveCats.sol

// Original license: SPDX_License_Identifier: UNLICENSED
pragma solidity ^0.8.20;


contract RecursiveCats is ERC404 {
    uint256 public constant TOTAL_MINT_SUPPLY = 100;
    uint256 public constant USER_MINT_SUPPLY = 10;
    uint256 public constant NFT_PRICE = 0.1 ether;

    address public RecatsTreasury = address(0x666668A6c4E8aEC685A6E4bF22807C4a2B64dFd9);

    string public baseTokenURI;

    uint256 public totalMintCount;

    mapping(address => uint256) public mintCount;

    constructor() ERC404("Recursive Cats", "RECAT", 18, 100, msg.sender) {
        balanceOf[RecatsTreasury] = 10 * 10 ** 18;
        setWhitelist(RecatsTreasury, true);
    }

    function mint() external payable {
        require(msg.value == NFT_PRICE, "Incorrect eth value");

        require(
            mintCount[msg.sender] < USER_MINT_SUPPLY,
            "Exceed user mint supply"
        );
        require(totalMintCount < TOTAL_MINT_SUPPLY, "Exceed total supply");
        mintCount[msg.sender] = mintCount[msg.sender] + 1;
        totalMintCount = totalMintCount + 1;

        balanceOf[msg.sender] = balanceOf[msg.sender] + 1 * 10 ** 18;
        super._mint(msg.sender);
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    function tokenURI(
        uint256 tokenId
    ) public view override returns (string memory) {
        return
            bytes(baseTokenURI).length > 0
                ? string.concat(baseTokenURI, Strings.toString(tokenId), ".json")
                : "";
    }

    function withdrawEth(address to) public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "balance is zero");
        payable(to).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidId","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","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":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RecatsTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_MINT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USER_MINT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405273666668a6c4e8aec685a6e4bf22807c4a2b64dfd9600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801562000064575f80fd5b506040518060400160405280600e81526020017f52656375727369766520436174730000000000000000000000000000000000008152506040518060400160405280600581526020017f52454341540000000000000000000000000000000000000000000000000000008152506012606433805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013d576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620001e8919062000619565b508360029081620001fa919062000619565b508260ff1660808160ff1681525050608051600a6200021a919062000886565b82620002279190620008d6565b60a081815250505050505050678ac7230489e8000060045f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620002d2600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620002d860201b60201c565b62000920565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200035d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200043157607f821691505b602082108103620004475762000446620003ec565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200046e565b620004b786836200046e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000501620004fb620004f584620004cf565b620004d8565b620004cf565b9050919050565b5f819050919050565b6200051c83620004e1565b620005346200052b8262000508565b8484546200047a565b825550505050565b5f90565b6200054a6200053c565b6200055781848462000511565b505050565b5b818110156200057e57620005725f8262000540565b6001810190506200055d565b5050565b601f821115620005cd5762000597816200044d565b620005a2846200045f565b81016020851015620005b2578190505b620005ca620005c1856200045f565b8301826200055c565b50505b505050565b5f82821c905092915050565b5f620005ef5f1984600802620005d2565b1980831691505092915050565b5f620006098383620005de565b9150826002028217905092915050565b6200062482620003b5565b67ffffffffffffffff81111562000640576200063f620003bf565b5b6200064c825462000419565b6200065982828562000582565b5f60209050601f8311600181146200068f575f84156200067a578287015190505b620006868582620005fc565b865550620006f5565b601f1984166200069f866200044d565b5f5b82811015620006c857848901518255600182019150602085019450602081019050620006a1565b86831015620006e85784890151620006e4601f891682620005de565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000787578086048111156200075f576200075e620006fd565b5b60018516156200076f5780820291505b80810290506200077f856200072a565b94506200073f565b94509492505050565b5f82620007a1576001905062000873565b81620007b0575f905062000873565b8160018114620007c95760028114620007d4576200080a565b600191505062000873565b60ff841115620007e957620007e8620006fd565b5b8360020a915084821115620008035762000802620006fd565b5b5062000873565b5060208310610133831016604e8410600b8410161715620008445782820a9050838111156200083e576200083d620006fd565b5b62000873565b62000853848484600162000736565b925090508184048111156200086d576200086c620006fd565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200089282620004cf565b91506200089f836200087a565b9250620008ce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000790565b905092915050565b5f620008e282620004cf565b9150620008ef83620004cf565b9250828202620008ff81620004cf565b91508282048414831517620009195762000918620006fd565b5b5092915050565b60805160a051613ce8620009495f395f610dba01525f818161180601526124b60152613ce85ff3fe6080604052600436106101ed575f3560e01c8063676dd5631161010c578063af7bddca1161009f578063dd62ed3e1161006e578063dd62ed3e146106c5578063e0df5b6f14610701578063e985e9c514610729578063ed9ec88814610765578063f2fde38b146107a1576101ed565b8063af7bddca1461060d578063b88d4fde14610637578063c87b56dd1461065f578063d547cfb71461069b576101ed565b806395d89b41116100db57806395d89b41146105435780639b19251a1461056d578063a22cb465146105a9578063a9059cbb146105d1576101ed565b8063676dd5631461048957806370a08231146104b35780637a0d2302146104ef5780638da5cb5b14610519576101ed565b8063313ce56711610184578063504334c211610153578063504334c2146103d357806353d6fd59146103fb5780635ade2021146104235780636352211e1461044d576101ed565b8063313ce5671461032d57806342842e0e146103575780634c191fc31461037f5780634f02c420146103a9576101ed565b806318160ddd116101c057806318160ddd1461029d57806323b872dd146102c757806325e16063146102ef5780632b96895814610317576101ed565b806306fdde03146101f1578063081812fc1461021b578063095ea7b3146102575780631249c58b14610293575b5f80fd5b3480156101fc575f80fd5b506102056107c9565b6040516102129190612d38565b60405180910390f35b348015610226575f80fd5b50610241600480360381019061023c9190612d9c565b610855565b60405161024e9190612e06565b60405180910390f35b348015610262575f80fd5b5061027d60048036038101906102789190612e49565b610885565b60405161028a9190612ea1565b60405180910390f35b61029b610b6c565b005b3480156102a8575f80fd5b506102b1610db8565b6040516102be9190612ec9565b60405180910390f35b3480156102d2575f80fd5b506102ed60048036038101906102e89190612ee2565b610ddc565b005b3480156102fa575f80fd5b5061031560048036038101906103109190612f32565b6115d3565b005b348015610322575f80fd5b5061032b6116e5565b005b348015610338575f80fd5b50610341611804565b60405161034e9190612f78565b60405180910390f35b348015610362575f80fd5b5061037d60048036038101906103789190612ee2565b611828565b005b34801561038a575f80fd5b50610393611957565b6040516103a09190612ec9565b60405180910390f35b3480156103b4575f80fd5b506103bd61195c565b6040516103ca9190612ec9565b60405180910390f35b3480156103de575f80fd5b506103f960048036038101906103f491906130bd565b611962565b005b348015610406575f80fd5b50610421600480360381019061041c919061315d565b6119f4565b005b34801561042e575f80fd5b50610437611ad0565b6040516104449190612ec9565b60405180910390f35b348015610458575f80fd5b50610473600480360381019061046e9190612d9c565b611ad5565b6040516104809190612e06565b60405180910390f35b348015610494575f80fd5b5061049d611b73565b6040516104aa9190612ec9565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612f32565b611b7f565b6040516104e69190612ec9565b60405180910390f35b3480156104fa575f80fd5b50610503611b94565b6040516105109190612ec9565b60405180910390f35b348015610524575f80fd5b5061052d611b9a565b60405161053a9190612e06565b60405180910390f35b34801561054e575f80fd5b50610557611bbd565b6040516105649190612d38565b60405180910390f35b348015610578575f80fd5b50610593600480360381019061058e9190612f32565b611c49565b6040516105a09190612ea1565b60405180910390f35b3480156105b4575f80fd5b506105cf60048036038101906105ca919061315d565b611c66565b005b3480156105dc575f80fd5b506105f760048036038101906105f29190612e49565b611d5e565b6040516106049190612ea1565b60405180910390f35b348015610618575f80fd5b50610621611d72565b60405161062e9190612e06565b60405180910390f35b348015610642575f80fd5b5061065d600480360381019061065891906131f8565b611d97565b005b34801561066a575f80fd5b5061068560048036038101906106809190612d9c565b611ecc565b6040516106929190612d38565b60405180910390f35b3480156106a6575f80fd5b506106af611f2a565b6040516106bc9190612d38565b60405180910390f35b3480156106d0575f80fd5b506106eb60048036038101906106e6919061327c565b611fb6565b6040516106f89190612ec9565b60405180910390f35b34801561070c575f80fd5b50610727600480360381019061072291906132ba565b611fd6565b005b348015610734575f80fd5b5061074f600480360381019061074a919061327c565b61206d565b60405161075c9190612ea1565b60405180910390f35b348015610770575f80fd5b5061078b60048036038101906107869190612f32565b612097565b6040516107989190612ec9565b60405180910390f35b3480156107ac575f80fd5b506107c760048036038101906107c29190612f32565b6120ac565b005b600180546107d69061332e565b80601f01602080910402602001604051908101604052809291908181526020018280546108029061332e565b801561084d5780601f106108245761010080835404028352916020019161084d565b820191905f5260205f20905b81548152906001019060200180831161083057829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561089757505f82115b15610a7f575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561098e575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156109c5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610a719190612ec9565b60405180910390a350610b62565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610b599190612ec9565b60405180910390a35b6001905092915050565b67016345785d8a00003414610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906133a8565b60405180910390fd5b600a600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90613410565b60405180910390fd5b6064600e5410610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290613478565b60405180910390fd5b6001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cc591906134c3565b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506001600e54610d1591906134c3565b600e81905550670de0b6b3a764000060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610d6c91906134c3565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610db633612231565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60035481116114945760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610edf576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610f9d575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611005575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561103c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110446124b3565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461108f91906134f6565b9250508190555061109e6124b3565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506111f491906134f6565b8154811061120557611204613529565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061127157611270613529565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806112ca576112c9613556565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506113b291906134f6565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876114796124b3565b6040516114869190612ec9565b60405180910390a3506115ce565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115c057818161154391906134f6565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6115cb8484846124e6565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611657576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790505f811161169d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611694906135cd565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156116e0573d5f803e3d5ffd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611769576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b611833838383610ddc565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561191b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b99392919061361e565b6020604051808303815f875af11580156118d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f991906136bb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611952576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600a81565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119f0828261282a565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b606481565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b6e576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b67016345785d8a000081565b6004602052805f5260405f205f915090505481565b600e5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028054611bca9061332e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf69061332e565b8015611c415780601f10611c1857610100808354040283529160200191611c41565b820191905f5260205f20905b815481529060010190602001808311611c2457829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d529190612ea1565b60405180910390a35050565b5f611d6a3384846124e6565b905092915050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611da2858585610ddc565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611e8e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611e2c959493929190613712565b6020604051808303815f875af1158015611e48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906136bb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611ec5576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60605f600d8054611edc9061332e565b905011611ef75760405180602001604052805f815250611f23565b600d611f028361284e565b604051602001611f13929190613850565b6040516020818303038152906040525b9050919050565b600d8054611f379061332e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f639061332e565b8015611fae5780601f10611f8557610100808354040283529160200191611fae565b820191905f5260205f20905b815481529060010190602001808311611f9157829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461205a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816120699190613a0d565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600f602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612130576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612195576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612296576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612342576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061243f91906134f6565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a6124e19190613c0b565b905090565b5f806124f06124b3565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546125c091906134f6565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166126e4575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546126a99190613c82565b84846126b59190613c82565b6126bf91906134f6565b90505f5b818110156126e1576126d489612918565b80806001019150506126c3565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127b7575f838261273f9190613c82565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546127889190613c82565b61279291906134f6565b90505f5b818110156127b4576127a788612231565b8080600101915050612796565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516128149190612ec9565b60405180910390a3600193505050509392505050565b81600190816128399190613a0d565b5080600290816128499190613a0d565b505050565b60605f600161285c84612b5d565b0190505f8167ffffffffffffffff81111561287a57612879612f99565b5b6040519080825280601f01601f1916602001820160405280156128ac5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561290d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161290257612901613c55565b5b0494505f85036128b9575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361297d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612a0891906134f6565b81548110612a1957612a18613529565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480612a7157612a70613556565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612bb9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612baf57612bae613c55565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bf6576d04ee2d6d415b85acef81000000008381612bec57612beb613c55565b5b0492506020810190505b662386f26fc100008310612c2557662386f26fc100008381612c1b57612c1a613c55565b5b0492506010810190505b6305f5e1008310612c4e576305f5e1008381612c4457612c43613c55565b5b0492506008810190505b6127108310612c73576127108381612c6957612c68613c55565b5b0492506004810190505b60648310612c965760648381612c8c57612c8b613c55565b5b0492506002810190505b600a8310612ca5576001810190505b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ce5578082015181840152602081019050612cca565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612d0a82612cae565b612d148185612cb8565b9350612d24818560208601612cc8565b612d2d81612cf0565b840191505092915050565b5f6020820190508181035f830152612d508184612d00565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612d7b81612d69565b8114612d85575f80fd5b50565b5f81359050612d9681612d72565b92915050565b5f60208284031215612db157612db0612d61565b5b5f612dbe84828501612d88565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612df082612dc7565b9050919050565b612e0081612de6565b82525050565b5f602082019050612e195f830184612df7565b92915050565b612e2881612de6565b8114612e32575f80fd5b50565b5f81359050612e4381612e1f565b92915050565b5f8060408385031215612e5f57612e5e612d61565b5b5f612e6c85828601612e35565b9250506020612e7d85828601612d88565b9150509250929050565b5f8115159050919050565b612e9b81612e87565b82525050565b5f602082019050612eb45f830184612e92565b92915050565b612ec381612d69565b82525050565b5f602082019050612edc5f830184612eba565b92915050565b5f805f60608486031215612ef957612ef8612d61565b5b5f612f0686828701612e35565b9350506020612f1786828701612e35565b9250506040612f2886828701612d88565b9150509250925092565b5f60208284031215612f4757612f46612d61565b5b5f612f5484828501612e35565b91505092915050565b5f60ff82169050919050565b612f7281612f5d565b82525050565b5f602082019050612f8b5f830184612f69565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612fcf82612cf0565b810181811067ffffffffffffffff82111715612fee57612fed612f99565b5b80604052505050565b5f613000612d58565b905061300c8282612fc6565b919050565b5f67ffffffffffffffff82111561302b5761302a612f99565b5b61303482612cf0565b9050602081019050919050565b828183375f83830152505050565b5f61306161305c84613011565b612ff7565b90508281526020810184848401111561307d5761307c612f95565b5b613088848285613041565b509392505050565b5f82601f8301126130a4576130a3612f91565b5b81356130b484826020860161304f565b91505092915050565b5f80604083850312156130d3576130d2612d61565b5b5f83013567ffffffffffffffff8111156130f0576130ef612d65565b5b6130fc85828601613090565b925050602083013567ffffffffffffffff81111561311d5761311c612d65565b5b61312985828601613090565b9150509250929050565b61313c81612e87565b8114613146575f80fd5b50565b5f8135905061315781613133565b92915050565b5f806040838503121561317357613172612d61565b5b5f61318085828601612e35565b925050602061319185828601613149565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f8401126131b8576131b7612f91565b5b8235905067ffffffffffffffff8111156131d5576131d461319b565b5b6020830191508360018202830111156131f1576131f061319f565b5b9250929050565b5f805f805f6080868803121561321157613210612d61565b5b5f61321e88828901612e35565b955050602061322f88828901612e35565b945050604061324088828901612d88565b935050606086013567ffffffffffffffff81111561326157613260612d65565b5b61326d888289016131a3565b92509250509295509295909350565b5f806040838503121561329257613291612d61565b5b5f61329f85828601612e35565b92505060206132b085828601612e35565b9150509250929050565b5f602082840312156132cf576132ce612d61565b5b5f82013567ffffffffffffffff8111156132ec576132eb612d65565b5b6132f884828501613090565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061334557607f821691505b60208210810361335857613357613301565b5b50919050565b7f496e636f7272656374206574682076616c7565000000000000000000000000005f82015250565b5f613392601383612cb8565b915061339d8261335e565b602082019050919050565b5f6020820190508181035f8301526133bf81613386565b9050919050565b7f4578636565642075736572206d696e7420737570706c790000000000000000005f82015250565b5f6133fa601783612cb8565b9150613405826133c6565b602082019050919050565b5f6020820190508181035f830152613427816133ee565b9050919050565b7f45786365656420746f74616c20737570706c79000000000000000000000000005f82015250565b5f613462601383612cb8565b915061346d8261342e565b602082019050919050565b5f6020820190508181035f83015261348f81613456565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134cd82612d69565b91506134d883612d69565b92508282019050808211156134f0576134ef613496565b5b92915050565b5f61350082612d69565b915061350b83612d69565b925082820390508181111561352357613522613496565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f62616c616e6365206973207a65726f00000000000000000000000000000000005f82015250565b5f6135b7600f83612cb8565b91506135c282613583565b602082019050919050565b5f6020820190508181035f8301526135e4816135ab565b9050919050565b5f82825260208201905092915050565b50565b5f6136095f836135eb565b9150613614826135fb565b5f82019050919050565b5f6080820190506136315f830186612df7565b61363e6020830185612df7565b61364b6040830184612eba565b818103606083015261365c816135fe565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61369a81613666565b81146136a4575f80fd5b50565b5f815190506136b581613691565b92915050565b5f602082840312156136d0576136cf612d61565b5b5f6136dd848285016136a7565b91505092915050565b5f6136f183856135eb565b93506136fe838584613041565b61370783612cf0565b840190509392505050565b5f6080820190506137255f830188612df7565b6137326020830187612df7565b61373f6040830186612eba565b81810360608301526137528184866136e6565b90509695505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f81546137868161332e565b613790818661375e565b9450600182165f81146137aa57600181146137bf576137f1565b60ff19831686528115158202860193506137f1565b6137c885613768565b5f5b838110156137e9578154818901526001820191506020810190506137ca565b838801955050505b50505092915050565b5f61380482612cae565b61380e818561375e565b935061381e818560208601612cc8565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f61385b828561377a565b915061386782846137fa565b91506138728261382a565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026138cc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613891565b6138d68683613891565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61391161390c61390784612d69565b6138ee565b612d69565b9050919050565b5f819050919050565b61392a836138f7565b61393e61393682613918565b84845461389d565b825550505050565b5f90565b613952613946565b61395d818484613921565b505050565b5b81811015613980576139755f8261394a565b600181019050613963565b5050565b601f8211156139c55761399681613768565b61399f84613882565b810160208510156139ae578190505b6139c26139ba85613882565b830182613962565b50505b505050565b5f82821c905092915050565b5f6139e55f19846008026139ca565b1980831691505092915050565b5f6139fd83836139d6565b9150826002028217905092915050565b613a1682612cae565b67ffffffffffffffff811115613a2f57613a2e612f99565b5b613a39825461332e565b613a44828285613984565b5f60209050601f831160018114613a75575f8415613a63578287015190505b613a6d85826139f2565b865550613ad4565b601f198416613a8386613768565b5f5b82811015613aaa57848901518255600182019150602085019450602081019050613a85565b86831015613ac75784890151613ac3601f8916826139d6565b8355505b6001600288020188555050505b505050505050565b5f8160011c9050919050565b5f808291508390505b6001851115613b3157808604811115613b0d57613b0c613496565b5b6001851615613b1c5780820291505b8081029050613b2a85613adc565b9450613af1565b94509492505050565b5f82613b495760019050613c04565b81613b56575f9050613c04565b8160018114613b6c5760028114613b7657613ba5565b6001915050613c04565b60ff841115613b8857613b87613496565b5b8360020a915084821115613b9f57613b9e613496565b5b50613c04565b5060208310610133831016604e8410600b8410161715613bda5782820a905083811115613bd557613bd4613496565b5b613c04565b613be78484846001613ae8565b92509050818404811115613bfe57613bfd613496565b5b81810290505b9392505050565b5f613c1582612d69565b9150613c2083612f5d565b9250613c4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b3a565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c8c82612d69565b9150613c9783612d69565b925082613ca757613ca6613c55565b5b82820490509291505056fea26469706673582212204eba7ef3e5e49dce52eaf48f3da59e45e692997536d7df62ed30d91b2865a90b64736f6c63430008180033

Deployed Bytecode

0x6080604052600436106101ed575f3560e01c8063676dd5631161010c578063af7bddca1161009f578063dd62ed3e1161006e578063dd62ed3e146106c5578063e0df5b6f14610701578063e985e9c514610729578063ed9ec88814610765578063f2fde38b146107a1576101ed565b8063af7bddca1461060d578063b88d4fde14610637578063c87b56dd1461065f578063d547cfb71461069b576101ed565b806395d89b41116100db57806395d89b41146105435780639b19251a1461056d578063a22cb465146105a9578063a9059cbb146105d1576101ed565b8063676dd5631461048957806370a08231146104b35780637a0d2302146104ef5780638da5cb5b14610519576101ed565b8063313ce56711610184578063504334c211610153578063504334c2146103d357806353d6fd59146103fb5780635ade2021146104235780636352211e1461044d576101ed565b8063313ce5671461032d57806342842e0e146103575780634c191fc31461037f5780634f02c420146103a9576101ed565b806318160ddd116101c057806318160ddd1461029d57806323b872dd146102c757806325e16063146102ef5780632b96895814610317576101ed565b806306fdde03146101f1578063081812fc1461021b578063095ea7b3146102575780631249c58b14610293575b5f80fd5b3480156101fc575f80fd5b506102056107c9565b6040516102129190612d38565b60405180910390f35b348015610226575f80fd5b50610241600480360381019061023c9190612d9c565b610855565b60405161024e9190612e06565b60405180910390f35b348015610262575f80fd5b5061027d60048036038101906102789190612e49565b610885565b60405161028a9190612ea1565b60405180910390f35b61029b610b6c565b005b3480156102a8575f80fd5b506102b1610db8565b6040516102be9190612ec9565b60405180910390f35b3480156102d2575f80fd5b506102ed60048036038101906102e89190612ee2565b610ddc565b005b3480156102fa575f80fd5b5061031560048036038101906103109190612f32565b6115d3565b005b348015610322575f80fd5b5061032b6116e5565b005b348015610338575f80fd5b50610341611804565b60405161034e9190612f78565b60405180910390f35b348015610362575f80fd5b5061037d60048036038101906103789190612ee2565b611828565b005b34801561038a575f80fd5b50610393611957565b6040516103a09190612ec9565b60405180910390f35b3480156103b4575f80fd5b506103bd61195c565b6040516103ca9190612ec9565b60405180910390f35b3480156103de575f80fd5b506103f960048036038101906103f491906130bd565b611962565b005b348015610406575f80fd5b50610421600480360381019061041c919061315d565b6119f4565b005b34801561042e575f80fd5b50610437611ad0565b6040516104449190612ec9565b60405180910390f35b348015610458575f80fd5b50610473600480360381019061046e9190612d9c565b611ad5565b6040516104809190612e06565b60405180910390f35b348015610494575f80fd5b5061049d611b73565b6040516104aa9190612ec9565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612f32565b611b7f565b6040516104e69190612ec9565b60405180910390f35b3480156104fa575f80fd5b50610503611b94565b6040516105109190612ec9565b60405180910390f35b348015610524575f80fd5b5061052d611b9a565b60405161053a9190612e06565b60405180910390f35b34801561054e575f80fd5b50610557611bbd565b6040516105649190612d38565b60405180910390f35b348015610578575f80fd5b50610593600480360381019061058e9190612f32565b611c49565b6040516105a09190612ea1565b60405180910390f35b3480156105b4575f80fd5b506105cf60048036038101906105ca919061315d565b611c66565b005b3480156105dc575f80fd5b506105f760048036038101906105f29190612e49565b611d5e565b6040516106049190612ea1565b60405180910390f35b348015610618575f80fd5b50610621611d72565b60405161062e9190612e06565b60405180910390f35b348015610642575f80fd5b5061065d600480360381019061065891906131f8565b611d97565b005b34801561066a575f80fd5b5061068560048036038101906106809190612d9c565b611ecc565b6040516106929190612d38565b60405180910390f35b3480156106a6575f80fd5b506106af611f2a565b6040516106bc9190612d38565b60405180910390f35b3480156106d0575f80fd5b506106eb60048036038101906106e6919061327c565b611fb6565b6040516106f89190612ec9565b60405180910390f35b34801561070c575f80fd5b50610727600480360381019061072291906132ba565b611fd6565b005b348015610734575f80fd5b5061074f600480360381019061074a919061327c565b61206d565b60405161075c9190612ea1565b60405180910390f35b348015610770575f80fd5b5061078b60048036038101906107869190612f32565b612097565b6040516107989190612ec9565b60405180910390f35b3480156107ac575f80fd5b506107c760048036038101906107c29190612f32565b6120ac565b005b600180546107d69061332e565b80601f01602080910402602001604051908101604052809291908181526020018280546108029061332e565b801561084d5780601f106108245761010080835404028352916020019161084d565b820191905f5260205f20905b81548152906001019060200180831161083057829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561089757505f82115b15610a7f575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561098e575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156109c5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610a719190612ec9565b60405180910390a350610b62565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610b599190612ec9565b60405180910390a35b6001905092915050565b67016345785d8a00003414610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad906133a8565b60405180910390fd5b600a600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90613410565b60405180910390fd5b6064600e5410610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290613478565b60405180910390fd5b6001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cc591906134c3565b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506001600e54610d1591906134c3565b600e81905550670de0b6b3a764000060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610d6c91906134c3565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610db633612231565b565b7f0000000000000000000000000000000000000000000000056bc75e2d6310000081565b60035481116114945760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610edf576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610f9d575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611005575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561103c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110446124b3565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461108f91906134f6565b9250508190555061109e6124b3565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506111f491906134f6565b8154811061120557611204613529565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061127157611270613529565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806112ca576112c9613556565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506113b291906134f6565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876114796124b3565b6040516114869190612ec9565b60405180910390a3506115ce565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115c057818161154391906134f6565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6115cb8484846124e6565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611657576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f4790505f811161169d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611694906135cd565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156116e0573d5f803e3d5ffd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611769576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b611833838383610ddc565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561191b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b99392919061361e565b6020604051808303815f875af11580156118d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f991906136bb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611952576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600a81565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119f0828261282a565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b606481565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b6e576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b67016345785d8a000081565b6004602052805f5260405f205f915090505481565b600e5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028054611bca9061332e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf69061332e565b8015611c415780601f10611c1857610100808354040283529160200191611c41565b820191905f5260205f20905b815481529060010190602001808311611c2457829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d529190612ea1565b60405180910390a35050565b5f611d6a3384846124e6565b905092915050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611da2858585610ddc565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015611e8e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611e2c959493929190613712565b6020604051808303815f875af1158015611e48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6c91906136bb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611ec5576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60605f600d8054611edc9061332e565b905011611ef75760405180602001604052805f815250611f23565b600d611f028361284e565b604051602001611f13929190613850565b6040516020818303038152906040525b9050919050565b600d8054611f379061332e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f639061332e565b8015611fae5780601f10611f8557610100808354040283529160200191611fae565b820191905f5260205f20905b815481529060010190602001808311611f9157829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461205a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816120699190613a0d565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600f602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612130576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612195576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612296576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612342576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061243f91906134f6565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a6124e19190613c0b565b905090565b5f806124f06124b3565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546125c091906134f6565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166126e4575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546126a99190613c82565b84846126b59190613c82565b6126bf91906134f6565b90505f5b818110156126e1576126d489612918565b80806001019150506126c3565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127b7575f838261273f9190613c82565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546127889190613c82565b61279291906134f6565b90505f5b818110156127b4576127a788612231565b8080600101915050612796565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516128149190612ec9565b60405180910390a3600193505050509392505050565b81600190816128399190613a0d565b5080600290816128499190613a0d565b505050565b60605f600161285c84612b5d565b0190505f8167ffffffffffffffff81111561287a57612879612f99565b5b6040519080825280601f01601f1916602001820160405280156128ac5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561290d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161290257612901613c55565b5b0494505f85036128b9575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361297d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612a0891906134f6565b81548110612a1957612a18613529565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480612a7157612a70613556565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612bb9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612baf57612bae613c55565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bf6576d04ee2d6d415b85acef81000000008381612bec57612beb613c55565b5b0492506020810190505b662386f26fc100008310612c2557662386f26fc100008381612c1b57612c1a613c55565b5b0492506010810190505b6305f5e1008310612c4e576305f5e1008381612c4457612c43613c55565b5b0492506008810190505b6127108310612c73576127108381612c6957612c68613c55565b5b0492506004810190505b60648310612c965760648381612c8c57612c8b613c55565b5b0492506002810190505b600a8310612ca5576001810190505b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ce5578082015181840152602081019050612cca565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612d0a82612cae565b612d148185612cb8565b9350612d24818560208601612cc8565b612d2d81612cf0565b840191505092915050565b5f6020820190508181035f830152612d508184612d00565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612d7b81612d69565b8114612d85575f80fd5b50565b5f81359050612d9681612d72565b92915050565b5f60208284031215612db157612db0612d61565b5b5f612dbe84828501612d88565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612df082612dc7565b9050919050565b612e0081612de6565b82525050565b5f602082019050612e195f830184612df7565b92915050565b612e2881612de6565b8114612e32575f80fd5b50565b5f81359050612e4381612e1f565b92915050565b5f8060408385031215612e5f57612e5e612d61565b5b5f612e6c85828601612e35565b9250506020612e7d85828601612d88565b9150509250929050565b5f8115159050919050565b612e9b81612e87565b82525050565b5f602082019050612eb45f830184612e92565b92915050565b612ec381612d69565b82525050565b5f602082019050612edc5f830184612eba565b92915050565b5f805f60608486031215612ef957612ef8612d61565b5b5f612f0686828701612e35565b9350506020612f1786828701612e35565b9250506040612f2886828701612d88565b9150509250925092565b5f60208284031215612f4757612f46612d61565b5b5f612f5484828501612e35565b91505092915050565b5f60ff82169050919050565b612f7281612f5d565b82525050565b5f602082019050612f8b5f830184612f69565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612fcf82612cf0565b810181811067ffffffffffffffff82111715612fee57612fed612f99565b5b80604052505050565b5f613000612d58565b905061300c8282612fc6565b919050565b5f67ffffffffffffffff82111561302b5761302a612f99565b5b61303482612cf0565b9050602081019050919050565b828183375f83830152505050565b5f61306161305c84613011565b612ff7565b90508281526020810184848401111561307d5761307c612f95565b5b613088848285613041565b509392505050565b5f82601f8301126130a4576130a3612f91565b5b81356130b484826020860161304f565b91505092915050565b5f80604083850312156130d3576130d2612d61565b5b5f83013567ffffffffffffffff8111156130f0576130ef612d65565b5b6130fc85828601613090565b925050602083013567ffffffffffffffff81111561311d5761311c612d65565b5b61312985828601613090565b9150509250929050565b61313c81612e87565b8114613146575f80fd5b50565b5f8135905061315781613133565b92915050565b5f806040838503121561317357613172612d61565b5b5f61318085828601612e35565b925050602061319185828601613149565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f8401126131b8576131b7612f91565b5b8235905067ffffffffffffffff8111156131d5576131d461319b565b5b6020830191508360018202830111156131f1576131f061319f565b5b9250929050565b5f805f805f6080868803121561321157613210612d61565b5b5f61321e88828901612e35565b955050602061322f88828901612e35565b945050604061324088828901612d88565b935050606086013567ffffffffffffffff81111561326157613260612d65565b5b61326d888289016131a3565b92509250509295509295909350565b5f806040838503121561329257613291612d61565b5b5f61329f85828601612e35565b92505060206132b085828601612e35565b9150509250929050565b5f602082840312156132cf576132ce612d61565b5b5f82013567ffffffffffffffff8111156132ec576132eb612d65565b5b6132f884828501613090565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061334557607f821691505b60208210810361335857613357613301565b5b50919050565b7f496e636f7272656374206574682076616c7565000000000000000000000000005f82015250565b5f613392601383612cb8565b915061339d8261335e565b602082019050919050565b5f6020820190508181035f8301526133bf81613386565b9050919050565b7f4578636565642075736572206d696e7420737570706c790000000000000000005f82015250565b5f6133fa601783612cb8565b9150613405826133c6565b602082019050919050565b5f6020820190508181035f830152613427816133ee565b9050919050565b7f45786365656420746f74616c20737570706c79000000000000000000000000005f82015250565b5f613462601383612cb8565b915061346d8261342e565b602082019050919050565b5f6020820190508181035f83015261348f81613456565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134cd82612d69565b91506134d883612d69565b92508282019050808211156134f0576134ef613496565b5b92915050565b5f61350082612d69565b915061350b83612d69565b925082820390508181111561352357613522613496565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f62616c616e6365206973207a65726f00000000000000000000000000000000005f82015250565b5f6135b7600f83612cb8565b91506135c282613583565b602082019050919050565b5f6020820190508181035f8301526135e4816135ab565b9050919050565b5f82825260208201905092915050565b50565b5f6136095f836135eb565b9150613614826135fb565b5f82019050919050565b5f6080820190506136315f830186612df7565b61363e6020830185612df7565b61364b6040830184612eba565b818103606083015261365c816135fe565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61369a81613666565b81146136a4575f80fd5b50565b5f815190506136b581613691565b92915050565b5f602082840312156136d0576136cf612d61565b5b5f6136dd848285016136a7565b91505092915050565b5f6136f183856135eb565b93506136fe838584613041565b61370783612cf0565b840190509392505050565b5f6080820190506137255f830188612df7565b6137326020830187612df7565b61373f6040830186612eba565b81810360608301526137528184866136e6565b90509695505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f81546137868161332e565b613790818661375e565b9450600182165f81146137aa57600181146137bf576137f1565b60ff19831686528115158202860193506137f1565b6137c885613768565b5f5b838110156137e9578154818901526001820191506020810190506137ca565b838801955050505b50505092915050565b5f61380482612cae565b61380e818561375e565b935061381e818560208601612cc8565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f61385b828561377a565b915061386782846137fa565b91506138728261382a565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026138cc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613891565b6138d68683613891565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61391161390c61390784612d69565b6138ee565b612d69565b9050919050565b5f819050919050565b61392a836138f7565b61393e61393682613918565b84845461389d565b825550505050565b5f90565b613952613946565b61395d818484613921565b505050565b5b81811015613980576139755f8261394a565b600181019050613963565b5050565b601f8211156139c55761399681613768565b61399f84613882565b810160208510156139ae578190505b6139c26139ba85613882565b830182613962565b50505b505050565b5f82821c905092915050565b5f6139e55f19846008026139ca565b1980831691505092915050565b5f6139fd83836139d6565b9150826002028217905092915050565b613a1682612cae565b67ffffffffffffffff811115613a2f57613a2e612f99565b5b613a39825461332e565b613a44828285613984565b5f60209050601f831160018114613a75575f8415613a63578287015190505b613a6d85826139f2565b865550613ad4565b601f198416613a8386613768565b5f5b82811015613aaa57848901518255600182019150602085019450602081019050613a85565b86831015613ac75784890151613ac3601f8916826139d6565b8355505b6001600288020188555050505b505050505050565b5f8160011c9050919050565b5f808291508390505b6001851115613b3157808604811115613b0d57613b0c613496565b5b6001851615613b1c5780820291505b8081029050613b2a85613adc565b9450613af1565b94509492505050565b5f82613b495760019050613c04565b81613b56575f9050613c04565b8160018114613b6c5760028114613b7657613ba5565b6001915050613c04565b60ff841115613b8857613b87613496565b5b8360020a915084821115613b9f57613b9e613496565b5b50613c04565b5060208310610133831016604e8410600b8410161715613bda5782820a905083811115613bd557613bd4613496565b5b613c04565b613be78484846001613ae8565b92509050818404811115613bfe57613bfd613496565b5b81810290505b9392505050565b5f613c1582612d69565b9150613c2083612f5d565b9250613c4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b3a565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c8c82612d69565b9150613c9783612d69565b925082613ca757613ca6613c55565b5b82820490509291505056fea26469706673582212204eba7ef3e5e49dce52eaf48f3da59e45e692997536d7df62ed30d91b2865a90b64736f6c63430008180033

Deployed Bytecode Sourcemap

30296:1889:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21297:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22008:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23839:642;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30896:522;;;:::i;:::-;;21533:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24888:1716;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31984:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19270:151;;;;;;;;;;;;;:::i;:::-;;21433:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26900:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30390:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21668:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31540:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23168:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30336:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23351:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30442:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21774:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30623:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18711:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21351;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22619:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24532:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26663:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30496:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27400:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31706:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30588:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21888:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31426:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22119:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30661:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19043:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21297:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22008:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;23839:642::-;23942:4;23977:6;;23963:10;:20;;:38;;;;;24000:1;23987:10;:14;23963:38;23959:491;;;24018:13;24034:8;:20;24043:10;24034:20;;;;;;;;;;;;;;;;;;;;;24018:36;;24089:5;24075:19;;:10;:19;;;;:59;;;;;24099:16;:23;24116:5;24099:23;;;;;;;;;;;;;;;:35;24123:10;24099:35;;;;;;;;;;;;;;;;;;;;;;;;;24098:36;24075:59;24071:121;;;24162:14;;;;;;;;;;;;;;24071:121;24234:7;24208:11;:23;24220:10;24208:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;24279:7;24263:36;;24272:5;24263:36;;;24288:10;24263:36;;;;;;:::i;:::-;;;;;;;;24003:308;23959:491;;;24365:10;24332:9;:21;24342:10;24332:21;;;;;;;;;;;;;;;:30;24354:7;24332:30;;;;;;;;;;;;;;;:43;;;;24418:7;24397:41;;24406:10;24397:41;;;24427:10;24397:41;;;;;;:::i;:::-;;;;;;;;23959:491;24469:4;24462:11;;23839:642;;;;:::o;30896:522::-;30478:9;30948;:22;30940:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;30433:2;31029:9;:21;31039:10;31029:21;;;;;;;;;;;;;;;;:40;31007:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;30380:3;31139:14;;:34;31131:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31256:1;31232:9;:21;31242:10;31232:21;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;31208:9;:21;31218:10;31208:21;;;;;;;;;;;;;;;:49;;;;31302:1;31285:14;;:18;;;;:::i;:::-;31268:14;:35;;;;31364:12;31340:9;:21;31350:10;31340:21;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;31316:9;:21;31326:10;31316:21;;;;;;;;;;;;;;;:60;;;;31387:23;31399:10;31387:11;:23::i;:::-;30896:522::o;21533:36::-;;;:::o;24888:1716::-;25034:6;;25020:10;:20;25016:1581;;25069:8;:20;25078:10;25069:20;;;;;;;;;;;;;;;;;;;;;25061:28;;:4;:28;;;25057:91;;25117:15;;;;;;;;;;;;;;25057:91;25182:1;25168:16;;:2;:16;;;25164:82;;25212:18;;;;;;;;;;;;;;25164:82;25298:4;25284:18;;:10;:18;;;;:74;;;;;25324:16;:22;25341:4;25324:22;;;;;;;;;;;;;;;:34;25347:10;25324:34;;;;;;;;;;;;;;;;;;;;;;;;;25323:35;25284:74;:132;;;;;25393:11;:23;25405:10;25393:23;;;;;;;;;;;;;;;;;;;;;25379:37;;:10;:37;;;;25284:132;25262:226;;;25458:14;;;;;;;;;;;;;;25262:226;25523:10;:8;:10::i;:::-;25504:9;:15;25514:4;25504:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;25596:10;:8;:10::i;:::-;25579:9;:13;25589:2;25579:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;25661:2;25638:8;:20;25647:10;25638:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25685:11;:23;25697:10;25685:23;;;;;;;;;;;;25678:30;;;;;;;;;;;25766:17;25786:6;:12;25793:4;25786:12;;;;;;;;;;;;;;;25821:1;25799:6;:12;25806:4;25799:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;25786:37;;;;;;;;:::i;:::-;;;;;;;;;;25766:57;;25878:9;25838:6;:12;25845:4;25838:12;;;;;;;;;;;;;;;25851:11;:23;25863:10;25851:23;;;;;;;;;;;;25838:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;25922:6;:12;25929:4;25922:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26026:11;:23;26038:10;26026:23;;;;;;;;;;;;26001:11;:22;26013:9;26001:22;;;;;;;;;;;:48;;;;26103:6;:10;26110:2;26103:10;;;;;;;;;;;;;;;26119;26103:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26233:1;26213:6;:10;26220:2;26213:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;26187:11;:23;26199:10;26187:23;;;;;;;;;;;:47;;;;26275:10;26271:2;26256:30;;26265:4;26256:30;;;;;;;;;;;;26326:2;26306:35;;26320:4;26306:35;;;26330:10;:8;:10::i;:::-;26306:35;;;;;;:::i;:::-;;;;;;;;25042:1311;25016:1581;;;26374:15;26392:9;:15;26402:4;26392:15;;;;;;;;;;;;;;;:27;26408:10;26392:27;;;;;;;;;;;;;;;;26374:45;;26451:17;26440:7;:28;26436:101;;26527:10;26517:7;:20;;;;:::i;:::-;26487:9;:15;26497:4;26487:15;;;;;;;;;;;;;;;:27;26503:10;26487:27;;;;;;;;;;;;;;;:50;;;;26436:101;26554:31;26564:4;26570:2;26574:10;26554:9;:31::i;:::-;;26359:238;25016:1581;24888:1716;;;:::o;31984:198::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;32045:15:::1;32063:21;32045:39;;32113:1;32103:7;:11;32095:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;32153:2;32145:20;;:29;32166:7;32145:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;32034:148;31984:198:::0;:::o;19270:151::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;19349:1:::1;19333:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;19410:1;19369:44;;19390:10;19369:44;;;;;;;;;;;;19270:151::o:0;21433:31::-;;;:::o;26900:405::-;27024:26;27037:4;27043:2;27047;27024:12;:26::i;:::-;27099:1;27081:2;:14;;;:19;;:154;;;;;27195:40;;;27117:118;;;27132:2;27117:35;;;27153:10;27165:4;27171:2;27117:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;27081:154;27063:235;;;27269:17;;;;;;;;;;;;;;27063:235;26900:405;;;:::o;30390:45::-;30433:2;30390:45;:::o;21668:21::-;;;;:::o;31540:158::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;31660:30:::1;31675:5;31682:7;31660:14;:30::i;:::-;31540:158:::0;;:::o;23168:111::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;23266:5:::1;23246:9;:17;23256:6;23246:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;23168:111:::0;;:::o;30336:47::-;30380:3;30336:47;:::o;23351:193::-;23409:13;23443:8;:12;23452:2;23443:12;;;;;;;;;;;;;;;;;;;;;23435:20;;23489:1;23472:19;;:5;:19;;;23468:69;;23515:10;;;;;;;;;;;;;;23468:69;23351:193;;;:::o;30442:45::-;30478:9;30442:45;:::o;21774:44::-;;;;;;;;;;;;;;;;;:::o;30623:29::-;;;;:::o;18711:20::-;;;;;;;;;;;;:::o;21351:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22619:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;24532:207::-;24659:8;24618:16;:28;24635:10;24618:28;;;;;;;;;;;;;;;:38;24647:8;24618:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;24712:8;24685:46;;24700:10;24685:46;;;24722:8;24685:46;;;;;;:::i;:::-;;;;;;;;24532:207;;:::o;26663:160::-;26758:4;26782:33;26792:10;26804:2;26808:6;26782:9;:33::i;:::-;26775:40;;26663:160;;;;:::o;30496:83::-;;;;;;;;;;;;;:::o;27400:437::-;27554:26;27567:4;27573:2;27577;27554:12;:26::i;:::-;27629:1;27611:2;:14;;;:19;;:156;;;;;27727:40;;;27647:120;;;27662:2;27647:35;;;27683:10;27695:4;27701:2;27705:4;;27647:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;27611:156;27593:237;;;27801:17;;;;;;;;;;;;;;27593:237;27400:437;;;;;:::o;31706:270::-;31787:13;31862:1;31839:12;31833:26;;;;;:::i;:::-;;;:30;:135;;;;;;;;;;;;;;;;;31897:12;31911:25;31928:7;31911:16;:25::i;:::-;31883:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31833:135;31813:155;;31706:270;;;:::o;30588:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21888:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31426:106::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;31515:9:::1;31500:12;:24;;;;;;:::i;:::-;;31426:106:::0;:::o;22119:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30661:44::-;;;;;;;;;;;;;;;;;:::o;19043:219::-;18798:5;;;;;;;;;;18784:19;;:10;:19;;;18780:46;;18812:14;;;;;;;;;;;;;;18780:46;19144:1:::1;19126:20;;:6;:20;;::::0;19122:47:::1;;19155:14;;;;;;;;;;;;;;19122:47;19190:6;19182:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;19247:6;19214:40;;19235:10;19214:40;;;;;;;;;;;;19043:219:::0;:::o;29137:474::-;29210:1;29196:16;;:2;:16;;;29192:74;;29236:18;;;;;;;;;;;;;;29192:74;29303:6;;:8;;;;;;;;;;;;;29335:10;29348:6;;29335:19;;29395:1;29371:26;;:8;:12;29380:2;29371:12;;;;;;;;;;;;;;;;;;;;;:26;;;29367:81;;29421:15;;;;;;;;;;;;;;29367:81;29475:2;29460:8;:12;29469:2;29460:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;29488:6;:10;29495:2;29488:10;;;;;;;;;;;;;;;29504:2;29488:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29556:1;29536:6;:10;29543:2;29536:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;29518:11;:15;29530:2;29518:15;;;;;;;;;;;:39;;;;29600:2;29596;29575:28;;29592:1;29575:28;;;;;;;;;;;;29181:430;29137:474;:::o;29037:92::-;29080:7;29113:8;29107:2;:14;;;;:::i;:::-;29100:21;;29037:92;:::o;27905:1093::-;28018:4;28035:12;28050:10;:8;:10::i;:::-;28035:25;;28071:27;28101:9;:15;28111:4;28101:15;;;;;;;;;;;;;;;;28071:45;;28127:29;28159:9;:13;28169:2;28159:13;;;;;;;;;;;;;;;;28127:45;;28204:6;28185:9;:15;28195:4;28185:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;28265:6;28248:9;:13;28258:2;28248:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;28356:9;:15;28366:4;28356:15;;;;;;;;;;;;;;;;;;;;;;;;;28351:251;;28388:22;28480:4;28462:9;:15;28472:4;28462:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;28436:4;28414:19;:26;;;;:::i;:::-;28413:72;;;;:::i;:::-;28388:97;;28505:9;28500:91;28524:14;28520:1;:18;28500:91;;;28564:11;28570:4;28564:5;:11::i;:::-;28540:3;;;;;;;28500:91;;;;28373:229;28351:251;28678:9;:13;28688:2;28678:13;;;;;;;;;;;;;;;;;;;;;;;;;28673:247;;28708:22;28800:4;28776:21;:28;;;;:::i;:::-;28750:4;28734:9;:13;28744:2;28734:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;28733:72;;;;:::i;:::-;28708:97;;28825:9;28820:89;28844:14;28840:1;:18;28820:89;;;28884:9;28890:2;28884:5;:9::i;:::-;28860:3;;;;;;;28820:89;;;;28693:227;28673:247;28957:2;28937:31;;28951:4;28937:31;;;28961:6;28937:31;;;;;;:::i;:::-;;;;;;;;28986:4;28979:11;;;;;27905:1093;;;;;:::o;30000:160::-;30120:5;30113:4;:12;;;;;;:::i;:::-;;30145:7;30136:6;:16;;;;;;:::i;:::-;;30000:160;;:::o;16011:716::-;16067:13;16118:14;16155:1;16135:17;16146:5;16135:10;:17::i;:::-;:21;16118:38;;16171:20;16205:6;16194:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16171:41;;16227:11;16356:6;16352:2;16348:15;16340:6;16336:28;16329:35;;16393:288;16400:4;16393:288;;;16425:5;;;;;;;;16567:8;16562:2;16555:5;16551:14;16546:30;16541:3;16533:44;16623:2;16614:11;;;;;;:::i;:::-;;;;;16657:1;16648:5;:10;16393:288;16644:21;16393:288;16702:6;16695:13;;;;;16011:716;;;:::o;29619:373::-;29696:1;29680:18;;:4;:18;;;29676:73;;29722:15;;;;;;;;;;;;;;29676:73;29761:10;29774:6;:12;29781:4;29774:12;;;;;;;;;;;;;;;29809:1;29787:6;:12;29794:4;29787:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;29774:37;;;;;;;;:::i;:::-;;;;;;;;;;29761:50;;29822:6;:12;29829:4;29822:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29858:11;:15;29870:2;29858:15;;;;;;;;;;;29851:22;;;29891:8;:12;29900:2;29891:12;;;;;;;;;;;;29884:19;;;;;;;;;;;29921:11;:15;29933:2;29921:15;;;;;;;;;;;;29914:22;;;;;;;;;;;29981:2;29977:1;29954:30;;29963:4;29954:30;;;;;;;;;;;;29665:327;29619:373;:::o;11394:948::-;11447:7;11467:14;11484:1;11467:18;;11534:8;11525:5;:17;11521:106;;11572:8;11563:17;;;;;;:::i;:::-;;;;;11609:2;11599:12;;;;11521:106;11654:8;11645:5;:17;11641:106;;11692:8;11683:17;;;;;;:::i;:::-;;;;;11729:2;11719:12;;;;11641:106;11774:8;11765:5;:17;11761:106;;11812:8;11803:17;;;;;;:::i;:::-;;;;;11849:2;11839:12;;;;11761:106;11894:7;11885:5;:16;11881:103;;11931:7;11922:16;;;;;;:::i;:::-;;;;;11967:1;11957:11;;;;11881:103;12011:7;12002:5;:16;11998:103;;12048:7;12039:16;;;;;;:::i;:::-;;;;;12084:1;12074:11;;;;11998:103;12128:7;12119:5;:16;12115:103;;12165:7;12156:16;;;;;;:::i;:::-;;;;;12201:1;12191:11;;;;12115:103;12245:7;12236:5;:16;12232:68;;12283:1;12273:11;;;;12232:68;12328:6;12321:13;;;11394:948;;;:::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:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::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:329::-;5169:6;5218:2;5206:9;5197:7;5193:23;5189:32;5186:119;;;5224:79;;:::i;:::-;5186:119;5344:1;5369:53;5414:7;5405:6;5394:9;5390:22;5369:53;:::i;:::-;5359:63;;5315:117;5110:329;;;;:::o;5445:86::-;5480:7;5520:4;5513:5;5509:16;5498:27;;5445:86;;;:::o;5537:112::-;5620:22;5636:5;5620:22;:::i;:::-;5615:3;5608:35;5537:112;;:::o;5655:214::-;5744:4;5782:2;5771:9;5767:18;5759:26;;5795:67;5859:1;5848:9;5844:17;5835:6;5795:67;:::i;:::-;5655:214;;;;:::o;5875:117::-;5984:1;5981;5974:12;5998:117;6107:1;6104;6097:12;6121:180;6169:77;6166:1;6159:88;6266:4;6263:1;6256:15;6290:4;6287:1;6280:15;6307:281;6390:27;6412:4;6390:27;:::i;:::-;6382:6;6378:40;6520:6;6508:10;6505:22;6484:18;6472:10;6469:34;6466:62;6463:88;;;6531:18;;:::i;:::-;6463:88;6571:10;6567:2;6560:22;6350:238;6307:281;;:::o;6594:129::-;6628:6;6655:20;;:::i;:::-;6645:30;;6684:33;6712:4;6704:6;6684:33;:::i;:::-;6594:129;;;:::o;6729:308::-;6791:4;6881:18;6873:6;6870:30;6867:56;;;6903:18;;:::i;:::-;6867:56;6941:29;6963:6;6941:29;:::i;:::-;6933:37;;7025:4;7019;7015:15;7007:23;;6729:308;;;:::o;7043:146::-;7140:6;7135:3;7130;7117:30;7181:1;7172:6;7167:3;7163:16;7156:27;7043:146;;;:::o;7195:425::-;7273:5;7298:66;7314:49;7356:6;7314:49;:::i;:::-;7298:66;:::i;:::-;7289:75;;7387:6;7380:5;7373:21;7425:4;7418:5;7414:16;7463:3;7454:6;7449:3;7445:16;7442:25;7439:112;;;7470:79;;:::i;:::-;7439:112;7560:54;7607:6;7602:3;7597;7560:54;:::i;:::-;7279:341;7195:425;;;;;:::o;7640:340::-;7696:5;7745:3;7738:4;7730:6;7726:17;7722:27;7712:122;;7753:79;;:::i;:::-;7712:122;7870:6;7857:20;7895:79;7970:3;7962:6;7955:4;7947:6;7943:17;7895:79;:::i;:::-;7886:88;;7702:278;7640:340;;;;:::o;7986:834::-;8074:6;8082;8131:2;8119:9;8110:7;8106:23;8102:32;8099:119;;;8137:79;;:::i;:::-;8099:119;8285:1;8274:9;8270:17;8257:31;8315:18;8307:6;8304:30;8301:117;;;8337:79;;:::i;:::-;8301:117;8442:63;8497:7;8488:6;8477:9;8473:22;8442:63;:::i;:::-;8432:73;;8228:287;8582:2;8571:9;8567:18;8554:32;8613:18;8605:6;8602:30;8599:117;;;8635:79;;:::i;:::-;8599:117;8740:63;8795:7;8786:6;8775:9;8771:22;8740:63;:::i;:::-;8730:73;;8525:288;7986:834;;;;;:::o;8826:116::-;8896:21;8911:5;8896:21;:::i;:::-;8889:5;8886:32;8876:60;;8932:1;8929;8922:12;8876:60;8826:116;:::o;8948:133::-;8991:5;9029:6;9016:20;9007:29;;9045:30;9069:5;9045:30;:::i;:::-;8948:133;;;;:::o;9087:468::-;9152:6;9160;9209:2;9197:9;9188:7;9184:23;9180:32;9177:119;;;9215:79;;:::i;:::-;9177:119;9335:1;9360:53;9405:7;9396:6;9385:9;9381:22;9360:53;:::i;:::-;9350:63;;9306:117;9462:2;9488:50;9530:7;9521:6;9510:9;9506:22;9488:50;:::i;:::-;9478:60;;9433:115;9087:468;;;;;:::o;9561:117::-;9670:1;9667;9660:12;9684:117;9793:1;9790;9783:12;9820:552;9877:8;9887:6;9937:3;9930:4;9922:6;9918:17;9914:27;9904:122;;9945:79;;:::i;:::-;9904:122;10058:6;10045:20;10035:30;;10088:18;10080:6;10077:30;10074:117;;;10110:79;;:::i;:::-;10074:117;10224:4;10216:6;10212:17;10200:29;;10278:3;10270:4;10262:6;10258:17;10248:8;10244:32;10241:41;10238:128;;;10285:79;;:::i;:::-;10238:128;9820:552;;;;;:::o;10378:963::-;10475:6;10483;10491;10499;10507;10556:3;10544:9;10535:7;10531:23;10527:33;10524:120;;;10563:79;;:::i;:::-;10524:120;10683:1;10708:53;10753:7;10744:6;10733:9;10729:22;10708:53;:::i;:::-;10698:63;;10654:117;10810:2;10836:53;10881:7;10872:6;10861:9;10857:22;10836:53;:::i;:::-;10826:63;;10781:118;10938:2;10964:53;11009:7;11000:6;10989:9;10985:22;10964:53;:::i;:::-;10954:63;;10909:118;11094:2;11083:9;11079:18;11066:32;11125:18;11117:6;11114:30;11111:117;;;11147:79;;:::i;:::-;11111:117;11260:64;11316:7;11307:6;11296:9;11292:22;11260:64;:::i;:::-;11242:82;;;;11037:297;10378:963;;;;;;;;:::o;11347:474::-;11415:6;11423;11472:2;11460:9;11451:7;11447:23;11443:32;11440:119;;;11478:79;;:::i;:::-;11440:119;11598:1;11623:53;11668:7;11659:6;11648:9;11644:22;11623:53;:::i;:::-;11613:63;;11569:117;11725:2;11751:53;11796:7;11787:6;11776:9;11772:22;11751:53;:::i;:::-;11741:63;;11696:118;11347:474;;;;;:::o;11827:509::-;11896:6;11945:2;11933:9;11924:7;11920:23;11916:32;11913:119;;;11951:79;;:::i;:::-;11913:119;12099:1;12088:9;12084:17;12071:31;12129:18;12121:6;12118:30;12115:117;;;12151:79;;:::i;:::-;12115:117;12256:63;12311:7;12302:6;12291:9;12287:22;12256:63;:::i;:::-;12246:73;;12042:287;11827:509;;;;:::o;12342:180::-;12390:77;12387:1;12380:88;12487:4;12484:1;12477:15;12511:4;12508:1;12501:15;12528:320;12572:6;12609:1;12603:4;12599:12;12589:22;;12656:1;12650:4;12646:12;12677:18;12667:81;;12733:4;12725:6;12721:17;12711:27;;12667:81;12795:2;12787:6;12784:14;12764:18;12761:38;12758:84;;12814:18;;:::i;:::-;12758:84;12579:269;12528:320;;;:::o;12854:169::-;12994:21;12990:1;12982:6;12978:14;12971:45;12854:169;:::o;13029:366::-;13171:3;13192:67;13256:2;13251:3;13192:67;:::i;:::-;13185:74;;13268:93;13357:3;13268:93;:::i;:::-;13386:2;13381:3;13377:12;13370:19;;13029:366;;;:::o;13401:419::-;13567:4;13605:2;13594:9;13590:18;13582:26;;13654:9;13648:4;13644:20;13640:1;13629:9;13625:17;13618:47;13682:131;13808:4;13682:131;:::i;:::-;13674:139;;13401:419;;;:::o;13826:173::-;13966:25;13962:1;13954:6;13950:14;13943:49;13826:173;:::o;14005:366::-;14147:3;14168:67;14232:2;14227:3;14168:67;:::i;:::-;14161:74;;14244:93;14333:3;14244:93;:::i;:::-;14362:2;14357:3;14353:12;14346:19;;14005:366;;;:::o;14377:419::-;14543:4;14581:2;14570:9;14566:18;14558:26;;14630:9;14624:4;14620:20;14616:1;14605:9;14601:17;14594:47;14658:131;14784:4;14658:131;:::i;:::-;14650:139;;14377:419;;;:::o;14802:169::-;14942:21;14938:1;14930:6;14926:14;14919:45;14802:169;:::o;14977:366::-;15119:3;15140:67;15204:2;15199:3;15140:67;:::i;:::-;15133:74;;15216:93;15305:3;15216:93;:::i;:::-;15334:2;15329:3;15325:12;15318:19;;14977:366;;;:::o;15349:419::-;15515:4;15553:2;15542:9;15538:18;15530:26;;15602:9;15596:4;15592:20;15588:1;15577:9;15573:17;15566:47;15630:131;15756:4;15630:131;:::i;:::-;15622:139;;15349:419;;;:::o;15774:180::-;15822:77;15819:1;15812:88;15919:4;15916:1;15909:15;15943:4;15940:1;15933:15;15960:191;16000:3;16019:20;16037:1;16019:20;:::i;:::-;16014:25;;16053:20;16071:1;16053:20;:::i;:::-;16048:25;;16096:1;16093;16089:9;16082:16;;16117:3;16114:1;16111:10;16108:36;;;16124:18;;:::i;:::-;16108:36;15960:191;;;;:::o;16157:194::-;16197:4;16217:20;16235:1;16217:20;:::i;:::-;16212:25;;16251:20;16269:1;16251:20;:::i;:::-;16246:25;;16295:1;16292;16288:9;16280:17;;16319:1;16313:4;16310:11;16307:37;;;16324:18;;:::i;:::-;16307:37;16157:194;;;;:::o;16357:180::-;16405:77;16402:1;16395:88;16502:4;16499:1;16492:15;16526:4;16523:1;16516:15;16543:180;16591:77;16588:1;16581:88;16688:4;16685:1;16678:15;16712:4;16709:1;16702:15;16729:165;16869:17;16865:1;16857:6;16853:14;16846:41;16729:165;:::o;16900:366::-;17042:3;17063:67;17127:2;17122:3;17063:67;:::i;:::-;17056:74;;17139:93;17228:3;17139:93;:::i;:::-;17257:2;17252:3;17248:12;17241:19;;16900:366;;;:::o;17272:419::-;17438:4;17476:2;17465:9;17461:18;17453:26;;17525:9;17519:4;17515:20;17511:1;17500:9;17496:17;17489:47;17553:131;17679:4;17553:131;:::i;:::-;17545:139;;17272:419;;;:::o;17697:168::-;17780:11;17814:6;17809:3;17802:19;17854:4;17849:3;17845:14;17830:29;;17697:168;;;;:::o;17871:114::-;;:::o;17991:362::-;18132:3;18153:65;18216:1;18211:3;18153:65;:::i;:::-;18146:72;;18227:93;18316:3;18227:93;:::i;:::-;18345:1;18340:3;18336:11;18329:18;;17991:362;;;:::o;18359:748::-;18608:4;18646:3;18635:9;18631:19;18623:27;;18660:71;18728:1;18717:9;18713:17;18704:6;18660:71;:::i;:::-;18741:72;18809:2;18798:9;18794:18;18785:6;18741:72;:::i;:::-;18823;18891:2;18880:9;18876:18;18867:6;18823:72;:::i;:::-;18942:9;18936:4;18932:20;18927:2;18916:9;18912:18;18905:48;18970:130;19095:4;18970:130;:::i;:::-;18962:138;;18359:748;;;;;;:::o;19113:149::-;19149:7;19189:66;19182:5;19178:78;19167:89;;19113:149;;;:::o;19268:120::-;19340:23;19357:5;19340:23;:::i;:::-;19333:5;19330:34;19320:62;;19378:1;19375;19368:12;19320:62;19268:120;:::o;19394:141::-;19450:5;19481:6;19475:13;19466:22;;19497:32;19523:5;19497:32;:::i;:::-;19394:141;;;;:::o;19541:349::-;19610:6;19659:2;19647:9;19638:7;19634:23;19630:32;19627:119;;;19665:79;;:::i;:::-;19627:119;19785:1;19810:63;19865:7;19856:6;19845:9;19841:22;19810:63;:::i;:::-;19800:73;;19756:127;19541:349;;;;:::o;19918:314::-;20014:3;20035:70;20098:6;20093:3;20035:70;:::i;:::-;20028:77;;20115:56;20164:6;20159:3;20152:5;20115:56;:::i;:::-;20196:29;20218:6;20196:29;:::i;:::-;20191:3;20187:39;20180:46;;19918:314;;;;;:::o;20238:660::-;20443:4;20481:3;20470:9;20466:19;20458:27;;20495:71;20563:1;20552:9;20548:17;20539:6;20495:71;:::i;:::-;20576:72;20644:2;20633:9;20629:18;20620:6;20576:72;:::i;:::-;20658;20726:2;20715:9;20711:18;20702:6;20658:72;:::i;:::-;20777:9;20771:4;20767:20;20762:2;20751:9;20747:18;20740:48;20805:86;20886:4;20877:6;20869;20805:86;:::i;:::-;20797:94;;20238:660;;;;;;;;:::o;20904:148::-;21006:11;21043:3;21028:18;;20904:148;;;;:::o;21058:141::-;21107:4;21130:3;21122:11;;21153:3;21150:1;21143:14;21187:4;21184:1;21174:18;21166:26;;21058:141;;;:::o;21229:874::-;21332:3;21369:5;21363:12;21398:36;21424:9;21398:36;:::i;:::-;21450:89;21532:6;21527:3;21450:89;:::i;:::-;21443:96;;21570:1;21559:9;21555:17;21586:1;21581:166;;;;21761:1;21756:341;;;;21548:549;;21581:166;21665:4;21661:9;21650;21646:25;21641:3;21634:38;21727:6;21720:14;21713:22;21705:6;21701:35;21696:3;21692:45;21685:52;;21581:166;;21756:341;21823:38;21855:5;21823:38;:::i;:::-;21883:1;21897:154;21911:6;21908:1;21905:13;21897:154;;;21985:7;21979:14;21975:1;21970:3;21966:11;21959:35;22035:1;22026:7;22022:15;22011:26;;21933:4;21930:1;21926:12;21921:17;;21897:154;;;22080:6;22075:3;22071:16;22064:23;;21763:334;;21548:549;;21336:767;;21229:874;;;;:::o;22109:390::-;22215:3;22243:39;22276:5;22243:39;:::i;:::-;22298:89;22380:6;22375:3;22298:89;:::i;:::-;22291:96;;22396:65;22454:6;22449:3;22442:4;22435:5;22431:16;22396:65;:::i;:::-;22486:6;22481:3;22477:16;22470:23;;22219:280;22109:390;;;;:::o;22505:182::-;22673:7;22668:3;22661:20;22505:182;:::o;22693:693::-;22960:3;22982:92;23070:3;23061:6;22982:92;:::i;:::-;22975:99;;23091:95;23182:3;23173:6;23091:95;:::i;:::-;23084:102;;23196:137;23329:3;23196:137;:::i;:::-;23358:1;23353:3;23349:11;23342:18;;23377:3;23370:10;;22693:693;;;;;:::o;23392:93::-;23429:6;23476:2;23471;23464:5;23460:14;23456:23;23446:33;;23392:93;;;:::o;23491:107::-;23535:8;23585:5;23579:4;23575:16;23554:37;;23491:107;;;;:::o;23604:393::-;23673:6;23723:1;23711:10;23707:18;23746:97;23776:66;23765:9;23746:97;:::i;:::-;23864:39;23894:8;23883:9;23864:39;:::i;:::-;23852:51;;23936:4;23932:9;23925:5;23921:21;23912:30;;23985:4;23975:8;23971:19;23964:5;23961:30;23951:40;;23680:317;;23604:393;;;;;:::o;24003:60::-;24031:3;24052:5;24045:12;;24003:60;;;:::o;24069:142::-;24119:9;24152:53;24170:34;24179:24;24197:5;24179:24;:::i;:::-;24170:34;:::i;:::-;24152:53;:::i;:::-;24139:66;;24069:142;;;:::o;24217:75::-;24260:3;24281:5;24274:12;;24217:75;;;:::o;24298:269::-;24408:39;24439:7;24408:39;:::i;:::-;24469:91;24518:41;24542:16;24518:41;:::i;:::-;24510:6;24503:4;24497:11;24469:91;:::i;:::-;24463:4;24456:105;24374:193;24298:269;;;:::o;24573:73::-;24618:3;24573:73;:::o;24652:189::-;24729:32;;:::i;:::-;24770:65;24828:6;24820;24814:4;24770:65;:::i;:::-;24705:136;24652:189;;:::o;24847:186::-;24907:120;24924:3;24917:5;24914:14;24907:120;;;24978:39;25015:1;25008:5;24978:39;:::i;:::-;24951:1;24944:5;24940:13;24931:22;;24907:120;;;24847:186;;:::o;25039:543::-;25140:2;25135:3;25132:11;25129:446;;;25174:38;25206:5;25174:38;:::i;:::-;25258:29;25276:10;25258:29;:::i;:::-;25248:8;25244:44;25441:2;25429:10;25426:18;25423:49;;;25462:8;25447:23;;25423:49;25485:80;25541:22;25559:3;25541:22;:::i;:::-;25531:8;25527:37;25514:11;25485:80;:::i;:::-;25144:431;;25129:446;25039:543;;;:::o;25588:117::-;25642:8;25692:5;25686:4;25682:16;25661:37;;25588:117;;;;:::o;25711:169::-;25755:6;25788:51;25836:1;25832:6;25824:5;25821:1;25817:13;25788:51;:::i;:::-;25784:56;25869:4;25863;25859:15;25849:25;;25762:118;25711:169;;;;:::o;25885:295::-;25961:4;26107:29;26132:3;26126:4;26107:29;:::i;:::-;26099:37;;26169:3;26166:1;26162:11;26156:4;26153:21;26145:29;;25885:295;;;;:::o;26185:1395::-;26302:37;26335:3;26302:37;:::i;:::-;26404:18;26396:6;26393:30;26390:56;;;26426:18;;:::i;:::-;26390:56;26470:38;26502:4;26496:11;26470:38;:::i;:::-;26555:67;26615:6;26607;26601:4;26555:67;:::i;:::-;26649:1;26673:4;26660:17;;26705:2;26697:6;26694:14;26722:1;26717:618;;;;27379:1;27396:6;27393:77;;;27445:9;27440:3;27436:19;27430:26;27421:35;;27393:77;27496:67;27556:6;27549:5;27496:67;:::i;:::-;27490:4;27483:81;27352:222;26687:887;;26717:618;26769:4;26765:9;26757:6;26753:22;26803:37;26835:4;26803:37;:::i;:::-;26862:1;26876:208;26890:7;26887:1;26884:14;26876:208;;;26969:9;26964:3;26960:19;26954:26;26946:6;26939:42;27020:1;27012:6;27008:14;26998:24;;27067:2;27056:9;27052:18;27039:31;;26913:4;26910:1;26906:12;26901:17;;26876:208;;;27112:6;27103:7;27100:19;27097:179;;;27170:9;27165:3;27161:19;27155:26;27213:48;27255:4;27247:6;27243:17;27232:9;27213:48;:::i;:::-;27205:6;27198:64;27120:156;27097:179;27322:1;27318;27310:6;27306:14;27302:22;27296:4;27289:36;26724:611;;;26687:887;;26277:1303;;;26185:1395;;:::o;27586:102::-;27628:8;27675:5;27672:1;27668:13;27647:34;;27586:102;;;:::o;27694:848::-;27755:5;27762:4;27786:6;27777:15;;27810:5;27801:14;;27824:712;27845:1;27835:8;27832:15;27824:712;;;27940:4;27935:3;27931:14;27925:4;27922:24;27919:50;;;27949:18;;:::i;:::-;27919:50;27999:1;27989:8;27985:16;27982:451;;;28414:4;28407:5;28403:16;28394:25;;27982:451;28464:4;28458;28454:15;28446:23;;28494:32;28517:8;28494:32;:::i;:::-;28482:44;;27824:712;;;27694:848;;;;;;;:::o;28548:1073::-;28602:5;28793:8;28783:40;;28814:1;28805:10;;28816:5;;28783:40;28842:4;28832:36;;28859:1;28850:10;;28861:5;;28832:36;28928:4;28976:1;28971:27;;;;29012:1;29007:191;;;;28921:277;;28971:27;28989:1;28980:10;;28991:5;;;29007:191;29052:3;29042:8;29039:17;29036:43;;;29059:18;;:::i;:::-;29036:43;29108:8;29105:1;29101:16;29092:25;;29143:3;29136:5;29133:14;29130:40;;;29150:18;;:::i;:::-;29130:40;29183:5;;;28921:277;;29307:2;29297:8;29294:16;29288:3;29282:4;29279:13;29275:36;29257:2;29247:8;29244:16;29239:2;29233:4;29230:12;29226:35;29210:111;29207:246;;;29363:8;29357:4;29353:19;29344:28;;29398:3;29391:5;29388:14;29385:40;;;29405:18;;:::i;:::-;29385:40;29438:5;;29207:246;29478:42;29516:3;29506:8;29500:4;29497:1;29478:42;:::i;:::-;29463:57;;;;29552:4;29547:3;29543:14;29536:5;29533:25;29530:51;;;29561:18;;:::i;:::-;29530:51;29610:4;29603:5;29599:16;29590:25;;28548:1073;;;;;;:::o;29627:281::-;29685:5;29709:23;29727:4;29709:23;:::i;:::-;29701:31;;29753:25;29769:8;29753:25;:::i;:::-;29741:37;;29797:104;29834:66;29824:8;29818:4;29797:104;:::i;:::-;29788:113;;29627:281;;;;:::o;29914:180::-;29962:77;29959:1;29952:88;30059:4;30056:1;30049:15;30083:4;30080:1;30073:15;30100:185;30140:1;30157:20;30175:1;30157:20;:::i;:::-;30152:25;;30191:20;30209:1;30191:20;:::i;:::-;30186:25;;30230:1;30220:35;;30235:18;;:::i;:::-;30220:35;30277:1;30274;30270:9;30265:14;;30100:185;;;;:::o

Swarm Source

ipfs://4eba7ef3e5e49dce52eaf48f3da59e45e692997536d7df62ed30d91b2865a90b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.