ETH Price: $3,679.26 (+1.47%)

Token

ERC-20: FISH Token (FISH)
 

Overview

Max Total Supply

1,014,905.970196759259259049 FISH

Holders

108

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,905.39583333333333333 FISH

Value
$0.00
0x962d24581d1aa2d89842def3d2f8c0964e28c9bd
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:
FishToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-04
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;




/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        _roleMembers[role].remove(account);
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol)

pragma solidity ^0.8.0;






/**
 * @dev {ERC20} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 *
 * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
 */
contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * See {ERC20-constructor}.
     */
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    /**
     * @dev Creates `amount` new tokens for `to`.
     *
     * See {ERC20-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 amount) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
        _mint(to, amount);
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: FishToken.sol



// Puffer Gang and Fish Gs NFT FISH token ERC20 contract

pragma solidity >=0.8.0 <0.9.0;



















interface INFTContract {
    function balanceOf(address _user) external view returns (uint256);
}

contract FishToken is ERC20PresetMinterPauser {
    using SafeMath for uint256;

    INFTContract public nftContract;

    uint256 public constant INITIAL_REWARD = 250 ether;
    uint256 public constant REWARD_RATE = 25 ether;
    uint256 public constant SECONDARY_REWARD_RATE = 15 ether;
    uint256 public constant REWARD_END = 1964390400;

    mapping(address => uint256) public rewards;
    mapping(address => uint256) public lastUpdate;
    mapping(address => INFTContract) public secondaryContracts;
    address[] public secondaryContractsAddresses;

    event FishClaimed(address indexed account, uint256 reward);
    event FishSpent(address indexed account, uint256 amount);

    bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");

    constructor(address _nftContract)
        ERC20PresetMinterPauser("FISH Token", "FISH")
    {
        grantRole(BURNER_ROLE, msg.sender);
        setContract(_nftContract);
    }

    function setContract(address _contract) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Admin only");
        nftContract = INFTContract(_contract);
        grantRole(BURNER_ROLE, _contract);
    }

//Allows addition/removal of additional contracts within the Puffer Gang Ecosystem

    function addSecondaryContract(address _contract) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Admin only");
        secondaryContracts[_contract] = INFTContract(_contract);
        secondaryContractsAddresses.push(_contract);
        grantRole(BURNER_ROLE, _contract);
    }

    function removeSecondaryContract(address _contract) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Admin only");
        delete secondaryContracts[_contract];
        uint256 index = 0;
        while (secondaryContractsAddresses[index] != _contract) {
            index++;
        }
        secondaryContractsAddresses[index] = secondaryContractsAddresses[
            secondaryContractsAddresses.length - 1
        ];
        secondaryContractsAddresses.pop();
        revokeRole(BURNER_ROLE, _contract);
    }

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

//Reward NFT minters upon minting of an NFT

    function updateRewardOnMint(address _to, uint256 _amount) external {
        require(msg.sender == address(nftContract), "Not allowed");
        uint256 time = min(block.timestamp, REWARD_END);
        uint256 timerUser = lastUpdate[_to];
        if (timerUser > 0)
            rewards[_to] = rewards[_to].add(
                nftContract
                    .balanceOf(_to)
                    .mul(REWARD_RATE.mul((time.sub(timerUser))))
                    .div(86400)
                    .add(_amount.mul(INITIAL_REWARD))
            );
        else rewards[_to] = rewards[_to].add(_amount.mul(INITIAL_REWARD));
        lastUpdate[_to] = time;
    }

    function updateReward(address _from, address _to) external {
        require(
            msg.sender == address(nftContract) ||
                abi.encodePacked(secondaryContracts[msg.sender]).length > 0,
            "Invalid Contract"
        );
        uint256 time = min(block.timestamp, REWARD_END);
        if (_from != address(0)) {
            uint256 timerFrom = lastUpdate[_from];
            if (timerFrom > 0) {
                rewards[_from] += getPendingReward(_from);
            }
            lastUpdate[_from] = lastUpdate[_from] < REWARD_END
                ? time
                : REWARD_END;
        }

        if (_to != address(0)) {
            uint256 timerTo = lastUpdate[_to];
            if (timerTo > 0) {
                rewards[_to] += getPendingReward(_to);
            }
            lastUpdate[_to] = lastUpdate[_to] < REWARD_END ? time : REWARD_END;
        }
    }

    function getReward(address _to) external {
        require(msg.sender == address(nftContract), "Not allowed");
        uint256 reward = rewards[_to];
        if (reward > 0) {
            rewards[_to] = 0;
            _mint(_to, reward);
            emit FishClaimed(_to, reward);
        }
    }

    function getTotalClaimable(address _account)
        external
        view
        returns (uint256)
    {
        return rewards[_account] + getPendingReward(_account);
    }

    function getPendingReward(address _account)
        internal
        view
        returns (uint256)
    {
        uint256 time = min(block.timestamp, REWARD_END);
        uint256 secondary = 0;
        if (secondaryContractsAddresses.length > 0) {
            for (uint256 i = 0; i < secondaryContractsAddresses.length; i++) {
                secondary = secondaryContracts[secondaryContractsAddresses[i]]
                    .balanceOf(_account)
                    .mul(
                        SECONDARY_REWARD_RATE.mul(
                            (time.sub(lastUpdate[_account]))
                        )
                    )
                    .div(86400)
                    .add(secondary);
            }
        }

        return
            nftContract
                .balanceOf(_account)
                .mul(REWARD_RATE.mul((time.sub(lastUpdate[_account]))))
                .div(86400)
                .add(secondary);
    }

    function burn(uint256 value) public override {
        require(
            hasRole(BURNER_ROLE, msg.sender),
            "Must have burner role to burn"
        );
        super._burn(msg.sender, value);
    }

    function spend(address _from, uint256 _amount) external {
        require(
            hasRole(BURNER_ROLE, msg.sender),
            "Must have burner role to spend"
        );
        super._burn(_from, _amount);
        emit FishSpent(_from, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"FishClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FishSpent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDARY_REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addSecondaryContract","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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"getReward","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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getTotalClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract INFTContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"removeSecondaryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"secondaryContracts","outputs":[{"internalType":"contract INFTContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryContractsAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateRewardOnMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005b5d38038062005b5d8339818101604052810190620000379190620009ba565b6040518060400160405280600a81526020017f4649534820546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f464953480000000000000000000000000000000000000000000000000000000081525081818160059080519060200190620000bd929190620008f3565b508060069080519060200190620000d6929190620008f3565b5050506000600760006101000a81548160ff021916908315150217905550620001186000801b6200010c620001e660201b60201c565b620001ee60201b60201c565b620001597f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200014d620001e660201b60201c565b620001ee60201b60201c565b6200019a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6200018e620001e660201b60201c565b620001ee60201b60201c565b5050620001ce7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848336200020460201b60201c565b620001df816200023d60201b60201c565b5062000ef8565b600033905090565b6200020082826200031960201b60201c565b5050565b62000215826200036160201b60201c565b62000226816200038060201b60201c565b6200023883836200031960201b60201c565b505050565b620002616000801b62000255620001e660201b60201c565b620003a460201b60201c565b620002a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029a9062000b88565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003167f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848826200020460201b60201c565b50565b6200033082826200040e60201b620020a51760201c565b6200035c8160016000858152602001908152602001600020620004ff60201b620021851790919060201c565b505050565b6000806000838152602001908152602001600020600101549050919050565b620003a18162000395620001e660201b60201c565b6200053760201b60201c565b50565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620004208282620003a460201b60201c565b620004fb57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004a0620001e660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200052f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620005fb60201b60201c565b905092915050565b620005498282620003a460201b60201c565b620005f7576200057c8173ffffffffffffffffffffffffffffffffffffffff1660146200067560201b620021b51760201c565b620005978360001c60206200067560201b620021b51760201c565b604051602001620005aa92919062000b00565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ee919062000b42565b60405180910390fd5b5050565b60006200060f8383620008d060201b60201c565b6200066a5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200066f565b600090505b92915050565b6060600060028360026200068a919062000c2e565b62000696919062000bd1565b67ffffffffffffffff811115620006b257620006b162000df5565b5b6040519080825280601f01601f191660200182016040528015620006e55781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000720576200071f62000dc6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000787576200078662000dc6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620007c9919062000c2e565b620007d5919062000bd1565b90505b60018111156200087f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106200081b576200081a62000dc6565b5b1a60f81b82828151811062000835576200083462000dc6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080620008779062000d03565b9050620007d8565b5060008414620008c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008bd9062000b66565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620009019062000d32565b90600052602060002090601f01602090048101928262000925576000855562000971565b82601f106200094057805160ff191683800117855562000971565b8280016001018555821562000971579182015b828111156200097057825182559160200191906001019062000953565b5b50905062000980919062000984565b5090565b5b808211156200099f57600081600090555060010162000985565b5090565b600081519050620009b48162000ede565b92915050565b600060208284031215620009d357620009d262000e24565b5b6000620009e384828501620009a3565b91505092915050565b6000620009f98262000baa565b62000a05818562000bb5565b935062000a1781856020860162000ccd565b62000a228162000e29565b840191505092915050565b600062000a3a8262000baa565b62000a46818562000bc6565b935062000a5881856020860162000ccd565b80840191505092915050565b600062000a7360208362000bb5565b915062000a808262000e3a565b602082019050919050565b600062000a9a60178362000bc6565b915062000aa78262000e63565b601782019050919050565b600062000ac1600a8362000bb5565b915062000ace8262000e8c565b602082019050919050565b600062000ae860118362000bc6565b915062000af58262000eb5565b601182019050919050565b600062000b0d8262000a8b565b915062000b1b828562000a2d565b915062000b288262000ad9565b915062000b36828462000a2d565b91508190509392505050565b6000602082019050818103600083015262000b5e8184620009ec565b905092915050565b6000602082019050818103600083015262000b818162000a64565b9050919050565b6000602082019050818103600083015262000ba38162000ab2565b9050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600062000bde8262000cc3565b915062000beb8362000cc3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c235762000c2262000d68565b5b828201905092915050565b600062000c3b8262000cc3565b915062000c488362000cc3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000c845762000c8362000d68565b5b828202905092915050565b600062000c9c8262000ca3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000ced57808201518184015260208101905062000cd0565b8381111562000cfd576000848401525b50505050565b600062000d108262000cc3565b9150600082141562000d275762000d2662000d68565b5b600182039050919050565b6000600282049050600182168062000d4b57607f821691505b6020821081141562000d625762000d6162000d97565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f41646d696e206f6e6c7900000000000000000000000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b62000ee98162000c8f565b811462000ef557600080fd5b50565b614c558062000f086000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806379cc67901161015c578063c00007b0116100ce578063d539139311610087578063d539139314610821578063d547741f1461083f578063d56d229d1461085b578063d573825914610879578063dd62ed3e14610895578063e63ab1e9146108c55761028a565b8063c00007b014610751578063ca15c8731461076d578063cb03fb1e1461079d578063cc240c01146107cd578063ce6af681146107e9578063d230af3a146108055761028a565b806395d89b411161012057806395d89b4114610669578063a2081dc114610687578063a217fddf146106b7578063a457c2d7146106d5578063a9059cbb14610705578063af7d6ca3146107355761028a565b806379cc6790146105c55780638456cb59146105e15780638acecfc5146105eb5780639010d07c1461060957806391d14854146106395761028a565b8063313ce5671161020057806340c10f19116101b957806340c10f191461050557806342966c68146105215780635997bb371461053d5780635c975abb1461055b57806370a082311461057957806375f890ab146105a95761028a565b8063313ce5671461045557806336568abe1461047357806336bcf7d61461048f578063381b9801146104ad57806339509351146104cb5780633f4ba83a146104fb5761028a565b806318160ddd1161025257806318160ddd1461036d57806323b872dd1461038b578063248a9ca3146103bb578063267e8ab6146103eb578063282c51f31461041b5780632f2ff15d146104395761028a565b806301ffc9a71461028f57806306fdde03146102bf5780630700037d146102dd578063095ea7b31461030d5780630f0b45a51461033d575b600080fd5b6102a960048036038101906102a491906138d8565b6108e3565b6040516102b69190613e15565b60405180910390f35b6102c761095d565b6040516102d49190613e66565b60405180910390f35b6102f760048036038101906102f2919061372b565b6109ef565b6040516103049190614168565b60405180910390f35b610327600480360381019061032291906137eb565b610a07565b6040516103349190613e15565b60405180910390f35b61035760048036038101906103529190613905565b610a2a565b6040516103649190613dfa565b60405180910390f35b610375610a69565b6040516103829190614168565b60405180910390f35b6103a560048036038101906103a09190613798565b610a73565b6040516103b29190613e15565b60405180910390f35b6103d560048036038101906103d0919061382b565b610aa2565b6040516103e29190613e30565b60405180910390f35b6104056004803603810190610400919061372b565b610ac1565b6040516104129190614168565b60405180910390f35b610423610b1d565b6040516104309190613e30565b60405180910390f35b610453600480360381019061044e9190613858565b610b41565b005b61045d610b62565b60405161046a9190614183565b60405180910390f35b61048d60048036038101906104889190613858565b610b6b565b005b610497610bee565b6040516104a49190614168565b60405180910390f35b6104b5610bfb565b6040516104c29190614168565b60405180910390f35b6104e560048036038101906104e091906137eb565b610c07565b6040516104f29190613e15565b60405180910390f35b610503610c3e565b005b61051f600480360381019061051a91906137eb565b610cb8565b005b61053b60048036038101906105369190613905565b610d36565b005b610545610dac565b6040516105529190614168565b60405180910390f35b610563610db9565b6040516105709190613e15565b60405180910390f35b610593600480360381019061058e919061372b565b610dd0565b6040516105a09190614168565b60405180910390f35b6105c360048036038101906105be919061372b565b610e19565b005b6105df60048036038101906105da91906137eb565b610eda565b005b6105e9610efa565b005b6105f3610f74565b6040516106009190614168565b60405180910390f35b610623600480360381019061061e9190613898565b610f7c565b6040516106309190613dfa565b60405180910390f35b610653600480360381019061064e9190613858565b610fab565b6040516106609190613e15565b60405180910390f35b610671611015565b60405161067e9190613e66565b60405180910390f35b6106a1600480360381019061069c919061372b565b6110a7565b6040516106ae9190613e4b565b60405180910390f35b6106bf6110da565b6040516106cc9190613e30565b60405180910390f35b6106ef60048036038101906106ea91906137eb565b6110e1565b6040516106fc9190613e15565b60405180910390f35b61071f600480360381019061071a91906137eb565b611158565b60405161072c9190613e15565b60405180910390f35b61074f600480360381019061074a91906137eb565b61117b565b005b61076b6004803603810190610766919061372b565b611240565b005b6107876004803603810190610782919061382b565b6113bf565b6040516107949190614168565b60405180910390f35b6107b760048036038101906107b2919061372b565b6113e3565b6040516107c49190614168565b60405180910390f35b6107e760048036038101906107e291906137eb565b6113fb565b005b61080360048036038101906107fe919061372b565b6117aa565b005b61081f600480360381019061081a9190613758565b61190b565b005b610829611d32565b6040516108369190613e30565b60405180910390f35b61085960048036038101906108549190613858565b611d56565b005b610863611d77565b6040516108709190613e4b565b60405180910390f35b610893600480360381019061088e919061372b565b611d9d565b005b6108af60048036038101906108aa9190613758565b611ffa565b6040516108bc9190614168565b60405180910390f35b6108cd612081565b6040516108da9190613e30565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109565750610955826123f1565b5b9050919050565b60606005805461096c906143f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610998906143f8565b80156109e55780601f106109ba576101008083540402835291602001916109e5565b820191906000526020600020905b8154815290600101906020018083116109c857829003601f168201915b5050505050905090565b60086020528060005260406000206000915090505481565b600080610a1261246b565b9050610a1f818585612473565b600191505092915050565b600b8181548110610a3a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600454905090565b600080610a7e61246b565b9050610a8b85828561263e565b610a968585856126ca565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6000610acc8261294e565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1691906141c5565b9050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610b4a82610aa2565b610b5381612cba565b610b5d8383612cce565b505050565b60006012905090565b610b7361246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790614108565b60405180910390fd5b610bea8282612d02565b5050565b680d8d726b7177a8000081565b67d02ab486cedc000081565b600080610c1261246b565b9050610c33818585610c248589611ffa565b610c2e91906141c5565b612473565b600191505092915050565b610c6f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6a61246b565b610fab565b610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590613f08565b60405180910390fd5b610cb6612d36565b565b610ce97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ce461246b565b610fab565b610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90614008565b60405180910390fd5b610d328282612dd8565b5050565b610d607f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610fab565b610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690614068565b60405180910390fd5b610da93382612f39565b50565b68015af1d78b58c4000081565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e2d6000801b610e2861246b565b610fab565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e63906140c8565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ed77f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84882610b41565b50565b610eec82610ee661246b565b8361263e565b610ef68282612f39565b5050565b610f2b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610f2661246b565b610fab565b610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906140a8565b60405180910390fd5b610f72613112565b565b637516380081565b6000610fa382600160008681526020019081526020016000206131b590919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054611024906143f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611050906143f8565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b5050505050905090565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b81565b6000806110ec61246b565b905060006110fa8286611ffa565b90508381101561113f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611136906140e8565b60405180910390fd5b61114c8286868403612473565b60019250505092915050565b60008061116361246b565b90506111708185856126ca565b600191505092915050565b6111a57f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610fab565b6111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90613fc8565b60405180910390fd5b6111ee8282612f39565b8173ffffffffffffffffffffffffffffffffffffffff167fdab2e314b61466541d7fa78bc3ea358c90cb7b3958b795769bfdbd0868d338df826040516112349190614168565b60405180910390a25050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790613fe8565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156113bb576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061136c8282612dd8565b8173ffffffffffffffffffffffffffffffffffffffff167f8f2e1fd43c7e6c0491e988b801bf69a9f592de987fa2d445dfafcb61b54eae65826040516113b29190614168565b60405180910390a25b5050565b60006113dc600160008481526020019081526020016000206131cf565b9050919050565b60096020528060005260406000206000915090505481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613fe8565b60405180910390fd5b600061149b4263751638006131e4565b90506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116af5761166761161961150c680d8d726b7177a80000866131fd90919063ffffffff16565b61160b620151806115fd61154461152c888a61321390919063ffffffff16565b68015af1d78b58c400006131fd90919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b815260040161159f9190613dfa565b60206040518083038186803b1580156115b757600080fd5b505afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323f90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611760565b61171c6116ce680d8d726b7177a80000856131fd90919063ffffffff16565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323f90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b81600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6117be6000801b6117b961246b565b610fab565b6117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f4906140c8565b60405180910390fd5b80600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119087f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84882610b41565b50565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119e657506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516020016119d49190613da5565b60405160208183030381529060405251115b611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c90613fa8565b60405180910390fd5b6000611a354263751638006131e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611bb2576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611b1757611ac18461294e565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0f91906141c5565b925050819055505b6375163800600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611b6b576375163800611b6d565b815b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d2d576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611c9257611c3c8361294e565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c8a91906141c5565b925050819055505b6375163800600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611ce6576375163800611ce8565b815b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611d5f82610aa2565b611d6881612cba565b611d728383612d02565b505050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611db16000801b611dac61246b565b610fab565b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de7906140c8565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560005b8173ffffffffffffffffffffffffffffffffffffffff16600b8281548110611e8057611e7f614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed9578080611ed19061442a565b915050611e55565b600b6001600b80549050611eed91906142a6565b81548110611efe57611efd614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b8281548110611f3d57611f3c614553565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b805480611f9757611f96614524565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611ff67f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84883611d56565b5050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6120af8282610fab565b61218157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061212661246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006121ad836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613255565b905092915050565b6060600060028360026121c8919061424c565b6121d291906141c5565b67ffffffffffffffff8111156121eb576121ea614582565b5b6040519080825280601f01601f19166020018201604052801561221d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061225557612254614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122b9576122b8614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122f9919061424c565b61230391906141c5565b90505b60018111156123a3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061234557612344614553565b5b1a60f81b82828151811061235c5761235b614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061239c906143ce565b9050612306565b50600084146123e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123de90613e88565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124645750612463826132c5565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da90614088565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90613f28565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126319190614168565b60405180910390a3505050565b600061264a8484611ffa565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146126c457818110156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613f48565b60405180910390fd5b6126c38484848403612473565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614048565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a190613ea8565b60405180910390fd5b6127b583838361332f565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390613f68565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d191906141c5565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129359190614168565b60405180910390a361294884848461333f565b50505050565b60008061295f4263751638006131e4565b9050600080600b805490501115612b615760005b600b80549050811015612b5f57612b4a82612b3c62015180612b2e6129fa6129e3600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a61321390919063ffffffff16565b67d02ab486cedc00006131fd90919063ffffffff16565b600a6000600b8981548110612a1257612a11614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401612ad09190613dfa565b60206040518083038186803b158015612ae857600080fd5b505afa158015612afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b209190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b91508080612b579061442a565b915050612973565b505b612cb181612ca362015180612c95612bdc612bc4600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548961321390919063ffffffff16565b68015af1d78b58c400006131fd90919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b8152600401612c379190613dfa565b60206040518083038186803b158015612c4f57600080fd5b505afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c879190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b92505050919050565b612ccb81612cc661246b565b613344565b50565b612cd882826120a5565b612cfd816001600085815260200190815260200160002061218590919063ffffffff16565b505050565b612d0c82826133e1565b612d3181600160008581526020019081526020016000206134c290919063ffffffff16565b505050565b612d3e610db9565b612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490613ec8565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612dc161246b565b604051612dce9190613dfa565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f90614128565b60405180910390fd5b612e546000838361332f565b8060046000828254612e6691906141c5565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ebc91906141c5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f219190614168565b60405180910390a3612f356000838361333f565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa090614028565b60405180910390fd5b612fb58260008361332f565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561303c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303390613ee8565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816004600082825461309491906142a6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130f99190614168565b60405180910390a361310d8360008461333f565b505050565b61311a610db9565b1561315a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315190613f88565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861319e61246b565b6040516131ab9190613dfa565b60405180910390a1565b60006131c483600001836134f2565b60001c905092915050565b60006131dd8260000161351d565b9050919050565b60008183106131f357816131f5565b825b905092915050565b6000818361320b919061424c565b905092915050565b6000818361322191906142a6565b905092915050565b60008183613237919061421b565b905092915050565b6000818361324d91906141c5565b905092915050565b6000613261838361352e565b6132ba5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132bf565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61333a838383613551565b505050565b505050565b61334e8282610fab565b6133dd576133738173ffffffffffffffffffffffffffffffffffffffff1660146121b5565b6133818360001c60206121b5565b604051602001613392929190613dc0565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d49190613e66565b60405180910390fd5b5050565b6133eb8282610fab565b156134be57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061346361246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006134ea836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6135a9565b905092915050565b600082600001828154811061350a57613509614553565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b61355c8383836136bd565b613564610db9565b156135a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359b90614148565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020549050600081146136b15760006001826135db91906142a6565b90506000600186600001805490506135f391906142a6565b905081811461366257600086600001828154811061361457613613614553565b5b906000526020600020015490508087600001848154811061363857613637614553565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061367657613675614524565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506136b7565b60009150505b92915050565b505050565b6000813590506136d181614bc3565b92915050565b6000813590506136e681614bda565b92915050565b6000813590506136fb81614bf1565b92915050565b60008135905061371081614c08565b92915050565b60008151905061372581614c08565b92915050565b600060208284031215613741576137406145b1565b5b600061374f848285016136c2565b91505092915050565b6000806040838503121561376f5761376e6145b1565b5b600061377d858286016136c2565b925050602061378e858286016136c2565b9150509250929050565b6000806000606084860312156137b1576137b06145b1565b5b60006137bf868287016136c2565b93505060206137d0868287016136c2565b92505060406137e186828701613701565b9150509250925092565b60008060408385031215613802576138016145b1565b5b6000613810858286016136c2565b925050602061382185828601613701565b9150509250929050565b600060208284031215613841576138406145b1565b5b600061384f848285016136d7565b91505092915050565b6000806040838503121561386f5761386e6145b1565b5b600061387d858286016136d7565b925050602061388e858286016136c2565b9150509250929050565b600080604083850312156138af576138ae6145b1565b5b60006138bd858286016136d7565b92505060206138ce85828601613701565b9150509250929050565b6000602082840312156138ee576138ed6145b1565b5b60006138fc848285016136ec565b91505092915050565b60006020828403121561391b5761391a6145b1565b5b600061392984828501613701565b91505092915050565b600060208284031215613948576139476145b1565b5b600061395684828501613716565b91505092915050565b613968816142da565b82525050565b613977816142ec565b82525050565b613986816142f8565b82525050565b61399581614365565b82525050565b6139ac6139a782614365565b614473565b82525050565b60006139bd8261419e565b6139c781856141a9565b93506139d781856020860161439b565b6139e0816145b6565b840191505092915050565b60006139f68261419e565b613a0081856141ba565b9350613a1081856020860161439b565b80840191505092915050565b6000613a296020836141a9565b9150613a34826145d4565b602082019050919050565b6000613a4c6023836141a9565b9150613a57826145fd565b604082019050919050565b6000613a6f6014836141a9565b9150613a7a8261464c565b602082019050919050565b6000613a926022836141a9565b9150613a9d82614675565b604082019050919050565b6000613ab56039836141a9565b9150613ac0826146c4565b604082019050919050565b6000613ad86022836141a9565b9150613ae382614713565b604082019050919050565b6000613afb601d836141a9565b9150613b0682614762565b602082019050919050565b6000613b1e6026836141a9565b9150613b298261478b565b604082019050919050565b6000613b416010836141a9565b9150613b4c826147da565b602082019050919050565b6000613b646010836141a9565b9150613b6f82614803565b602082019050919050565b6000613b87601e836141a9565b9150613b928261482c565b602082019050919050565b6000613baa600b836141a9565b9150613bb582614855565b602082019050919050565b6000613bcd6036836141a9565b9150613bd88261487e565b604082019050919050565b6000613bf06021836141a9565b9150613bfb826148cd565b604082019050919050565b6000613c136025836141a9565b9150613c1e8261491c565b604082019050919050565b6000613c36601d836141a9565b9150613c418261496b565b602082019050919050565b6000613c596024836141a9565b9150613c6482614994565b604082019050919050565b6000613c7c6037836141a9565b9150613c87826149e3565b604082019050919050565b6000613c9f6017836141ba565b9150613caa82614a32565b601782019050919050565b6000613cc2600a836141a9565b9150613ccd82614a5b565b602082019050919050565b6000613ce56025836141a9565b9150613cf082614a84565b604082019050919050565b6000613d086011836141ba565b9150613d1382614ad3565b601182019050919050565b6000613d2b602f836141a9565b9150613d3682614afc565b604082019050919050565b6000613d4e601f836141a9565b9150613d5982614b4b565b602082019050919050565b6000613d71602a836141a9565b9150613d7c82614b74565b604082019050919050565b613d908161434e565b82525050565b613d9f81614358565b82525050565b6000613db1828461399b565b60148201915081905092915050565b6000613dcb82613c92565b9150613dd782856139eb565b9150613de282613cfb565b9150613dee82846139eb565b91508190509392505050565b6000602082019050613e0f600083018461395f565b92915050565b6000602082019050613e2a600083018461396e565b92915050565b6000602082019050613e45600083018461397d565b92915050565b6000602082019050613e60600083018461398c565b92915050565b60006020820190508181036000830152613e8081846139b2565b905092915050565b60006020820190508181036000830152613ea181613a1c565b9050919050565b60006020820190508181036000830152613ec181613a3f565b9050919050565b60006020820190508181036000830152613ee181613a62565b9050919050565b60006020820190508181036000830152613f0181613a85565b9050919050565b60006020820190508181036000830152613f2181613aa8565b9050919050565b60006020820190508181036000830152613f4181613acb565b9050919050565b60006020820190508181036000830152613f6181613aee565b9050919050565b60006020820190508181036000830152613f8181613b11565b9050919050565b60006020820190508181036000830152613fa181613b34565b9050919050565b60006020820190508181036000830152613fc181613b57565b9050919050565b60006020820190508181036000830152613fe181613b7a565b9050919050565b6000602082019050818103600083015261400181613b9d565b9050919050565b6000602082019050818103600083015261402181613bc0565b9050919050565b6000602082019050818103600083015261404181613be3565b9050919050565b6000602082019050818103600083015261406181613c06565b9050919050565b6000602082019050818103600083015261408181613c29565b9050919050565b600060208201905081810360008301526140a181613c4c565b9050919050565b600060208201905081810360008301526140c181613c6f565b9050919050565b600060208201905081810360008301526140e181613cb5565b9050919050565b6000602082019050818103600083015261410181613cd8565b9050919050565b6000602082019050818103600083015261412181613d1e565b9050919050565b6000602082019050818103600083015261414181613d41565b9050919050565b6000602082019050818103600083015261416181613d64565b9050919050565b600060208201905061417d6000830184613d87565b92915050565b60006020820190506141986000830184613d96565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006141d08261434e565b91506141db8361434e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142105761420f614497565b5b828201905092915050565b60006142268261434e565b91506142318361434e565b925082614241576142406144c6565b5b828204905092915050565b60006142578261434e565b91506142628361434e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561429b5761429a614497565b5b828202905092915050565b60006142b18261434e565b91506142bc8361434e565b9250828210156142cf576142ce614497565b5b828203905092915050565b60006142e58261432e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061437082614377565b9050919050565b600061438282614389565b9050919050565b60006143948261432e565b9050919050565b60005b838110156143b957808201518184015260208101905061439e565b838111156143c8576000848401525b50505050565b60006143d98261434e565b915060008214156143ed576143ec614497565b5b600182039050919050565b6000600282049050600182168061441057607f821691505b60208210811415614424576144236144f5565b5b50919050565b60006144358261434e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561446857614467614497565b5b600182019050919050565b600061447e82614485565b9050919050565b6000614490826145c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c696420436f6e747261637400000000000000000000000000000000600082015250565b7f4d7573742068617665206275726e657220726f6c6520746f207370656e640000600082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d7573742068617665206275726e657220726f6c6520746f206275726e000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f41646d696e206f6e6c7900000000000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b614bcc816142da565b8114614bd757600080fd5b50565b614be3816142f8565b8114614bee57600080fd5b50565b614bfa81614302565b8114614c0557600080fd5b50565b614c118161434e565b8114614c1c57600080fd5b5056fea2646970667358221220b1581566d33b6f9e363854f5b70d7383dfb075a7596a6e72f1925116b9b145f964736f6c634300080700330000000000000000000000003efe5b89110dc566d47b4a30e90462ba76968e5a

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c806379cc67901161015c578063c00007b0116100ce578063d539139311610087578063d539139314610821578063d547741f1461083f578063d56d229d1461085b578063d573825914610879578063dd62ed3e14610895578063e63ab1e9146108c55761028a565b8063c00007b014610751578063ca15c8731461076d578063cb03fb1e1461079d578063cc240c01146107cd578063ce6af681146107e9578063d230af3a146108055761028a565b806395d89b411161012057806395d89b4114610669578063a2081dc114610687578063a217fddf146106b7578063a457c2d7146106d5578063a9059cbb14610705578063af7d6ca3146107355761028a565b806379cc6790146105c55780638456cb59146105e15780638acecfc5146105eb5780639010d07c1461060957806391d14854146106395761028a565b8063313ce5671161020057806340c10f19116101b957806340c10f191461050557806342966c68146105215780635997bb371461053d5780635c975abb1461055b57806370a082311461057957806375f890ab146105a95761028a565b8063313ce5671461045557806336568abe1461047357806336bcf7d61461048f578063381b9801146104ad57806339509351146104cb5780633f4ba83a146104fb5761028a565b806318160ddd1161025257806318160ddd1461036d57806323b872dd1461038b578063248a9ca3146103bb578063267e8ab6146103eb578063282c51f31461041b5780632f2ff15d146104395761028a565b806301ffc9a71461028f57806306fdde03146102bf5780630700037d146102dd578063095ea7b31461030d5780630f0b45a51461033d575b600080fd5b6102a960048036038101906102a491906138d8565b6108e3565b6040516102b69190613e15565b60405180910390f35b6102c761095d565b6040516102d49190613e66565b60405180910390f35b6102f760048036038101906102f2919061372b565b6109ef565b6040516103049190614168565b60405180910390f35b610327600480360381019061032291906137eb565b610a07565b6040516103349190613e15565b60405180910390f35b61035760048036038101906103529190613905565b610a2a565b6040516103649190613dfa565b60405180910390f35b610375610a69565b6040516103829190614168565b60405180910390f35b6103a560048036038101906103a09190613798565b610a73565b6040516103b29190613e15565b60405180910390f35b6103d560048036038101906103d0919061382b565b610aa2565b6040516103e29190613e30565b60405180910390f35b6104056004803603810190610400919061372b565b610ac1565b6040516104129190614168565b60405180910390f35b610423610b1d565b6040516104309190613e30565b60405180910390f35b610453600480360381019061044e9190613858565b610b41565b005b61045d610b62565b60405161046a9190614183565b60405180910390f35b61048d60048036038101906104889190613858565b610b6b565b005b610497610bee565b6040516104a49190614168565b60405180910390f35b6104b5610bfb565b6040516104c29190614168565b60405180910390f35b6104e560048036038101906104e091906137eb565b610c07565b6040516104f29190613e15565b60405180910390f35b610503610c3e565b005b61051f600480360381019061051a91906137eb565b610cb8565b005b61053b60048036038101906105369190613905565b610d36565b005b610545610dac565b6040516105529190614168565b60405180910390f35b610563610db9565b6040516105709190613e15565b60405180910390f35b610593600480360381019061058e919061372b565b610dd0565b6040516105a09190614168565b60405180910390f35b6105c360048036038101906105be919061372b565b610e19565b005b6105df60048036038101906105da91906137eb565b610eda565b005b6105e9610efa565b005b6105f3610f74565b6040516106009190614168565b60405180910390f35b610623600480360381019061061e9190613898565b610f7c565b6040516106309190613dfa565b60405180910390f35b610653600480360381019061064e9190613858565b610fab565b6040516106609190613e15565b60405180910390f35b610671611015565b60405161067e9190613e66565b60405180910390f35b6106a1600480360381019061069c919061372b565b6110a7565b6040516106ae9190613e4b565b60405180910390f35b6106bf6110da565b6040516106cc9190613e30565b60405180910390f35b6106ef60048036038101906106ea91906137eb565b6110e1565b6040516106fc9190613e15565b60405180910390f35b61071f600480360381019061071a91906137eb565b611158565b60405161072c9190613e15565b60405180910390f35b61074f600480360381019061074a91906137eb565b61117b565b005b61076b6004803603810190610766919061372b565b611240565b005b6107876004803603810190610782919061382b565b6113bf565b6040516107949190614168565b60405180910390f35b6107b760048036038101906107b2919061372b565b6113e3565b6040516107c49190614168565b60405180910390f35b6107e760048036038101906107e291906137eb565b6113fb565b005b61080360048036038101906107fe919061372b565b6117aa565b005b61081f600480360381019061081a9190613758565b61190b565b005b610829611d32565b6040516108369190613e30565b60405180910390f35b61085960048036038101906108549190613858565b611d56565b005b610863611d77565b6040516108709190613e4b565b60405180910390f35b610893600480360381019061088e919061372b565b611d9d565b005b6108af60048036038101906108aa9190613758565b611ffa565b6040516108bc9190614168565b60405180910390f35b6108cd612081565b6040516108da9190613e30565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109565750610955826123f1565b5b9050919050565b60606005805461096c906143f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610998906143f8565b80156109e55780601f106109ba576101008083540402835291602001916109e5565b820191906000526020600020905b8154815290600101906020018083116109c857829003601f168201915b5050505050905090565b60086020528060005260406000206000915090505481565b600080610a1261246b565b9050610a1f818585612473565b600191505092915050565b600b8181548110610a3a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600454905090565b600080610a7e61246b565b9050610a8b85828561263e565b610a968585856126ca565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6000610acc8261294e565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1691906141c5565b9050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610b4a82610aa2565b610b5381612cba565b610b5d8383612cce565b505050565b60006012905090565b610b7361246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790614108565b60405180910390fd5b610bea8282612d02565b5050565b680d8d726b7177a8000081565b67d02ab486cedc000081565b600080610c1261246b565b9050610c33818585610c248589611ffa565b610c2e91906141c5565b612473565b600191505092915050565b610c6f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6a61246b565b610fab565b610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590613f08565b60405180910390fd5b610cb6612d36565b565b610ce97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ce461246b565b610fab565b610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90614008565b60405180910390fd5b610d328282612dd8565b5050565b610d607f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610fab565b610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690614068565b60405180910390fd5b610da93382612f39565b50565b68015af1d78b58c4000081565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e2d6000801b610e2861246b565b610fab565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e63906140c8565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ed77f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84882610b41565b50565b610eec82610ee661246b565b8361263e565b610ef68282612f39565b5050565b610f2b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610f2661246b565b610fab565b610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906140a8565b60405180910390fd5b610f72613112565b565b637516380081565b6000610fa382600160008681526020019081526020016000206131b590919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054611024906143f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611050906143f8565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b5050505050905090565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b81565b6000806110ec61246b565b905060006110fa8286611ffa565b90508381101561113f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611136906140e8565b60405180910390fd5b61114c8286868403612473565b60019250505092915050565b60008061116361246b565b90506111708185856126ca565b600191505092915050565b6111a57f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610fab565b6111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90613fc8565b60405180910390fd5b6111ee8282612f39565b8173ffffffffffffffffffffffffffffffffffffffff167fdab2e314b61466541d7fa78bc3ea358c90cb7b3958b795769bfdbd0868d338df826040516112349190614168565b60405180910390a25050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790613fe8565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156113bb576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061136c8282612dd8565b8173ffffffffffffffffffffffffffffffffffffffff167f8f2e1fd43c7e6c0491e988b801bf69a9f592de987fa2d445dfafcb61b54eae65826040516113b29190614168565b60405180910390a25b5050565b60006113dc600160008481526020019081526020016000206131cf565b9050919050565b60096020528060005260406000206000915090505481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613fe8565b60405180910390fd5b600061149b4263751638006131e4565b90506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116af5761166761161961150c680d8d726b7177a80000866131fd90919063ffffffff16565b61160b620151806115fd61154461152c888a61321390919063ffffffff16565b68015af1d78b58c400006131fd90919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b815260040161159f9190613dfa565b60206040518083038186803b1580156115b757600080fd5b505afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323f90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611760565b61171c6116ce680d8d726b7177a80000856131fd90919063ffffffff16565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323f90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b81600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6117be6000801b6117b961246b565b610fab565b6117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f4906140c8565b60405180910390fd5b80600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119087f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84882610b41565b50565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119e657506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516020016119d49190613da5565b60405160208183030381529060405251115b611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c90613fa8565b60405180910390fd5b6000611a354263751638006131e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611bb2576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611b1757611ac18461294e565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0f91906141c5565b925050819055505b6375163800600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611b6b576375163800611b6d565b815b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d2d576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611c9257611c3c8361294e565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c8a91906141c5565b925050819055505b6375163800600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611ce6576375163800611ce8565b815b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611d5f82610aa2565b611d6881612cba565b611d728383612d02565b505050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611db16000801b611dac61246b565b610fab565b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de7906140c8565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560005b8173ffffffffffffffffffffffffffffffffffffffff16600b8281548110611e8057611e7f614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed9578080611ed19061442a565b915050611e55565b600b6001600b80549050611eed91906142a6565b81548110611efe57611efd614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b8281548110611f3d57611f3c614553565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b805480611f9757611f96614524565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611ff67f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84883611d56565b5050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6120af8282610fab565b61218157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061212661246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006121ad836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613255565b905092915050565b6060600060028360026121c8919061424c565b6121d291906141c5565b67ffffffffffffffff8111156121eb576121ea614582565b5b6040519080825280601f01601f19166020018201604052801561221d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061225557612254614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122b9576122b8614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122f9919061424c565b61230391906141c5565b90505b60018111156123a3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061234557612344614553565b5b1a60f81b82828151811061235c5761235b614553565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061239c906143ce565b9050612306565b50600084146123e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123de90613e88565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124645750612463826132c5565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da90614088565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90613f28565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126319190614168565b60405180910390a3505050565b600061264a8484611ffa565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146126c457818110156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613f48565b60405180910390fd5b6126c38484848403612473565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614048565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a190613ea8565b60405180910390fd5b6127b583838361332f565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390613f68565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d191906141c5565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129359190614168565b60405180910390a361294884848461333f565b50505050565b60008061295f4263751638006131e4565b9050600080600b805490501115612b615760005b600b80549050811015612b5f57612b4a82612b3c62015180612b2e6129fa6129e3600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a61321390919063ffffffff16565b67d02ab486cedc00006131fd90919063ffffffff16565b600a6000600b8981548110612a1257612a11614553565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401612ad09190613dfa565b60206040518083038186803b158015612ae857600080fd5b505afa158015612afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b209190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b91508080612b579061442a565b915050612973565b505b612cb181612ca362015180612c95612bdc612bc4600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548961321390919063ffffffff16565b68015af1d78b58c400006131fd90919063ffffffff16565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b8152600401612c379190613dfa565b60206040518083038186803b158015612c4f57600080fd5b505afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c879190613932565b6131fd90919063ffffffff16565b61322990919063ffffffff16565b61323f90919063ffffffff16565b92505050919050565b612ccb81612cc661246b565b613344565b50565b612cd882826120a5565b612cfd816001600085815260200190815260200160002061218590919063ffffffff16565b505050565b612d0c82826133e1565b612d3181600160008581526020019081526020016000206134c290919063ffffffff16565b505050565b612d3e610db9565b612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490613ec8565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612dc161246b565b604051612dce9190613dfa565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f90614128565b60405180910390fd5b612e546000838361332f565b8060046000828254612e6691906141c5565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ebc91906141c5565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f219190614168565b60405180910390a3612f356000838361333f565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa090614028565b60405180910390fd5b612fb58260008361332f565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561303c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303390613ee8565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816004600082825461309491906142a6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130f99190614168565b60405180910390a361310d8360008461333f565b505050565b61311a610db9565b1561315a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315190613f88565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861319e61246b565b6040516131ab9190613dfa565b60405180910390a1565b60006131c483600001836134f2565b60001c905092915050565b60006131dd8260000161351d565b9050919050565b60008183106131f357816131f5565b825b905092915050565b6000818361320b919061424c565b905092915050565b6000818361322191906142a6565b905092915050565b60008183613237919061421b565b905092915050565b6000818361324d91906141c5565b905092915050565b6000613261838361352e565b6132ba5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132bf565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61333a838383613551565b505050565b505050565b61334e8282610fab565b6133dd576133738173ffffffffffffffffffffffffffffffffffffffff1660146121b5565b6133818360001c60206121b5565b604051602001613392929190613dc0565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d49190613e66565b60405180910390fd5b5050565b6133eb8282610fab565b156134be57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061346361246b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006134ea836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6135a9565b905092915050565b600082600001828154811061350a57613509614553565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b61355c8383836136bd565b613564610db9565b156135a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359b90614148565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020549050600081146136b15760006001826135db91906142a6565b90506000600186600001805490506135f391906142a6565b905081811461366257600086600001828154811061361457613613614553565b5b906000526020600020015490508087600001848154811061363857613637614553565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061367657613675614524565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506136b7565b60009150505b92915050565b505050565b6000813590506136d181614bc3565b92915050565b6000813590506136e681614bda565b92915050565b6000813590506136fb81614bf1565b92915050565b60008135905061371081614c08565b92915050565b60008151905061372581614c08565b92915050565b600060208284031215613741576137406145b1565b5b600061374f848285016136c2565b91505092915050565b6000806040838503121561376f5761376e6145b1565b5b600061377d858286016136c2565b925050602061378e858286016136c2565b9150509250929050565b6000806000606084860312156137b1576137b06145b1565b5b60006137bf868287016136c2565b93505060206137d0868287016136c2565b92505060406137e186828701613701565b9150509250925092565b60008060408385031215613802576138016145b1565b5b6000613810858286016136c2565b925050602061382185828601613701565b9150509250929050565b600060208284031215613841576138406145b1565b5b600061384f848285016136d7565b91505092915050565b6000806040838503121561386f5761386e6145b1565b5b600061387d858286016136d7565b925050602061388e858286016136c2565b9150509250929050565b600080604083850312156138af576138ae6145b1565b5b60006138bd858286016136d7565b92505060206138ce85828601613701565b9150509250929050565b6000602082840312156138ee576138ed6145b1565b5b60006138fc848285016136ec565b91505092915050565b60006020828403121561391b5761391a6145b1565b5b600061392984828501613701565b91505092915050565b600060208284031215613948576139476145b1565b5b600061395684828501613716565b91505092915050565b613968816142da565b82525050565b613977816142ec565b82525050565b613986816142f8565b82525050565b61399581614365565b82525050565b6139ac6139a782614365565b614473565b82525050565b60006139bd8261419e565b6139c781856141a9565b93506139d781856020860161439b565b6139e0816145b6565b840191505092915050565b60006139f68261419e565b613a0081856141ba565b9350613a1081856020860161439b565b80840191505092915050565b6000613a296020836141a9565b9150613a34826145d4565b602082019050919050565b6000613a4c6023836141a9565b9150613a57826145fd565b604082019050919050565b6000613a6f6014836141a9565b9150613a7a8261464c565b602082019050919050565b6000613a926022836141a9565b9150613a9d82614675565b604082019050919050565b6000613ab56039836141a9565b9150613ac0826146c4565b604082019050919050565b6000613ad86022836141a9565b9150613ae382614713565b604082019050919050565b6000613afb601d836141a9565b9150613b0682614762565b602082019050919050565b6000613b1e6026836141a9565b9150613b298261478b565b604082019050919050565b6000613b416010836141a9565b9150613b4c826147da565b602082019050919050565b6000613b646010836141a9565b9150613b6f82614803565b602082019050919050565b6000613b87601e836141a9565b9150613b928261482c565b602082019050919050565b6000613baa600b836141a9565b9150613bb582614855565b602082019050919050565b6000613bcd6036836141a9565b9150613bd88261487e565b604082019050919050565b6000613bf06021836141a9565b9150613bfb826148cd565b604082019050919050565b6000613c136025836141a9565b9150613c1e8261491c565b604082019050919050565b6000613c36601d836141a9565b9150613c418261496b565b602082019050919050565b6000613c596024836141a9565b9150613c6482614994565b604082019050919050565b6000613c7c6037836141a9565b9150613c87826149e3565b604082019050919050565b6000613c9f6017836141ba565b9150613caa82614a32565b601782019050919050565b6000613cc2600a836141a9565b9150613ccd82614a5b565b602082019050919050565b6000613ce56025836141a9565b9150613cf082614a84565b604082019050919050565b6000613d086011836141ba565b9150613d1382614ad3565b601182019050919050565b6000613d2b602f836141a9565b9150613d3682614afc565b604082019050919050565b6000613d4e601f836141a9565b9150613d5982614b4b565b602082019050919050565b6000613d71602a836141a9565b9150613d7c82614b74565b604082019050919050565b613d908161434e565b82525050565b613d9f81614358565b82525050565b6000613db1828461399b565b60148201915081905092915050565b6000613dcb82613c92565b9150613dd782856139eb565b9150613de282613cfb565b9150613dee82846139eb565b91508190509392505050565b6000602082019050613e0f600083018461395f565b92915050565b6000602082019050613e2a600083018461396e565b92915050565b6000602082019050613e45600083018461397d565b92915050565b6000602082019050613e60600083018461398c565b92915050565b60006020820190508181036000830152613e8081846139b2565b905092915050565b60006020820190508181036000830152613ea181613a1c565b9050919050565b60006020820190508181036000830152613ec181613a3f565b9050919050565b60006020820190508181036000830152613ee181613a62565b9050919050565b60006020820190508181036000830152613f0181613a85565b9050919050565b60006020820190508181036000830152613f2181613aa8565b9050919050565b60006020820190508181036000830152613f4181613acb565b9050919050565b60006020820190508181036000830152613f6181613aee565b9050919050565b60006020820190508181036000830152613f8181613b11565b9050919050565b60006020820190508181036000830152613fa181613b34565b9050919050565b60006020820190508181036000830152613fc181613b57565b9050919050565b60006020820190508181036000830152613fe181613b7a565b9050919050565b6000602082019050818103600083015261400181613b9d565b9050919050565b6000602082019050818103600083015261402181613bc0565b9050919050565b6000602082019050818103600083015261404181613be3565b9050919050565b6000602082019050818103600083015261406181613c06565b9050919050565b6000602082019050818103600083015261408181613c29565b9050919050565b600060208201905081810360008301526140a181613c4c565b9050919050565b600060208201905081810360008301526140c181613c6f565b9050919050565b600060208201905081810360008301526140e181613cb5565b9050919050565b6000602082019050818103600083015261410181613cd8565b9050919050565b6000602082019050818103600083015261412181613d1e565b9050919050565b6000602082019050818103600083015261414181613d41565b9050919050565b6000602082019050818103600083015261416181613d64565b9050919050565b600060208201905061417d6000830184613d87565b92915050565b60006020820190506141986000830184613d96565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006141d08261434e565b91506141db8361434e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142105761420f614497565b5b828201905092915050565b60006142268261434e565b91506142318361434e565b925082614241576142406144c6565b5b828204905092915050565b60006142578261434e565b91506142628361434e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561429b5761429a614497565b5b828202905092915050565b60006142b18261434e565b91506142bc8361434e565b9250828210156142cf576142ce614497565b5b828203905092915050565b60006142e58261432e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061437082614377565b9050919050565b600061438282614389565b9050919050565b60006143948261432e565b9050919050565b60005b838110156143b957808201518184015260208101905061439e565b838111156143c8576000848401525b50505050565b60006143d98261434e565b915060008214156143ed576143ec614497565b5b600182039050919050565b6000600282049050600182168061441057607f821691505b60208210811415614424576144236144f5565b5b50919050565b60006144358261434e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561446857614467614497565b5b600182019050919050565b600061447e82614485565b9050919050565b6000614490826145c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c696420436f6e747261637400000000000000000000000000000000600082015250565b7f4d7573742068617665206275726e657220726f6c6520746f207370656e640000600082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d7573742068617665206275726e657220726f6c6520746f206275726e000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f41646d696e206f6e6c7900000000000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b614bcc816142da565b8114614bd757600080fd5b50565b614be3816142f8565b8114614bee57600080fd5b50565b614bfa81614302565b8114614c0557600080fd5b50565b614c118161434e565b8114614c1c57600080fd5b5056fea2646970667358221220b1581566d33b6f9e363854f5b70d7383dfb075a7596a6e72f1925116b9b145f964736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003efe5b89110dc566d47b4a30e90462ba76968e5a

-----Decoded View---------------
Arg [0] : _nftContract (address): 0x3EFe5B89110Dc566D47b4A30E90462ba76968e5A

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003efe5b89110dc566d47b4a30e90462ba76968e5a


Deployed Bytecode Sourcemap

63499:5884:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51402:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6653:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63856:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9004:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64022:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7773:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9785:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34673:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67725:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64205:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35066:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7615:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36114:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63627:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63737:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10489:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55784:178;;;:::i;:::-;;54975:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68890:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63684:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19744:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7944:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64467:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18441:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55394:172;;;:::i;:::-;;63800:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52215:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33133:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6872:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63957:58;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32238:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11230:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8277:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69114:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67413:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52542:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63905:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65808:667;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64783:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66483:922;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54217:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35458:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63587:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65094:545;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8533:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51402:214;51487:4;51526:42;51511:57;;;:11;:57;;;;:97;;;;51572:36;51596:11;51572:23;:36::i;:::-;51511:97;51504:104;;51402:214;;;:::o;6653:100::-;6707:13;6740:5;6733:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6653:100;:::o;63856:42::-;;;;;;;;;;;;;;;;;:::o;9004:201::-;9087:4;9104:13;9120:12;:10;:12::i;:::-;9104:28;;9143:32;9152:5;9159:7;9168:6;9143:8;:32::i;:::-;9193:4;9186:11;;;9004:201;;;;:::o;64022:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7773:108::-;7834:7;7861:12;;7854:19;;7773:108;:::o;9785:295::-;9916:4;9933:15;9951:12;:10;:12::i;:::-;9933:30;;9974:38;9990:4;9996:7;10005:6;9974:15;:38::i;:::-;10023:27;10033:4;10039:2;10043:6;10023:9;:27::i;:::-;10068:4;10061:11;;;9785:295;;;;;:::o;34673:131::-;34747:7;34774:6;:12;34781:4;34774:12;;;;;;;;;;;:22;;;34767:29;;34673:131;;;:::o;67725:181::-;67820:7;67872:26;67889:8;67872:16;:26::i;:::-;67852:7;:17;67860:8;67852:17;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;67845:53;;67725:181;;;:::o;64205:62::-;64243:24;64205:62;:::o;35066:147::-;35149:18;35162:4;35149:12;:18::i;:::-;32729:16;32740:4;32729:10;:16::i;:::-;35180:25:::1;35191:4;35197:7;35180:10;:25::i;:::-;35066:147:::0;;;:::o;7615:93::-;7673:5;7698:2;7691:9;;7615:93;:::o;36114:218::-;36221:12;:10;:12::i;:::-;36210:23;;:7;:23;;;36202:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;36298:26;36310:4;36316:7;36298:11;:26::i;:::-;36114:218;;:::o;63627:50::-;63668:9;63627:50;:::o;63737:56::-;63785:8;63737:56;:::o;10489:238::-;10577:4;10594:13;10610:12;:10;:12::i;:::-;10594:28;;10633:64;10642:5;10649:7;10686:10;10658:25;10668:5;10675:7;10658:9;:25::i;:::-;:38;;;;:::i;:::-;10633:8;:64::i;:::-;10715:4;10708:11;;;10489:238;;;;:::o;55784:178::-;55837:34;54324:24;55858:12;:10;:12::i;:::-;55837:7;:34::i;:::-;55829:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55944:10;:8;:10::i;:::-;55784:178::o;54975:205::-;55051:34;54255:24;55072:12;:10;:12::i;:::-;55051:7;:34::i;:::-;55043:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55155:17;55161:2;55165:6;55155:5;:17::i;:::-;54975:205;;:::o;68890:216::-;68968:32;64243:24;68989:10;68968:7;:32::i;:::-;68946:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;69068:30;69080:10;69092:5;69068:11;:30::i;:::-;68890:216;:::o;63684:46::-;63722:8;63684:46;:::o;19744:86::-;19791:4;19815:7;;;;;;;;;;;19808:14;;19744:86;:::o;7944:127::-;8018:7;8045:9;:18;8055:7;8045:18;;;;;;;;;;;;;;;;8038:25;;7944:127;;;:::o;64467:222::-;64533:41;32283:4;64541:18;;64561:12;:10;:12::i;:::-;64533:7;:41::i;:::-;64525:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64627:9;64600:11;;:37;;;;;;;;;;;;;;;;;;64648:33;64243:24;64671:9;64648;:33::i;:::-;64467:222;:::o;18441:164::-;18518:46;18534:7;18543:12;:10;:12::i;:::-;18557:6;18518:15;:46::i;:::-;18575:22;18581:7;18590:6;18575:5;:22::i;:::-;18441:164;;:::o;55394:172::-;55445:34;54324:24;55466:12;:10;:12::i;:::-;55445:7;:34::i;:::-;55437:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;55550:8;:6;:8::i;:::-;55394:172::o;63800:47::-;63837:10;63800:47;:::o;52215:153::-;52305:7;52332:28;52354:5;52332:12;:18;52345:4;52332:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;52325:35;;52215:153;;;;:::o;33133:147::-;33219:4;33243:6;:12;33250:4;33243:12;;;;;;;;;;;:20;;:29;33264:7;33243:29;;;;;;;;;;;;;;;;;;;;;;;;;33236:36;;33133:147;;;;:::o;6872:104::-;6928:13;6961:7;6954:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6872:104;:::o;63957:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;32238:49::-;32283:4;32238:49;;;:::o;11230:436::-;11323:4;11340:13;11356:12;:10;:12::i;:::-;11340:28;;11379:24;11406:25;11416:5;11423:7;11406:9;:25::i;:::-;11379:52;;11470:15;11450:16;:35;;11442:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11563:60;11572:5;11579:7;11607:15;11588:16;:34;11563:8;:60::i;:::-;11654:4;11647:11;;;;11230:436;;;;:::o;8277:193::-;8356:4;8373:13;8389:12;:10;:12::i;:::-;8373:28;;8412;8422:5;8429:2;8433:6;8412:9;:28::i;:::-;8458:4;8451:11;;;8277:193;;;;:::o;69114:266::-;69203:32;64243:24;69224:10;69203:7;:32::i;:::-;69181:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;69304:27;69316:5;69323:7;69304:11;:27::i;:::-;69357:5;69347:25;;;69364:7;69347:25;;;;;;:::i;:::-;;;;;;;;69114:266;;:::o;67413:304::-;67495:11;;;;;;;;;;;67473:34;;:10;:34;;;67465:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67534:14;67551:7;:12;67559:3;67551:12;;;;;;;;;;;;;;;;67534:29;;67587:1;67578:6;:10;67574:136;;;67620:1;67605:7;:12;67613:3;67605:12;;;;;;;;;;;;;;;:16;;;;67636:18;67642:3;67647:6;67636:5;:18::i;:::-;67686:3;67674:24;;;67691:6;67674:24;;;;;;:::i;:::-;;;;;;;;67574:136;67454:263;67413:304;:::o;52542:142::-;52622:7;52649:27;:12;:18;52662:4;52649:18;;;;;;;;;;;:25;:27::i;:::-;52642:34;;52542:142;;;:::o;63905:45::-;;;;;;;;;;;;;;;;;:::o;65808:667::-;65916:11;;;;;;;;;;;65894:34;;:10;:34;;;65886:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65955:12;65970:32;65974:15;63837:10;65970:3;:32::i;:::-;65955:47;;66013:17;66033:10;:15;66044:3;66033:15;;;;;;;;;;;;;;;;66013:35;;66075:1;66063:9;:13;66059:375;;;66106:252;66141:202;66315:27;63668:9;66315:7;:11;;:27;;;;:::i;:::-;66141:147;66282:5;66141:114;66216:38;66233:19;66242:9;66233:4;:8;;:19;;;;:::i;:::-;63722:8;66216:15;;:38;;;;:::i;:::-;66141:11;;;;;;;;;;;:43;;;66185:3;66141:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;:114;;;;:::i;:::-;:140;;:147;;;;:::i;:::-;:173;;:202;;;;:::i;:::-;66106:7;:12;66114:3;66106:12;;;;;;;;;;;;;;;;:16;;:252;;;;:::i;:::-;66091:7;:12;66099:3;66091:12;;;;;;;;;;;;;;;:267;;;;66059:375;;;66389:45;66406:27;63668:9;66406:7;:11;;:27;;;;:::i;:::-;66389:7;:12;66397:3;66389:12;;;;;;;;;;;;;;;;:16;;:45;;;;:::i;:::-;66374:7;:12;66382:3;66374:12;;;;;;;;;;;;;;;:60;;;;66059:375;66463:4;66445:10;:15;66456:3;66445:15;;;;;;;;;;;;;;;:22;;;;65875:600;;65808:667;;:::o;64783:303::-;64858:41;32283:4;64866:18;;64886:12;:10;:12::i;:::-;64858:7;:41::i;:::-;64850:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64970:9;64925:18;:29;64944:9;64925:29;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;64991:27;65024:9;64991:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65045:33;64243:24;65068:9;65045;:33::i;:::-;64783:303;:::o;66483:922::-;66597:11;;;;;;;;;;;66575:34;;:10;:34;;;:114;;;;66688:1;66647:18;:30;66666:10;66647:30;;;;;;;;;;;;;;;;;;;;;;;;;66630:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;:55;:59;66575:114;66553:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;66744:12;66759:32;66763:15;63837:10;66759:3;:32::i;:::-;66744:47;;66823:1;66806:19;;:5;:19;;;66802:317;;66842:17;66862:10;:17;66873:5;66862:17;;;;;;;;;;;;;;;;66842:37;;66910:1;66898:9;:13;66894:95;;;66950:23;66967:5;66950:16;:23::i;:::-;66932:7;:14;66940:5;66932:14;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;66894:95;63837:10;67023;:17;67034:5;67023:17;;;;;;;;;;;;;;;;:30;:84;;63837:10;67023:84;;;67073:4;67023:84;67003:10;:17;67014:5;67003:17;;;;;;;;;;;;;;;:104;;;;66827:292;66802:317;67150:1;67135:17;;:3;:17;;;67131:267;;67169:15;67187:10;:15;67198:3;67187:15;;;;;;;;;;;;;;;;67169:33;;67231:1;67221:7;:11;67217:89;;;67269:21;67286:3;67269:16;:21::i;:::-;67253:7;:12;67261:3;67253:12;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;67217:89;63837:10;67338;:15;67349:3;67338:15;;;;;;;;;;;;;;;;:28;:48;;63837:10;67338:48;;;67369:4;67338:48;67320:10;:15;67331:3;67320:15;;;;;;;;;;;;;;;:66;;;;67154:244;67131:267;66542:863;66483:922;;:::o;54217:62::-;54255:24;54217:62;:::o;35458:149::-;35542:18;35555:4;35542:12;:18::i;:::-;32729:16;32740:4;32729:10;:16::i;:::-;35573:26:::1;35585:4;35591:7;35573:11;:26::i;:::-;35458:149:::0;;;:::o;63587:31::-;;;;;;;;;;;;;:::o;65094:545::-;65172:41;32283:4;65180:18;;65200:12;:10;:12::i;:::-;65172:7;:41::i;:::-;65164:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;65246:18;:29;65265:9;65246:29;;;;;;;;;;;;;;;;65239:36;;;;;;;;;;;65286:13;65314:90;65359:9;65321:47;;:27;65349:5;65321:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:47;;;65314:90;;65385:7;;;;;:::i;:::-;;;;65314:90;;;65451:27;65530:1;65493:27;:34;;;;:38;;;;:::i;:::-;65451:91;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65414:27;65442:5;65414:34;;;;;;;;:::i;:::-;;;;;;;;;;:128;;;;;;;;;;;;;;;;;;65553:27;:33;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;65597:34;64243:24;65621:9;65597:10;:34::i;:::-;65153:486;65094:545;:::o;8533:151::-;8622:7;8649:11;:18;8661:5;8649:18;;;;;;;;;;;;;;;:27;8668:7;8649:27;;;;;;;;;;;;;;;;8642:34;;8533:151;;;;:::o;54286:62::-;54324:24;54286:62;:::o;37615:238::-;37699:22;37707:4;37713:7;37699;:22::i;:::-;37694:152;;37770:4;37738:6;:12;37745:4;37738:12;;;;;;;;;;;:20;;:29;37759:7;37738:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;37821:12;:10;:12::i;:::-;37794:40;;37812:7;37794:40;;37806:4;37794:40;;;;;;;;;;37694:152;37615:238;;:::o;46118:152::-;46188:4;46212:50;46217:3;:10;;46253:5;46237:23;;46229:32;;46212:4;:50::i;:::-;46205:57;;46118:152;;;;:::o;27856:451::-;27931:13;27957:19;28002:1;27993:6;27989:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;27979:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27957:47;;28015:15;:6;28022:1;28015:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;28041;:6;28048:1;28041:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;28072:9;28097:1;28088:6;28084:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;28072:26;;28067:135;28104:1;28100;:5;28067:135;;;28139:12;28160:3;28152:5;:11;28139:25;;;;;;;:::i;:::-;;;;;28127:6;28134:1;28127:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;28189:1;28179:11;;;;;28107:3;;;;:::i;:::-;;;28067:135;;;;28229:1;28220:5;:10;28212:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;28292:6;28278:21;;;27856:451;;;;:::o;32837:204::-;32922:4;32961:32;32946:47;;;:11;:47;;;;:87;;;;32997:36;33021:11;32997:23;:36::i;:::-;32946:87;32939:94;;32837:204;;;:::o;4293:98::-;4346:7;4373:10;4366:17;;4293:98;:::o;14864:380::-;15017:1;15000:19;;:5;:19;;;;14992:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15098:1;15079:21;;:7;:21;;;;15071:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15182:6;15152:11;:18;15164:5;15152:18;;;;;;;;;;;;;;;:27;15171:7;15152:27;;;;;;;;;;;;;;;:36;;;;15220:7;15204:32;;15213:5;15204:32;;;15229:6;15204:32;;;;;;:::i;:::-;;;;;;;;14864:380;;;:::o;15535:453::-;15670:24;15697:25;15707:5;15714:7;15697:9;:25::i;:::-;15670:52;;15757:17;15737:16;:37;15733:248;;15819:6;15799:16;:26;;15791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15903:51;15912:5;15919:7;15947:6;15928:16;:25;15903:8;:51::i;:::-;15733:248;15659:329;15535:453;;;:::o;12145:671::-;12292:1;12276:18;;:4;:18;;;;12268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12369:1;12355:16;;:2;:16;;;;12347:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12424:38;12445:4;12451:2;12455:6;12424:20;:38::i;:::-;12475:19;12497:9;:15;12507:4;12497:15;;;;;;;;;;;;;;;;12475:37;;12546:6;12531:11;:21;;12523:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12663:6;12649:11;:20;12631:9;:15;12641:4;12631:15;;;;;;;;;;;;;;;:38;;;;12708:6;12691:9;:13;12701:2;12691:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;12747:2;12732:26;;12741:4;12732:26;;;12751:6;12732:26;;;;;;:::i;:::-;;;;;;;;12771:37;12791:4;12797:2;12801:6;12771:19;:37::i;:::-;12257:559;12145:671;;;:::o;67914:968::-;68008:7;68033:12;68048:32;68052:15;63837:10;68048:3;:32::i;:::-;68033:47;;68091:17;68164:1;68127:27;:34;;;;:38;68123:535;;;68187:9;68182:465;68206:27;:34;;;;68202:1;:38;68182:465;;;68278:353;68621:9;68278:316;68588:5;68278:283;68423:115;68480:30;68489:10;:20;68500:8;68489:20;;;;;;;;;;;;;;;;68480:4;:8;;:30;;;;:::i;:::-;63785:8;68423:25;;:115;;;;:::i;:::-;68278:18;:50;68297:27;68325:1;68297:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68278:50;;;;;;;;;;;;;;;;;;;;;;;;;:82;;;68361:8;68278:92;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;:283;;;;:::i;:::-;:309;;:316;;;;:::i;:::-;:342;;:353;;;;:::i;:::-;68266:365;;68242:3;;;;;:::i;:::-;;;;68182:465;;;;68123:535;68690:184;68864:9;68690:151;68835:5;68690:122;68762:49;68779:30;68788:10;:20;68799:8;68788:20;;;;;;;;;;;;;;;;68779:4;:8;;:30;;;;:::i;:::-;63722:8;68762:15;;:49;;;;:::i;:::-;68690:11;;;;;;;;;;;:39;;;68730:8;68690:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;:122;;;;:::i;:::-;:144;;:151;;;;:::i;:::-;:173;;:184;;;;:::i;:::-;68670:204;;;;67914:968;;;:::o;33584:105::-;33651:30;33662:4;33668:12;:10;:12::i;:::-;33651:10;:30::i;:::-;33584:105;:::o;52777:169::-;52865:31;52882:4;52888:7;52865:16;:31::i;:::-;52907;52930:7;52907:12;:18;52920:4;52907:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;52777:169;;:::o;53040:174::-;53129:32;53147:4;53153:7;53129:17;:32::i;:::-;53172:34;53198:7;53172:12;:18;53185:4;53172:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;53040:174;;:::o;20803:120::-;20347:8;:6;:8::i;:::-;20339:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;20872:5:::1;20862:7;;:15;;;;;;;;;;;;;;;;;;20893:22;20902:12;:10;:12::i;:::-;20893:22;;;;;;:::i;:::-;;;;;;;;20803:120::o:0;13103:399::-;13206:1;13187:21;;:7;:21;;;;13179:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13257:49;13286:1;13290:7;13299:6;13257:20;:49::i;:::-;13335:6;13319:12;;:22;;;;;;;:::i;:::-;;;;;;;;13374:6;13352:9;:18;13362:7;13352:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13417:7;13396:37;;13413:1;13396:37;;;13426:6;13396:37;;;;;;:::i;:::-;;;;;;;;13446:48;13474:1;13478:7;13487:6;13446:19;:48::i;:::-;13103:399;;:::o;13835:591::-;13938:1;13919:21;;:7;:21;;;;13911:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13991:49;14012:7;14029:1;14033:6;13991:20;:49::i;:::-;14053:22;14078:9;:18;14088:7;14078:18;;;;;;;;;;;;;;;;14053:43;;14133:6;14115:14;:24;;14107:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14252:6;14235:14;:23;14214:9;:18;14224:7;14214:18;;;;;;;;;;;;;;;:44;;;;14296:6;14280:12;;:22;;;;;;;:::i;:::-;;;;;;;;14346:1;14320:37;;14329:7;14320:37;;;14350:6;14320:37;;;;;;:::i;:::-;;;;;;;;14370:48;14390:7;14407:1;14411:6;14370:19;:48::i;:::-;13900:526;13835:591;;:::o;20544:118::-;20070:8;:6;:8::i;:::-;20069:9;20061:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;20614:4:::1;20604:7;;:14;;;;;;;;;;;;;;;;;;20634:20;20641:12;:10;:12::i;:::-;20634:20;;;;;;:::i;:::-;;;;;;;;20544:118::o:0;47414:158::-;47488:7;47539:22;47543:3;:10;;47555:5;47539:3;:22::i;:::-;47531:31;;47508:56;;47414:158;;;;:::o;46943:117::-;47006:7;47033:19;47041:3;:10;;47033:7;:19::i;:::-;47026:26;;46943:117;;;:::o;65647:106::-;65705:7;65736:1;65732;:5;:13;;65744:1;65732:13;;;65740:1;65732:13;65725:20;;65647:106;;;;:::o;59808:98::-;59866:7;59897:1;59893;:5;;;;:::i;:::-;59886:12;;59808:98;;;;:::o;59451:::-;59509:7;59540:1;59536;:5;;;;:::i;:::-;59529:12;;59451:98;;;;:::o;60207:::-;60265:7;60296:1;60292;:5;;;;:::i;:::-;60285:12;;60207:98;;;;:::o;59070:::-;59128:7;59159:1;59155;:5;;;;:::i;:::-;59148:12;;59070:98;;;;:::o;40033:414::-;40096:4;40118:21;40128:3;40133:5;40118:9;:21::i;:::-;40113:327;;40156:3;:11;;40173:5;40156:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40339:3;:11;;:18;;;;40317:3;:12;;:19;40330:5;40317:19;;;;;;;;;;;:40;;;;40379:4;40372:11;;;;40113:327;40423:5;40416:12;;40033:414;;;;;:::o;30096:157::-;30181:4;30220:25;30205:40;;;:11;:40;;;;30198:47;;30096:157;;;:::o;55970:217::-;56135:44;56162:4;56168:2;56172:6;56135:26;:44::i;:::-;55970:217;;;:::o;17317:124::-;;;;:::o;33979:505::-;34068:22;34076:4;34082:7;34068;:22::i;:::-;34063:414;;34256:41;34284:7;34256:41;;34294:2;34256:19;:41::i;:::-;34370:38;34398:4;34390:13;;34405:2;34370:19;:38::i;:::-;34161:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34107:358;;;;;;;;;;;:::i;:::-;;;;;;;;34063:414;33979:505;;:::o;37985:239::-;38069:22;38077:4;38083:7;38069;:22::i;:::-;38065:152;;;38140:5;38108:6;:12;38115:4;38108:12;;;;;;;;;;;:20;;:29;38129:7;38108:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;38192:12;:10;:12::i;:::-;38165:40;;38183:7;38165:40;;38177:4;38165:40;;;;;;;;;;38065:152;37985:239;;:::o;46446:158::-;46519:4;46543:53;46551:3;:10;;46587:5;46571:23;;46563:32;;46543:7;:53::i;:::-;46536:60;;46446:158;;;;:::o;42807:120::-;42874:7;42901:3;:11;;42913:5;42901:18;;;;;;;;:::i;:::-;;;;;;;;;;42894:25;;42807:120;;;;:::o;42344:109::-;42400:7;42427:3;:11;;:18;;;;42420:25;;42344:109;;;:::o;42129:129::-;42202:4;42249:1;42226:3;:12;;:19;42239:5;42226:19;;;;;;;;;;;;:24;;42219:31;;42129:129;;;;:::o;21600:272::-;21743:44;21770:4;21776:2;21780:6;21743:26;:44::i;:::-;21809:8;:6;:8::i;:::-;21808:9;21800:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;21600:272;;;:::o;40623:1420::-;40689:4;40807:18;40828:3;:12;;:19;40841:5;40828:19;;;;;;;;;;;;40807:40;;40878:1;40864:10;:15;40860:1176;;41239:21;41276:1;41263:10;:14;;;;:::i;:::-;41239:38;;41292:17;41333:1;41312:3;:11;;:18;;;;:22;;;;:::i;:::-;41292:42;;41368:13;41355:9;:26;41351:405;;41402:17;41422:3;:11;;41434:9;41422:22;;;;;;;;:::i;:::-;;;;;;;;;;41402:42;;41576:9;41547:3;:11;;41559:13;41547:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;41687:10;41661:3;:12;;:23;41674:9;41661:23;;;;;;;;;;;:36;;;;41383:373;41351:405;41837:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41932:3;:12;;:19;41945:5;41932:19;;;;;;;;;;;41925:26;;;41975:4;41968:11;;;;;;;40860:1176;42019:5;42012:12;;;40623:1420;;;;;:::o;16588:125::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:137::-;342:5;380:6;367:20;358:29;;396:32;422:5;396:32;:::i;:::-;297:137;;;;:::o;440:139::-;486:5;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;440:139;;;;:::o;585:143::-;642:5;673:6;667:13;658:22;;689:33;716:5;689:33;:::i;:::-;585:143;;;;:::o;734:329::-;793:6;842:2;830:9;821:7;817:23;813:32;810:119;;;848:79;;:::i;:::-;810:119;968:1;993:53;1038:7;1029:6;1018:9;1014:22;993:53;:::i;:::-;983:63;;939:117;734:329;;;;:::o;1069:474::-;1137:6;1145;1194:2;1182:9;1173:7;1169:23;1165:32;1162:119;;;1200:79;;:::i;:::-;1162:119;1320:1;1345:53;1390:7;1381:6;1370:9;1366:22;1345:53;:::i;:::-;1335:63;;1291:117;1447:2;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1418:118;1069:474;;;;;:::o;1549:619::-;1626:6;1634;1642;1691:2;1679:9;1670:7;1666:23;1662:32;1659:119;;;1697:79;;:::i;:::-;1659:119;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;2072:2;2098:53;2143:7;2134:6;2123:9;2119:22;2098:53;:::i;:::-;2088:63;;2043:118;1549:619;;;;;:::o;2174:474::-;2242:6;2250;2299:2;2287:9;2278:7;2274:23;2270:32;2267:119;;;2305:79;;:::i;:::-;2267:119;2425:1;2450:53;2495:7;2486:6;2475:9;2471:22;2450:53;:::i;:::-;2440:63;;2396:117;2552:2;2578:53;2623:7;2614:6;2603:9;2599:22;2578:53;:::i;:::-;2568:63;;2523:118;2174:474;;;;;:::o;2654:329::-;2713:6;2762:2;2750:9;2741:7;2737:23;2733:32;2730:119;;;2768:79;;:::i;:::-;2730:119;2888:1;2913:53;2958:7;2949:6;2938:9;2934:22;2913:53;:::i;:::-;2903:63;;2859:117;2654:329;;;;:::o;2989:474::-;3057:6;3065;3114:2;3102:9;3093:7;3089:23;3085:32;3082:119;;;3120:79;;:::i;:::-;3082:119;3240:1;3265:53;3310:7;3301:6;3290:9;3286:22;3265:53;:::i;:::-;3255:63;;3211:117;3367:2;3393:53;3438:7;3429:6;3418:9;3414:22;3393:53;:::i;:::-;3383:63;;3338:118;2989:474;;;;;:::o;3469:::-;3537:6;3545;3594:2;3582:9;3573:7;3569:23;3565:32;3562:119;;;3600:79;;:::i;:::-;3562:119;3720:1;3745:53;3790:7;3781:6;3770:9;3766:22;3745:53;:::i;:::-;3735:63;;3691:117;3847:2;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3818:118;3469:474;;;;;:::o;3949:327::-;4007:6;4056:2;4044:9;4035:7;4031:23;4027:32;4024:119;;;4062:79;;:::i;:::-;4024:119;4182:1;4207:52;4251:7;4242:6;4231:9;4227:22;4207:52;:::i;:::-;4197:62;;4153:116;3949:327;;;;:::o;4282:329::-;4341:6;4390:2;4378:9;4369:7;4365:23;4361:32;4358:119;;;4396:79;;:::i;:::-;4358:119;4516:1;4541:53;4586:7;4577:6;4566:9;4562:22;4541:53;:::i;:::-;4531:63;;4487:117;4282:329;;;;:::o;4617:351::-;4687:6;4736:2;4724:9;4715:7;4711:23;4707:32;4704:119;;;4742:79;;:::i;:::-;4704:119;4862:1;4887:64;4943:7;4934:6;4923:9;4919:22;4887:64;:::i;:::-;4877:74;;4833:128;4617:351;;;;:::o;4974:118::-;5061:24;5079:5;5061:24;:::i;:::-;5056:3;5049:37;4974:118;;:::o;5098:109::-;5179:21;5194:5;5179:21;:::i;:::-;5174:3;5167:34;5098:109;;:::o;5213:118::-;5300:24;5318:5;5300:24;:::i;:::-;5295:3;5288:37;5213:118;;:::o;5337:173::-;5445:58;5497:5;5445:58;:::i;:::-;5440:3;5433:71;5337:173;;:::o;5516:212::-;5642:79;5662:58;5714:5;5662:58;:::i;:::-;5642:79;:::i;:::-;5637:3;5630:92;5516:212;;:::o;5734:364::-;5822:3;5850:39;5883:5;5850:39;:::i;:::-;5905:71;5969:6;5964:3;5905:71;:::i;:::-;5898:78;;5985:52;6030:6;6025:3;6018:4;6011:5;6007:16;5985:52;:::i;:::-;6062:29;6084:6;6062:29;:::i;:::-;6057:3;6053:39;6046:46;;5826:272;5734:364;;;;:::o;6104:377::-;6210:3;6238:39;6271:5;6238:39;:::i;:::-;6293:89;6375:6;6370:3;6293:89;:::i;:::-;6286:96;;6391:52;6436:6;6431:3;6424:4;6417:5;6413:16;6391:52;:::i;:::-;6468:6;6463:3;6459:16;6452:23;;6214:267;6104:377;;;;:::o;6487:366::-;6629:3;6650:67;6714:2;6709:3;6650:67;:::i;:::-;6643:74;;6726:93;6815:3;6726:93;:::i;:::-;6844:2;6839:3;6835:12;6828:19;;6487:366;;;:::o;6859:::-;7001:3;7022:67;7086:2;7081:3;7022:67;:::i;:::-;7015:74;;7098:93;7187:3;7098:93;:::i;:::-;7216:2;7211:3;7207:12;7200:19;;6859:366;;;:::o;7231:::-;7373:3;7394:67;7458:2;7453:3;7394:67;:::i;:::-;7387:74;;7470:93;7559:3;7470:93;:::i;:::-;7588:2;7583:3;7579:12;7572:19;;7231:366;;;:::o;7603:::-;7745:3;7766:67;7830:2;7825:3;7766:67;:::i;:::-;7759:74;;7842:93;7931:3;7842:93;:::i;:::-;7960:2;7955:3;7951:12;7944:19;;7603:366;;;:::o;7975:::-;8117:3;8138:67;8202:2;8197:3;8138:67;:::i;:::-;8131:74;;8214:93;8303:3;8214:93;:::i;:::-;8332:2;8327:3;8323:12;8316:19;;7975:366;;;:::o;8347:::-;8489:3;8510:67;8574:2;8569:3;8510:67;:::i;:::-;8503:74;;8586:93;8675:3;8586:93;:::i;:::-;8704:2;8699:3;8695:12;8688:19;;8347:366;;;:::o;8719:::-;8861:3;8882:67;8946:2;8941:3;8882:67;:::i;:::-;8875:74;;8958:93;9047:3;8958:93;:::i;:::-;9076:2;9071:3;9067:12;9060:19;;8719:366;;;:::o;9091:::-;9233:3;9254:67;9318:2;9313:3;9254:67;:::i;:::-;9247:74;;9330:93;9419:3;9330:93;:::i;:::-;9448:2;9443:3;9439:12;9432:19;;9091:366;;;:::o;9463:::-;9605:3;9626:67;9690:2;9685:3;9626:67;:::i;:::-;9619:74;;9702:93;9791:3;9702:93;:::i;:::-;9820:2;9815:3;9811:12;9804:19;;9463:366;;;:::o;9835:::-;9977:3;9998:67;10062:2;10057:3;9998:67;:::i;:::-;9991:74;;10074:93;10163:3;10074:93;:::i;:::-;10192:2;10187:3;10183:12;10176:19;;9835:366;;;:::o;10207:::-;10349:3;10370:67;10434:2;10429:3;10370:67;:::i;:::-;10363:74;;10446:93;10535:3;10446:93;:::i;:::-;10564:2;10559:3;10555:12;10548:19;;10207:366;;;:::o;10579:::-;10721:3;10742:67;10806:2;10801:3;10742:67;:::i;:::-;10735:74;;10818:93;10907:3;10818:93;:::i;:::-;10936:2;10931:3;10927:12;10920:19;;10579:366;;;:::o;10951:::-;11093:3;11114:67;11178:2;11173:3;11114:67;:::i;:::-;11107:74;;11190:93;11279:3;11190:93;:::i;:::-;11308:2;11303:3;11299:12;11292:19;;10951:366;;;:::o;11323:::-;11465:3;11486:67;11550:2;11545:3;11486:67;:::i;:::-;11479:74;;11562:93;11651:3;11562:93;:::i;:::-;11680:2;11675:3;11671:12;11664:19;;11323:366;;;:::o;11695:::-;11837:3;11858:67;11922:2;11917:3;11858:67;:::i;:::-;11851:74;;11934:93;12023:3;11934:93;:::i;:::-;12052:2;12047:3;12043:12;12036:19;;11695:366;;;:::o;12067:::-;12209:3;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12306:93;12395:3;12306:93;:::i;:::-;12424:2;12419:3;12415:12;12408:19;;12067:366;;;:::o;12439:::-;12581:3;12602:67;12666:2;12661:3;12602:67;:::i;:::-;12595:74;;12678:93;12767:3;12678:93;:::i;:::-;12796:2;12791:3;12787:12;12780:19;;12439:366;;;:::o;12811:::-;12953:3;12974:67;13038:2;13033:3;12974:67;:::i;:::-;12967:74;;13050:93;13139:3;13050:93;:::i;:::-;13168:2;13163:3;13159:12;13152:19;;12811:366;;;:::o;13183:402::-;13343:3;13364:85;13446:2;13441:3;13364:85;:::i;:::-;13357:92;;13458:93;13547:3;13458:93;:::i;:::-;13576:2;13571:3;13567:12;13560:19;;13183:402;;;:::o;13591:366::-;13733:3;13754:67;13818:2;13813:3;13754:67;:::i;:::-;13747:74;;13830:93;13919:3;13830:93;:::i;:::-;13948:2;13943:3;13939:12;13932:19;;13591:366;;;:::o;13963:::-;14105:3;14126:67;14190:2;14185:3;14126:67;:::i;:::-;14119:74;;14202:93;14291:3;14202:93;:::i;:::-;14320:2;14315:3;14311:12;14304:19;;13963:366;;;:::o;14335:402::-;14495:3;14516:85;14598:2;14593:3;14516:85;:::i;:::-;14509:92;;14610:93;14699:3;14610:93;:::i;:::-;14728:2;14723:3;14719:12;14712:19;;14335:402;;;:::o;14743:366::-;14885:3;14906:67;14970:2;14965:3;14906:67;:::i;:::-;14899:74;;14982:93;15071:3;14982:93;:::i;:::-;15100:2;15095:3;15091:12;15084:19;;14743:366;;;:::o;15115:::-;15257:3;15278:67;15342:2;15337:3;15278:67;:::i;:::-;15271:74;;15354:93;15443:3;15354:93;:::i;:::-;15472:2;15467:3;15463:12;15456:19;;15115:366;;;:::o;15487:::-;15629:3;15650:67;15714:2;15709:3;15650:67;:::i;:::-;15643:74;;15726:93;15815:3;15726:93;:::i;:::-;15844:2;15839:3;15835:12;15828:19;;15487:366;;;:::o;15859:118::-;15946:24;15964:5;15946:24;:::i;:::-;15941:3;15934:37;15859:118;;:::o;15983:112::-;16066:22;16082:5;16066:22;:::i;:::-;16061:3;16054:35;15983:112;;:::o;16101:298::-;16234:3;16249:96;16341:3;16332:6;16249:96;:::i;:::-;16370:2;16365:3;16361:12;16354:19;;16390:3;16383:10;;16101:298;;;;:::o;16405:967::-;16787:3;16809:148;16953:3;16809:148;:::i;:::-;16802:155;;16974:95;17065:3;17056:6;16974:95;:::i;:::-;16967:102;;17086:148;17230:3;17086:148;:::i;:::-;17079:155;;17251:95;17342:3;17333:6;17251:95;:::i;:::-;17244:102;;17363:3;17356:10;;16405:967;;;;;:::o;17378:222::-;17471:4;17509:2;17498:9;17494:18;17486:26;;17522:71;17590:1;17579:9;17575:17;17566:6;17522:71;:::i;:::-;17378:222;;;;:::o;17606:210::-;17693:4;17731:2;17720:9;17716:18;17708:26;;17744:65;17806:1;17795:9;17791:17;17782:6;17744:65;:::i;:::-;17606:210;;;;:::o;17822:222::-;17915:4;17953:2;17942:9;17938:18;17930:26;;17966:71;18034:1;18023:9;18019:17;18010:6;17966:71;:::i;:::-;17822:222;;;;:::o;18050:264::-;18164:4;18202:2;18191:9;18187:18;18179:26;;18215:92;18304:1;18293:9;18289:17;18280:6;18215:92;:::i;:::-;18050:264;;;;:::o;18320:313::-;18433:4;18471:2;18460:9;18456:18;18448:26;;18520:9;18514:4;18510:20;18506:1;18495:9;18491:17;18484:47;18548:78;18621:4;18612:6;18548:78;:::i;:::-;18540:86;;18320:313;;;;:::o;18639:419::-;18805:4;18843:2;18832:9;18828:18;18820:26;;18892:9;18886:4;18882:20;18878:1;18867:9;18863:17;18856:47;18920:131;19046:4;18920:131;:::i;:::-;18912:139;;18639:419;;;:::o;19064:::-;19230:4;19268:2;19257:9;19253:18;19245:26;;19317:9;19311:4;19307:20;19303:1;19292:9;19288:17;19281:47;19345:131;19471:4;19345:131;:::i;:::-;19337:139;;19064:419;;;:::o;19489:::-;19655:4;19693:2;19682:9;19678:18;19670:26;;19742:9;19736:4;19732:20;19728:1;19717:9;19713:17;19706:47;19770:131;19896:4;19770:131;:::i;:::-;19762:139;;19489:419;;;:::o;19914:::-;20080:4;20118:2;20107:9;20103:18;20095:26;;20167:9;20161:4;20157:20;20153:1;20142:9;20138:17;20131:47;20195:131;20321:4;20195:131;:::i;:::-;20187:139;;19914:419;;;:::o;20339:::-;20505:4;20543:2;20532:9;20528:18;20520:26;;20592:9;20586:4;20582:20;20578:1;20567:9;20563:17;20556:47;20620:131;20746:4;20620:131;:::i;:::-;20612:139;;20339:419;;;:::o;20764:::-;20930:4;20968:2;20957:9;20953:18;20945:26;;21017:9;21011:4;21007:20;21003:1;20992:9;20988:17;20981:47;21045:131;21171:4;21045:131;:::i;:::-;21037:139;;20764:419;;;:::o;21189:::-;21355:4;21393:2;21382:9;21378:18;21370:26;;21442:9;21436:4;21432:20;21428:1;21417:9;21413:17;21406:47;21470:131;21596:4;21470:131;:::i;:::-;21462:139;;21189:419;;;:::o;21614:::-;21780:4;21818:2;21807:9;21803:18;21795:26;;21867:9;21861:4;21857:20;21853:1;21842:9;21838:17;21831:47;21895:131;22021:4;21895:131;:::i;:::-;21887:139;;21614:419;;;:::o;22039:::-;22205:4;22243:2;22232:9;22228:18;22220:26;;22292:9;22286:4;22282:20;22278:1;22267:9;22263:17;22256:47;22320:131;22446:4;22320:131;:::i;:::-;22312:139;;22039:419;;;:::o;22464:::-;22630:4;22668:2;22657:9;22653:18;22645:26;;22717:9;22711:4;22707:20;22703:1;22692:9;22688:17;22681:47;22745:131;22871:4;22745:131;:::i;:::-;22737:139;;22464:419;;;:::o;22889:::-;23055:4;23093:2;23082:9;23078:18;23070:26;;23142:9;23136:4;23132:20;23128:1;23117:9;23113:17;23106:47;23170:131;23296:4;23170:131;:::i;:::-;23162:139;;22889:419;;;:::o;23314:::-;23480:4;23518:2;23507:9;23503:18;23495:26;;23567:9;23561:4;23557:20;23553:1;23542:9;23538:17;23531:47;23595:131;23721:4;23595:131;:::i;:::-;23587:139;;23314:419;;;:::o;23739:::-;23905:4;23943:2;23932:9;23928:18;23920:26;;23992:9;23986:4;23982:20;23978:1;23967:9;23963:17;23956:47;24020:131;24146:4;24020:131;:::i;:::-;24012:139;;23739:419;;;:::o;24164:::-;24330:4;24368:2;24357:9;24353:18;24345:26;;24417:9;24411:4;24407:20;24403:1;24392:9;24388:17;24381:47;24445:131;24571:4;24445:131;:::i;:::-;24437:139;;24164:419;;;:::o;24589:::-;24755:4;24793:2;24782:9;24778:18;24770:26;;24842:9;24836:4;24832:20;24828:1;24817:9;24813:17;24806:47;24870:131;24996:4;24870:131;:::i;:::-;24862:139;;24589:419;;;:::o;25014:::-;25180:4;25218:2;25207:9;25203:18;25195:26;;25267:9;25261:4;25257:20;25253:1;25242:9;25238:17;25231:47;25295:131;25421:4;25295:131;:::i;:::-;25287:139;;25014:419;;;:::o;25439:::-;25605:4;25643:2;25632:9;25628:18;25620:26;;25692:9;25686:4;25682:20;25678:1;25667:9;25663:17;25656:47;25720:131;25846:4;25720:131;:::i;:::-;25712:139;;25439:419;;;:::o;25864:::-;26030:4;26068:2;26057:9;26053:18;26045:26;;26117:9;26111:4;26107:20;26103:1;26092:9;26088:17;26081:47;26145:131;26271:4;26145:131;:::i;:::-;26137:139;;25864:419;;;:::o;26289:::-;26455:4;26493:2;26482:9;26478:18;26470:26;;26542:9;26536:4;26532:20;26528:1;26517:9;26513:17;26506:47;26570:131;26696:4;26570:131;:::i;:::-;26562:139;;26289:419;;;:::o;26714:::-;26880:4;26918:2;26907:9;26903:18;26895:26;;26967:9;26961:4;26957:20;26953:1;26942:9;26938:17;26931:47;26995:131;27121:4;26995:131;:::i;:::-;26987:139;;26714:419;;;:::o;27139:::-;27305:4;27343:2;27332:9;27328:18;27320:26;;27392:9;27386:4;27382:20;27378:1;27367:9;27363:17;27356:47;27420:131;27546:4;27420:131;:::i;:::-;27412:139;;27139:419;;;:::o;27564:::-;27730:4;27768:2;27757:9;27753:18;27745:26;;27817:9;27811:4;27807:20;27803:1;27792:9;27788:17;27781:47;27845:131;27971:4;27845:131;:::i;:::-;27837:139;;27564:419;;;:::o;27989:::-;28155:4;28193:2;28182:9;28178:18;28170:26;;28242:9;28236:4;28232:20;28228:1;28217:9;28213:17;28206:47;28270:131;28396:4;28270:131;:::i;:::-;28262:139;;27989:419;;;:::o;28414:222::-;28507:4;28545:2;28534:9;28530:18;28522:26;;28558:71;28626:1;28615:9;28611:17;28602:6;28558:71;:::i;:::-;28414:222;;;;:::o;28642:214::-;28731:4;28769:2;28758:9;28754:18;28746:26;;28782:67;28846:1;28835:9;28831:17;28822:6;28782:67;:::i;:::-;28642:214;;;;:::o;28943:99::-;28995:6;29029:5;29023:12;29013:22;;28943:99;;;:::o;29048:169::-;29132:11;29166:6;29161:3;29154:19;29206:4;29201:3;29197:14;29182:29;;29048:169;;;;:::o;29223:148::-;29325:11;29362:3;29347:18;;29223:148;;;;:::o;29377:305::-;29417:3;29436:20;29454:1;29436:20;:::i;:::-;29431:25;;29470:20;29488:1;29470:20;:::i;:::-;29465:25;;29624:1;29556:66;29552:74;29549:1;29546:81;29543:107;;;29630:18;;:::i;:::-;29543:107;29674:1;29671;29667:9;29660:16;;29377:305;;;;:::o;29688:185::-;29728:1;29745:20;29763:1;29745:20;:::i;:::-;29740:25;;29779:20;29797:1;29779:20;:::i;:::-;29774:25;;29818:1;29808:35;;29823:18;;:::i;:::-;29808:35;29865:1;29862;29858:9;29853:14;;29688:185;;;;:::o;29879:348::-;29919:7;29942:20;29960:1;29942:20;:::i;:::-;29937:25;;29976:20;29994:1;29976:20;:::i;:::-;29971:25;;30164:1;30096:66;30092:74;30089:1;30086:81;30081:1;30074:9;30067:17;30063:105;30060:131;;;30171:18;;:::i;:::-;30060:131;30219:1;30216;30212:9;30201:20;;29879:348;;;;:::o;30233:191::-;30273:4;30293:20;30311:1;30293:20;:::i;:::-;30288:25;;30327:20;30345:1;30327:20;:::i;:::-;30322:25;;30366:1;30363;30360:8;30357:34;;;30371:18;;:::i;:::-;30357:34;30416:1;30413;30409:9;30401:17;;30233:191;;;;:::o;30430:96::-;30467:7;30496:24;30514:5;30496:24;:::i;:::-;30485:35;;30430:96;;;:::o;30532:90::-;30566:7;30609:5;30602:13;30595:21;30584:32;;30532:90;;;:::o;30628:77::-;30665:7;30694:5;30683:16;;30628:77;;;:::o;30711:149::-;30747:7;30787:66;30780:5;30776:78;30765:89;;30711:149;;;:::o;30866:126::-;30903:7;30943:42;30936:5;30932:54;30921:65;;30866:126;;;:::o;30998:77::-;31035:7;31064:5;31053:16;;30998:77;;;:::o;31081:86::-;31116:7;31156:4;31149:5;31145:16;31134:27;;31081:86;;;:::o;31173:147::-;31244:9;31277:37;31308:5;31277:37;:::i;:::-;31264:50;;31173:147;;;:::o;31326:126::-;31376:9;31409:37;31440:5;31409:37;:::i;:::-;31396:50;;31326:126;;;:::o;31458:113::-;31508:9;31541:24;31559:5;31541:24;:::i;:::-;31528:37;;31458:113;;;:::o;31577:307::-;31645:1;31655:113;31669:6;31666:1;31663:13;31655:113;;;31754:1;31749:3;31745:11;31739:18;31735:1;31730:3;31726:11;31719:39;31691:2;31688:1;31684:10;31679:15;;31655:113;;;31786:6;31783:1;31780:13;31777:101;;;31866:1;31857:6;31852:3;31848:16;31841:27;31777:101;31626:258;31577:307;;;:::o;31890:171::-;31929:3;31952:24;31970:5;31952:24;:::i;:::-;31943:33;;31998:4;31991:5;31988:15;31985:41;;;32006:18;;:::i;:::-;31985:41;32053:1;32046:5;32042:13;32035:20;;31890:171;;;:::o;32067:320::-;32111:6;32148:1;32142:4;32138:12;32128:22;;32195:1;32189:4;32185:12;32216:18;32206:81;;32272:4;32264:6;32260:17;32250:27;;32206:81;32334:2;32326:6;32323:14;32303:18;32300:38;32297:84;;;32353:18;;:::i;:::-;32297:84;32118:269;32067:320;;;:::o;32393:233::-;32432:3;32455:24;32473:5;32455:24;:::i;:::-;32446:33;;32501:66;32494:5;32491:77;32488:103;;;32571:18;;:::i;:::-;32488:103;32618:1;32611:5;32607:13;32600:20;;32393:233;;;:::o;32632:100::-;32671:7;32700:26;32720:5;32700:26;:::i;:::-;32689:37;;32632:100;;;:::o;32738:94::-;32777:7;32806:20;32820:5;32806:20;:::i;:::-;32795:31;;32738:94;;;:::o;32838:180::-;32886:77;32883:1;32876:88;32983:4;32980:1;32973:15;33007:4;33004:1;32997:15;33024:180;33072:77;33069:1;33062:88;33169:4;33166:1;33159:15;33193:4;33190:1;33183:15;33210:180;33258:77;33255:1;33248:88;33355:4;33352:1;33345:15;33379:4;33376:1;33369:15;33396:180;33444:77;33441:1;33434:88;33541:4;33538:1;33531:15;33565:4;33562:1;33555:15;33582:180;33630:77;33627:1;33620:88;33727:4;33724:1;33717:15;33751:4;33748:1;33741:15;33768:180;33816:77;33813:1;33806:88;33913:4;33910:1;33903:15;33937:4;33934:1;33927:15;34077:117;34186:1;34183;34176:12;34200:102;34241:6;34292:2;34288:7;34283:2;34276:5;34272:14;34268:28;34258:38;;34200:102;;;:::o;34308:94::-;34341:8;34389:5;34385:2;34381:14;34360:35;;34308:94;;;:::o;34408:182::-;34548:34;34544:1;34536:6;34532:14;34525:58;34408:182;:::o;34596:222::-;34736:34;34732:1;34724:6;34720:14;34713:58;34805:5;34800:2;34792:6;34788:15;34781:30;34596:222;:::o;34824:170::-;34964:22;34960:1;34952:6;34948:14;34941:46;34824:170;:::o;35000:221::-;35140:34;35136:1;35128:6;35124:14;35117:58;35209:4;35204:2;35196:6;35192:15;35185:29;35000:221;:::o;35227:244::-;35367:34;35363:1;35355:6;35351:14;35344:58;35436:27;35431:2;35423:6;35419:15;35412:52;35227:244;:::o;35477:221::-;35617:34;35613:1;35605:6;35601:14;35594:58;35686:4;35681:2;35673:6;35669:15;35662:29;35477:221;:::o;35704:179::-;35844:31;35840:1;35832:6;35828:14;35821:55;35704:179;:::o;35889:225::-;36029:34;36025:1;36017:6;36013:14;36006:58;36098:8;36093:2;36085:6;36081:15;36074:33;35889:225;:::o;36120:166::-;36260:18;36256:1;36248:6;36244:14;36237:42;36120:166;:::o;36292:::-;36432:18;36428:1;36420:6;36416:14;36409:42;36292:166;:::o;36464:180::-;36604:32;36600:1;36592:6;36588:14;36581:56;36464:180;:::o;36650:161::-;36790:13;36786:1;36778:6;36774:14;36767:37;36650:161;:::o;36817:241::-;36957:34;36953:1;36945:6;36941:14;36934:58;37026:24;37021:2;37013:6;37009:15;37002:49;36817:241;:::o;37064:220::-;37204:34;37200:1;37192:6;37188:14;37181:58;37273:3;37268:2;37260:6;37256:15;37249:28;37064:220;:::o;37290:224::-;37430:34;37426:1;37418:6;37414:14;37407:58;37499:7;37494:2;37486:6;37482:15;37475:32;37290:224;:::o;37520:179::-;37660:31;37656:1;37648:6;37644:14;37637:55;37520:179;:::o;37705:223::-;37845:34;37841:1;37833:6;37829:14;37822:58;37914:6;37909:2;37901:6;37897:15;37890:31;37705:223;:::o;37934:242::-;38074:34;38070:1;38062:6;38058:14;38051:58;38143:25;38138:2;38130:6;38126:15;38119:50;37934:242;:::o;38182:173::-;38322:25;38318:1;38310:6;38306:14;38299:49;38182:173;:::o;38361:160::-;38501:12;38497:1;38489:6;38485:14;38478:36;38361:160;:::o;38527:224::-;38667:34;38663:1;38655:6;38651:14;38644:58;38736:7;38731:2;38723:6;38719:15;38712:32;38527:224;:::o;38757:167::-;38897:19;38893:1;38885:6;38881:14;38874:43;38757:167;:::o;38930:234::-;39070:34;39066:1;39058:6;39054:14;39047:58;39139:17;39134:2;39126:6;39122:15;39115:42;38930:234;:::o;39170:181::-;39310:33;39306:1;39298:6;39294:14;39287:57;39170:181;:::o;39357:229::-;39497:34;39493:1;39485:6;39481:14;39474:58;39566:12;39561:2;39553:6;39549:15;39542:37;39357:229;:::o;39592:122::-;39665:24;39683:5;39665:24;:::i;:::-;39658:5;39655:35;39645:63;;39704:1;39701;39694:12;39645:63;39592:122;:::o;39720:::-;39793:24;39811:5;39793:24;:::i;:::-;39786:5;39783:35;39773:63;;39832:1;39829;39822:12;39773:63;39720:122;:::o;39848:120::-;39920:23;39937:5;39920:23;:::i;:::-;39913:5;39910:34;39900:62;;39958:1;39955;39948:12;39900:62;39848:120;:::o;39974:122::-;40047:24;40065:5;40047:24;:::i;:::-;40040:5;40037:35;40027:63;;40086:1;40083;40076:12;40027:63;39974:122;:::o

Swarm Source

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