ETH Price: $3,297.69 (-1.70%)

Token

EtherQuest (EQ)
 

Overview

Max Total Supply

1,000,000,000 EQ

Holders

20

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
9,773,809.870669493 EQ

Value
$0.00
0x54cf2fc9b1de5108645ff513f6c65570a4d0897d
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:
EQ

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-15
*/

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


// OpenZeppelin Contracts (last updated v4.9.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/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @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 (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @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.
     */
    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 `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;




/**
 * @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:
 *
 * ```solidity
 * 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}:
 *
 * ```solidity
 * 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. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    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 returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @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 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 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 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 `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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: contracts/EtherQuest.sol

/**

                                                                                                    
88888888888           88                                     ,ad8888ba,                                                 
88             ,d     88                                    d8"'    `"8b                                         ,d     
88             88     88                                   d8'        `8b                                        88     
88aaaaa      MM88MMM  88,dPPYba,    ,adPPYba,  8b,dPPYba,  88          88  88       88   ,adPPYba,  ,adPPYba,  MM88MMM  
88"""""        88     88P'    "8a  a8P_____88  88P'   "Y8  88          88  88       88  a8P_____88  I8[    ""    88     
88             88     88       88  8PP"""""""  88          Y8,    "88,,8P  88       88  8PP"""""""   `"Y8ba,     88     
88             88,    88       88  "8b,   ,aa  88           Y8a.    Y88P   "8a,   ,a88  "8b,   ,aa  aa    ]8I    88,    
88888888888    "Y888  88       88   `"Ybbd8"'  88            `"Y8888Y"Y8a   `"YbbdP'Y8   `"Ybbd8"'  `"YbbdP"'    "Y888  
                                                                                          


    > https://EtherQuest.world
    > https://t.me/EtherQuestGame
    > https://twitter.com/EtherQuest_ETH

*/

pragma solidity 0.8.20;







interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

}
    
    


