ETH Price: $3,450.57 (-1.20%)
Gas: 11 Gwei

Token

MATCHETH (MATCH)
 

Overview

Max Total Supply

600,000,000,000 MATCH

Holders

123

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
709,945,048.281193456983548595 MATCH

Value
$0.00
0x0d8d4319c8086b261910c10b758a75861e58ef10
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:
Matcheth

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-04
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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 10, 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 * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.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 `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);
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: TOKEN\Matcheth.sol



pragma solidity ^0.8.0;





contract Matcheth is ERC20,Ownable,AccessControl{
    
    using SafeMath for uint256;
    //ido开关
    bool public idoSwitch1=true;

    bool public idoSwitch2=false;
    //提币开关
    bool public withdaw1=false;

    bool public withdaw2=false;

    bytes32 private constant MANAGER_ROLE = keccak256("MANAGER_ROLE");

    mapping(address => bool) private whiteList;

    mapping(address=>uint256) public idoToBuy1;

    uint256 public idoBuyTotal1;

    mapping (address=>uint256) public idoAlreadyGet1;

    mapping(address=>uint256) public idoToBuy2;

    uint256 public idoBuyTotal2;

    mapping (address=>uint256) public idoAlreadyGet2;

    uint256 idoCount1=60000000000 * 10 ** decimals();
    
    uint256 idoCount2=360000000000 * 10 ** decimals();

    uint256 public minBuy=1*10**16;

    uint256 public maxBuy=1*10**18;

    mapping (address=>uint256) public alreadyBack;
    
    address holdAddress;

    constructor() ERC20("MATCHETH", "MATCH") {
        address admin=0x75d9E48653D372a4c5BEa74a7D7FDF50c1A1f322;
        holdAddress=admin;
        _grantRole(DEFAULT_ADMIN_ROLE,admin);
        _grantRole(MANAGER_ROLE, admin);
        _mint(admin, 600000000000 * 10 ** decimals());
        whiteList[admin]=true;
        //transferOwnership(admin);
    }
    
    function getWhitelist(address account) public view returns(bool) {
        return whiteList[account];
    }
    
    function setWhiteList(address[] calldata _addresses,bool _b)external onlyRole(MANAGER_ROLE){
        for(uint256 i=0;i<_addresses.length;i++){
            if(_addresses[i]!=address(0)){
                whiteList[_addresses[i]]=_b;
            }
        }
    }

    function withdawOwner(uint256 amount) external onlyRole(MANAGER_ROLE){
        payable(msg.sender).transfer(amount);
    }
    
    function errorToken(address _token) external onlyRole(MANAGER_ROLE){
        ERC20(_token).transfer(msg.sender, IERC20(_token).balanceOf(address(this)));
    }
    
    function setSwitch(bool _ido1,bool _ido2) external onlyRole(MANAGER_ROLE){
        idoSwitch1=_ido1;
        idoSwitch2=_ido2;
    }
    
    function setWithdaw(bool _withdaw1,bool _withdaw2) external onlyRole(MANAGER_ROLE){
        withdaw1=_withdaw1;
        withdaw2=_withdaw2;
    }
    
    function setMinMaxBuy(uint256 _minBuy,uint256 _maxBuy) external onlyRole(MANAGER_ROLE){
        minBuy=_minBuy;
        maxBuy=_maxBuy;
    }

    function ido1()payable external{
        require(whiteList[msg.sender], "not in white list");
        require(idoSwitch1, "not open");
        require(!isContract(msg.sender),"address not Alow");
        uint256 amountTobuy = msg.value;
        require(idoToBuy1[msg.sender]+amountTobuy<=maxBuy,"max ido");
        require(amountTobuy >= minBuy, "You need to send some Ether");
        idoToBuy1[msg.sender]+=amountTobuy;
        idoBuyTotal1+=amountTobuy;
        //payable(holdAddress).transfer(amountTobuy);
    }

    //获取可领取的数量
    function withdrawIdoCount1()public view returns(uint256){
        uint256 result=idoToBuy1[msg.sender]*idoCount1/idoBuyTotal1;
        if(result>idoAlreadyGet1[msg.sender]){
            return result-idoAlreadyGet1[msg.sender];
        }
        return 0;
    }
    //提取ido后的代币
    function withdrawIdo1()public{
        require(withdaw1, "not open");
        require(!idoSwitch1, "ido not close");
        uint256 toGet=withdrawIdoCount1();
        require(toGet>0, "not alow");
        ERC20(this).transfer(msg.sender,toGet);
        idoAlreadyGet1[msg.sender]+=toGet;
    }
    //计算能返回的eth
    function claimEthBalance()public view returns(uint256){
        if(!withdaw1){
            return 0;
        }else if(idoSwitch1){
            return 0;
        }
        if(idoBuyTotal1<=15*maxBuy){
            return 0;
        }else{
            uint256 backCount=idoToBuy1[msg.sender]*(idoBuyTotal1-maxBuy*15)/idoBuyTotal1;
            if(alreadyBack[msg.sender]>backCount){
                return 0;
            }else{
                return backCount-alreadyBack[msg.sender];
            }
        }
    }
    
    function claimEth()public{
        require(withdaw1, "not open");
        require(!idoSwitch1, "ido not close");
        uint256 toGet=claimEthBalance();
        require(toGet>0, "not alow");
        payable(msg.sender).transfer(toGet);
        alreadyBack[msg.sender]+=toGet;
    }

    function ido2()payable external{
        require(idoSwitch2, "not open");
        require(!isContract(msg.sender),"not Alow");
        //require(idoToBuy2[msg.sender]==0,"already join");
        uint256 amountTobuy = msg.value;
        require(amountTobuy >= minBuy, "You need to send some Ether");
        idoToBuy2[msg.sender]+=amountTobuy;
        idoBuyTotal2+=amountTobuy;
        payable(holdAddress).transfer(amountTobuy);
    }

    //获取可领取的数量
    function withdrawIdoCount2()public view returns(uint256){
        uint256 result=idoToBuy2[msg.sender]*idoCount2/idoBuyTotal2;
        if(result>idoAlreadyGet2[msg.sender]){
            return result-idoAlreadyGet2[msg.sender];
        }
        return 0;
    }
    //提取ido后的代币
    function withdrawIdo2()public{
        require(withdaw2, "not open");
        require(!idoSwitch2, "ido not close");
        uint256 toGet=withdrawIdoCount2();
        require(toGet>0, "not alow");
        ERC20(this).transfer(msg.sender,toGet);
        idoAlreadyGet2[msg.sender]+=toGet;
    }
   
    receive() external payable {}
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
    
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"errorToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ido1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ido2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"idoAlreadyGet1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"idoAlreadyGet2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idoBuyTotal1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idoBuyTotal2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idoSwitch1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idoSwitch2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"idoToBuy1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"idoToBuy2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBuy","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBuy","type":"uint256"},{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setMinMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ido1","type":"bool"},{"internalType":"bool","name":"_ido2","type":"bool"}],"name":"setSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_b","type":"bool"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_withdaw1","type":"bool"},{"internalType":"bool","name":"_withdaw2","type":"bool"}],"name":"setWithdaw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdaw1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdaw2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdawOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawIdo1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawIdo2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawIdoCount1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawIdoCount2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600760006101000a81548160ff0219169083151502179055506000600760016101000a81548160ff0219169083151502179055506000600760026101000a81548160ff0219169083151502179055506000600760036101000a81548160ff02191690831515021790555062000080620002fc60201b60201c565b600a6200008e919062000898565b640df8475800620000a09190620009d5565b600f55620000b3620002fc60201b60201c565b600a620000c1919062000898565b6453d1ac1000620000d39190620009d5565b601055662386f26fc10000601155670de0b6b3a7640000601255348015620000fa57600080fd5b506040518060400160405280600881526020017f4d415443484554480000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4d4154434800000000000000000000000000000000000000000000000000000081525081600390805190602001906200017f929190620006a8565b50806004908051906020019062000198929190620006a8565b505050620001bb620001af6200030560201b60201c565b6200030d60201b60201c565b60007375d9e48653d372a4c5bea74a7d7fdf50c1a1f322905080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200022a6000801b82620003d360201b60201c565b6200025c7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0882620003d360201b60201c565b6200029d8162000271620002fc60201b60201c565b600a6200027f919062000898565b648bb2c97000620002919190620009d5565b620004c560201b60201c565b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000b17565b60006012905090565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003e582826200063360201b60201c565b620004c15760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004666200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000538576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052f9062000790565b60405180910390fd5b6200054c600083836200069e60201b60201c565b8060026000828254620005609190620007e0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006139190620007b2565b60405180910390a36200062f60008383620006a360201b60201c565b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b505050565b828054620006b69062000a4d565b90600052602060002090601f016020900481019282620006da576000855562000726565b82601f10620006f557805160ff191683800117855562000726565b8280016001018555821562000726579182015b828111156200072557825182559160200191906001019062000708565b5b50905062000735919062000739565b5090565b5b80821115620007545760008160009055506001016200073a565b5090565b600062000767601f83620007cf565b9150620007748262000aee565b602082019050919050565b6200078a8162000a36565b82525050565b60006020820190508181036000830152620007ab8162000758565b9050919050565b6000602082019050620007c960008301846200077f565b92915050565b600082825260208201905092915050565b6000620007ed8262000a36565b9150620007fa8362000a36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000832576200083162000a83565b5b828201905092915050565b6000808291508390505b60018511156200088f5780860481111562000867576200086662000a83565b5b6001851615620008775780820291505b8081029050620008878562000ae1565b945062000847565b94509492505050565b6000620008a58262000a36565b9150620008b28362000a40565b9250620008e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620008e9565b905092915050565b600082620008fb5760019050620009ce565b816200090b5760009050620009ce565b81600181146200092457600281146200092f5762000965565b6001915050620009ce565b60ff84111562000944576200094362000a83565b5b8360020a9150848211156200095e576200095d62000a83565b5b50620009ce565b5060208310610133831016604e8410600b84101617156200099f5782820a90508381111562000999576200099862000a83565b5b620009ce565b620009ae84848460016200083d565b92509050818404811115620009c857620009c762000a83565b5b81810290505b9392505050565b6000620009e28262000a36565b9150620009ef8362000a36565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000a2b5762000a2a62000a83565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000a6657607f821691505b6020821081141562000a7d5762000a7c62000ab2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6142638062000b276000396000f3fe6080604052600436106102b25760003560e01c806370db69d611610175578063b7cdddcb116100dc578063d992744811610095578063e43f696e1161006f578063e43f696e14610acb578063f2fde38b14610af4578063f5ec004914610b1d578063fc4898ec14610b48576102b9565b8063d992744814610a4e578063dd62ed3e14610a77578063e34d54e314610ab4576102b9565b8063b7cdddcb14610966578063bb7b3c6b1461097d578063ccbf9540146109a6578063d547741f146109d1578063d67d8e6e146109fa578063d8cd923914610a37576102b9565b8063950144331161012e578063950144331461084257806395d89b411461086b578063a217fddf14610896578063a457c2d7146108c1578063a9059cbb146108fe578063ab78f8c21461093b576102b9565b806370db69d6146107305780637107d7a61461075b578063715018a6146107865780638b8fc13a1461079d5780638da5cb5b146107da57806391d1485414610805576102b9565b806336568abe116102195780635ad4c28c116101d25780635ad4c28c1461062d5780635df8df2c1461066a57806361c15c96146106955780636bf42549146106be5780636ee8fe45146106c857806370a08231146106f3576102b9565b806336568abe14610518578063395093511461054157806348b9382e1461057e5780634ae844fd146105885780634d0c0d0a146105c557806358dd749c14610602576102b9565b806323b872dd1161026b57806323b872dd146103e2578063248a9ca31461041f5780632a51d80d1461045c5780632f2ff15d1461048757806330edc0f5146104b0578063313ce567146104ed576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063095ea7b31461032657806318160ddd146103635780631c6a0c4c1461038e578063202133a0146103b7576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e091906131b2565b610b73565b6040516102f2919061368b565b60405180910390f35b34801561030757600080fd5b50610310610bed565b60405161031d91906136c1565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613038565b610c7f565b60405161035a919061368b565b60405180910390f35b34801561036f57600080fd5b50610378610ca2565b6040516103859190613943565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906131df565b610cac565b005b3480156103c357600080fd5b506103cc610d21565b6040516103d99190613943565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612fe5565b610e23565b604051610416919061368b565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613145565b610e52565b60405161045391906136a6565b60405180910390f35b34801561046857600080fd5b50610471610e72565b60405161047e9190613943565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613172565b610fe9565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612f78565b61100a565b6040516104e4919061368b565b60405180910390f35b3480156104f957600080fd5b50610502611060565b60405161050f919061395e565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613172565b611069565b005b34801561054d57600080fd5b5061056860048036038101906105639190613038565b6110ec565b604051610575919061368b565b60405180910390f35b610586611123565b005b34801561059457600080fd5b506105af60048036038101906105aa9190612f78565b611392565b6040516105bc9190613943565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190612f78565b6113aa565b6040516105f99190613943565b60405180910390f35b34801561060e57600080fd5b506106176113c2565b604051610624919061368b565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190612f78565b6113d5565b6040516106619190613943565b60405180910390f35b34801561067657600080fd5b5061067f6113ed565b60405161068c919061368b565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613239565b611400565b005b6106c661143d565b005b3480156106d457600080fd5b506106dd6115fa565b6040516106ea9190613943565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612f78565b611600565b6040516107279190613943565b60405180910390f35b34801561073c57600080fd5b50610745611648565b6040516107529190613943565b60405180910390f35b34801561076757600080fd5b5061077061164e565b60405161077d9190613943565b60405180910390f35b34801561079257600080fd5b5061079b611654565b005b3480156107a957600080fd5b506107c460048036038101906107bf9190612f78565b611668565b6040516107d19190613943565b60405180910390f35b3480156107e657600080fd5b506107ef611680565b6040516107fc9190613647565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613172565b6116aa565b604051610839919061368b565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613105565b611715565b005b34801561087757600080fd5b50610880611778565b60405161088d91906136c1565b60405180910390f35b3480156108a257600080fd5b506108ab61180a565b6040516108b891906136a6565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613038565b611811565b6040516108f5919061368b565b60405180910390f35b34801561090a57600080fd5b5061092560048036038101906109209190613038565b611888565b604051610932919061368b565b60405180910390f35b34801561094757600080fd5b506109506118ab565b60405161095d919061368b565b60405180910390f35b34801561097257600080fd5b5061097b6118be565b005b34801561098957600080fd5b506109a4600480360381019061099f9190613105565b611a4c565b005b3480156109b257600080fd5b506109bb611aaf565b6040516109c89190613943565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190613172565b611bb1565b005b348015610a0657600080fd5b50610a216004803603810190610a1c9190612f78565b611bd2565b604051610a2e9190613943565b60405180910390f35b348015610a4357600080fd5b50610a4c611bea565b005b348015610a5a57600080fd5b50610a756004803603810190610a709190612f78565b611dbf565b005b348015610a8357600080fd5b50610a9e6004803603810190610a999190612fa5565b611f03565b604051610aab9190613943565b60405180910390f35b348015610ac057600080fd5b50610ac9611f8a565b005b348015610ad757600080fd5b50610af26004803603810190610aed9190613078565b61215f565b005b348015610b0057600080fd5b50610b1b6004803603810190610b169190612f78565b61228b565b005b348015610b2957600080fd5b50610b3261230f565b604051610b3f919061368b565b60405180910390f35b348015610b5457600080fd5b50610b5d612322565b604051610b6a9190613943565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610be65750610be582612328565b5b9050919050565b606060038054610bfc90613b9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2890613b9d565b8015610c755780601f10610c4a57610100808354040283529160200191610c75565b820191906000526020600020905b815481529060010190602001808311610c5857829003601f168201915b5050505050905090565b600080610c8a612392565b9050610c9781858561239a565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610cd681612565565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610d1c573d6000803e3d6000fd5b505050565b600080600a54600f54600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d749190613a27565b610d7e91906139f6565b9050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610e1a57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610e129190613a81565b915050610e20565b60009150505b90565b600080610e2e612392565b9050610e3b858285612579565b610e46858585612605565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6000600760029054906101000a900460ff16610e915760009050610fe6565b600760009054906101000a900460ff1615610eaf5760009050610fe6565b601254600f610ebe9190613a27565b600a5411610ecf5760009050610fe6565b6000600a54600f601254610ee39190613a27565b600a54610ef09190613a81565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f3a9190613a27565b610f4491906139f6565b905080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f97576000915050610fe6565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610fe29190613a81565b9150505b90565b610ff282610e52565b610ffb81612565565b611005838361287d565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012905090565b611071612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590613923565b60405180910390fd5b6110e8828261295e565b5050565b6000806110f7612392565b90506111188185856111098589611f03565b61111391906139a0565b61239a565b600191505092915050565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a6906137c3565b60405180910390fd5b600760009054906101000a900460ff166111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590613823565b60405180910390fd5b61120733612a40565b15611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906138a3565b60405180910390fd5b600034905060125481600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461129a91906139a0565b11156112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d2906138e3565b60405180910390fd5b601154811015611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613843565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136f91906139a0565b9250508190555080600a600082825461138891906139a0565b9250508190555050565b600e6020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600760029054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b600760019054906101000a900460ff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861142a81612565565b8260118190555081601281905550505050565b600760019054906101000a900460ff1661148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390613823565b60405180910390fd5b61149533612a40565b156114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc906137a3565b60405180910390fd5b600034905060115481101561151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690613843565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461156e91906139a0565b9250508190555080600d600082825461158791906139a0565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115f6573d6000803e3d6000fd5b5050565b600a5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b60115481565b61165c612a53565b6116666000612ad1565b565b600b6020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861173f81612565565b82600760006101000a81548160ff02191690831515021790555081600760016101000a81548160ff021916908315150217905550505050565b60606004805461178790613b9d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b390613b9d565b80156118005780601f106117d557610100808354040283529160200191611800565b820191906000526020600020905b8154815290600101906020018083116117e357829003601f168201915b5050505050905090565b6000801b81565b60008061181c612392565b9050600061182a8286611f03565b90508381101561186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690613903565b60405180910390fd5b61187c828686840361239a565b60019250505092915050565b600080611893612392565b90506118a0818585612605565b600191505092915050565b600760039054906101000a900460ff1681565b600760029054906101000a900460ff1661190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613823565b60405180910390fd5b600760009054906101000a900460ff161561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613723565b60405180910390fd5b6000611967610e72565b9050600081116119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613783565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156119f2573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a4291906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611a7681612565565b82600760026101000a81548160ff02191690831515021790555081600760036101000a81548160ff021916908315150217905550505050565b600080600d54601054600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b029190613a27565b611b0c91906139f6565b9050600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611ba857600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481611ba09190613a81565b915050611bae565b60009150505b90565b611bba82610e52565b611bc381612565565b611bcd838361295e565b505050565b60096020528060005260406000206000915090505481565b600760029054906101000a900460ff16611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090613823565b60405180910390fd5b600760009054906101000a900460ff1615611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613723565b60405180910390fd5b6000611c93610d21565b905060008111611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613783565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d13929190613662565b602060405180830381600087803b158015611d2d57600080fd5b505af1158015611d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6591906130d8565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db591906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611de981612565565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e3f9190613647565b60206040518083038186803b158015611e5757600080fd5b505afa158015611e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8f919061320c565b6040518363ffffffff1660e01b8152600401611eac929190613662565b602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe91906130d8565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760039054906101000a900460ff16611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613823565b60405180910390fd5b600760019054906101000a900460ff1615612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613723565b60405180910390fd5b6000612033611aaf565b905060008111612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613783565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016120b3929190613662565b602060405180830381600087803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210591906130d8565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215591906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861218981612565565b60005b8484905081101561228457600073ffffffffffffffffffffffffffffffffffffffff168585838181106121c2576121c1613ca5565b5b90506020020160208101906121d79190612f78565b73ffffffffffffffffffffffffffffffffffffffff161461227157826008600087878581811061220a57612209613ca5565b5b905060200201602081019061221f9190612f78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061227c90613bcf565b91505061218c565b5050505050565b612293612a53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90613743565b60405180910390fd5b61230c81612ad1565b50565b600760009054906101000a900460ff1681565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561240a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612401906138c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561247a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247190613763565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125589190613943565b60405180910390a3505050565b61257681612571612392565b612b97565b50565b60006125858484611f03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125ff57818110156125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e8906137e3565b60405180910390fd5b6125fe848484840361239a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266c90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90613703565b60405180910390fd5b6126f0838383612c1c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90613803565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128649190613943565b60405180910390a3612877848484612c21565b50505050565b61288782826116aa565b61295a5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128ff612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61296882826116aa565b15612a3c5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506129e1612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080823b905060008111915050919050565b612a5b612392565b73ffffffffffffffffffffffffffffffffffffffff16612a79611680565b73ffffffffffffffffffffffffffffffffffffffff1614612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac690613863565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ba182826116aa565b612c1857612bae81612c26565b612bbc8360001c6020612c53565b604051602001612bcd92919061360d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f91906136c1565b60405180910390fd5b5050565b505050565b505050565b6060612c4c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612c53565b9050919050565b606060006002836002612c669190613a27565b612c7091906139a0565b67ffffffffffffffff811115612c8957612c88613cd4565b5b6040519080825280601f01601f191660200182016040528015612cbb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612cf357612cf2613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d5757612d56613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d979190613a27565b612da191906139a0565b90505b6001811115612e41577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612de357612de2613ca5565b5b1a60f81b828281518110612dfa57612df9613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e3a90613b73565b9050612da4565b5060008414612e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7c906136e3565b60405180910390fd5b8091505092915050565b600081359050612e9e816141ba565b92915050565b60008083601f840112612eba57612eb9613d08565b5b8235905067ffffffffffffffff811115612ed757612ed6613d03565b5b602083019150836020820283011115612ef357612ef2613d0d565b5b9250929050565b600081359050612f09816141d1565b92915050565b600081519050612f1e816141d1565b92915050565b600081359050612f33816141e8565b92915050565b600081359050612f48816141ff565b92915050565b600081359050612f5d81614216565b92915050565b600081519050612f7281614216565b92915050565b600060208284031215612f8e57612f8d613d17565b5b6000612f9c84828501612e8f565b91505092915050565b60008060408385031215612fbc57612fbb613d17565b5b6000612fca85828601612e8f565b9250506020612fdb85828601612e8f565b9150509250929050565b600080600060608486031215612ffe57612ffd613d17565b5b600061300c86828701612e8f565b935050602061301d86828701612e8f565b925050604061302e86828701612f4e565b9150509250925092565b6000806040838503121561304f5761304e613d17565b5b600061305d85828601612e8f565b925050602061306e85828601612f4e565b9150509250929050565b60008060006040848603121561309157613090613d17565b5b600084013567ffffffffffffffff8111156130af576130ae613d12565b5b6130bb86828701612ea4565b935093505060206130ce86828701612efa565b9150509250925092565b6000602082840312156130ee576130ed613d17565b5b60006130fc84828501612f0f565b91505092915050565b6000806040838503121561311c5761311b613d17565b5b600061312a85828601612efa565b925050602061313b85828601612efa565b9150509250929050565b60006020828403121561315b5761315a613d17565b5b600061316984828501612f24565b91505092915050565b6000806040838503121561318957613188613d17565b5b600061319785828601612f24565b92505060206131a885828601612e8f565b9150509250929050565b6000602082840312156131c8576131c7613d17565b5b60006131d684828501612f39565b91505092915050565b6000602082840312156131f5576131f4613d17565b5b600061320384828501612f4e565b91505092915050565b60006020828403121561322257613221613d17565b5b600061323084828501612f63565b91505092915050565b600080604083850312156132505761324f613d17565b5b600061325e85828601612f4e565b925050602061326f85828601612f4e565b9150509250929050565b61328281613ab5565b82525050565b61329181613ac7565b82525050565b6132a081613ad3565b82525050565b60006132b182613979565b6132bb8185613984565b93506132cb818560208601613b40565b6132d481613d1c565b840191505092915050565b60006132ea82613979565b6132f48185613995565b9350613304818560208601613b40565b80840191505092915050565b600061331d602083613984565b915061332882613d2d565b602082019050919050565b6000613340602383613984565b915061334b82613d56565b604082019050919050565b6000613363600d83613984565b915061336e82613da5565b602082019050919050565b6000613386602683613984565b915061339182613dce565b604082019050919050565b60006133a9602283613984565b91506133b482613e1d565b604082019050919050565b60006133cc600883613984565b91506133d782613e6c565b602082019050919050565b60006133ef600883613984565b91506133fa82613e95565b602082019050919050565b6000613412601183613984565b915061341d82613ebe565b602082019050919050565b6000613435601d83613984565b915061344082613ee7565b602082019050919050565b6000613458602683613984565b915061346382613f10565b604082019050919050565b600061347b600883613984565b915061348682613f5f565b602082019050919050565b600061349e601b83613984565b91506134a982613f88565b602082019050919050565b60006134c1602083613984565b91506134cc82613fb1565b602082019050919050565b60006134e4602583613984565b91506134ef82613fda565b604082019050919050565b6000613507601083613984565b915061351282614029565b602082019050919050565b600061352a602483613984565b915061353582614052565b604082019050919050565b600061354d600783613984565b9150613558826140a1565b602082019050919050565b6000613570601783613995565b915061357b826140ca565b601782019050919050565b6000613593602583613984565b915061359e826140f3565b604082019050919050565b60006135b6601183613995565b91506135c182614142565b601182019050919050565b60006135d9602f83613984565b91506135e48261416b565b604082019050919050565b6135f881613b29565b82525050565b61360781613b33565b82525050565b600061361882613563565b915061362482856132df565b915061362f826135a9565b915061363b82846132df565b91508190509392505050565b600060208201905061365c6000830184613279565b92915050565b60006040820190506136776000830185613279565b61368460208301846135ef565b9392505050565b60006020820190506136a06000830184613288565b92915050565b60006020820190506136bb6000830184613297565b92915050565b600060208201905081810360008301526136db81846132a6565b905092915050565b600060208201905081810360008301526136fc81613310565b9050919050565b6000602082019050818103600083015261371c81613333565b9050919050565b6000602082019050818103600083015261373c81613356565b9050919050565b6000602082019050818103600083015261375c81613379565b9050919050565b6000602082019050818103600083015261377c8161339c565b9050919050565b6000602082019050818103600083015261379c816133bf565b9050919050565b600060208201905081810360008301526137bc816133e2565b9050919050565b600060208201905081810360008301526137dc81613405565b9050919050565b600060208201905081810360008301526137fc81613428565b9050919050565b6000602082019050818103600083015261381c8161344b565b9050919050565b6000602082019050818103600083015261383c8161346e565b9050919050565b6000602082019050818103600083015261385c81613491565b9050919050565b6000602082019050818103600083015261387c816134b4565b9050919050565b6000602082019050818103600083015261389c816134d7565b9050919050565b600060208201905081810360008301526138bc816134fa565b9050919050565b600060208201905081810360008301526138dc8161351d565b9050919050565b600060208201905081810360008301526138fc81613540565b9050919050565b6000602082019050818103600083015261391c81613586565b9050919050565b6000602082019050818103600083015261393c816135cc565b9050919050565b600060208201905061395860008301846135ef565b92915050565b600060208201905061397360008301846135fe565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006139ab82613b29565b91506139b683613b29565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139eb576139ea613c18565b5b828201905092915050565b6000613a0182613b29565b9150613a0c83613b29565b925082613a1c57613a1b613c47565b5b828204905092915050565b6000613a3282613b29565b9150613a3d83613b29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7657613a75613c18565b5b828202905092915050565b6000613a8c82613b29565b9150613a9783613b29565b925082821015613aaa57613aa9613c18565b5b828203905092915050565b6000613ac082613b09565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613b5e578082015181840152602081019050613b43565b83811115613b6d576000848401525b50505050565b6000613b7e82613b29565b91506000821415613b9257613b91613c18565b5b600182039050919050565b60006002820490506001821680613bb557607f821691505b60208210811415613bc957613bc8613c76565b5b50919050565b6000613bda82613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c0d57613c0c613c18565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f69646f206e6f7420636c6f736500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420616c6f77000000000000000000000000000000000000000000000000600082015250565b7f6e6f7420416c6f77000000000000000000000000000000000000000000000000600082015250565b7f6e6f7420696e207768697465206c697374000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f596f75206e65656420746f2073656e6420736f6d652045746865720000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f61646472657373206e6f7420416c6f7700000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f6d61782069646f00000000000000000000000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6141c381613ab5565b81146141ce57600080fd5b50565b6141da81613ac7565b81146141e557600080fd5b50565b6141f181613ad3565b81146141fc57600080fd5b50565b61420881613add565b811461421357600080fd5b50565b61421f81613b29565b811461422a57600080fd5b5056fea2646970667358221220687d0f683023b599ddf56fb0b316299c9866067798301802b164c79c89c87db764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806370db69d611610175578063b7cdddcb116100dc578063d992744811610095578063e43f696e1161006f578063e43f696e14610acb578063f2fde38b14610af4578063f5ec004914610b1d578063fc4898ec14610b48576102b9565b8063d992744814610a4e578063dd62ed3e14610a77578063e34d54e314610ab4576102b9565b8063b7cdddcb14610966578063bb7b3c6b1461097d578063ccbf9540146109a6578063d547741f146109d1578063d67d8e6e146109fa578063d8cd923914610a37576102b9565b8063950144331161012e578063950144331461084257806395d89b411461086b578063a217fddf14610896578063a457c2d7146108c1578063a9059cbb146108fe578063ab78f8c21461093b576102b9565b806370db69d6146107305780637107d7a61461075b578063715018a6146107865780638b8fc13a1461079d5780638da5cb5b146107da57806391d1485414610805576102b9565b806336568abe116102195780635ad4c28c116101d25780635ad4c28c1461062d5780635df8df2c1461066a57806361c15c96146106955780636bf42549146106be5780636ee8fe45146106c857806370a08231146106f3576102b9565b806336568abe14610518578063395093511461054157806348b9382e1461057e5780634ae844fd146105885780634d0c0d0a146105c557806358dd749c14610602576102b9565b806323b872dd1161026b57806323b872dd146103e2578063248a9ca31461041f5780632a51d80d1461045c5780632f2ff15d1461048757806330edc0f5146104b0578063313ce567146104ed576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063095ea7b31461032657806318160ddd146103635780631c6a0c4c1461038e578063202133a0146103b7576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e091906131b2565b610b73565b6040516102f2919061368b565b60405180910390f35b34801561030757600080fd5b50610310610bed565b60405161031d91906136c1565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613038565b610c7f565b60405161035a919061368b565b60405180910390f35b34801561036f57600080fd5b50610378610ca2565b6040516103859190613943565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906131df565b610cac565b005b3480156103c357600080fd5b506103cc610d21565b6040516103d99190613943565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612fe5565b610e23565b604051610416919061368b565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613145565b610e52565b60405161045391906136a6565b60405180910390f35b34801561046857600080fd5b50610471610e72565b60405161047e9190613943565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613172565b610fe9565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612f78565b61100a565b6040516104e4919061368b565b60405180910390f35b3480156104f957600080fd5b50610502611060565b60405161050f919061395e565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613172565b611069565b005b34801561054d57600080fd5b5061056860048036038101906105639190613038565b6110ec565b604051610575919061368b565b60405180910390f35b610586611123565b005b34801561059457600080fd5b506105af60048036038101906105aa9190612f78565b611392565b6040516105bc9190613943565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190612f78565b6113aa565b6040516105f99190613943565b60405180910390f35b34801561060e57600080fd5b506106176113c2565b604051610624919061368b565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190612f78565b6113d5565b6040516106619190613943565b60405180910390f35b34801561067657600080fd5b5061067f6113ed565b60405161068c919061368b565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613239565b611400565b005b6106c661143d565b005b3480156106d457600080fd5b506106dd6115fa565b6040516106ea9190613943565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612f78565b611600565b6040516107279190613943565b60405180910390f35b34801561073c57600080fd5b50610745611648565b6040516107529190613943565b60405180910390f35b34801561076757600080fd5b5061077061164e565b60405161077d9190613943565b60405180910390f35b34801561079257600080fd5b5061079b611654565b005b3480156107a957600080fd5b506107c460048036038101906107bf9190612f78565b611668565b6040516107d19190613943565b60405180910390f35b3480156107e657600080fd5b506107ef611680565b6040516107fc9190613647565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613172565b6116aa565b604051610839919061368b565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613105565b611715565b005b34801561087757600080fd5b50610880611778565b60405161088d91906136c1565b60405180910390f35b3480156108a257600080fd5b506108ab61180a565b6040516108b891906136a6565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613038565b611811565b6040516108f5919061368b565b60405180910390f35b34801561090a57600080fd5b5061092560048036038101906109209190613038565b611888565b604051610932919061368b565b60405180910390f35b34801561094757600080fd5b506109506118ab565b60405161095d919061368b565b60405180910390f35b34801561097257600080fd5b5061097b6118be565b005b34801561098957600080fd5b506109a4600480360381019061099f9190613105565b611a4c565b005b3480156109b257600080fd5b506109bb611aaf565b6040516109c89190613943565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190613172565b611bb1565b005b348015610a0657600080fd5b50610a216004803603810190610a1c9190612f78565b611bd2565b604051610a2e9190613943565b60405180910390f35b348015610a4357600080fd5b50610a4c611bea565b005b348015610a5a57600080fd5b50610a756004803603810190610a709190612f78565b611dbf565b005b348015610a8357600080fd5b50610a9e6004803603810190610a999190612fa5565b611f03565b604051610aab9190613943565b60405180910390f35b348015610ac057600080fd5b50610ac9611f8a565b005b348015610ad757600080fd5b50610af26004803603810190610aed9190613078565b61215f565b005b348015610b0057600080fd5b50610b1b6004803603810190610b169190612f78565b61228b565b005b348015610b2957600080fd5b50610b3261230f565b604051610b3f919061368b565b60405180910390f35b348015610b5457600080fd5b50610b5d612322565b604051610b6a9190613943565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610be65750610be582612328565b5b9050919050565b606060038054610bfc90613b9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2890613b9d565b8015610c755780601f10610c4a57610100808354040283529160200191610c75565b820191906000526020600020905b815481529060010190602001808311610c5857829003601f168201915b5050505050905090565b600080610c8a612392565b9050610c9781858561239a565b600191505092915050565b6000600254905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610cd681612565565b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610d1c573d6000803e3d6000fd5b505050565b600080600a54600f54600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d749190613a27565b610d7e91906139f6565b9050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610e1a57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610e129190613a81565b915050610e20565b60009150505b90565b600080610e2e612392565b9050610e3b858285612579565b610e46858585612605565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b6000600760029054906101000a900460ff16610e915760009050610fe6565b600760009054906101000a900460ff1615610eaf5760009050610fe6565b601254600f610ebe9190613a27565b600a5411610ecf5760009050610fe6565b6000600a54600f601254610ee39190613a27565b600a54610ef09190613a81565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f3a9190613a27565b610f4491906139f6565b905080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f97576000915050610fe6565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610fe29190613a81565b9150505b90565b610ff282610e52565b610ffb81612565565b611005838361287d565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012905090565b611071612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590613923565b60405180910390fd5b6110e8828261295e565b5050565b6000806110f7612392565b90506111188185856111098589611f03565b61111391906139a0565b61239a565b600191505092915050565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a6906137c3565b60405180910390fd5b600760009054906101000a900460ff166111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590613823565b60405180910390fd5b61120733612a40565b15611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906138a3565b60405180910390fd5b600034905060125481600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461129a91906139a0565b11156112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d2906138e3565b60405180910390fd5b601154811015611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613843565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136f91906139a0565b9250508190555080600a600082825461138891906139a0565b9250508190555050565b600e6020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600760029054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b600760019054906101000a900460ff1681565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861142a81612565565b8260118190555081601281905550505050565b600760019054906101000a900460ff1661148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390613823565b60405180910390fd5b61149533612a40565b156114d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cc906137a3565b60405180910390fd5b600034905060115481101561151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690613843565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461156e91906139a0565b9250508190555080600d600082825461158791906139a0565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115f6573d6000803e3d6000fd5b5050565b600a5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b60115481565b61165c612a53565b6116666000612ad1565b565b600b6020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861173f81612565565b82600760006101000a81548160ff02191690831515021790555081600760016101000a81548160ff021916908315150217905550505050565b60606004805461178790613b9d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b390613b9d565b80156118005780601f106117d557610100808354040283529160200191611800565b820191906000526020600020905b8154815290600101906020018083116117e357829003601f168201915b5050505050905090565b6000801b81565b60008061181c612392565b9050600061182a8286611f03565b90508381101561186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690613903565b60405180910390fd5b61187c828686840361239a565b60019250505092915050565b600080611893612392565b90506118a0818585612605565b600191505092915050565b600760039054906101000a900460ff1681565b600760029054906101000a900460ff1661190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613823565b60405180910390fd5b600760009054906101000a900460ff161561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613723565b60405180910390fd5b6000611967610e72565b9050600081116119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613783565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156119f2573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a4291906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611a7681612565565b82600760026101000a81548160ff02191690831515021790555081600760036101000a81548160ff021916908315150217905550505050565b600080600d54601054600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b029190613a27565b611b0c91906139f6565b9050600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611ba857600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481611ba09190613a81565b915050611bae565b60009150505b90565b611bba82610e52565b611bc381612565565b611bcd838361295e565b505050565b60096020528060005260406000206000915090505481565b600760029054906101000a900460ff16611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090613823565b60405180910390fd5b600760009054906101000a900460ff1615611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613723565b60405180910390fd5b6000611c93610d21565b905060008111611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613783565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d13929190613662565b602060405180830381600087803b158015611d2d57600080fd5b505af1158015611d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6591906130d8565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db591906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611de981612565565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e3f9190613647565b60206040518083038186803b158015611e5757600080fd5b505afa158015611e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8f919061320c565b6040518363ffffffff1660e01b8152600401611eac929190613662565b602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe91906130d8565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760039054906101000a900460ff16611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613823565b60405180910390fd5b600760019054906101000a900460ff1615612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613723565b60405180910390fd5b6000612033611aaf565b905060008111612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613783565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016120b3929190613662565b602060405180830381600087803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210591906130d8565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215591906139a0565b9250508190555050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861218981612565565b60005b8484905081101561228457600073ffffffffffffffffffffffffffffffffffffffff168585838181106121c2576121c1613ca5565b5b90506020020160208101906121d79190612f78565b73ffffffffffffffffffffffffffffffffffffffff161461227157826008600087878581811061220a57612209613ca5565b5b905060200201602081019061221f9190612f78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061227c90613bcf565b91505061218c565b5050505050565b612293612a53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90613743565b60405180910390fd5b61230c81612ad1565b50565b600760009054906101000a900460ff1681565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561240a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612401906138c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561247a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247190613763565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125589190613943565b60405180910390a3505050565b61257681612571612392565b612b97565b50565b60006125858484611f03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125ff57818110156125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e8906137e3565b60405180910390fd5b6125fe848484840361239a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266c90613883565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90613703565b60405180910390fd5b6126f0838383612c1c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90613803565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128649190613943565b60405180910390a3612877848484612c21565b50505050565b61288782826116aa565b61295a5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128ff612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61296882826116aa565b15612a3c5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506129e1612392565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080823b905060008111915050919050565b612a5b612392565b73ffffffffffffffffffffffffffffffffffffffff16612a79611680565b73ffffffffffffffffffffffffffffffffffffffff1614612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac690613863565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ba182826116aa565b612c1857612bae81612c26565b612bbc8360001c6020612c53565b604051602001612bcd92919061360d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f91906136c1565b60405180910390fd5b5050565b505050565b505050565b6060612c4c8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612c53565b9050919050565b606060006002836002612c669190613a27565b612c7091906139a0565b67ffffffffffffffff811115612c8957612c88613cd4565b5b6040519080825280601f01601f191660200182016040528015612cbb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612cf357612cf2613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d5757612d56613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d979190613a27565b612da191906139a0565b90505b6001811115612e41577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612de357612de2613ca5565b5b1a60f81b828281518110612dfa57612df9613ca5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e3a90613b73565b9050612da4565b5060008414612e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7c906136e3565b60405180910390fd5b8091505092915050565b600081359050612e9e816141ba565b92915050565b60008083601f840112612eba57612eb9613d08565b5b8235905067ffffffffffffffff811115612ed757612ed6613d03565b5b602083019150836020820283011115612ef357612ef2613d0d565b5b9250929050565b600081359050612f09816141d1565b92915050565b600081519050612f1e816141d1565b92915050565b600081359050612f33816141e8565b92915050565b600081359050612f48816141ff565b92915050565b600081359050612f5d81614216565b92915050565b600081519050612f7281614216565b92915050565b600060208284031215612f8e57612f8d613d17565b5b6000612f9c84828501612e8f565b91505092915050565b60008060408385031215612fbc57612fbb613d17565b5b6000612fca85828601612e8f565b9250506020612fdb85828601612e8f565b9150509250929050565b600080600060608486031215612ffe57612ffd613d17565b5b600061300c86828701612e8f565b935050602061301d86828701612e8f565b925050604061302e86828701612f4e565b9150509250925092565b6000806040838503121561304f5761304e613d17565b5b600061305d85828601612e8f565b925050602061306e85828601612f4e565b9150509250929050565b60008060006040848603121561309157613090613d17565b5b600084013567ffffffffffffffff8111156130af576130ae613d12565b5b6130bb86828701612ea4565b935093505060206130ce86828701612efa565b9150509250925092565b6000602082840312156130ee576130ed613d17565b5b60006130fc84828501612f0f565b91505092915050565b6000806040838503121561311c5761311b613d17565b5b600061312a85828601612efa565b925050602061313b85828601612efa565b9150509250929050565b60006020828403121561315b5761315a613d17565b5b600061316984828501612f24565b91505092915050565b6000806040838503121561318957613188613d17565b5b600061319785828601612f24565b92505060206131a885828601612e8f565b9150509250929050565b6000602082840312156131c8576131c7613d17565b5b60006131d684828501612f39565b91505092915050565b6000602082840312156131f5576131f4613d17565b5b600061320384828501612f4e565b91505092915050565b60006020828403121561322257613221613d17565b5b600061323084828501612f63565b91505092915050565b600080604083850312156132505761324f613d17565b5b600061325e85828601612f4e565b925050602061326f85828601612f4e565b9150509250929050565b61328281613ab5565b82525050565b61329181613ac7565b82525050565b6132a081613ad3565b82525050565b60006132b182613979565b6132bb8185613984565b93506132cb818560208601613b40565b6132d481613d1c565b840191505092915050565b60006132ea82613979565b6132f48185613995565b9350613304818560208601613b40565b80840191505092915050565b600061331d602083613984565b915061332882613d2d565b602082019050919050565b6000613340602383613984565b915061334b82613d56565b604082019050919050565b6000613363600d83613984565b915061336e82613da5565b602082019050919050565b6000613386602683613984565b915061339182613dce565b604082019050919050565b60006133a9602283613984565b91506133b482613e1d565b604082019050919050565b60006133cc600883613984565b91506133d782613e6c565b602082019050919050565b60006133ef600883613984565b91506133fa82613e95565b602082019050919050565b6000613412601183613984565b915061341d82613ebe565b602082019050919050565b6000613435601d83613984565b915061344082613ee7565b602082019050919050565b6000613458602683613984565b915061346382613f10565b604082019050919050565b600061347b600883613984565b915061348682613f5f565b602082019050919050565b600061349e601b83613984565b91506134a982613f88565b602082019050919050565b60006134c1602083613984565b91506134cc82613fb1565b602082019050919050565b60006134e4602583613984565b91506134ef82613fda565b604082019050919050565b6000613507601083613984565b915061351282614029565b602082019050919050565b600061352a602483613984565b915061353582614052565b604082019050919050565b600061354d600783613984565b9150613558826140a1565b602082019050919050565b6000613570601783613995565b915061357b826140ca565b601782019050919050565b6000613593602583613984565b915061359e826140f3565b604082019050919050565b60006135b6601183613995565b91506135c182614142565b601182019050919050565b60006135d9602f83613984565b91506135e48261416b565b604082019050919050565b6135f881613b29565b82525050565b61360781613b33565b82525050565b600061361882613563565b915061362482856132df565b915061362f826135a9565b915061363b82846132df565b91508190509392505050565b600060208201905061365c6000830184613279565b92915050565b60006040820190506136776000830185613279565b61368460208301846135ef565b9392505050565b60006020820190506136a06000830184613288565b92915050565b60006020820190506136bb6000830184613297565b92915050565b600060208201905081810360008301526136db81846132a6565b905092915050565b600060208201905081810360008301526136fc81613310565b9050919050565b6000602082019050818103600083015261371c81613333565b9050919050565b6000602082019050818103600083015261373c81613356565b9050919050565b6000602082019050818103600083015261375c81613379565b9050919050565b6000602082019050818103600083015261377c8161339c565b9050919050565b6000602082019050818103600083015261379c816133bf565b9050919050565b600060208201905081810360008301526137bc816133e2565b9050919050565b600060208201905081810360008301526137dc81613405565b9050919050565b600060208201905081810360008301526137fc81613428565b9050919050565b6000602082019050818103600083015261381c8161344b565b9050919050565b6000602082019050818103600083015261383c8161346e565b9050919050565b6000602082019050818103600083015261385c81613491565b9050919050565b6000602082019050818103600083015261387c816134b4565b9050919050565b6000602082019050818103600083015261389c816134d7565b9050919050565b600060208201905081810360008301526138bc816134fa565b9050919050565b600060208201905081810360008301526138dc8161351d565b9050919050565b600060208201905081810360008301526138fc81613540565b9050919050565b6000602082019050818103600083015261391c81613586565b9050919050565b6000602082019050818103600083015261393c816135cc565b9050919050565b600060208201905061395860008301846135ef565b92915050565b600060208201905061397360008301846135fe565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006139ab82613b29565b91506139b683613b29565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139eb576139ea613c18565b5b828201905092915050565b6000613a0182613b29565b9150613a0c83613b29565b925082613a1c57613a1b613c47565b5b828204905092915050565b6000613a3282613b29565b9150613a3d83613b29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7657613a75613c18565b5b828202905092915050565b6000613a8c82613b29565b9150613a9783613b29565b925082821015613aaa57613aa9613c18565b5b828203905092915050565b6000613ac082613b09565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613b5e578082015181840152602081019050613b43565b83811115613b6d576000848401525b50505050565b6000613b7e82613b29565b91506000821415613b9257613b91613c18565b5b600182039050919050565b60006002820490506001821680613bb557607f821691505b60208210811415613bc957613bc8613c76565b5b50919050565b6000613bda82613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c0d57613c0c613c18565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f69646f206e6f7420636c6f736500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420616c6f77000000000000000000000000000000000000000000000000600082015250565b7f6e6f7420416c6f77000000000000000000000000000000000000000000000000600082015250565b7f6e6f7420696e207768697465206c697374000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6e6f74206f70656e000000000000000000000000000000000000000000000000600082015250565b7f596f75206e65656420746f2073656e6420736f6d652045746865720000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f61646472657373206e6f7420416c6f7700000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f6d61782069646f00000000000000000000000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6141c381613ab5565b81146141ce57600080fd5b50565b6141da81613ac7565b81146141e557600080fd5b50565b6141f181613ad3565b81146141fc57600080fd5b50565b61420881613add565b811461421357600080fd5b50565b61421f81613b29565b811461422a57600080fd5b5056fea2646970667358221220687d0f683023b599ddf56fb0b316299c9866067798301802b164c79c89c87db764736f6c63430008070033

Deployed Bytecode Sourcemap

56082:5984:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30697:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44824:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47175:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45944:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57815:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59149:267;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47956:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32520:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59787:527;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32961:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57420:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61964:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34105:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48660:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58583:526;;;:::i;:::-;;56710:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56964:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56284:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56623:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56229:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58431:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60623:444;;;:::i;:::-;;56530:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46115:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56925:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56886;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38249:103;;;;;;;;;;;;;:::i;:::-;;56566:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37601:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30993:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58124:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45043:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30098:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49401:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46448:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56319:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60326:289;;;;;;;;;;;;;:::i;:::-;;58271:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61107:267;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33401:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56479:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59451:301;;;;;;;;;;;;;:::i;:::-;;57951:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46704:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61409:301;;;;;;;;;;;;;:::i;:::-;;57541:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38507:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56193:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56674;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30697:204;30782:4;30821:32;30806:47;;;:11;:47;;;;:87;;;;30857:36;30881:11;30857:23;:36::i;:::-;30806:87;30799:94;;30697:204;;;:::o;44824:100::-;44878:13;44911:5;44904:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44824:100;:::o;47175:201::-;47258:4;47275:13;47291:12;:10;:12::i;:::-;47275:28;;47314:32;47323:5;47330:7;47339:6;47314:8;:32::i;:::-;47364:4;47357:11;;;47175:201;;;;:::o;45944:108::-;46005:7;46032:12;;46025:19;;45944:108;:::o;57815:124::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;57903:10:::1;57895:28;;:36;57924:6;57895:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57815:124:::0;;:::o;59149:267::-;59197:7;59216:14;59263:12;;59253:9;;59231;:21;59241:10;59231:21;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:44;;;;:::i;:::-;59216:59;;59296:14;:26;59311:10;59296:26;;;;;;;;;;;;;;;;59289:6;:33;59286:104;;;59352:14;:26;59367:10;59352:26;;;;;;;;;;;;;;;;59345:6;:33;;;;:::i;:::-;59338:40;;;;;59286:104;59407:1;59400:8;;;59149:267;;:::o;47956:295::-;48087:4;48104:15;48122:12;:10;:12::i;:::-;48104:30;;48145:38;48161:4;48167:7;48176:6;48145:15;:38::i;:::-;48194:27;48204:4;48210:2;48214:6;48194:9;:27::i;:::-;48239:4;48232:11;;;47956:295;;;;;:::o;32520:131::-;32594:7;32621:6;:12;32628:4;32621:12;;;;;;;;;;;:22;;;32614:29;;32520:131;;;:::o;59787:527::-;59833:7;59856:8;;;;;;;;;;;59852:102;;59887:1;59880:8;;;;59852:102;59908:10;;;;;;;;;;;59905:49;;;59941:1;59934:8;;;;59905:49;59984:6;;59981:2;:9;;;;:::i;:::-;59967:12;;:23;59964:343;;60013:1;60006:8;;;;59964:343;60045:17;60110:12;;60106:2;60099:6;;:9;;;;:::i;:::-;60086:12;;:22;;;;:::i;:::-;60063:9;:21;60073:10;60063:21;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:59;;;;:::i;:::-;60045:77;;60164:9;60140:11;:23;60152:10;60140:23;;;;;;;;;;;;;;;;:33;60137:159;;;60200:1;60193:8;;;;;60137:159;60257:11;:23;60269:10;60257:23;;;;;;;;;;;;;;;;60247:9;:33;;;;:::i;:::-;60240:40;;;59787:527;;:::o;32961:147::-;33044:18;33057:4;33044:12;:18::i;:::-;30589:16;30600:4;30589:10;:16::i;:::-;33075:25:::1;33086:4;33092:7;33075:10;:25::i;:::-;32961:147:::0;;;:::o;57420:109::-;57479:4;57503:9;:18;57513:7;57503:18;;;;;;;;;;;;;;;;;;;;;;;;;57496:25;;57420:109;;;:::o;61964:93::-;62022:5;62047:2;62040:9;;61964:93;:::o;34105:218::-;34212:12;:10;:12::i;:::-;34201:23;;:7;:23;;;34193:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;34289:26;34301:4;34307:7;34289:11;:26::i;:::-;34105:218;;:::o;48660:238::-;48748:4;48765:13;48781:12;:10;:12::i;:::-;48765:28;;48804:64;48813:5;48820:7;48857:10;48829:25;48839:5;48846:7;48829:9;:25::i;:::-;:38;;;;:::i;:::-;48804:8;:64::i;:::-;48886:4;48879:11;;;48660:238;;;;:::o;58583:526::-;58633:9;:21;58643:10;58633:21;;;;;;;;;;;;;;;;;;;;;;;;;58625:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;58695:10;;;;;;;;;;;58687:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;58738:22;58749:10;58738;:22::i;:::-;58737:23;58729:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;58791:19;58813:9;58791:31;;58876:6;;58863:11;58841:9;:21;58851:10;58841:21;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:41;;58833:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58927:6;;58912:11;:21;;58904:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58999:11;58976:9;:21;58986:10;58976:21;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;59035:11;59021:12;;:25;;;;;;;:::i;:::-;;;;;;;;58614:495;58583:526::o;56710:48::-;;;;;;;;;;;;;;;;;:::o;56964:45::-;;;;;;;;;;;;;;;;;:::o;56284:26::-;;;;;;;;;;;;;:::o;56623:42::-;;;;;;;;;;;;;;;;;:::o;56229:28::-;;;;;;;;;;;;;:::o;58431:144::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;58535:7:::1;58528:6;:14;;;;58560:7;58553:6;:14;;;;58431:144:::0;;;:::o;60623:444::-;60673:10;;;;;;;;;;;60665:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;60716:22;60727:10;60716;:22::i;:::-;60715:23;60707:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60822:19;60844:9;60822:31;;60887:6;;60872:11;:21;;60864:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60959:11;60936:9;:21;60946:10;60936:21;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;60995:11;60981:12;;:25;;;;;;;:::i;:::-;;;;;;;;61025:11;;;;;;;;;;;61017:29;;:42;61047:11;61017:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60654:413;60623:444::o;56530:27::-;;;;:::o;46115:127::-;46189:7;46216:9;:18;46226:7;46216:18;;;;;;;;;;;;;;;;46209:25;;46115:127;;;:::o;56925:30::-;;;;:::o;56886:::-;;;;:::o;38249:103::-;37487:13;:11;:13::i;:::-;38314:30:::1;38341:1;38314:18;:30::i;:::-;38249:103::o:0;56566:48::-;;;;;;;;;;;;;;;;;:::o;37601:87::-;37647:7;37674:6;;;;;;;;;;;37667:13;;37601:87;:::o;30993:147::-;31079:4;31103:6;:12;31110:4;31103:12;;;;;;;;;;;:20;;:29;31124:7;31103:29;;;;;;;;;;;;;;;;;;;;;;;;;31096:36;;30993:147;;;;:::o;58124:135::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;58219:5:::1;58208:10;;:16;;;;;;;;;;;;;;;;;;58246:5;58235:10;;:16;;;;;;;;;;;;;;;;;;58124:135:::0;;;:::o;45043:104::-;45099:13;45132:7;45125:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45043:104;:::o;30098:49::-;30143:4;30098:49;;;:::o;49401:436::-;49494:4;49511:13;49527:12;:10;:12::i;:::-;49511:28;;49550:24;49577:25;49587:5;49594:7;49577:9;:25::i;:::-;49550:52;;49641:15;49621:16;:35;;49613:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49734:60;49743:5;49750:7;49778:15;49759:16;:34;49734:8;:60::i;:::-;49825:4;49818:11;;;;49401:436;;;;:::o;46448:193::-;46527:4;46544:13;46560:12;:10;:12::i;:::-;46544:28;;46583;46593:5;46600:2;46604:6;46583:9;:28::i;:::-;46629:4;46622:11;;;46448:193;;;;:::o;56319:26::-;;;;;;;;;;;;;:::o;60326:289::-;60370:8;;;;;;;;;;;60362:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;60411:10;;;;;;;;;;;60410:11;60402:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60450:13;60464:17;:15;:17::i;:::-;60450:31;;60506:1;60500:5;:7;60492:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;60539:10;60531:28;;:35;60560:5;60531:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60602:5;60577:11;:23;60589:10;60577:23;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;60351:264;60326:289::o;58271:148::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;58373:9:::1;58364:8;;:18;;;;;;;;;;;;;;;;;;58402:9;58393:8;;:18;;;;;;;;;;;;;;;;;;58271:148:::0;;;:::o;61107:267::-;61155:7;61174:14;61221:12;;61211:9;;61189;:21;61199:10;61189:21;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:44;;;;:::i;:::-;61174:59;;61254:14;:26;61269:10;61254:26;;;;;;;;;;;;;;;;61247:6;:33;61244:104;;;61310:14;:26;61325:10;61310:26;;;;;;;;;;;;;;;;61303:6;:33;;;;:::i;:::-;61296:40;;;;;61244:104;61365:1;61358:8;;;61107:267;;:::o;33401:149::-;33485:18;33498:4;33485:12;:18::i;:::-;30589:16;30600:4;30589:10;:16::i;:::-;33516:26:::1;33528:4;33534:7;33516:11;:26::i;:::-;33401:149:::0;;;:::o;56479:42::-;;;;;;;;;;;;;;;;;:::o;59451:301::-;59499:8;;;;;;;;;;;59491:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;59540:10;;;;;;;;;;;59539:11;59531:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;59579:13;59593:19;:17;:19::i;:::-;59579:33;;59637:1;59631:5;:7;59623:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;59668:4;59662:20;;;59683:10;59694:5;59662:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59739:5;59711:14;:26;59726:10;59711:26;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;59480:272;59451:301::o;57951:161::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;58035:6:::1;58029:22;;;58052:10;58071:6;58064:24;;;58097:4;58064:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58029:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57951:161:::0;;:::o;46704:151::-;46793:7;46820:11;:18;46832:5;46820:18;;;;;;;;;;;;;;;:27;46839:7;46820:27;;;;;;;;;;;;;;;;46813:34;;46704:151;;;;:::o;61409:301::-;61457:8;;;;;;;;;;;61449:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;61498:10;;;;;;;;;;;61497:11;61489:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61537:13;61551:19;:17;:19::i;:::-;61537:33;;61595:1;61589:5;:7;61581:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;61626:4;61620:20;;;61641:10;61652:5;61620:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61697:5;61669:14;:26;61684:10;61669:26;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;61438:272;61409:301::o;57541:266::-;56394:25;30589:16;30600:4;30589:10;:16::i;:::-;57647:9:::1;57643:157;57661:10;;:17;;57659:1;:19;57643:157;;;57724:1;57701:25;;:10;;57712:1;57701:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:25;;;57698:91;;57771:2;57746:9;:24;57756:10;;57767:1;57756:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57746:24;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;57698:91;57679:3;;;;;:::i;:::-;;;;57643:157;;;;57541:266:::0;;;;:::o;38507:201::-;37487:13;:11;:13::i;:::-;38616:1:::1;38596:22;;:8;:22;;;;38588:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38672:28;38691:8;38672:18;:28::i;:::-;38507:201:::0;:::o;56193:27::-;;;;;;;;;;;;;:::o;56674:::-;;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;27906:98::-;27959:7;27986:10;27979:17;;27906:98;:::o;53428:380::-;53581:1;53564:19;;:5;:19;;;;53556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53662:1;53643:21;;:7;:21;;;;53635:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53746:6;53716:11;:18;53728:5;53716:18;;;;;;;;;;;;;;;:27;53735:7;53716:27;;;;;;;;;;;;;;;:36;;;;53784:7;53768:32;;53777:5;53768:32;;;53793:6;53768:32;;;;;;:::i;:::-;;;;;;;;53428:380;;;:::o;31444:105::-;31511:30;31522:4;31528:12;:10;:12::i;:::-;31511:10;:30::i;:::-;31444:105;:::o;54099:453::-;54234:24;54261:25;54271:5;54278:7;54261:9;:25::i;:::-;54234:52;;54321:17;54301:16;:37;54297:248;;54383:6;54363:16;:26;;54355:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54467:51;54476:5;54483:7;54511:6;54492:16;:25;54467:8;:51::i;:::-;54297:248;54223:329;54099:453;;;:::o;50307:840::-;50454:1;50438:18;;:4;:18;;;;50430:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50531:1;50517:16;;:2;:16;;;;50509:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50586:38;50607:4;50613:2;50617:6;50586:20;:38::i;:::-;50637:19;50659:9;:15;50669:4;50659:15;;;;;;;;;;;;;;;;50637:37;;50708:6;50693:11;:21;;50685:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;50825:6;50811:11;:20;50793:9;:15;50803:4;50793:15;;;;;;;;;;;;;;;:38;;;;51028:6;51011:9;:13;51021:2;51011:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;51078:2;51063:26;;51072:4;51063:26;;;51082:6;51063:26;;;;;;:::i;:::-;;;;;;;;51102:37;51122:4;51128:2;51132:6;51102:19;:37::i;:::-;50419:728;50307:840;;;:::o;35702:238::-;35786:22;35794:4;35800:7;35786;:22::i;:::-;35781:152;;35857:4;35825:6;:12;35832:4;35825:12;;;;;;;;;;;:20;;:29;35846:7;35825:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35908:12;:10;:12::i;:::-;35881:40;;35899:7;35881:40;;35893:4;35881:40;;;;;;;;;;35781:152;35702:238;;:::o;36120:239::-;36204:22;36212:4;36218:7;36204;:22::i;:::-;36200:152;;;36275:5;36243:6;:12;36250:4;36243:12;;;;;;;;;;;:20;;:29;36264:7;36243:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;36327:12;:10;:12::i;:::-;36300:40;;36318:7;36300:40;;36312:4;36300:40;;;;;;;;;;36200:152;36120:239;;:::o;61756:196::-;61816:4;61833:12;61900:7;61888:20;61880:28;;61943:1;61936:4;:8;61929:15;;;61756:196;;;:::o;37766:132::-;37841:12;:10;:12::i;:::-;37830:23;;:7;:5;:7::i;:::-;:23;;;37822:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37766:132::o;38868:191::-;38942:16;38961:6;;;;;;;;;;;38942:25;;38987:8;38978:6;;:17;;;;;;;;;;;;;;;;;;39042:8;39011:40;;39032:8;39011:40;;;;;;;;;;;;38931:128;38868:191;:::o;31839:492::-;31928:22;31936:4;31942:7;31928;:22::i;:::-;31923:401;;32116:28;32136:7;32116:19;:28::i;:::-;32217:38;32245:4;32237:13;;32252:2;32217:19;:38::i;:::-;32021:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31967:345;;;;;;;;;;;:::i;:::-;;;;;;;;31923:401;31839:492;;:::o;55152:125::-;;;;:::o;55881:124::-;;;;:::o;16987:151::-;17045:13;17078:52;17106:4;17090:22;;15142:2;17078:52;;:11;:52::i;:::-;17071:59;;16987:151;;;:::o;16383:447::-;16458:13;16484:19;16529:1;16520:6;16516:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16506:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16484:47;;16542:15;:6;16549:1;16542:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16568;:6;16575:1;16568:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16599:9;16624:1;16615:6;16611:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16599:26;;16594:131;16631:1;16627;:5;16594:131;;;16666:8;16683:3;16675:5;:11;16666:21;;;;;;;:::i;:::-;;;;;16654:6;16661:1;16654:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;16712:1;16702:11;;;;;16634:3;;;;:::i;:::-;;;16594:131;;;;16752:1;16743:5;:10;16735:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;16815:6;16801:21;;;16383:447;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;169:568::-;242:8;252:6;302:3;295:4;287:6;283:17;279:27;269:122;;310:79;;:::i;:::-;269:122;423:6;410:20;400:30;;453:18;445:6;442:30;439:117;;;475:79;;:::i;:::-;439:117;589:4;581:6;577:17;565:29;;643:3;635:4;627:6;623:17;613:8;609:32;606:41;603:128;;;650:79;;:::i;:::-;603:128;169:568;;;;;:::o;743:133::-;786:5;824:6;811:20;802:29;;840:30;864:5;840:30;:::i;:::-;743:133;;;;:::o;882:137::-;936:5;967:6;961:13;952:22;;983:30;1007:5;983:30;:::i;:::-;882:137;;;;:::o;1025:139::-;1071:5;1109:6;1096:20;1087:29;;1125:33;1152:5;1125:33;:::i;:::-;1025:139;;;;:::o;1170:137::-;1215:5;1253:6;1240:20;1231:29;;1269:32;1295:5;1269:32;:::i;:::-;1170:137;;;;:::o;1313:139::-;1359:5;1397:6;1384:20;1375:29;;1413:33;1440:5;1413:33;:::i;:::-;1313:139;;;;:::o;1458:143::-;1515:5;1546:6;1540:13;1531:22;;1562:33;1589:5;1562:33;:::i;:::-;1458:143;;;;:::o;1607:329::-;1666:6;1715:2;1703:9;1694:7;1690:23;1686:32;1683:119;;;1721:79;;:::i;:::-;1683:119;1841:1;1866:53;1911:7;1902:6;1891:9;1887:22;1866:53;:::i;:::-;1856:63;;1812:117;1607:329;;;;:::o;1942:474::-;2010:6;2018;2067:2;2055:9;2046:7;2042:23;2038:32;2035:119;;;2073:79;;:::i;:::-;2035:119;2193:1;2218:53;2263:7;2254:6;2243:9;2239:22;2218:53;:::i;:::-;2208:63;;2164:117;2320:2;2346:53;2391:7;2382:6;2371:9;2367:22;2346:53;:::i;:::-;2336:63;;2291:118;1942:474;;;;;:::o;2422:619::-;2499:6;2507;2515;2564:2;2552:9;2543:7;2539:23;2535:32;2532:119;;;2570:79;;:::i;:::-;2532:119;2690:1;2715:53;2760:7;2751:6;2740:9;2736:22;2715:53;:::i;:::-;2705:63;;2661:117;2817:2;2843:53;2888:7;2879:6;2868:9;2864:22;2843:53;:::i;:::-;2833:63;;2788:118;2945:2;2971:53;3016:7;3007:6;2996:9;2992:22;2971:53;:::i;:::-;2961:63;;2916:118;2422:619;;;;;:::o;3047:474::-;3115:6;3123;3172:2;3160:9;3151:7;3147:23;3143:32;3140:119;;;3178:79;;:::i;:::-;3140:119;3298:1;3323:53;3368:7;3359:6;3348:9;3344:22;3323:53;:::i;:::-;3313:63;;3269:117;3425:2;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3396:118;3047:474;;;;;:::o;3527:698::-;3619:6;3627;3635;3684:2;3672:9;3663:7;3659:23;3655:32;3652:119;;;3690:79;;:::i;:::-;3652:119;3838:1;3827:9;3823:17;3810:31;3868:18;3860:6;3857:30;3854:117;;;3890:79;;:::i;:::-;3854:117;4003:80;4075:7;4066:6;4055:9;4051:22;4003:80;:::i;:::-;3985:98;;;;3781:312;4132:2;4158:50;4200:7;4191:6;4180:9;4176:22;4158:50;:::i;:::-;4148:60;;4103:115;3527:698;;;;;:::o;4231:345::-;4298:6;4347:2;4335:9;4326:7;4322:23;4318:32;4315:119;;;4353:79;;:::i;:::-;4315:119;4473:1;4498:61;4551:7;4542:6;4531:9;4527:22;4498:61;:::i;:::-;4488:71;;4444:125;4231:345;;;;:::o;4582:462::-;4644:6;4652;4701:2;4689:9;4680:7;4676:23;4672:32;4669:119;;;4707:79;;:::i;:::-;4669:119;4827:1;4852:50;4894:7;4885:6;4874:9;4870:22;4852:50;:::i;:::-;4842:60;;4798:114;4951:2;4977:50;5019:7;5010:6;4999:9;4995:22;4977:50;:::i;:::-;4967:60;;4922:115;4582:462;;;;;:::o;5050:329::-;5109:6;5158:2;5146:9;5137:7;5133:23;5129:32;5126:119;;;5164:79;;:::i;:::-;5126:119;5284:1;5309:53;5354:7;5345:6;5334:9;5330:22;5309:53;:::i;:::-;5299:63;;5255:117;5050:329;;;;:::o;5385:474::-;5453:6;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5385:474;;;;;:::o;5865:327::-;5923:6;5972:2;5960:9;5951:7;5947:23;5943:32;5940:119;;;5978:79;;:::i;:::-;5940:119;6098:1;6123:52;6167:7;6158:6;6147:9;6143:22;6123:52;:::i;:::-;6113:62;;6069:116;5865:327;;;;:::o;6198:329::-;6257:6;6306:2;6294:9;6285:7;6281:23;6277:32;6274:119;;;6312:79;;:::i;:::-;6274:119;6432:1;6457:53;6502:7;6493:6;6482:9;6478:22;6457:53;:::i;:::-;6447:63;;6403:117;6198:329;;;;:::o;6533:351::-;6603:6;6652:2;6640:9;6631:7;6627:23;6623:32;6620:119;;;6658:79;;:::i;:::-;6620:119;6778:1;6803:64;6859:7;6850:6;6839:9;6835:22;6803:64;:::i;:::-;6793:74;;6749:128;6533:351;;;;:::o;6890:474::-;6958:6;6966;7015:2;7003:9;6994:7;6990:23;6986:32;6983:119;;;7021:79;;:::i;:::-;6983:119;7141:1;7166:53;7211:7;7202:6;7191:9;7187:22;7166:53;:::i;:::-;7156:63;;7112:117;7268:2;7294:53;7339:7;7330:6;7319:9;7315:22;7294:53;:::i;:::-;7284:63;;7239:118;6890:474;;;;;:::o;7370:118::-;7457:24;7475:5;7457:24;:::i;:::-;7452:3;7445:37;7370:118;;:::o;7494:109::-;7575:21;7590:5;7575:21;:::i;:::-;7570:3;7563:34;7494:109;;:::o;7609:118::-;7696:24;7714:5;7696:24;:::i;:::-;7691:3;7684:37;7609:118;;:::o;7733:364::-;7821:3;7849:39;7882:5;7849:39;:::i;:::-;7904:71;7968:6;7963:3;7904:71;:::i;:::-;7897:78;;7984:52;8029:6;8024:3;8017:4;8010:5;8006:16;7984:52;:::i;:::-;8061:29;8083:6;8061:29;:::i;:::-;8056:3;8052:39;8045:46;;7825:272;7733:364;;;;:::o;8103:377::-;8209:3;8237:39;8270:5;8237:39;:::i;:::-;8292:89;8374:6;8369:3;8292:89;:::i;:::-;8285:96;;8390:52;8435:6;8430:3;8423:4;8416:5;8412:16;8390:52;:::i;:::-;8467:6;8462:3;8458:16;8451:23;;8213:267;8103:377;;;;:::o;8486:366::-;8628:3;8649:67;8713:2;8708:3;8649:67;:::i;:::-;8642:74;;8725:93;8814:3;8725:93;:::i;:::-;8843:2;8838:3;8834:12;8827:19;;8486:366;;;:::o;8858:::-;9000:3;9021:67;9085:2;9080:3;9021:67;:::i;:::-;9014:74;;9097:93;9186:3;9097:93;:::i;:::-;9215:2;9210:3;9206:12;9199:19;;8858:366;;;:::o;9230:::-;9372:3;9393:67;9457:2;9452:3;9393:67;:::i;:::-;9386:74;;9469:93;9558:3;9469:93;:::i;:::-;9587:2;9582:3;9578:12;9571:19;;9230:366;;;:::o;9602:::-;9744:3;9765:67;9829:2;9824:3;9765:67;:::i;:::-;9758:74;;9841:93;9930:3;9841:93;:::i;:::-;9959:2;9954:3;9950:12;9943:19;;9602:366;;;:::o;9974:::-;10116:3;10137:67;10201:2;10196:3;10137:67;:::i;:::-;10130:74;;10213:93;10302:3;10213:93;:::i;:::-;10331:2;10326:3;10322:12;10315:19;;9974:366;;;:::o;10346:365::-;10488:3;10509:66;10573:1;10568:3;10509:66;:::i;:::-;10502:73;;10584:93;10673:3;10584:93;:::i;:::-;10702:2;10697:3;10693:12;10686:19;;10346:365;;;:::o;10717:::-;10859:3;10880:66;10944:1;10939:3;10880:66;:::i;:::-;10873:73;;10955:93;11044:3;10955:93;:::i;:::-;11073:2;11068:3;11064:12;11057:19;;10717:365;;;:::o;11088:366::-;11230:3;11251:67;11315:2;11310:3;11251:67;:::i;:::-;11244:74;;11327:93;11416:3;11327:93;:::i;:::-;11445:2;11440:3;11436:12;11429:19;;11088:366;;;:::o;11460:::-;11602:3;11623:67;11687:2;11682:3;11623:67;:::i;:::-;11616:74;;11699:93;11788:3;11699:93;:::i;:::-;11817:2;11812:3;11808:12;11801:19;;11460:366;;;:::o;11832:::-;11974:3;11995:67;12059:2;12054:3;11995:67;:::i;:::-;11988:74;;12071:93;12160:3;12071:93;:::i;:::-;12189:2;12184:3;12180:12;12173:19;;11832:366;;;:::o;12204:365::-;12346:3;12367:66;12431:1;12426:3;12367:66;:::i;:::-;12360:73;;12442:93;12531:3;12442:93;:::i;:::-;12560:2;12555:3;12551:12;12544:19;;12204:365;;;:::o;12575:366::-;12717:3;12738:67;12802:2;12797:3;12738:67;:::i;:::-;12731:74;;12814:93;12903:3;12814:93;:::i;:::-;12932:2;12927:3;12923:12;12916:19;;12575:366;;;:::o;12947:::-;13089:3;13110:67;13174:2;13169:3;13110:67;:::i;:::-;13103:74;;13186:93;13275:3;13186:93;:::i;:::-;13304:2;13299:3;13295:12;13288:19;;12947:366;;;:::o;13319:::-;13461:3;13482:67;13546:2;13541:3;13482:67;:::i;:::-;13475:74;;13558:93;13647:3;13558:93;:::i;:::-;13676:2;13671:3;13667:12;13660:19;;13319:366;;;:::o;13691:::-;13833:3;13854:67;13918:2;13913:3;13854:67;:::i;:::-;13847:74;;13930:93;14019:3;13930:93;:::i;:::-;14048:2;14043:3;14039:12;14032:19;;13691:366;;;:::o;14063:::-;14205:3;14226:67;14290:2;14285:3;14226:67;:::i;:::-;14219:74;;14302:93;14391:3;14302:93;:::i;:::-;14420:2;14415:3;14411:12;14404:19;;14063:366;;;:::o;14435:365::-;14577:3;14598:66;14662:1;14657:3;14598:66;:::i;:::-;14591:73;;14673:93;14762:3;14673:93;:::i;:::-;14791:2;14786:3;14782:12;14775:19;;14435:365;;;:::o;14806:402::-;14966:3;14987:85;15069:2;15064:3;14987:85;:::i;:::-;14980:92;;15081:93;15170:3;15081:93;:::i;:::-;15199:2;15194:3;15190:12;15183:19;;14806:402;;;:::o;15214:366::-;15356:3;15377:67;15441:2;15436:3;15377:67;:::i;:::-;15370:74;;15453:93;15542:3;15453:93;:::i;:::-;15571:2;15566:3;15562:12;15555:19;;15214:366;;;:::o;15586:402::-;15746:3;15767:85;15849:2;15844:3;15767:85;:::i;:::-;15760:92;;15861:93;15950:3;15861:93;:::i;:::-;15979:2;15974:3;15970:12;15963:19;;15586:402;;;:::o;15994:366::-;16136:3;16157:67;16221:2;16216:3;16157:67;:::i;:::-;16150:74;;16233:93;16322:3;16233:93;:::i;:::-;16351:2;16346:3;16342:12;16335:19;;15994:366;;;:::o;16366:118::-;16453:24;16471:5;16453:24;:::i;:::-;16448:3;16441:37;16366:118;;:::o;16490:112::-;16573:22;16589:5;16573:22;:::i;:::-;16568:3;16561:35;16490:112;;:::o;16608:967::-;16990:3;17012:148;17156:3;17012:148;:::i;:::-;17005:155;;17177:95;17268:3;17259:6;17177:95;:::i;:::-;17170:102;;17289:148;17433:3;17289:148;:::i;:::-;17282:155;;17454:95;17545:3;17536:6;17454:95;:::i;:::-;17447:102;;17566:3;17559:10;;16608:967;;;;;:::o;17581:222::-;17674:4;17712:2;17701:9;17697:18;17689:26;;17725:71;17793:1;17782:9;17778:17;17769:6;17725:71;:::i;:::-;17581:222;;;;:::o;17809:332::-;17930:4;17968:2;17957:9;17953:18;17945:26;;17981:71;18049:1;18038:9;18034:17;18025:6;17981:71;:::i;:::-;18062:72;18130:2;18119:9;18115:18;18106:6;18062:72;:::i;:::-;17809:332;;;;;:::o;18147:210::-;18234:4;18272:2;18261:9;18257:18;18249:26;;18285:65;18347:1;18336:9;18332:17;18323:6;18285:65;:::i;:::-;18147:210;;;;:::o;18363:222::-;18456:4;18494:2;18483:9;18479:18;18471:26;;18507:71;18575:1;18564:9;18560:17;18551:6;18507:71;:::i;:::-;18363:222;;;;:::o;18591:313::-;18704:4;18742:2;18731:9;18727:18;18719:26;;18791:9;18785:4;18781:20;18777:1;18766:9;18762:17;18755:47;18819:78;18892:4;18883:6;18819:78;:::i;:::-;18811:86;;18591:313;;;;:::o;18910:419::-;19076:4;19114:2;19103:9;19099:18;19091:26;;19163:9;19157:4;19153:20;19149:1;19138:9;19134:17;19127:47;19191:131;19317:4;19191:131;:::i;:::-;19183:139;;18910:419;;;:::o;19335:::-;19501:4;19539:2;19528:9;19524:18;19516:26;;19588:9;19582:4;19578:20;19574:1;19563:9;19559:17;19552:47;19616:131;19742:4;19616:131;:::i;:::-;19608:139;;19335:419;;;:::o;19760:::-;19926:4;19964:2;19953:9;19949:18;19941:26;;20013:9;20007:4;20003:20;19999:1;19988:9;19984:17;19977:47;20041:131;20167:4;20041:131;:::i;:::-;20033:139;;19760:419;;;:::o;20185:::-;20351:4;20389:2;20378:9;20374:18;20366:26;;20438:9;20432:4;20428:20;20424:1;20413:9;20409:17;20402:47;20466:131;20592:4;20466:131;:::i;:::-;20458:139;;20185:419;;;:::o;20610:::-;20776:4;20814:2;20803:9;20799:18;20791:26;;20863:9;20857:4;20853:20;20849:1;20838:9;20834:17;20827:47;20891:131;21017:4;20891:131;:::i;:::-;20883:139;;20610:419;;;:::o;21035:::-;21201:4;21239:2;21228:9;21224:18;21216:26;;21288:9;21282:4;21278:20;21274:1;21263:9;21259:17;21252:47;21316:131;21442:4;21316:131;:::i;:::-;21308:139;;21035:419;;;:::o;21460:::-;21626:4;21664:2;21653:9;21649:18;21641:26;;21713:9;21707:4;21703:20;21699:1;21688:9;21684:17;21677:47;21741:131;21867:4;21741:131;:::i;:::-;21733:139;;21460:419;;;:::o;21885:::-;22051:4;22089:2;22078:9;22074:18;22066:26;;22138:9;22132:4;22128:20;22124:1;22113:9;22109:17;22102:47;22166:131;22292:4;22166:131;:::i;:::-;22158:139;;21885:419;;;:::o;22310:::-;22476:4;22514:2;22503:9;22499:18;22491:26;;22563:9;22557:4;22553:20;22549:1;22538:9;22534:17;22527:47;22591:131;22717:4;22591:131;:::i;:::-;22583:139;;22310:419;;;:::o;22735:::-;22901:4;22939:2;22928:9;22924:18;22916:26;;22988:9;22982:4;22978:20;22974:1;22963:9;22959:17;22952:47;23016:131;23142:4;23016:131;:::i;:::-;23008:139;;22735:419;;;:::o;23160:::-;23326:4;23364:2;23353:9;23349:18;23341:26;;23413:9;23407:4;23403:20;23399:1;23388:9;23384:17;23377:47;23441:131;23567:4;23441:131;:::i;:::-;23433:139;;23160:419;;;:::o;23585:::-;23751:4;23789:2;23778:9;23774:18;23766:26;;23838:9;23832:4;23828:20;23824:1;23813:9;23809:17;23802:47;23866:131;23992:4;23866:131;:::i;:::-;23858:139;;23585:419;;;:::o;24010:::-;24176:4;24214:2;24203:9;24199:18;24191:26;;24263:9;24257:4;24253:20;24249:1;24238:9;24234:17;24227:47;24291:131;24417:4;24291:131;:::i;:::-;24283:139;;24010:419;;;:::o;24435:::-;24601:4;24639:2;24628:9;24624:18;24616:26;;24688:9;24682:4;24678:20;24674:1;24663:9;24659:17;24652:47;24716:131;24842:4;24716:131;:::i;:::-;24708:139;;24435:419;;;:::o;24860:::-;25026:4;25064:2;25053:9;25049:18;25041:26;;25113:9;25107:4;25103:20;25099:1;25088:9;25084:17;25077:47;25141:131;25267:4;25141:131;:::i;:::-;25133:139;;24860:419;;;:::o;25285:::-;25451:4;25489:2;25478:9;25474:18;25466:26;;25538:9;25532:4;25528:20;25524:1;25513:9;25509:17;25502:47;25566:131;25692:4;25566:131;:::i;:::-;25558:139;;25285:419;;;:::o;25710:::-;25876:4;25914:2;25903:9;25899:18;25891:26;;25963:9;25957:4;25953:20;25949:1;25938:9;25934:17;25927:47;25991:131;26117:4;25991:131;:::i;:::-;25983:139;;25710:419;;;:::o;26135:::-;26301:4;26339:2;26328:9;26324:18;26316:26;;26388:9;26382:4;26378:20;26374:1;26363:9;26359:17;26352:47;26416:131;26542:4;26416:131;:::i;:::-;26408:139;;26135:419;;;:::o;26560:::-;26726:4;26764:2;26753:9;26749:18;26741:26;;26813:9;26807:4;26803:20;26799:1;26788:9;26784:17;26777:47;26841:131;26967:4;26841:131;:::i;:::-;26833:139;;26560:419;;;:::o;26985:222::-;27078:4;27116:2;27105:9;27101:18;27093:26;;27129:71;27197:1;27186:9;27182:17;27173:6;27129:71;:::i;:::-;26985:222;;;;:::o;27213:214::-;27302:4;27340:2;27329:9;27325:18;27317:26;;27353:67;27417:1;27406:9;27402:17;27393:6;27353:67;:::i;:::-;27213:214;;;;:::o;27514:99::-;27566:6;27600:5;27594:12;27584:22;;27514:99;;;:::o;27619:169::-;27703:11;27737:6;27732:3;27725:19;27777:4;27772:3;27768:14;27753:29;;27619:169;;;;:::o;27794:148::-;27896:11;27933:3;27918:18;;27794:148;;;;:::o;27948:305::-;27988:3;28007:20;28025:1;28007:20;:::i;:::-;28002:25;;28041:20;28059:1;28041:20;:::i;:::-;28036:25;;28195:1;28127:66;28123:74;28120:1;28117:81;28114:107;;;28201:18;;:::i;:::-;28114:107;28245:1;28242;28238:9;28231:16;;27948:305;;;;:::o;28259:185::-;28299:1;28316:20;28334:1;28316:20;:::i;:::-;28311:25;;28350:20;28368:1;28350:20;:::i;:::-;28345:25;;28389:1;28379:35;;28394:18;;:::i;:::-;28379:35;28436:1;28433;28429:9;28424:14;;28259:185;;;;:::o;28450:348::-;28490:7;28513:20;28531:1;28513:20;:::i;:::-;28508:25;;28547:20;28565:1;28547:20;:::i;:::-;28542:25;;28735:1;28667:66;28663:74;28660:1;28657:81;28652:1;28645:9;28638:17;28634:105;28631:131;;;28742:18;;:::i;:::-;28631:131;28790:1;28787;28783:9;28772:20;;28450:348;;;;:::o;28804:191::-;28844:4;28864:20;28882:1;28864:20;:::i;:::-;28859:25;;28898:20;28916:1;28898:20;:::i;:::-;28893:25;;28937:1;28934;28931:8;28928:34;;;28942:18;;:::i;:::-;28928:34;28987:1;28984;28980:9;28972:17;;28804:191;;;;:::o;29001:96::-;29038:7;29067:24;29085:5;29067:24;:::i;:::-;29056:35;;29001:96;;;:::o;29103:90::-;29137:7;29180:5;29173:13;29166:21;29155:32;;29103:90;;;:::o;29199:77::-;29236:7;29265:5;29254:16;;29199:77;;;:::o;29282:149::-;29318:7;29358:66;29351:5;29347:78;29336:89;;29282:149;;;:::o;29437:126::-;29474:7;29514:42;29507:5;29503:54;29492:65;;29437:126;;;:::o;29569:77::-;29606:7;29635:5;29624:16;;29569:77;;;:::o;29652:86::-;29687:7;29727:4;29720:5;29716:16;29705:27;;29652:86;;;:::o;29744:307::-;29812:1;29822:113;29836:6;29833:1;29830:13;29822:113;;;29921:1;29916:3;29912:11;29906:18;29902:1;29897:3;29893:11;29886:39;29858:2;29855:1;29851:10;29846:15;;29822:113;;;29953:6;29950:1;29947:13;29944:101;;;30033:1;30024:6;30019:3;30015:16;30008:27;29944:101;29793:258;29744:307;;;:::o;30057:171::-;30096:3;30119:24;30137:5;30119:24;:::i;:::-;30110:33;;30165:4;30158:5;30155:15;30152:41;;;30173:18;;:::i;:::-;30152:41;30220:1;30213:5;30209:13;30202:20;;30057:171;;;:::o;30234:320::-;30278:6;30315:1;30309:4;30305:12;30295:22;;30362:1;30356:4;30352:12;30383:18;30373:81;;30439:4;30431:6;30427:17;30417:27;;30373:81;30501:2;30493:6;30490:14;30470:18;30467:38;30464:84;;;30520:18;;:::i;:::-;30464:84;30285:269;30234:320;;;:::o;30560:233::-;30599:3;30622:24;30640:5;30622:24;:::i;:::-;30613:33;;30668:66;30661:5;30658:77;30655:103;;;30738:18;;:::i;:::-;30655:103;30785:1;30778:5;30774:13;30767:20;;30560:233;;;:::o;30799:180::-;30847:77;30844:1;30837:88;30944:4;30941:1;30934:15;30968:4;30965:1;30958:15;30985:180;31033:77;31030:1;31023:88;31130:4;31127:1;31120:15;31154:4;31151:1;31144:15;31171:180;31219:77;31216:1;31209:88;31316:4;31313:1;31306:15;31340:4;31337:1;31330:15;31357:180;31405:77;31402:1;31395:88;31502:4;31499:1;31492:15;31526:4;31523:1;31516:15;31543:180;31591:77;31588:1;31581:88;31688:4;31685:1;31678:15;31712:4;31709:1;31702:15;31729:117;31838:1;31835;31828:12;31852:117;31961:1;31958;31951:12;31975:117;32084:1;32081;32074:12;32098:117;32207:1;32204;32197:12;32221:117;32330:1;32327;32320:12;32344:102;32385:6;32436:2;32432:7;32427:2;32420:5;32416:14;32412:28;32402:38;;32344:102;;;:::o;32452:182::-;32592:34;32588:1;32580:6;32576:14;32569:58;32452:182;:::o;32640:222::-;32780:34;32776:1;32768:6;32764:14;32757:58;32849:5;32844:2;32836:6;32832:15;32825:30;32640:222;:::o;32868:163::-;33008:15;33004:1;32996:6;32992:14;32985:39;32868:163;:::o;33037:225::-;33177:34;33173:1;33165:6;33161:14;33154:58;33246:8;33241:2;33233:6;33229:15;33222:33;33037:225;:::o;33268:221::-;33408:34;33404:1;33396:6;33392:14;33385:58;33477:4;33472:2;33464:6;33460:15;33453:29;33268:221;:::o;33495:158::-;33635:10;33631:1;33623:6;33619:14;33612:34;33495:158;:::o;33659:::-;33799:10;33795:1;33787:6;33783:14;33776:34;33659:158;:::o;33823:167::-;33963:19;33959:1;33951:6;33947:14;33940:43;33823:167;:::o;33996:179::-;34136:31;34132:1;34124:6;34120:14;34113:55;33996:179;:::o;34181:225::-;34321:34;34317:1;34309:6;34305:14;34298:58;34390:8;34385:2;34377:6;34373:15;34366:33;34181:225;:::o;34412:158::-;34552:10;34548:1;34540:6;34536:14;34529:34;34412:158;:::o;34576:177::-;34716:29;34712:1;34704:6;34700:14;34693:53;34576:177;:::o;34759:182::-;34899:34;34895:1;34887:6;34883:14;34876:58;34759:182;:::o;34947:224::-;35087:34;35083:1;35075:6;35071:14;35064:58;35156:7;35151:2;35143:6;35139:15;35132:32;34947:224;:::o;35177:166::-;35317:18;35313:1;35305:6;35301:14;35294:42;35177:166;:::o;35349:223::-;35489:34;35485:1;35477:6;35473:14;35466:58;35558:6;35553:2;35545:6;35541:15;35534:31;35349:223;:::o;35578:157::-;35718:9;35714:1;35706:6;35702:14;35695:33;35578:157;:::o;35741:173::-;35881:25;35877:1;35869:6;35865:14;35858:49;35741:173;:::o;35920:224::-;36060:34;36056:1;36048:6;36044:14;36037:58;36129:7;36124:2;36116:6;36112:15;36105:32;35920:224;:::o;36150:167::-;36290:19;36286:1;36278:6;36274:14;36267:43;36150:167;:::o;36323:234::-;36463:34;36459:1;36451:6;36447:14;36440:58;36532:17;36527:2;36519:6;36515:15;36508:42;36323:234;:::o;36563:122::-;36636:24;36654:5;36636:24;:::i;:::-;36629:5;36626:35;36616:63;;36675:1;36672;36665:12;36616:63;36563:122;:::o;36691:116::-;36761:21;36776:5;36761:21;:::i;:::-;36754:5;36751:32;36741:60;;36797:1;36794;36787:12;36741:60;36691:116;:::o;36813:122::-;36886:24;36904:5;36886:24;:::i;:::-;36879:5;36876:35;36866:63;;36925:1;36922;36915:12;36866:63;36813:122;:::o;36941:120::-;37013:23;37030:5;37013:23;:::i;:::-;37006:5;37003:34;36993:62;;37051:1;37048;37041:12;36993:62;36941:120;:::o;37067:122::-;37140:24;37158:5;37140:24;:::i;:::-;37133:5;37130:35;37120:63;;37179:1;37176;37169:12;37120:63;37067:122;:::o

Swarm Source

ipfs://687d0f683023b599ddf56fb0b316299c9866067798301802b164c79c89c87db7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.