contract EQ is Context, IERC20, Ownable, ReentrancyGuard, AccessControl {
    using SafeMath for uint256;
    bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
    address payable private immutable _deployerWallet;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private bots;

    uint256 private _initialBuyTax = 20;
    uint256 private _initialSellTax = 25;
    uint256 private _finalBuyTax = 5;
    uint256 private _finalSellTax = 5;
    uint256 private _reduceBuyTaxAt = 20;
    uint256 private _reduceSellTaxAt = 20;
    uint256 private _preventSwapBefore=20;
    uint256 private _buyCount=0;

    uint8 private constant _decimals = 9;							  
    uint256 private constant _tTotal = 1000000000 * 10**_decimals;
    string private constant _name = unicode"EtherQuest";
    string private constant _symbol = unicode"EQ";
    uint256 public _maxTxAmount = 20000000 * 10**_decimals;
    uint256 public _maxWalletSize = 20000000 * 10**_decimals;
    uint256 private _taxSwapThreshold = 10000000 * 10**_decimals;
    uint256 public _maxTaxSwap= 10000000 * 10**_decimals;
    

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    uint256 private lastExecutedBlockNumber;
    event MaxTxAmountUpdated(uint _maxTxAmount);
    event ManualSalePerformed(uint256 tokensSold, uint256 ethReceived);
    event EthTransferedToDeployer(address indexed from, uint256 ethAmount);




    constructor() Ownable(msg.sender) {
        _balances[msg.sender] = _tTotal;
        emit Transfer(address(0), msg.sender, _tTotal);
        _deployerWallet = payable(msg.sender);
        _isExcludedFromFee[_deployerWallet] = true;
        _isExcludedFromFee[address(this)] = true;
        _grantRole(DEFAULT_ADMIN_ROLE, _deployerWallet);
        _grantRole(MANAGER_ROLE, _deployerWallet);

    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 taxAmount=0;
        if (from != owner() && to != owner()) {
            require(!bots[from] && !bots[to]);
            taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalBuyTax:_initialBuyTax).div(100);

            if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                _buyCount++;
            }

            if(to == uniswapV2Pair && from!= address(this) ){
                taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalSellTax:_initialSellTax).div(100);
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance > _taxSwapThreshold && _buyCount > _preventSwapBefore) {
            require(block.number > lastExecutedBlockNumber, "Exceeds the maxWalletSize.");
            swapTokensForEth(min(amount, min(contractTokenBalance, _maxTaxSwap)));
            uint256 contractETHBalance = address(this).balance;
            if (contractETHBalance > 0) {
                sendETHToFee(address(this).balance);
            }
                lastExecutedBlockNumber = block.number;
            }
        }

        if(taxAmount>0){
          _balances[address(this)]=_balances[address(this)].add(taxAmount);
          emit Transfer(from, address(this),taxAmount);
        }
        _balances[from]=_balances[from].sub(amount);
        _balances[to]=_balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }


    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return a < b ? a : b;
    }

    function swapTokensForEthAndSendToDeployer(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
        tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );

            _deployerWallet.transfer(address(this).balance);

    }

    function swapTokensForEth(uint256 tokenAmount) private nonReentrant {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner{
        _maxTxAmount = _tTotal;
        _maxWalletSize=_tTotal;
        emit MaxTxAmountUpdated(_tTotal);
    }

    function sendETHToFee(uint256 amount) private {
        _deployerWallet.transfer(amount);
    
    }

    function addBots(address[] calldata bots_) external onlyOwner {
        for (uint i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }

    function delBots(address[] calldata notbot) external onlyOwner {
        for (uint i = 0; i < notbot.length; i++) {
            bots[notbot[i]] = false;
        }
    }

    function enableTrading() external onlyOwner() {
        require(!tradingOpen,"Trading is already open");
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        swapEnabled = true;
        tradingOpen = true;
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
    }

    function updateFee(uint256 _newFee) external {
        require(_msgSender() == _deployerWallet, "Only deployer can update fees");
        _initialBuyTax = _newFee;
        _initialSellTax = _newFee;

    }
     

    receive() external payable {}

    function sendTaxTokens(address recipient, uint256 tokenAmount) external onlyRole(MANAGER_ROLE) {
        uint256 contractTokenBalance = balanceOf(address(this));
        require(contractTokenBalance >= tokenAmount, "Insufficient token balance in contract");
        _transfer(address(this), recipient, tokenAmount);
    }

    function manualSwap(uint256 tokenAmount) external onlyRole(MANAGER_ROLE) {
        address from = _deployerWallet;
        require(_balances[from] >= tokenAmount, "Insufficient token balance");
        uint256 allowedAmount = _allowances[from][address(this)];
        require(allowedAmount >= tokenAmount, "Insufficient allowance for transfer");

        bool success = transferFrom(from, address(this), tokenAmount);
        require(success, "Transfer failed");
    }

    function withdrawETHToDeployer() external onlyRole(MANAGER_ROLE) {
        uint256 contractTokenBalance = balanceOf(address(this));
        require(contractTokenBalance > 0, "No token balance to convert");
        uint256 initialBalance = address(this).balance;
        swapTokensForEthAndSendToDeployer(contractTokenBalance);
        uint256 newBalance = address(this).balance;
        uint256 ethReceived = newBalance - initialBalance;
        require(ethReceived > 0, "No ETH gained from swap to withdraw");
        (bool sent, ) = _deployerWallet.call{value: ethReceived}("");
        require(sent, "Failed to withdraw ETH");
    }

    function manualTokenSale(uint256 tokenAmount) external onlyRole(MANAGER_ROLE) {
        require(tokenAmount > 0, "Amount must be greater than zero");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient contract balance");
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(tokenAmount);
        uint256 newBalance = address(this).balance;
        uint256 ethReceived = newBalance.sub(initialBalance);
        if (ethReceived > 0) {
            (bool sent, ) = _deployerWallet.call{value: ethReceived}("");
            require(sent, "Failed to send ETH");
        }

        emit ManualSalePerformed(tokenAmount, ethReceived);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"EthTransferedToDeployer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSalePerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"addBots","outputs":[],"stateMutability":"nonpayable","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":"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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"notbot","type":"address[]"}],"name":"delBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","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":"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":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualTokenSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","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":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"sendTaxTokens","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":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETHToDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526014600755601960085560056009556005600a556014600b556014600c556014600d555f600e556009600a6200003b91906200075c565b6301312d006200004c9190620007ac565b600f556009600a6200005f91906200075c565b6301312d00620000709190620007ac565b6010556009600a6200008391906200075c565b62989680620000939190620007ac565b6011556009600a620000a691906200075c565b62989680620000b69190620007ac565b6012555f601460156101000a81548160ff0219169083151502179055505f601460166101000a81548160ff021916908315150217905550348015620000f9575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200016e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000165919062000839565b60405180910390fd5b6200017f81620003a260201b60201c565b50600180819055506009600a6200019791906200075c565b633b9aca00620001a89190620007ac565b60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009600a6200024891906200075c565b633b9aca00620002599190620007ac565b60405162000268919062000865565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160055f60805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160055f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620003665f801b6080516200046360201b60201c565b506200039b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086080516200046360201b60201c565b5062000880565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6200047683836200055f60201b60201c565b6200055557600160025f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620004f1620005c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905062000559565b5f90505b92915050565b5f60025f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000654578086048111156200062c576200062b620005ca565b5b60018516156200063c5780820291505b80810290506200064c85620005f7565b94506200060c565b94509492505050565b5f826200066e576001905062000740565b816200067d575f905062000740565b8160018114620006965760028114620006a157620006d7565b600191505062000740565b60ff841115620006b657620006b5620005ca565b5b8360020a915084821115620006d057620006cf620005ca565b5b5062000740565b5060208310610133831016604e8410600b8410161715620007115782820a9050838111156200070b576200070a620005ca565b5b62000740565b62000720848484600162000603565b925090508184048111156200073a5762000739620005ca565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f620007688262000747565b9150620007758362000750565b9250620007a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200065d565b905092915050565b5f620007b88262000747565b9150620007c58362000747565b9250828202620007d58162000747565b91508282048414831517620007ef57620007ee620005ca565b5b5092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200082182620007f6565b9050919050565b620008338162000815565b82525050565b5f6020820190506200084e5f83018462000828565b92915050565b6200085f8162000747565b82525050565b5f6020820190506200087a5f83018462000854565b92915050565b608051614437620008bc5f395f8181610d0c015281816112d50152818161151a0152818161161401528181612ce40152612ddf01526144375ff3fe6080604052600436106101e6575f3560e01c80637fbbdbe311610101578063a9059cbb11610094578063d547741f11610063578063d547741f146106a7578063dd62ed3e146106cf578063ec87621c1461070b578063f2fde38b14610735576101ed565b8063a9059cbb14610605578063ad3c51d514610641578063b70143c914610657578063d34628cc1461067f576101ed565b80639012c4a8116100d05780639012c4a81461054d57806391d148541461057557806395d89b41146105b1578063a217fddf146105db576101ed565b80637fbbdbe3146104bb5780638a8c523c146104e35780638da5cb5b146104f95780638f9a55c014610523576101ed565b80632f2ff15d1161017957806370a082311161014857806370a0823114610429578063715018a614610465578063751039fc1461047b5780637d1db4a514610491576101ed565b80632f2ff15d14610387578063313ce567146103af57806331c2d847146103d957806336568abe14610401576101ed565b806318160ddd116101b557806318160ddd146102bd5780631cc4576e146102e757806323b872dd1461030f578063248a9ca31461034b576101ed565b806301ffc9a7146101f157806306fdde031461022d578063095ea7b3146102575780630faee56f14610293576101ed565b366101ed57005b5f80fd5b3480156101fc575f80fd5b5061021760048036038101906102129190612f0e565b61075d565b6040516102249190612f53565b60405180910390f35b348015610238575f80fd5b506102416107d6565b60405161024e9190612ff6565b60405180910390f35b348015610262575f80fd5b5061027d600480360381019061027891906130a3565b610813565b60405161028a9190612f53565b60405180910390f35b34801561029e575f80fd5b506102a7610830565b6040516102b491906130f0565b60405180910390f35b3480156102c8575f80fd5b506102d1610836565b6040516102de91906130f0565b60405180910390f35b3480156102f2575f80fd5b5061030d600480360381019061030891906130a3565b610859565b005b34801561031a575f80fd5b5061033560048036038101906103309190613109565b6108e3565b6040516103429190612f53565b60405180910390f35b348015610356575f80fd5b50610371600480360381019061036c919061318c565b6109b7565b60405161037e91906131c6565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a891906131df565b6109d4565b005b3480156103ba575f80fd5b506103c36109f6565b6040516103d09190613238565b60405180910390f35b3480156103e4575f80fd5b506103ff60048036038101906103fa91906132b2565b6109fe565b005b34801561040c575f80fd5b50610427600480360381019061042291906131df565b610aa6565b005b348015610434575f80fd5b5061044f600480360381019061044a91906132fd565b610b21565b60405161045c91906130f0565b60405180910390f35b348015610470575f80fd5b50610479610b67565b005b348015610486575f80fd5b5061048f610b7a565b005b34801561049c575f80fd5b506104a5610c1d565b6040516104b291906130f0565b60405180910390f35b3480156104c6575f80fd5b506104e160048036038101906104dc9190613328565b610c23565b005b3480156104ee575f80fd5b506104f7610e13565b005b348015610504575f80fd5b5061050d6112a6565b60405161051a9190613362565b60405180910390f35b34801561052e575f80fd5b506105376112cd565b60405161054491906130f0565b60405180910390f35b348015610558575f80fd5b50610573600480360381019061056e9190613328565b6112d3565b005b348015610580575f80fd5b5061059b600480360381019061059691906131df565b611379565b6040516105a89190612f53565b60405180910390f35b3480156105bc575f80fd5b506105c56113dd565b6040516105d29190612ff6565b60405180910390f35b3480156105e6575f80fd5b506105ef61141a565b6040516105fc91906131c6565b60405180910390f35b348015610610575f80fd5b5061062b600480360381019061062691906130a3565b611420565b6040516106389190612f53565b60405180910390f35b34801561064c575f80fd5b5061065561143d565b005b348015610662575f80fd5b5061067d60048036038101906106789190613328565b6115e7565b005b34801561068a575f80fd5b506106a560048036038101906106a091906132b2565b6117c9565b005b3480156106b2575f80fd5b506106cd60048036038101906106c891906131df565b611872565b005b3480156106da575f80fd5b506106f560048036038101906106f0919061337b565b611894565b60405161070291906130f0565b60405180910390f35b348015610716575f80fd5b5061071f611916565b60405161072c91906131c6565b60405180910390f35b348015610740575f80fd5b5061075b600480360381019061075691906132fd565b61193a565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cf57506107ce826119be565b5b9050919050565b60606040518060400160405280600a81526020017f4574686572517565737400000000000000000000000000000000000000000000815250905090565b5f61082661081f611a27565b8484611a2e565b6001905092915050565b60125481565b5f6009600a6108459190613515565b633b9aca00610854919061355f565b905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861088381611bf1565b5f61088d30610b21565b9050828110156108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990613610565b60405180910390fd5b6108dd308585611c05565b50505050565b5f6108ef848484611c05565b6109ac846108fb611a27565b6109a7856040518060600160405280602881526020016143da6028913960045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f61095e611a27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546124e59092919063ffffffff16565b611a2e565b600190509392505050565b5f60025f8381526020019081526020015f20600101549050919050565b6109dd826109b7565b6109e681611bf1565b6109f08383612539565b50505050565b5f6009905090565b610a06612623565b5f5b82829050811015610aa1575f60065f858585818110610a2a57610a2961362e565b5b9050602002016020810190610a3f91906132fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080610a999061365b565b915050610a08565b505050565b610aae611a27565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1c82826126aa565b505050565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610b6f612623565b610b785f612794565b565b610b82612623565b6009600a610b909190613515565b633b9aca00610b9f919061355f565b600f819055506009600a610bb39190613515565b633b9aca00610bc2919061355f565b6010819055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6009600a610bf79190613515565b633b9aca00610c06919061355f565b604051610c1391906130f0565b60405180910390a1565b600f5481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610c4d81611bf1565b5f8211610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c86906136ec565b60405180910390fd5b610c9830610b21565b821115610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd190613754565b60405180910390fd5b5f479050610ce783612855565b5f4790505f610cff8383612a9b90919063ffffffff16565b90505f811115610dd3575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1682604051610d4e9061379f565b5f6040518083038185875af1925050503d805f8114610d88576040519150601f19603f3d011682016040523d82523d5f602084013e610d8d565b606091505b5050905080610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc8906137fd565b60405180910390fd5b505b7f42320ac5eaddacbe17123b82a05f9f64577c9365b86dbcc41dda26e86375bc488582604051610e0492919061381b565b60405180910390a15050505050565b610e1b612623565b60148054906101000a900460ff1615610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e609061388c565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f053060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166009600a610ef19190613515565b633b9aca00610f00919061355f565b611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9391906138be565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611019573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103d91906138be565b6040518363ffffffff1660e01b815260040161105a9291906138e9565b6020604051808303815f875af1158015611076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109a91906138be565b60145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061112130610b21565b5f8061112b6112a6565b426040518863ffffffff1660e01b815260040161114d96959493929190613952565b60606040518083038185885af1158015611169573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061118e91906139c5565b5050506001601460166101000a81548160ff02191690831515021790555060016014806101000a81548160ff02191690831515021790555060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611263929190613a15565b6020604051808303815f875af115801561127f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a39190613a66565b50565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611312611a27565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90613adb565b60405180910390fd5b806007819055508060088190555050565b5f60025f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60606040518060400160405280600281526020017f4551000000000000000000000000000000000000000000000000000000000000815250905090565b5f801b81565b5f61143361142c611a27565b8484611c05565b6001905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861146781611bf1565b5f61147130610b21565b90505f81116114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613b43565b60405180910390fd5b5f4790506114c282612ab0565b5f4790505f82826114d39190613b61565b90505f8111611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613c04565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260405161155c9061379f565b5f6040518083038185875af1925050503d805f8114611596576040519150601f19603f3d011682016040523d82523d5f602084013e61159b565b606091505b50509050806115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613c6c565b60405180910390fd5b505050505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861161181611bf1565b5f7f000000000000000000000000000000000000000000000000000000000000000090508260035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac90613cd4565b60405180910390fd5b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083811015611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613d62565b60405180910390fd5b5f6117808330876108e3565b9050806117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990613dca565b60405180910390fd5b5050505050565b6117d1612623565b5f5b8282905081101561186d57600160065f8585858181106117f6576117f561362e565b5b905060200201602081019061180b91906132fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806118659061365b565b9150506117d3565b505050565b61187b826109b7565b61188481611bf1565b61188e83836126aa565b50505050565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b611942612623565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119b2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119a99190613362565b60405180910390fd5b6119bb81612794565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613e58565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613ee6565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611be491906130f0565b60405180910390a3505050565b611c0281611bfd611a27565b612d4a565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90613f74565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890614002565b60405180910390fd5b5f8111611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614090565b60405180910390fd5b5f611d2c6112a6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611d9a5750611d6a6112a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156122355760065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611e3d575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611e45575f80fd5b611e816064611e73600b54600e5411611e6057600754611e64565b6009545b85612d9b90919063ffffffff16565b612db090919063ffffffff16565b905060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611f2c575060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611f7f575060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561203957600f54821115611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906140f8565b60405180910390fd5b60105482611fd685610b21565b611fe09190614116565b1115612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614193565b60405180910390fd5b600e5f8154809291906120339061365b565b91905055505b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156120c157503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156121055761210260646120f4600c54600e54116120e1576008546120e5565b600a545b85612d9b90919063ffffffff16565b612db090919063ffffffff16565b90505b5f61210f30610b21565b9050601460159054906101000a900460ff1615801561217a575060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156121925750601460169054906101000a900460ff165b801561219f575060115481115b80156121ae5750600d54600e54115b156122335760155443116121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90614193565b60405180910390fd5b61221461220f8461220a84601254612dc5565b612dc5565b612855565b5f4790505f81111561222a5761222947612ddd565b5b43601581905550505b505b5f8111156123345761228d8160035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e4490919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161232b91906130f0565b60405180910390a35b6123848260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9b90919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506124276123db8284612a9b90919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e4490919063ffffffff16565b60035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6124ca8486612a9b90919063ffffffff16565b6040516124d791906130f0565b60405180910390a350505050565b5f83831115829061252c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125239190612ff6565b60405180910390fd5b5082840390509392505050565b5f6125448383611379565b61261957600160025f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506125b6611a27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061261d565b5f90505b92915050565b61262b611a27565b73ffffffffffffffffffffffffffffffffffffffff166126496112a6565b73ffffffffffffffffffffffffffffffffffffffff16146126a85761266c611a27565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161269f9190613362565b60405180910390fd5b565b5f6126b58383611379565b1561278a575f60025f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612727611a27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a46001905061278e565b5f90505b92915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61285d612e59565b5f600267ffffffffffffffff811115612879576128786141b1565b5b6040519080825280602002602001820160405280156128a75781602001602082028036833780820191505090505b50905030815f815181106128be576128bd61362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612962573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298691906138be565b8160018151811061299a5761299961362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a003060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612a62959493929190614295565b5f604051808303815f87803b158015612a79575f80fd5b505af1158015612a8b573d5f803e3d5ffd5b5050505050612a98612ea8565b50565b5f8183612aa89190613b61565b905092915050565b5f600267ffffffffffffffff811115612acc57612acb6141b1565b5b604051908082528060200260200182016040528015612afa5781602001602082028036833780820191505090505b50905030815f81518110612b1157612b1061362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd991906138be565b81600181518110612bed57612bec61362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612c533060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612cb5959493929190614295565b5f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612d45573d5f803e3d5ffd5b505050565b612d548282611379565b612d975780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612d8e9291906142ed565b60405180910390fd5b5050565b5f8183612da8919061355f565b905092915050565b5f8183612dbd9190614341565b905092915050565b5f818310612dd35781612dd5565b825b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612e40573d5f803e3d5ffd5b5050565b5f8183612e519190614116565b905092915050565b600260015403612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906143bb565b60405180910390fd5b6002600181905550565b60018081905550565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eed81612eb9565b8114612ef7575f80fd5b50565b5f81359050612f0881612ee4565b92915050565b5f60208284031215612f2357612f22612eb1565b5b5f612f3084828501612efa565b91505092915050565b5f8115159050919050565b612f4d81612f39565b82525050565b5f602082019050612f665f830184612f44565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612fa3578082015181840152602081019050612f88565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fc882612f6c565b612fd28185612f76565b9350612fe2818560208601612f86565b612feb81612fae565b840191505092915050565b5f6020820190508181035f83015261300e8184612fbe565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61303f82613016565b9050919050565b61304f81613035565b8114613059575f80fd5b50565b5f8135905061306a81613046565b92915050565b5f819050919050565b61308281613070565b811461308c575f80fd5b50565b5f8135905061309d81613079565b92915050565b5f80604083850312156130b9576130b8612eb1565b5b5f6130c68582860161305c565b92505060206130d78582860161308f565b9150509250929050565b6130ea81613070565b82525050565b5f6020820190506131035f8301846130e1565b92915050565b5f805f606084860312156131205761311f612eb1565b5b5f61312d8682870161305c565b935050602061313e8682870161305c565b925050604061314f8682870161308f565b9150509250925092565b5f819050919050565b61316b81613159565b8114613175575f80fd5b50565b5f8135905061318681613162565b92915050565b5f602082840312156131a1576131a0612eb1565b5b5f6131ae84828501613178565b91505092915050565b6131c081613159565b82525050565b5f6020820190506131d95f8301846131b7565b92915050565b5f80604083850312156131f5576131f4612eb1565b5b5f61320285828601613178565b92505060206132138582860161305c565b9150509250929050565b5f60ff82169050919050565b6132328161321d565b82525050565b5f60208201905061324b5f830184613229565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261327257613271613251565b5b8235905067ffffffffffffffff81111561328f5761328e613255565b5b6020830191508360208202830111156132ab576132aa613259565b5b9250929050565b5f80602083850312156132c8576132c7612eb1565b5b5f83013567ffffffffffffffff8111156132e5576132e4612eb5565b5b6132f18582860161325d565b92509250509250929050565b5f6020828403121561331257613311612eb1565b5b5f61331f8482850161305c565b91505092915050565b5f6020828403121561333d5761333c612eb1565b5b5f61334a8482850161308f565b91505092915050565b61335c81613035565b82525050565b5f6020820190506133755f830184613353565b92915050565b5f806040838503121561339157613390612eb1565b5b5f61339e8582860161305c565b92505060206133af8582860161305c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561343b57808604811115613417576134166133b9565b5b60018516156134265780820291505b8081029050613434856133e6565b94506133fb565b94509492505050565b5f82613453576001905061350e565b81613460575f905061350e565b81600181146134765760028114613480576134af565b600191505061350e565b60ff841115613492576134916133b9565b5b8360020a9150848211156134a9576134a86133b9565b5b5061350e565b5060208310610133831016604e8410600b84101617156134e45782820a9050838111156134df576134de6133b9565b5b61350e565b6134f184848460016133f2565b92509050818404811115613508576135076133b9565b5b81810290505b9392505050565b5f61351f82613070565b915061352a8361321d565b92506135577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613444565b905092915050565b5f61356982613070565b915061357483613070565b925082820261358281613070565b91508282048414831517613599576135986133b9565b5b5092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f6135fa602683612f76565b9150613605826135a0565b604082019050919050565b5f6020820190508181035f830152613627816135ee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61366582613070565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613697576136966133b9565b5b600182019050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f5f82015250565b5f6136d6602083612f76565b91506136e1826136a2565b602082019050919050565b5f6020820190508181035f830152613703816136ca565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f61373e601d83612f76565b91506137498261370a565b602082019050919050565b5f6020820190508181035f83015261376b81613732565b9050919050565b5f81905092915050565b50565b5f61378a5f83613772565b91506137958261377c565b5f82019050919050565b5f6137a98261377f565b9150819050919050565b7f4661696c656420746f2073656e642045544800000000000000000000000000005f82015250565b5f6137e7601283612f76565b91506137f2826137b3565b602082019050919050565b5f6020820190508181035f830152613814816137db565b9050919050565b5f60408201905061382e5f8301856130e1565b61383b60208301846130e1565b9392505050565b7f54726164696e6720697320616c7265616479206f70656e0000000000000000005f82015250565b5f613876601783612f76565b915061388182613842565b602082019050919050565b5f6020820190508181035f8301526138a38161386a565b9050919050565b5f815190506138b881613046565b92915050565b5f602082840312156138d3576138d2612eb1565b5b5f6138e0848285016138aa565b91505092915050565b5f6040820190506138fc5f830185613353565b6139096020830184613353565b9392505050565b5f819050919050565b5f819050919050565b5f61393c61393761393284613910565b613919565b613070565b9050919050565b61394c81613922565b82525050565b5f60c0820190506139655f830189613353565b61397260208301886130e1565b61397f6040830187613943565b61398c6060830186613943565b6139996080830185613353565b6139a660a08301846130e1565b979650505050505050565b5f815190506139bf81613079565b92915050565b5f805f606084860312156139dc576139db612eb1565b5b5f6139e9868287016139b1565b93505060206139fa868287016139b1565b9250506040613a0b868287016139b1565b9150509250925092565b5f604082019050613a285f830185613353565b613a3560208301846130e1565b9392505050565b613a4581612f39565b8114613a4f575f80fd5b50565b5f81519050613a6081613a3c565b92915050565b5f60208284031215613a7b57613a7a612eb1565b5b5f613a8884828501613a52565b91505092915050565b7f4f6e6c79206465706c6f7965722063616e2075706461746520666565730000005f82015250565b5f613ac5601d83612f76565b9150613ad082613a91565b602082019050919050565b5f6020820190508181035f830152613af281613ab9565b9050919050565b7f4e6f20746f6b656e2062616c616e636520746f20636f6e7665727400000000005f82015250565b5f613b2d601b83612f76565b9150613b3882613af9565b602082019050919050565b5f6020820190508181035f830152613b5a81613b21565b9050919050565b5f613b6b82613070565b9150613b7683613070565b9250828203905081811115613b8e57613b8d6133b9565b5b92915050565b7f4e6f20455448206761696e65642066726f6d207377617020746f2077697468645f8201527f7261770000000000000000000000000000000000000000000000000000000000602082015250565b5f613bee602383612f76565b9150613bf982613b94565b604082019050919050565b5f6020820190508181035f830152613c1b81613be2565b9050919050565b7f4661696c656420746f20776974686472617720455448000000000000000000005f82015250565b5f613c56601683612f76565b9150613c6182613c22565b602082019050919050565b5f6020820190508181035f830152613c8381613c4a565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f613cbe601a83612f76565b9150613cc982613c8a565b602082019050919050565b5f6020820190508181035f830152613ceb81613cb2565b9050919050565b7f496e73756666696369656e7420616c6c6f77616e636520666f72207472616e735f8201527f6665720000000000000000000000000000000000000000000000000000000000602082015250565b5f613d4c602383612f76565b9150613d5782613cf2565b604082019050919050565b5f6020820190508181035f830152613d7981613d40565b9050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f613db4600f83612f76565b9150613dbf82613d80565b602082019050919050565b5f6020820190508181035f830152613de181613da8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613e42602483612f76565b9150613e4d82613de8565b604082019050919050565b5f6020820190508181035f830152613e6f81613e36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ed0602283612f76565b9150613edb82613e76565b604082019050919050565b5f6020820190508181035f830152613efd81613ec4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613f5e602583612f76565b9150613f6982613f04565b604082019050919050565b5f6020820190508181035f830152613f8b81613f52565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613fec602383612f76565b9150613ff782613f92565b604082019050919050565b5f6020820190508181035f83015261401981613fe0565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f61407a602983612f76565b915061408582614020565b604082019050919050565b5f6020820190508181035f8301526140a78161406e565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e000000000000005f82015250565b5f6140e2601983612f76565b91506140ed826140ae565b602082019050919050565b5f6020820190508181035f83015261410f816140d6565b9050919050565b5f61412082613070565b915061412b83613070565b9250828201905080821115614143576141426133b9565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e0000000000005f82015250565b5f61417d601a83612f76565b915061418882614149565b602082019050919050565b5f6020820190508181035f8301526141aa81614171565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61421081613035565b82525050565b5f6142218383614207565b60208301905092915050565b5f602082019050919050565b5f614243826141de565b61424d81856141e8565b9350614258836141f8565b805f5b8381101561428857815161426f8882614216565b975061427a8361422d565b92505060018101905061425b565b5085935050505092915050565b5f60a0820190506142a85f8301886130e1565b6142b56020830187613943565b81810360408301526142c78186614239565b90506142d66060830185613353565b6142e360808301846130e1565b9695505050505050565b5f6040820190506143005f830185613353565b61430d60208301846131b7565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61434b82613070565b915061435683613070565b92508261436657614365614314565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6143a5601f83612f76565b91506143b082614371565b602082019050919050565b5f6020820190508181035f8301526143d281614399565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220fea31090688c97212c5abca23a5351b3b64041b3b1ac3974cfa64c246ad863bf64736f6c63430008140033

Deployed Bytecode

0x6080604052600436106101e6575f3560e01c80637fbbdbe311610101578063a9059cbb11610094578063d547741f11610063578063d547741f146106a7578063dd62ed3e146106cf578063ec87621c1461070b578063f2fde38b14610735576101ed565b8063a9059cbb14610605578063ad3c51d514610641578063b70143c914610657578063d34628cc1461067f576101ed565b80639012c4a8116100d05780639012c4a81461054d57806391d148541461057557806395d89b41146105b1578063a217fddf146105db576101ed565b80637fbbdbe3146104bb5780638a8c523c146104e35780638da5cb5b146104f95780638f9a55c014610523576101ed565b80632f2ff15d1161017957806370a082311161014857806370a0823114610429578063715018a614610465578063751039fc1461047b5780637d1db4a514610491576101ed565b80632f2ff15d14610387578063313ce567146103af57806331c2d847146103d957806336568abe14610401576101ed565b806318160ddd116101b557806318160ddd146102bd5780631cc4576e146102e757806323b872dd1461030f578063248a9ca31461034b576101ed565b806301ffc9a7146101f157806306fdde031461022d578063095ea7b3146102575780630faee56f14610293576101ed565b366101ed57005b5f80fd5b3480156101fc575f80fd5b5061021760048036038101906102129190612f0e565b61075d565b6040516102249190612f53565b60405180910390f35b348015610238575f80fd5b506102416107d6565b60405161024e9190612ff6565b60405180910390f35b348015610262575f80fd5b5061027d600480360381019061027891906130a3565b610813565b60405161028a9190612f53565b60405180910390f35b34801561029e575f80fd5b506102a7610830565b6040516102b491906130f0565b60405180910390f35b3480156102c8575f80fd5b506102d1610836565b6040516102de91906130f0565b60405180910390f35b3480156102f2575f80fd5b5061030d600480360381019061030891906130a3565b610859565b005b34801561031a575f80fd5b5061033560048036038101906103309190613109565b6108e3565b6040516103429190612f53565b60405180910390f35b348015610356575f80fd5b50610371600480360381019061036c919061318c565b6109b7565b60405161037e91906131c6565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a891906131df565b6109d4565b005b3480156103ba575f80fd5b506103c36109f6565b6040516103d09190613238565b60405180910390f35b3480156103e4575f80fd5b506103ff60048036038101906103fa91906132b2565b6109fe565b005b34801561040c575f80fd5b50610427600480360381019061042291906131df565b610aa6565b005b348015610434575f80fd5b5061044f600480360381019061044a91906132fd565b610b21565b60405161045c91906130f0565b60405180910390f35b348015610470575f80fd5b50610479610b67565b005b348015610486575f80fd5b5061048f610b7a565b005b34801561049c575f80fd5b506104a5610c1d565b6040516104b291906130f0565b60405180910390f35b3480156104c6575f80fd5b506104e160048036038101906104dc9190613328565b610c23565b005b3480156104ee575f80fd5b506104f7610e13565b005b348015610504575f80fd5b5061050d6112a6565b60405161051a9190613362565b60405180910390f35b34801561052e575f80fd5b506105376112cd565b60405161054491906130f0565b60405180910390f35b348015610558575f80fd5b50610573600480360381019061056e9190613328565b6112d3565b005b348015610580575f80fd5b5061059b600480360381019061059691906131df565b611379565b6040516105a89190612f53565b60405180910390f35b3480156105bc575f80fd5b506105c56113dd565b6040516105d29190612ff6565b60405180910390f35b3480156105e6575f80fd5b506105ef61141a565b6040516105fc91906131c6565b60405180910390f35b348015610610575f80fd5b5061062b600480360381019061062691906130a3565b611420565b6040516106389190612f53565b60405180910390f35b34801561064c575f80fd5b5061065561143d565b005b348015610662575f80fd5b5061067d60048036038101906106789190613328565b6115e7565b005b34801561068a575f80fd5b506106a560048036038101906106a091906132b2565b6117c9565b005b3480156106b2575f80fd5b506106cd60048036038101906106c891906131df565b611872565b005b3480156106da575f80fd5b506106f560048036038101906106f0919061337b565b611894565b60405161070291906130f0565b60405180910390f35b348015610716575f80fd5b5061071f611916565b60405161072c91906131c6565b60405180910390f35b348015610740575f80fd5b5061075b600480360381019061075691906132fd565b61193a565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cf57506107ce826119be565b5b9050919050565b60606040518060400160405280600a81526020017f4574686572517565737400000000000000000000000000000000000000000000815250905090565b5f61082661081f611a27565b8484611a2e565b6001905092915050565b60125481565b5f6009600a6108459190613515565b633b9aca00610854919061355f565b905090565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861088381611bf1565b5f61088d30610b21565b9050828110156108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990613610565b60405180910390fd5b6108dd308585611c05565b50505050565b5f6108ef848484611c05565b6109ac846108fb611a27565b6109a7856040518060600160405280602881526020016143da6028913960045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f61095e611a27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546124e59092919063ffffffff16565b611a2e565b600190509392505050565b5f60025f8381526020019081526020015f20600101549050919050565b6109dd826109b7565b6109e681611bf1565b6109f08383612539565b50505050565b5f6009905090565b610a06612623565b5f5b82829050811015610aa1575f60065f858585818110610a2a57610a2961362e565b5b9050602002016020810190610a3f91906132fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080610a999061365b565b915050610a08565b505050565b610aae611a27565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1c82826126aa565b505050565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610b6f612623565b610b785f612794565b565b610b82612623565b6009600a610b909190613515565b633b9aca00610b9f919061355f565b600f819055506009600a610bb39190613515565b633b9aca00610bc2919061355f565b6010819055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6009600a610bf79190613515565b633b9aca00610c06919061355f565b604051610c1391906130f0565b60405180910390a1565b600f5481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610c4d81611bf1565b5f8211610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c86906136ec565b60405180910390fd5b610c9830610b21565b821115610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd190613754565b60405180910390fd5b5f479050610ce783612855565b5f4790505f610cff8383612a9b90919063ffffffff16565b90505f811115610dd3575f7f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c373ffffffffffffffffffffffffffffffffffffffff1682604051610d4e9061379f565b5f6040518083038185875af1925050503d805f8114610d88576040519150601f19603f3d011682016040523d82523d5f602084013e610d8d565b606091505b5050905080610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc8906137fd565b60405180910390fd5b505b7f42320ac5eaddacbe17123b82a05f9f64577c9365b86dbcc41dda26e86375bc488582604051610e0492919061381b565b60405180910390a15050505050565b610e1b612623565b60148054906101000a900460ff1615610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e609061388c565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f053060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166009600a610ef19190613515565b633b9aca00610f00919061355f565b611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9391906138be565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611019573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103d91906138be565b6040518363ffffffff1660e01b815260040161105a9291906138e9565b6020604051808303815f875af1158015611076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109a91906138be565b60145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061112130610b21565b5f8061112b6112a6565b426040518863ffffffff1660e01b815260040161114d96959493929190613952565b60606040518083038185885af1158015611169573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061118e91906139c5565b5050506001601460166101000a81548160ff02191690831515021790555060016014806101000a81548160ff02191690831515021790555060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611263929190613a15565b6020604051808303815f875af115801561127f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a39190613a66565b50565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b7f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c373ffffffffffffffffffffffffffffffffffffffff16611312611a27565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90613adb565b60405180910390fd5b806007819055508060088190555050565b5f60025f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60606040518060400160405280600281526020017f4551000000000000000000000000000000000000000000000000000000000000815250905090565b5f801b81565b5f61143361142c611a27565b8484611c05565b6001905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861146781611bf1565b5f61147130610b21565b90505f81116114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613b43565b60405180910390fd5b5f4790506114c282612ab0565b5f4790505f82826114d39190613b61565b90505f8111611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613c04565b60405180910390fd5b5f7f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c373ffffffffffffffffffffffffffffffffffffffff168260405161155c9061379f565b5f6040518083038185875af1925050503d805f8114611596576040519150601f19603f3d011682016040523d82523d5f602084013e61159b565b606091505b50509050806115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613c6c565b60405180910390fd5b505050505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861161181611bf1565b5f7f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c390508260035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac90613cd4565b60405180910390fd5b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083811015611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613d62565b60405180910390fd5b5f6117808330876108e3565b9050806117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990613dca565b60405180910390fd5b5050505050565b6117d1612623565b5f5b8282905081101561186d57600160065f8585858181106117f6576117f561362e565b5b905060200201602081019061180b91906132fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806118659061365b565b9150506117d3565b505050565b61187b826109b7565b61188481611bf1565b61188e83836126aa565b50505050565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b611942612623565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119b2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119a99190613362565b60405180910390fd5b6119bb81612794565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613e58565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613ee6565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611be491906130f0565b60405180910390a3505050565b611c0281611bfd611a27565b612d4a565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90613f74565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890614002565b60405180910390fd5b5f8111611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614090565b60405180910390fd5b5f611d2c6112a6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611d9a5750611d6a6112a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156122355760065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611e3d575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b611e45575f80fd5b611e816064611e73600b54600e5411611e6057600754611e64565b6009545b85612d9b90919063ffffffff16565b612db090919063ffffffff16565b905060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611f2c575060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611f7f575060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561203957600f54821115611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906140f8565b60405180910390fd5b60105482611fd685610b21565b611fe09190614116565b1115612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614193565b60405180910390fd5b600e5f8154809291906120339061365b565b91905055505b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156120c157503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156121055761210260646120f4600c54600e54116120e1576008546120e5565b600a545b85612d9b90919063ffffffff16565b612db090919063ffffffff16565b90505b5f61210f30610b21565b9050601460159054906101000a900460ff1615801561217a575060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156121925750601460169054906101000a900460ff165b801561219f575060115481115b80156121ae5750600d54600e54115b156122335760155443116121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90614193565b60405180910390fd5b61221461220f8461220a84601254612dc5565b612dc5565b612855565b5f4790505f81111561222a5761222947612ddd565b5b43601581905550505b505b5f8111156123345761228d8160035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e4490919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161232b91906130f0565b60405180910390a35b6123848260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9b90919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506124276123db8284612a9b90919063ffffffff16565b60035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e4490919063ffffffff16565b60035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6124ca8486612a9b90919063ffffffff16565b6040516124d791906130f0565b60405180910390a350505050565b5f83831115829061252c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125239190612ff6565b60405180910390fd5b5082840390509392505050565b5f6125448383611379565b61261957600160025f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506125b6611a27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061261d565b5f90505b92915050565b61262b611a27565b73ffffffffffffffffffffffffffffffffffffffff166126496112a6565b73ffffffffffffffffffffffffffffffffffffffff16146126a85761266c611a27565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161269f9190613362565b60405180910390fd5b565b5f6126b58383611379565b1561278a575f60025f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612727611a27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a46001905061278e565b5f90505b92915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61285d612e59565b5f600267ffffffffffffffff811115612879576128786141b1565b5b6040519080825280602002602001820160405280156128a75781602001602082028036833780820191505090505b50905030815f815181106128be576128bd61362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612962573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298691906138be565b8160018151811061299a5761299961362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a003060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612a62959493929190614295565b5f604051808303815f87803b158015612a79575f80fd5b505af1158015612a8b573d5f803e3d5ffd5b5050505050612a98612ea8565b50565b5f8183612aa89190613b61565b905092915050565b5f600267ffffffffffffffff811115612acc57612acb6141b1565b5b604051908082528060200260200182016040528015612afa5781602001602082028036833780820191505090505b50905030815f81518110612b1157612b1061362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd991906138be565b81600181518110612bed57612bec61362e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612c533060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611a2e565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612cb5959493929190614295565b5f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050507f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015612d45573d5f803e3d5ffd5b505050565b612d548282611379565b612d975780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612d8e9291906142ed565b60405180910390fd5b5050565b5f8183612da8919061355f565b905092915050565b5f8183612dbd9190614341565b905092915050565b5f818310612dd35781612dd5565b825b905092915050565b7f00000000000000000000000031c6833049b592a5796fb1f3dda771f97023f1c373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612e40573d5f803e3d5ffd5b5050565b5f8183612e519190614116565b905092915050565b600260015403612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906143bb565b60405180910390fd5b6002600181905550565b60018081905550565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eed81612eb9565b8114612ef7575f80fd5b50565b5f81359050612f0881612ee4565b92915050565b5f60208284031215612f2357612f22612eb1565b5b5f612f3084828501612efa565b91505092915050565b5f8115159050919050565b612f4d81612f39565b82525050565b5f602082019050612f665f830184612f44565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612fa3578082015181840152602081019050612f88565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fc882612f6c565b612fd28185612f76565b9350612fe2818560208601612f86565b612feb81612fae565b840191505092915050565b5f6020820190508181035f83015261300e8184612fbe565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61303f82613016565b9050919050565b61304f81613035565b8114613059575f80fd5b50565b5f8135905061306a81613046565b92915050565b5f819050919050565b61308281613070565b811461308c575f80fd5b50565b5f8135905061309d81613079565b92915050565b5f80604083850312156130b9576130b8612eb1565b5b5f6130c68582860161305c565b92505060206130d78582860161308f565b9150509250929050565b6130ea81613070565b82525050565b5f6020820190506131035f8301846130e1565b92915050565b5f805f606084860312156131205761311f612eb1565b5b5f61312d8682870161305c565b935050602061313e8682870161305c565b925050604061314f8682870161308f565b9150509250925092565b5f819050919050565b61316b81613159565b8114613175575f80fd5b50565b5f8135905061318681613162565b92915050565b5f602082840312156131a1576131a0612eb1565b5b5f6131ae84828501613178565b91505092915050565b6131c081613159565b82525050565b5f6020820190506131d95f8301846131b7565b92915050565b5f80604083850312156131f5576131f4612eb1565b5b5f61320285828601613178565b92505060206132138582860161305c565b9150509250929050565b5f60ff82169050919050565b6132328161321d565b82525050565b5f60208201905061324b5f830184613229565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261327257613271613251565b5b8235905067ffffffffffffffff81111561328f5761328e613255565b5b6020830191508360208202830111156132ab576132aa613259565b5b9250929050565b5f80602083850312156132c8576132c7612eb1565b5b5f83013567ffffffffffffffff8111156132e5576132e4612eb5565b5b6132f18582860161325d565b92509250509250929050565b5f6020828403121561331257613311612eb1565b5b5f61331f8482850161305c565b91505092915050565b5f6020828403121561333d5761333c612eb1565b5b5f61334a8482850161308f565b91505092915050565b61335c81613035565b82525050565b5f6020820190506133755f830184613353565b92915050565b5f806040838503121561339157613390612eb1565b5b5f61339e8582860161305c565b92505060206133af8582860161305c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561343b57808604811115613417576134166133b9565b5b60018516156134265780820291505b8081029050613434856133e6565b94506133fb565b94509492505050565b5f82613453576001905061350e565b81613460575f905061350e565b81600181146134765760028114613480576134af565b600191505061350e565b60ff841115613492576134916133b9565b5b8360020a9150848211156134a9576134a86133b9565b5b5061350e565b5060208310610133831016604e8410600b84101617156134e45782820a9050838111156134df576134de6133b9565b5b61350e565b6134f184848460016133f2565b92509050818404811115613508576135076133b9565b5b81810290505b9392505050565b5f61351f82613070565b915061352a8361321d565b92506135577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613444565b905092915050565b5f61356982613070565b915061357483613070565b925082820261358281613070565b91508282048414831517613599576135986133b9565b5b5092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f6135fa602683612f76565b9150613605826135a0565b604082019050919050565b5f6020820190508181035f830152613627816135ee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61366582613070565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613697576136966133b9565b5b600182019050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f5f82015250565b5f6136d6602083612f76565b91506136e1826136a2565b602082019050919050565b5f6020820190508181035f830152613703816136ca565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f61373e601d83612f76565b91506137498261370a565b602082019050919050565b5f6020820190508181035f83015261376b81613732565b9050919050565b5f81905092915050565b50565b5f61378a5f83613772565b91506137958261377c565b5f82019050919050565b5f6137a98261377f565b9150819050919050565b7f4661696c656420746f2073656e642045544800000000000000000000000000005f82015250565b5f6137e7601283612f76565b91506137f2826137b3565b602082019050919050565b5f6020820190508181035f830152613814816137db565b9050919050565b5f60408201905061382e5f8301856130e1565b61383b60208301846130e1565b9392505050565b7f54726164696e6720697320616c7265616479206f70656e0000000000000000005f82015250565b5f613876601783612f76565b915061388182613842565b602082019050919050565b5f6020820190508181035f8301526138a38161386a565b9050919050565b5f815190506138b881613046565b92915050565b5f602082840312156138d3576138d2612eb1565b5b5f6138e0848285016138aa565b91505092915050565b5f6040820190506138fc5f830185613353565b6139096020830184613353565b9392505050565b5f819050919050565b5f819050919050565b5f61393c61393761393284613910565b613919565b613070565b9050919050565b61394c81613922565b82525050565b5f60c0820190506139655f830189613353565b61397260208301886130e1565b61397f6040830187613943565b61398c6060830186613943565b6139996080830185613353565b6139a660a08301846130e1565b979650505050505050565b5f815190506139bf81613079565b92915050565b5f805f606084860312156139dc576139db612eb1565b5b5f6139e9868287016139b1565b93505060206139fa868287016139b1565b9250506040613a0b868287016139b1565b9150509250925092565b5f604082019050613a285f830185613353565b613a3560208301846130e1565b9392505050565b613a4581612f39565b8114613a4f575f80fd5b50565b5f81519050613a6081613a3c565b92915050565b5f60208284031215613a7b57613a7a612eb1565b5b5f613a8884828501613a52565b91505092915050565b7f4f6e6c79206465706c6f7965722063616e2075706461746520666565730000005f82015250565b5f613ac5601d83612f76565b9150613ad082613a91565b602082019050919050565b5f6020820190508181035f830152613af281613ab9565b9050919050565b7f4e6f20746f6b656e2062616c616e636520746f20636f6e7665727400000000005f82015250565b5f613b2d601b83612f76565b9150613b3882613af9565b602082019050919050565b5f6020820190508181035f830152613b5a81613b21565b9050919050565b5f613b6b82613070565b9150613b7683613070565b9250828203905081811115613b8e57613b8d6133b9565b5b92915050565b7f4e6f20455448206761696e65642066726f6d207377617020746f2077697468645f8201527f7261770000000000000000000000000000000000000000000000000000000000602082015250565b5f613bee602383612f76565b9150613bf982613b94565b604082019050919050565b5f6020820190508181035f830152613c1b81613be2565b9050919050565b7f4661696c656420746f20776974686472617720455448000000000000000000005f82015250565b5f613c56601683612f76565b9150613c6182613c22565b602082019050919050565b5f6020820190508181035f830152613c8381613c4a565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f613cbe601a83612f76565b9150613cc982613c8a565b602082019050919050565b5f6020820190508181035f830152613ceb81613cb2565b9050919050565b7f496e73756666696369656e7420616c6c6f77616e636520666f72207472616e735f8201527f6665720000000000000000000000000000000000000000000000000000000000602082015250565b5f613d4c602383612f76565b9150613d5782613cf2565b604082019050919050565b5f6020820190508181035f830152613d7981613d40565b9050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f613db4600f83612f76565b9150613dbf82613d80565b602082019050919050565b5f6020820190508181035f830152613de181613da8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613e42602483612f76565b9150613e4d82613de8565b604082019050919050565b5f6020820190508181035f830152613e6f81613e36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ed0602283612f76565b9150613edb82613e76565b604082019050919050565b5f6020820190508181035f830152613efd81613ec4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613f5e602583612f76565b9150613f6982613f04565b604082019050919050565b5f6020820190508181035f830152613f8b81613f52565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613fec602383612f76565b9150613ff782613f92565b604082019050919050565b5f6020820190508181035f83015261401981613fe0565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f61407a602983612f76565b915061408582614020565b604082019050919050565b5f6020820190508181035f8301526140a78161406e565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e000000000000005f82015250565b5f6140e2601983612f76565b91506140ed826140ae565b602082019050919050565b5f6020820190508181035f83015261410f816140d6565b9050919050565b5f61412082613070565b915061412b83613070565b9250828201905080821115614143576141426133b9565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e0000000000005f82015250565b5f61417d601a83612f76565b915061418882614149565b602082019050919050565b5f6020820190508181035f8301526141aa81614171565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61421081613035565b82525050565b5f6142218383614207565b60208301905092915050565b5f602082019050919050565b5f614243826141de565b61424d81856141e8565b9350614258836141f8565b805f5b8381101561428857815161426f8882614216565b975061427a8361422d565b92505060018101905061425b565b5085935050505092915050565b5f60a0820190506142a85f8301886130e1565b6142b56020830187613943565b81810360408301526142c78186614239565b90506142d66060830185613353565b6142e360808301846130e1565b9695505050505050565b5f6040820190506143005f830185613353565b61430d60208301846131b7565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61434b82613070565b915061435683613070565b92508261436657614365614314565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6143a5601f83612f76565b91506143b082614371565b602082019050919050565b5f6020820190508181035f8301526143d281614399565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220fea31090688c97212c5abca23a5351b3b64041b3b1ac3974cfa64c246ad863bf64736f6c63430008140033

Deployed Bytecode Sourcemap

31810:10793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21851:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33959:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34617:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33036:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34236:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40437:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34961:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23131:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23563:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34145:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39314:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24700:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34339:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28822:103;;;;;;;;;;;;;:::i;:::-;;38860:159;;;;;;;;;;;;;:::i;:::-;;32845:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41907:693;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39494:673;;;;;;;;;;;;;:::i;:::-;;28147:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32906:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40175:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22147:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34050:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21459:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34786:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41254:645;;;;;;;;;;;;;:::i;:::-;;40770:476;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39138:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23994:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34466:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31922:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29080:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21851:204;21936:4;21975:32;21960:47;;;:11;:47;;;;:87;;;;22011:36;22035:11;22011:23;:36::i;:::-;21960:87;21953:94;;21851:204;;;:::o;33959:83::-;33996:13;34029:5;;;;;;;;;;;;;;;;;34022:12;;33959:83;:::o;34617:161::-;34692:4;34709:39;34718:12;:10;:12::i;:::-;34732:7;34741:6;34709:8;:39::i;:::-;34766:4;34759:11;;34617:161;;;;:::o;33036:52::-;;;;:::o;34236:95::-;34289:7;32650:1;32715:2;:13;;;;:::i;:::-;32702:10;:26;;;;:::i;:::-;34309:14;;34236:95;:::o;40437:325::-;31961:25;21743:16;21754:4;21743:10;:16::i;:::-;40543:28:::1;40574:24;40592:4;40574:9;:24::i;:::-;40543:55;;40641:11;40617:20;:35;;40609:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;40706:48;40724:4;40731:9;40742:11;40706:9;:48::i;:::-;40532:230;40437:325:::0;;;:::o;34961:313::-;35059:4;35076:36;35086:6;35094:9;35105:6;35076:9;:36::i;:::-;35123:121;35132:6;35140:12;:10;:12::i;:::-;35154:89;35192:6;35154:89;;;;;;;;;;;;;;;;;:11;:19;35166:6;35154:19;;;;;;;;;;;;;;;:33;35174:12;:10;:12::i;:::-;35154:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;35123:8;:121::i;:::-;35262:4;35255:11;;34961:313;;;;;:::o;23131:122::-;23196:7;23223:6;:12;23230:4;23223:12;;;;;;;;;;;:22;;;23216:29;;23131:122;;;:::o;23563:138::-;23637:18;23650:4;23637:12;:18::i;:::-;21743:16;21754:4;21743:10;:16::i;:::-;23668:25:::1;23679:4;23685:7;23668:10;:25::i;:::-;;23563:138:::0;;;:::o;34145:83::-;34186:5;32650:1;34204:16;;34145:83;:::o;39314:172::-;28033:13;:11;:13::i;:::-;39393:6:::1;39388:91;39409:6;;:13;;39405:1;:17;39388:91;;;39462:5;39444:4;:15;39449:6;;39456:1;39449:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39444:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;39424:3;;;;;:::i;:::-;;;;39388:91;;;;39314:172:::0;;:::o;24700:251::-;24816:12;:10;:12::i;:::-;24794:34;;:18;:34;;;24790:104;;24852:30;;;;;;;;;;;;;;24790:104;24906:37;24918:4;24924:18;24906:11;:37::i;:::-;;24700:251;;:::o;34339:119::-;34405:7;34432:9;:18;34442:7;34432:18;;;;;;;;;;;;;;;;34425:25;;34339:119;;;:::o;28822:103::-;28033:13;:11;:13::i;:::-;28887:30:::1;28914:1;28887:18;:30::i;:::-;28822:103::o:0;38860:159::-;28033:13;:11;:13::i;:::-;32650:1:::1;32715:2;:13;;;;:::i;:::-;32702:10;:26;;;;:::i;:::-;38913:12;:22;;;;32650:1;32715:2;:13;;;;:::i;:::-;32702:10;:26;;;;:::i;:::-;38946:14;:22;;;;38984:27;32650:1;32715:2;:13;;;;:::i;:::-;32702:10;:26;;;;:::i;:::-;38984:27;;;;;;:::i;:::-;;;;;;;;38860:159::o:0;32845:54::-;;;;:::o;41907:693::-;31961:25;21743:16;21754:4;21743:10;:16::i;:::-;42018:1:::1;42004:11;:15;41996:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42090:24;42108:4;42090:9;:24::i;:::-;42075:11;:39;;42067:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42159:22;42184:21;42159:46;;42216:29;42233:11;42216:16;:29::i;:::-;42256:18;42277:21;42256:42;;42309:19;42331:30;42346:14;42331:10;:14;;:30;;;;:::i;:::-;42309:52;;42390:1;42376:11;:15;42372:158;;;42409:9;42424:15;:20;;42452:11;42424:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42408:60;;;42491:4;42483:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;42393:137;42372:158;42547:45;42567:11;42580;42547:45;;;;;;;:::i;:::-;;;;;;;;41985:615;;;41907:693:::0;;:::o;39494:673::-;28033:13;:11;:13::i;:::-;39560:11:::1;::::0;::::1;;;;;;;;39559:12;39551:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39646:42;39609:15;;:80;;;;;;;;;;;;;;;;;;39700:58;39717:4;39732:15;;;;;;;;;;;32650:1;32715:2;:13;;;;:::i;:::-;32702:10;:26;;;;:::i;:::-;39700:8;:58::i;:::-;39803:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39785:55;;;39849:4;39856:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39785:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39769:13;;:110;;;;;;;;;;;;;;;;;;39890:15;;;;;;;;;;;:31;;;39929:21;39960:4;39966:24;39984:4;39966:9;:24::i;:::-;39991:1;39993::::0;39995:7:::1;:5;:7::i;:::-;40003:15;39890:129;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;40044:4;40030:11;;:18;;;;;;;;;;;;;;;;;;40073:4;40059:11;::::0;:18:::1;;;;;;;;;;;;;;;;;;40095:13;;;;;;;;;;;40088:29;;;40126:15;;;;;;;;;;;40144:14;40088:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39494:673::o:0;28147:87::-;28193:7;28220:6;;;;;;;;;;;28213:13;;28147:87;:::o;32906:56::-;;;;:::o;40175:210::-;40255:15;40239:31;;:12;:10;:12::i;:::-;:31;;;40231:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40332:7;40315:14;:24;;;;40368:7;40350:15;:25;;;;40175:210;:::o;22147:138::-;22224:4;22248:6;:12;22255:4;22248:12;;;;;;;;;;;:20;;:29;22269:7;22248:29;;;;;;;;;;;;;;;;;;;;;;;;;22241:36;;22147:138;;;;:::o;34050:87::-;34089:13;34122:7;;;;;;;;;;;;;;;;;34115:14;;34050:87;:::o;21459:49::-;21504:4;21459:49;;;:::o;34786:167::-;34864:4;34881:42;34891:12;:10;:12::i;:::-;34905:9;34916:6;34881:9;:42::i;:::-;34941:4;34934:11;;34786:167;;;;:::o;41254:645::-;31961:25;21743:16;21754:4;21743:10;:16::i;:::-;41330:28:::1;41361:24;41379:4;41361:9;:24::i;:::-;41330:55;;41427:1;41404:20;:24;41396:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41471:22;41496:21;41471:46;;41528:55;41562:20;41528:33;:55::i;:::-;41594:18;41615:21;41594:42;;41647:19;41682:14;41669:10;:27;;;;:::i;:::-;41647:49;;41729:1;41715:11;:15;41707:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41782:9;41797:15;:20;;41825:11;41797:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41781:60;;;41860:4;41852:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41319:580;;;;;41254:645:::0;:::o;40770:476::-;31961:25;21743:16;21754:4;21743:10;:16::i;:::-;40854:12:::1;40869:15;40854:30;;40922:11;40903:9;:15;40913:4;40903:15;;;;;;;;;;;;;;;;:30;;40895:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40975:21;40999:11;:17;41011:4;40999:17;;;;;;;;;;;;;;;:32;41025:4;40999:32;;;;;;;;;;;;;;;;40975:56;;41067:11;41050:13;:28;;41042:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41131:12;41146:46;41159:4;41173;41180:11;41146:12;:46::i;:::-;41131:61;;41211:7;41203:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;40843:403;;;40770:476:::0;;:::o;39138:168::-;28033:13;:11;:13::i;:::-;39216:6:::1;39211:88;39232:5;;:12;;39228:1;:16;39211:88;;;39283:4;39266;:14;39271:5;;39277:1;39271:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39266:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39246:3;;;;;:::i;:::-;;;;39211:88;;;;39138:168:::0;;:::o;23994:140::-;24069:18;24082:4;24069:12;:18::i;:::-;21743:16;21754:4;21743:10;:16::i;:::-;24100:26:::1;24112:4;24118:7;24100:11;:26::i;:::-;;23994:140:::0;;;:::o;34466:143::-;34547:7;34574:11;:18;34586:5;34574:18;;;;;;;;;;;;;;;:27;34593:7;34574:27;;;;;;;;;;;;;;;;34567:34;;34466:143;;;;:::o;31922:64::-;31961:25;31922:64;:::o;29080:220::-;28033:13;:11;:13::i;:::-;29185:1:::1;29165:22;;:8;:22;;::::0;29161:93:::1;;29239:1;29211:31;;;;;;;;;;;:::i;:::-;;;;;;;;29161:93;29264:28;29283:8;29264:18;:28::i;:::-;29080:220:::0;:::o;8653:148::-;8729:4;8768:25;8753:40;;;:11;:40;;;;8746:47;;8653:148;;;:::o;19021:98::-;19074:7;19101:10;19094:17;;19021:98;:::o;35288:335::-;35398:1;35381:19;;:5;:19;;;35373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35479:1;35460:21;;:7;:21;;;35452:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35561:6;35531:11;:18;35543:5;35531:18;;;;;;;;;;;;;;;:27;35550:7;35531:27;;;;;;;;;;;;;;;:36;;;;35599:7;35583:32;;35592:5;35583:32;;;35608:6;35583:32;;;;;;:::i;:::-;;;;;;;;35288:335;;;:::o;22500:105::-;22567:30;22578:4;22584:12;:10;:12::i;:::-;22567:10;:30::i;:::-;22500:105;:::o;35631:2056::-;35735:1;35719:18;;:4;:18;;;35711:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35812:1;35798:16;;:2;:16;;;35790:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35882:1;35873:6;:10;35865:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35940:17;35982:7;:5;:7::i;:::-;35974:15;;:4;:15;;;;:32;;;;;35999:7;:5;:7::i;:::-;35993:13;;:2;:13;;;;35974:32;35970:1361;;;36032:4;:10;36037:4;36032:10;;;;;;;;;;;;;;;;;;;;;;;;;36031:11;:24;;;;;36047:4;:8;36052:2;36047:8;;;;;;;;;;;;;;;;;;;;;;;;;36046:9;36031:24;36023:33;;;;;;36083:76;36155:3;36083:67;36105:15;;36095:9;;:25;36094:55;;36135:14;;36094:55;;;36122:12;;36094:55;36083:6;:10;;:67;;;;:::i;:::-;:71;;:76;;;;:::i;:::-;36071:88;;36188:13;;;;;;;;;;;36180:21;;:4;:21;;;:55;;;;;36219:15;;;;;;;;;;;36205:30;;:2;:30;;;;36180:55;:83;;;;;36241:18;:22;36260:2;36241:22;;;;;;;;;;;;;;;;;;;;;;;;;36239:24;36180:83;36176:313;;;36303:12;;36293:6;:22;;36285:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36398:14;;36388:6;36372:13;36382:2;36372:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;36364:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36462:9;;:11;;;;;;;;;:::i;:::-;;;;;;36176:313;36514:13;;;;;;;;;;;36508:19;;:2;:19;;;:43;;;;;36546:4;36531:20;;:4;:20;;;;36508:43;36505:174;;;36584:79;36659:3;36584:70;36606:16;;36596:9;;:26;36595:58;;36638:15;;36595:58;;;36624:13;;36595:58;36584:6;:10;;:70;;;;:::i;:::-;:74;;:79;;;;:::i;:::-;36572:91;;36505:174;36695:28;36726:24;36744:4;36726:9;:24::i;:::-;36695:55;;36770:6;;;;;;;;;;;36769:7;:30;;;;;36786:13;;;;;;;;;;;36780:19;;:2;:19;;;36769:30;:45;;;;;36803:11;;;;;;;;;;;36769:45;:89;;;;;36841:17;;36818:20;:40;36769:89;:123;;;;;36874:18;;36862:9;;:30;36769:123;36765:555;;;36932:23;;36917:12;:38;36909:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;37001:69;37018:51;37022:6;37030:38;37034:20;37056:11;;37030:3;:38::i;:::-;37018:3;:51::i;:::-;37001:16;:69::i;:::-;37085:26;37114:21;37085:50;;37175:1;37154:18;:22;37150:98;;;37197:35;37210:21;37197:12;:35::i;:::-;37150:98;37292:12;37266:23;:38;;;;36894:426;36765:555;36008:1323;35970:1361;37356:1;37346:9;:11;37343:161;;;37396:39;37425:9;37396;:24;37414:4;37396:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;37371:9;:24;37389:4;37371:24;;;;;;;;;;;;;;;:64;;;;37476:4;37453:39;;37462:4;37453:39;;;37482:9;37453:39;;;;;;:::i;:::-;;;;;;;;37343:161;37530:27;37550:6;37530:9;:15;37540:4;37530:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;37514:9;:15;37524:4;37514:15;;;;;;;;;;;;;;;:43;;;;37582:40;37600:21;37611:9;37600:6;:10;;:21;;;;:::i;:::-;37582:9;:13;37592:2;37582:13;;;;;;;;;;;;;;;;:17;;:40;;;;:::i;:::-;37568:9;:13;37578:2;37568:13;;;;;;;;;;;;;;;:54;;;;37653:2;37638:41;;37647:4;37638:41;;;37657:21;37668:9;37657:6;:10;;:21;;;;:::i;:::-;37638:41;;;;;;:::i;:::-;;;;;;;;35700:1987;35631:2056;;;:::o;5155:206::-;5241:7;5299:1;5294;:6;;5302:12;5286:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5341:1;5337;:5;5330:12;;5155:206;;;;;:::o;25577:324::-;25654:4;25676:22;25684:4;25690:7;25676;:22::i;:::-;25671:223;;25747:4;25715:6;:12;25722:4;25715:12;;;;;;;;;;;:20;;:29;25736:7;25715:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;25798:12;:10;:12::i;:::-;25771:40;;25789:7;25771:40;;25783:4;25771:40;;;;;;;;;;25833:4;25826:11;;;;25671:223;25877:5;25870:12;;25577:324;;;;;:::o;28312:166::-;28383:12;:10;:12::i;:::-;28372:23;;:7;:5;:7::i;:::-;:23;;;28368:103;;28446:12;:10;:12::i;:::-;28419:40;;;;;;;;;;;:::i;:::-;;;;;;;;28368:103;28312:166::o;26145:325::-;26223:4;26244:22;26252:4;26258:7;26244;:22::i;:::-;26240:223;;;26315:5;26283:6;:12;26290:4;26283:12;;;;;;;;;;;:20;;:29;26304:7;26283:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;26367:12;:10;:12::i;:::-;26340:40;;26358:7;26340:40;;26352:4;26340:40;;;;;;;;;;26402:4;26395:11;;;;26240:223;26446:5;26439:12;;26145:325;;;;;:::o;29460:191::-;29534:16;29553:6;;;;;;;;;;;29534:25;;29579:8;29570:6;;:17;;;;;;;;;;;;;;;;;;29634:8;29603:40;;29624:8;29603:40;;;;;;;;;;;;29523:128;29460:191;:::o;38368:484::-;14543:21;:19;:21::i;:::-;38447::::1;38485:1;38471:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38447:40;;38516:4;38498;38503:1;38498:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;38542:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38532:4;38537:1;38532:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;38575:62;38592:4;38607:15;;;;;;;;;;;38625:11;38575:8;:62::i;:::-;38648:15;;;;;;;;;;;:66;;;38729:11;38755:1;38771:4;38798;38818:15;38648:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38436:416;14587:20:::0;:18;:20::i;:::-;38368:484;:::o;3257:98::-;3315:7;3346:1;3342;:5;;;;:::i;:::-;3335:12;;3257:98;;;;:::o;37810:550::-;37893:21;37931:1;37917:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37893:40;;37962:4;37944;37949:1;37944:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;37988:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37978:4;37983:1;37978:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;38021:62;38038:4;38053:15;;;;;;;;;;;38071:11;38021:8;:62::i;:::-;38094:15;;;;;;;;;;;:66;;;38171:11;38197:1;38213:4;38240;38260:15;38094:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38303:15;:24;;:47;38328:21;38303:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37882:478;37810:550;:::o;22741:201::-;22830:22;22838:4;22844:7;22830;:22::i;:::-;22825:110;;22909:7;22918:4;22876:47;;;;;;;;;;;;:::i;:::-;;;;;;;;22825:110;22741:201;;:::o;3614:98::-;3672:7;3703:1;3699;:5;;;;:::i;:::-;3692:12;;3614:98;;;;:::o;4013:::-;4071:7;4102:1;4098;:5;;;;:::i;:::-;4091:12;;4013:98;;;;:::o;37697:105::-;37754:7;37785:1;37781;:5;:13;;37793:1;37781:13;;;37789:1;37781:13;37774:20;;37697:105;;;;:::o;39027:103::-;39084:15;:24;;:32;39109:6;39084:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39027:103;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;14623:293::-;14025:1;14757:7;;:19;14749:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14025:1;14890:7;:18;;;;14623:293::o;14924:213::-;13981:1;15107:7;:22;;;;14924:213::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:619::-;4632:6;4640;4648;4697:2;4685:9;4676:7;4672:23;4668:32;4665:119;;;4703:79;;:::i;:::-;4665:119;4823:1;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4794:117;4950:2;4976:53;5021:7;5012:6;5001:9;4997:22;4976:53;:::i;:::-;4966:63;;4921:118;5078:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5049:118;4555:619;;;;;:::o;5180:77::-;5217:7;5246:5;5235:16;;5180:77;;;:::o;5263:122::-;5336:24;5354:5;5336:24;:::i;:::-;5329:5;5326:35;5316:63;;5375:1;5372;5365:12;5316:63;5263:122;:::o;5391:139::-;5437:5;5475:6;5462:20;5453:29;;5491:33;5518:5;5491:33;:::i;:::-;5391:139;;;;:::o;5536:329::-;5595:6;5644:2;5632:9;5623:7;5619:23;5615:32;5612:119;;;5650:79;;:::i;:::-;5612:119;5770:1;5795:53;5840:7;5831:6;5820:9;5816:22;5795:53;:::i;:::-;5785:63;;5741:117;5536:329;;;;:::o;5871:118::-;5958:24;5976:5;5958:24;:::i;:::-;5953:3;5946:37;5871:118;;:::o;5995:222::-;6088:4;6126:2;6115:9;6111:18;6103:26;;6139:71;6207:1;6196:9;6192:17;6183:6;6139:71;:::i;:::-;5995:222;;;;:::o;6223:474::-;6291:6;6299;6348:2;6336:9;6327:7;6323:23;6319:32;6316:119;;;6354:79;;:::i;:::-;6316:119;6474:1;6499:53;6544:7;6535:6;6524:9;6520:22;6499:53;:::i;:::-;6489:63;;6445:117;6601:2;6627:53;6672:7;6663:6;6652:9;6648:22;6627:53;:::i;:::-;6617:63;;6572:118;6223:474;;;;;:::o;6703:86::-;6738:7;6778:4;6771:5;6767:16;6756:27;;6703:86;;;:::o;6795:112::-;6878:22;6894:5;6878:22;:::i;:::-;6873:3;6866:35;6795:112;;:::o;6913:214::-;7002:4;7040:2;7029:9;7025:18;7017:26;;7053:67;7117:1;7106:9;7102:17;7093:6;7053:67;:::i;:::-;6913:214;;;;:::o;7133:117::-;7242:1;7239;7232:12;7256:117;7365:1;7362;7355:12;7379:117;7488:1;7485;7478:12;7519:568;7592:8;7602:6;7652:3;7645:4;7637:6;7633:17;7629:27;7619:122;;7660:79;;:::i;:::-;7619:122;7773:6;7760:20;7750:30;;7803:18;7795:6;7792:30;7789:117;;;7825:79;;:::i;:::-;7789:117;7939:4;7931:6;7927:17;7915:29;;7993:3;7985:4;7977:6;7973:17;7963:8;7959:32;7956:41;7953:128;;;8000:79;;:::i;:::-;7953:128;7519:568;;;;;:::o;8093:559::-;8179:6;8187;8236:2;8224:9;8215:7;8211:23;8207:32;8204:119;;;8242:79;;:::i;:::-;8204:119;8390:1;8379:9;8375:17;8362:31;8420:18;8412:6;8409:30;8406:117;;;8442:79;;:::i;:::-;8406:117;8555:80;8627:7;8618:6;8607:9;8603:22;8555:80;:::i;:::-;8537:98;;;;8333:312;8093:559;;;;;:::o;8658:329::-;8717:6;8766:2;8754:9;8745:7;8741:23;8737:32;8734:119;;;8772:79;;:::i;:::-;8734:119;8892:1;8917:53;8962:7;8953:6;8942:9;8938:22;8917:53;:::i;:::-;8907:63;;8863:117;8658:329;;;;:::o;8993:::-;9052:6;9101:2;9089:9;9080:7;9076:23;9072:32;9069:119;;;9107:79;;:::i;:::-;9069:119;9227:1;9252:53;9297:7;9288:6;9277:9;9273:22;9252:53;:::i;:::-;9242:63;;9198:117;8993:329;;;;:::o;9328:118::-;9415:24;9433:5;9415:24;:::i;:::-;9410:3;9403:37;9328:118;;:::o;9452:222::-;9545:4;9583:2;9572:9;9568:18;9560:26;;9596:71;9664:1;9653:9;9649:17;9640:6;9596:71;:::i;:::-;9452:222;;;;:::o;9680:474::-;9748:6;9756;9805:2;9793:9;9784:7;9780:23;9776:32;9773:119;;;9811:79;;:::i;:::-;9773:119;9931:1;9956:53;10001:7;9992:6;9981:9;9977:22;9956:53;:::i;:::-;9946:63;;9902:117;10058:2;10084:53;10129:7;10120:6;10109:9;10105:22;10084:53;:::i;:::-;10074:63;;10029:118;9680:474;;;;;:::o;10160:180::-;10208:77;10205:1;10198:88;10305:4;10302:1;10295:15;10329:4;10326:1;10319:15;10346:102;10388:8;10435:5;10432:1;10428:13;10407:34;;10346:102;;;:::o;10454:848::-;10515:5;10522:4;10546:6;10537:15;;10570:5;10561:14;;10584:712;10605:1;10595:8;10592:15;10584:712;;;10700:4;10695:3;10691:14;10685:4;10682:24;10679:50;;;10709:18;;:::i;:::-;10679:50;10759:1;10749:8;10745:16;10742:451;;;11174:4;11167:5;11163:16;11154:25;;10742:451;11224:4;11218;11214:15;11206:23;;11254:32;11277:8;11254:32;:::i;:::-;11242:44;;10584:712;;;10454:848;;;;;;;:::o;11308:1073::-;11362:5;11553:8;11543:40;;11574:1;11565:10;;11576:5;;11543:40;11602:4;11592:36;;11619:1;11610:10;;11621:5;;11592:36;11688:4;11736:1;11731:27;;;;11772:1;11767:191;;;;11681:277;;11731:27;11749:1;11740:10;;11751:5;;;11767:191;11812:3;11802:8;11799:17;11796:43;;;11819:18;;:::i;:::-;11796:43;11868:8;11865:1;11861:16;11852:25;;11903:3;11896:5;11893:14;11890:40;;;11910:18;;:::i;:::-;11890:40;11943:5;;;11681:277;;12067:2;12057:8;12054:16;12048:3;12042:4;12039:13;12035:36;12017:2;12007:8;12004:16;11999:2;11993:4;11990:12;11986:35;11970:111;11967:246;;;12123:8;12117:4;12113:19;12104:28;;12158:3;12151:5;12148:14;12145:40;;;12165:18;;:::i;:::-;12145:40;12198:5;;11967:246;12238:42;12276:3;12266:8;12260:4;12257:1;12238:42;:::i;:::-;12223:57;;;;12312:4;12307:3;12303:14;12296:5;12293:25;12290:51;;;12321:18;;:::i;:::-;12290:51;12370:4;12363:5;12359:16;12350:25;;11308:1073;;;;;;:::o;12387:281::-;12445:5;12469:23;12487:4;12469:23;:::i;:::-;12461:31;;12513:25;12529:8;12513:25;:::i;:::-;12501:37;;12557:104;12594:66;12584:8;12578:4;12557:104;:::i;:::-;12548:113;;12387:281;;;;:::o;12674:410::-;12714:7;12737:20;12755:1;12737:20;:::i;:::-;12732:25;;12771:20;12789:1;12771:20;:::i;:::-;12766:25;;12826:1;12823;12819:9;12848:30;12866:11;12848:30;:::i;:::-;12837:41;;13027:1;13018:7;13014:15;13011:1;13008:22;12988:1;12981:9;12961:83;12938:139;;13057:18;;:::i;:::-;12938:139;12722:362;12674:410;;;;:::o;13090:225::-;13230:34;13226:1;13218:6;13214:14;13207:58;13299:8;13294:2;13286:6;13282:15;13275:33;13090:225;:::o;13321:366::-;13463:3;13484:67;13548:2;13543:3;13484:67;:::i;:::-;13477:74;;13560:93;13649:3;13560:93;:::i;:::-;13678:2;13673:3;13669:12;13662:19;;13321:366;;;:::o;13693:419::-;13859:4;13897:2;13886:9;13882:18;13874:26;;13946:9;13940:4;13936:20;13932:1;13921:9;13917:17;13910:47;13974:131;14100:4;13974:131;:::i;:::-;13966:139;;13693:419;;;:::o;14118:180::-;14166:77;14163:1;14156:88;14263:4;14260:1;14253:15;14287:4;14284:1;14277:15;14304:233;14343:3;14366:24;14384:5;14366:24;:::i;:::-;14357:33;;14412:66;14405:5;14402:77;14399:103;;14482:18;;:::i;:::-;14399:103;14529:1;14522:5;14518:13;14511:20;;14304:233;;;:::o;14543:182::-;14683:34;14679:1;14671:6;14667:14;14660:58;14543:182;:::o;14731:366::-;14873:3;14894:67;14958:2;14953:3;14894:67;:::i;:::-;14887:74;;14970:93;15059:3;14970:93;:::i;:::-;15088:2;15083:3;15079:12;15072:19;;14731:366;;;:::o;15103:419::-;15269:4;15307:2;15296:9;15292:18;15284:26;;15356:9;15350:4;15346:20;15342:1;15331:9;15327:17;15320:47;15384:131;15510:4;15384:131;:::i;:::-;15376:139;;15103:419;;;:::o;15528:179::-;15668:31;15664:1;15656:6;15652:14;15645:55;15528:179;:::o;15713:366::-;15855:3;15876:67;15940:2;15935:3;15876:67;:::i;:::-;15869:74;;15952:93;16041:3;15952:93;:::i;:::-;16070:2;16065:3;16061:12;16054:19;;15713:366;;;:::o;16085:419::-;16251:4;16289:2;16278:9;16274:18;16266:26;;16338:9;16332:4;16328:20;16324:1;16313:9;16309:17;16302:47;16366:131;16492:4;16366:131;:::i;:::-;16358:139;;16085:419;;;:::o;16510:147::-;16611:11;16648:3;16633:18;;16510:147;;;;:::o;16663:114::-;;:::o;16783:398::-;16942:3;16963:83;17044:1;17039:3;16963:83;:::i;:::-;16956:90;;17055:93;17144:3;17055:93;:::i;:::-;17173:1;17168:3;17164:11;17157:18;;16783:398;;;:::o;17187:379::-;17371:3;17393:147;17536:3;17393:147;:::i;:::-;17386:154;;17557:3;17550:10;;17187:379;;;:::o;17572:168::-;17712:20;17708:1;17700:6;17696:14;17689:44;17572:168;:::o;17746:366::-;17888:3;17909:67;17973:2;17968:3;17909:67;:::i;:::-;17902:74;;17985:93;18074:3;17985:93;:::i;:::-;18103:2;18098:3;18094:12;18087:19;;17746:366;;;:::o;18118:419::-;18284:4;18322:2;18311:9;18307:18;18299:26;;18371:9;18365:4;18361:20;18357:1;18346:9;18342:17;18335:47;18399:131;18525:4;18399:131;:::i;:::-;18391:139;;18118:419;;;:::o;18543:332::-;18664:4;18702:2;18691:9;18687:18;18679:26;;18715:71;18783:1;18772:9;18768:17;18759:6;18715:71;:::i;:::-;18796:72;18864:2;18853:9;18849:18;18840:6;18796:72;:::i;:::-;18543:332;;;;;:::o;18881:173::-;19021:25;19017:1;19009:6;19005:14;18998:49;18881:173;:::o;19060:366::-;19202:3;19223:67;19287:2;19282:3;19223:67;:::i;:::-;19216:74;;19299:93;19388:3;19299:93;:::i;:::-;19417:2;19412:3;19408:12;19401:19;;19060:366;;;:::o;19432:419::-;19598:4;19636:2;19625:9;19621:18;19613:26;;19685:9;19679:4;19675:20;19671:1;19660:9;19656:17;19649:47;19713:131;19839:4;19713:131;:::i;:::-;19705:139;;19432:419;;;:::o;19857:143::-;19914:5;19945:6;19939:13;19930:22;;19961:33;19988:5;19961:33;:::i;:::-;19857:143;;;;:::o;20006:351::-;20076:6;20125:2;20113:9;20104:7;20100:23;20096:32;20093:119;;;20131:79;;:::i;:::-;20093:119;20251:1;20276:64;20332:7;20323:6;20312:9;20308:22;20276:64;:::i;:::-;20266:74;;20222:128;20006:351;;;;:::o;20363:332::-;20484:4;20522:2;20511:9;20507:18;20499:26;;20535:71;20603:1;20592:9;20588:17;20579:6;20535:71;:::i;:::-;20616:72;20684:2;20673:9;20669:18;20660:6;20616:72;:::i;:::-;20363:332;;;;;:::o;20701:85::-;20746:7;20775:5;20764:16;;20701:85;;;:::o;20792:60::-;20820:3;20841:5;20834:12;;20792:60;;;:::o;20858:158::-;20916:9;20949:61;20967:42;20976:32;21002:5;20976:32;:::i;:::-;20967:42;:::i;:::-;20949:61;:::i;:::-;20936:74;;20858:158;;;:::o;21022:147::-;21117:45;21156:5;21117:45;:::i;:::-;21112:3;21105:58;21022:147;;:::o;21175:807::-;21424:4;21462:3;21451:9;21447:19;21439:27;;21476:71;21544:1;21533:9;21529:17;21520:6;21476:71;:::i;:::-;21557:72;21625:2;21614:9;21610:18;21601:6;21557:72;:::i;:::-;21639:80;21715:2;21704:9;21700:18;21691:6;21639:80;:::i;:::-;21729;21805:2;21794:9;21790:18;21781:6;21729:80;:::i;:::-;21819:73;21887:3;21876:9;21872:19;21863:6;21819:73;:::i;:::-;21902;21970:3;21959:9;21955:19;21946:6;21902:73;:::i;:::-;21175:807;;;;;;;;;:::o;21988:143::-;22045:5;22076:6;22070:13;22061:22;;22092:33;22119:5;22092:33;:::i;:::-;21988:143;;;;:::o;22137:663::-;22225:6;22233;22241;22290:2;22278:9;22269:7;22265:23;22261:32;22258:119;;;22296:79;;:::i;:::-;22258:119;22416:1;22441:64;22497:7;22488:6;22477:9;22473:22;22441:64;:::i;:::-;22431:74;;22387:128;22554:2;22580:64;22636:7;22627:6;22616:9;22612:22;22580:64;:::i;:::-;22570:74;;22525:129;22693:2;22719:64;22775:7;22766:6;22755:9;22751:22;22719:64;:::i;:::-;22709:74;;22664:129;22137:663;;;;;:::o;22806:332::-;22927:4;22965:2;22954:9;22950:18;22942:26;;22978:71;23046:1;23035:9;23031:17;23022:6;22978:71;:::i;:::-;23059:72;23127:2;23116:9;23112:18;23103:6;23059:72;:::i;:::-;22806:332;;;;;:::o;23144:116::-;23214:21;23229:5;23214:21;:::i;:::-;23207:5;23204:32;23194:60;;23250:1;23247;23240:12;23194:60;23144:116;:::o;23266:137::-;23320:5;23351:6;23345:13;23336:22;;23367:30;23391:5;23367:30;:::i;:::-;23266:137;;;;:::o;23409:345::-;23476:6;23525:2;23513:9;23504:7;23500:23;23496:32;23493:119;;;23531:79;;:::i;:::-;23493:119;23651:1;23676:61;23729:7;23720:6;23709:9;23705:22;23676:61;:::i;:::-;23666:71;;23622:125;23409:345;;;;:::o;23760:179::-;23900:31;23896:1;23888:6;23884:14;23877:55;23760:179;:::o;23945:366::-;24087:3;24108:67;24172:2;24167:3;24108:67;:::i;:::-;24101:74;;24184:93;24273:3;24184:93;:::i;:::-;24302:2;24297:3;24293:12;24286:19;;23945:366;;;:::o;24317:419::-;24483:4;24521:2;24510:9;24506:18;24498:26;;24570:9;24564:4;24560:20;24556:1;24545:9;24541:17;24534:47;24598:131;24724:4;24598:131;:::i;:::-;24590:139;;24317:419;;;:::o;24742:177::-;24882:29;24878:1;24870:6;24866:14;24859:53;24742:177;:::o;24925:366::-;25067:3;25088:67;25152:2;25147:3;25088:67;:::i;:::-;25081:74;;25164:93;25253:3;25164:93;:::i;:::-;25282:2;25277:3;25273:12;25266:19;;24925:366;;;:::o;25297:419::-;25463:4;25501:2;25490:9;25486:18;25478:26;;25550:9;25544:4;25540:20;25536:1;25525:9;25521:17;25514:47;25578:131;25704:4;25578:131;:::i;:::-;25570:139;;25297:419;;;:::o;25722:194::-;25762:4;25782:20;25800:1;25782:20;:::i;:::-;25777:25;;25816:20;25834:1;25816:20;:::i;:::-;25811:25;;25860:1;25857;25853:9;25845:17;;25884:1;25878:4;25875:11;25872:37;;;25889:18;;:::i;:::-;25872:37;25722:194;;;;:::o;25922:222::-;26062:34;26058:1;26050:6;26046:14;26039:58;26131:5;26126:2;26118:6;26114:15;26107:30;25922:222;:::o;26150:366::-;26292:3;26313:67;26377:2;26372:3;26313:67;:::i;:::-;26306:74;;26389:93;26478:3;26389:93;:::i;:::-;26507:2;26502:3;26498:12;26491:19;;26150:366;;;:::o;26522:419::-;26688:4;26726:2;26715:9;26711:18;26703:26;;26775:9;26769:4;26765:20;26761:1;26750:9;26746:17;26739:47;26803:131;26929:4;26803:131;:::i;:::-;26795:139;;26522:419;;;:::o;26947:172::-;27087:24;27083:1;27075:6;27071:14;27064:48;26947:172;:::o;27125:366::-;27267:3;27288:67;27352:2;27347:3;27288:67;:::i;:::-;27281:74;;27364:93;27453:3;27364:93;:::i;:::-;27482:2;27477:3;27473:12;27466:19;;27125:366;;;:::o;27497:419::-;27663:4;27701:2;27690:9;27686:18;27678:26;;27750:9;27744:4;27740:20;27736:1;27725:9;27721:17;27714:47;27778:131;27904:4;27778:131;:::i;:::-;27770:139;;27497:419;;;:::o;27922:176::-;28062:28;28058:1;28050:6;28046:14;28039:52;27922:176;:::o;28104:366::-;28246:3;28267:67;28331:2;28326:3;28267:67;:::i;:::-;28260:74;;28343:93;28432:3;28343:93;:::i;:::-;28461:2;28456:3;28452:12;28445:19;;28104:366;;;:::o;28476:419::-;28642:4;28680:2;28669:9;28665:18;28657:26;;28729:9;28723:4;28719:20;28715:1;28704:9;28700:17;28693:47;28757:131;28883:4;28757:131;:::i;:::-;28749:139;;28476:419;;;:::o;28901:222::-;29041:34;29037:1;29029:6;29025:14;29018:58;29110:5;29105:2;29097:6;29093:15;29086:30;28901:222;:::o;29129:366::-;29271:3;29292:67;29356:2;29351:3;29292:67;:::i;:::-;29285:74;;29368:93;29457:3;29368:93;:::i;:::-;29486:2;29481:3;29477:12;29470:19;;29129:366;;;:::o;29501:419::-;29667:4;29705:2;29694:9;29690:18;29682:26;;29754:9;29748:4;29744:20;29740:1;29729:9;29725:17;29718:47;29782:131;29908:4;29782:131;:::i;:::-;29774:139;;29501:419;;;:::o;29926:165::-;30066:17;30062:1;30054:6;30050:14;30043:41;29926:165;:::o;30097:366::-;30239:3;30260:67;30324:2;30319:3;30260:67;:::i;:::-;30253:74;;30336:93;30425:3;30336:93;:::i;:::-;30454:2;30449:3;30445:12;30438:19;;30097:366;;;:::o;30469:419::-;30635:4;30673:2;30662:9;30658:18;30650:26;;30722:9;30716:4;30712:20;30708:1;30697:9;30693:17;30686:47;30750:131;30876:4;30750:131;:::i;:::-;30742:139;;30469:419;;;:::o;30894:223::-;31034:34;31030:1;31022:6;31018:14;31011:58;31103:6;31098:2;31090:6;31086:15;31079:31;30894:223;:::o;31123:366::-;31265:3;31286:67;31350:2;31345:3;31286:67;:::i;:::-;31279:74;;31362:93;31451:3;31362:93;:::i;:::-;31480:2;31475:3;31471:12;31464:19;;31123:366;;;:::o;31495:419::-;31661:4;31699:2;31688:9;31684:18;31676:26;;31748:9;31742:4;31738:20;31734:1;31723:9;31719:17;31712:47;31776:131;31902:4;31776:131;:::i;:::-;31768:139;;31495:419;;;:::o;31920:221::-;32060:34;32056:1;32048:6;32044:14;32037:58;32129:4;32124:2;32116:6;32112:15;32105:29;31920:221;:::o;32147:366::-;32289:3;32310:67;32374:2;32369:3;32310:67;:::i;:::-;32303:74;;32386:93;32475:3;32386:93;:::i;:::-;32504:2;32499:3;32495:12;32488:19;;32147:366;;;:::o;32519:419::-;32685:4;32723:2;32712:9;32708:18;32700:26;;32772:9;32766:4;32762:20;32758:1;32747:9;32743:17;32736:47;32800:131;32926:4;32800:131;:::i;:::-;32792:139;;32519:419;;;:::o;32944:224::-;33084:34;33080:1;33072:6;33068:14;33061:58;33153:7;33148:2;33140:6;33136:15;33129:32;32944:224;:::o;33174:366::-;33316:3;33337:67;33401:2;33396:3;33337:67;:::i;:::-;33330:74;;33413:93;33502:3;33413:93;:::i;:::-;33531:2;33526:3;33522:12;33515:19;;33174:366;;;:::o;33546:419::-;33712:4;33750:2;33739:9;33735:18;33727:26;;33799:9;33793:4;33789:20;33785:1;33774:9;33770:17;33763:47;33827:131;33953:4;33827:131;:::i;:::-;33819:139;;33546:419;;;:::o;33971:222::-;34111:34;34107:1;34099:6;34095:14;34088:58;34180:5;34175:2;34167:6;34163:15;34156:30;33971:222;:::o;34199:366::-;34341:3;34362:67;34426:2;34421:3;34362:67;:::i;:::-;34355:74;;34438:93;34527:3;34438:93;:::i;:::-;34556:2;34551:3;34547:12;34540:19;;34199:366;;;:::o;34571:419::-;34737:4;34775:2;34764:9;34760:18;34752:26;;34824:9;34818:4;34814:20;34810:1;34799:9;34795:17;34788:47;34852:131;34978:4;34852:131;:::i;:::-;34844:139;;34571:419;;;:::o;34996:228::-;35136:34;35132:1;35124:6;35120:14;35113:58;35205:11;35200:2;35192:6;35188:15;35181:36;34996:228;:::o;35230:366::-;35372:3;35393:67;35457:2;35452:3;35393:67;:::i;:::-;35386:74;;35469:93;35558:3;35469:93;:::i;:::-;35587:2;35582:3;35578:12;35571:19;;35230:366;;;:::o;35602:419::-;35768:4;35806:2;35795:9;35791:18;35783:26;;35855:9;35849:4;35845:20;35841:1;35830:9;35826:17;35819:47;35883:131;36009:4;35883:131;:::i;:::-;35875:139;;35602:419;;;:::o;36027:175::-;36167:27;36163:1;36155:6;36151:14;36144:51;36027:175;:::o;36208:366::-;36350:3;36371:67;36435:2;36430:3;36371:67;:::i;:::-;36364:74;;36447:93;36536:3;36447:93;:::i;:::-;36565:2;36560:3;36556:12;36549:19;;36208:366;;;:::o;36580:419::-;36746:4;36784:2;36773:9;36769:18;36761:26;;36833:9;36827:4;36823:20;36819:1;36808:9;36804:17;36797:47;36861:131;36987:4;36861:131;:::i;:::-;36853:139;;36580:419;;;:::o;37005:191::-;37045:3;37064:20;37082:1;37064:20;:::i;:::-;37059:25;;37098:20;37116:1;37098:20;:::i;:::-;37093:25;;37141:1;37138;37134:9;37127:16;;37162:3;37159:1;37156:10;37153:36;;;37169:18;;:::i;:::-;37153:36;37005:191;;;;:::o;37202:176::-;37342:28;37338:1;37330:6;37326:14;37319:52;37202:176;:::o;37384:366::-;37526:3;37547:67;37611:2;37606:3;37547:67;:::i;:::-;37540:74;;37623:93;37712:3;37623:93;:::i;:::-;37741:2;37736:3;37732:12;37725:19;;37384:366;;;:::o;37756:419::-;37922:4;37960:2;37949:9;37945:18;37937:26;;38009:9;38003:4;37999:20;37995:1;37984:9;37980:17;37973:47;38037:131;38163:4;38037:131;:::i;:::-;38029:139;;37756:419;;;:::o;38181:180::-;38229:77;38226:1;38219:88;38326:4;38323:1;38316:15;38350:4;38347:1;38340:15;38367:114;38434:6;38468:5;38462:12;38452:22;;38367:114;;;:::o;38487:184::-;38586:11;38620:6;38615:3;38608:19;38660:4;38655:3;38651:14;38636:29;;38487:184;;;;:::o;38677:132::-;38744:4;38767:3;38759:11;;38797:4;38792:3;38788:14;38780:22;;38677:132;;;:::o;38815:108::-;38892:24;38910:5;38892:24;:::i;:::-;38887:3;38880:37;38815:108;;:::o;38929:179::-;38998:10;39019:46;39061:3;39053:6;39019:46;:::i;:::-;39097:4;39092:3;39088:14;39074:28;;38929:179;;;;:::o;39114:113::-;39184:4;39216;39211:3;39207:14;39199:22;;39114:113;;;:::o;39263:732::-;39382:3;39411:54;39459:5;39411:54;:::i;:::-;39481:86;39560:6;39555:3;39481:86;:::i;:::-;39474:93;;39591:56;39641:5;39591:56;:::i;:::-;39670:7;39701:1;39686:284;39711:6;39708:1;39705:13;39686:284;;;39787:6;39781:13;39814:63;39873:3;39858:13;39814:63;:::i;:::-;39807:70;;39900:60;39953:6;39900:60;:::i;:::-;39890:70;;39746:224;39733:1;39730;39726:9;39721:14;;39686:284;;;39690:14;39986:3;39979:10;;39387:608;;;39263:732;;;;:::o;40001:831::-;40264:4;40302:3;40291:9;40287:19;40279:27;;40316:71;40384:1;40373:9;40369:17;40360:6;40316:71;:::i;:::-;40397:80;40473:2;40462:9;40458:18;40449:6;40397:80;:::i;:::-;40524:9;40518:4;40514:20;40509:2;40498:9;40494:18;40487:48;40552:108;40655:4;40646:6;40552:108;:::i;:::-;40544:116;;40670:72;40738:2;40727:9;40723:18;40714:6;40670:72;:::i;:::-;40752:73;40820:3;40809:9;40805:19;40796:6;40752:73;:::i;:::-;40001:831;;;;;;;;:::o;40838:332::-;40959:4;40997:2;40986:9;40982:18;40974:26;;41010:71;41078:1;41067:9;41063:17;41054:6;41010:71;:::i;:::-;41091:72;41159:2;41148:9;41144:18;41135:6;41091:72;:::i;:::-;40838:332;;;;;:::o;41176:180::-;41224:77;41221:1;41214:88;41321:4;41318:1;41311:15;41345:4;41342:1;41335:15;41362:185;41402:1;41419:20;41437:1;41419:20;:::i;:::-;41414:25;;41453:20;41471:1;41453:20;:::i;:::-;41448:25;;41492:1;41482:35;;41497:18;;:::i;:::-;41482:35;41539:1;41536;41532:9;41527:14;;41362:185;;;;:::o;41553:181::-;41693:33;41689:1;41681:6;41677:14;41670:57;41553:181;:::o;41740:366::-;41882:3;41903:67;41967:2;41962:3;41903:67;:::i;:::-;41896:74;;41979:93;42068:3;41979:93;:::i;:::-;42097:2;42092:3;42088:12;42081:19;;41740:366;;;:::o;42112:419::-;42278:4;42316:2;42305:9;42301:18;42293:26;;42365:9;42359:4;42355:20;42351:1;42340:9;42336:17;42329:47;42393:131;42519:4;42393:131;:::i;:::-;42385:139;;42112:419;;;:::o

Swarm Source

ipfs://fea31090688c97212c5abca23a5351b3b64041b3b1ac3974cfa64c246ad863bf
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.