MATIC Price: $0.685639 (-3.56%)
Gas: 33 GWei
 

Overview

Max Total Supply

218,711,587.420965863561050499 Deod

Holders

11,963 (0.00%)

Market

Price

$0.01 @ 0.014065 MATIC (-14.93%)

Onchain Market Cap

$2,109,136.44

Circulating Supply Market Cap

$1,045,169.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
43.00144 Deod

Value
$0.41 ( ~0.59798261036515 MATIC) [0.0000%]
0x0794e62414836d973e2ced6ce06b4a8fd277d314
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

It Is the Decentralised platfrom For Entertainment, where users Can create Contents Own it and Earn

Market

Volume (24H):$188,272.00
Market Capitalization:$1,045,169.00
Circulating Supply:108,579,059.00 Deod
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
Decentrawood

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at polygonscan.com on 2022-10-17
*/

// SPDX-License-Identifier: GNU GENERAL PUBLIC LICENSE V3

// OpenZeppelin Contracts v4.4.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 substraction 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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;
    }
}


pragma solidity ^0.8.0;



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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */


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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol

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

pragma solidity ^0.8.0;



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



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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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,Ownable {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;
    uint256 private _maxTotalSupply;

    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_,
        uint256 maxTotalSupply_
    ) {
        _name = name_;
        _symbol = symbol_;
        _maxTotalSupply = maxTotalSupply_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _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;
        require(
            _totalSupply <= _maxTotalSupply,
            "ERC20: minting amount exceeds max total supply"
        );
        _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 {}
}

pragma solidity >=0.7.0 <0.9.0;

contract Decentrawood is ERC20 {
    using SafeMath for uint256;

    uint256 public allotmentCount;
    uint256 public maxTotalSupply = 2000000000 * 10**18;
    uint256 public maxAllotmentByAdmin = maxTotalSupply.mul(10).div(100);
    uint256 public totalAllotmentByAdmin;
    uint256 public maxAllotmentByMarketingTeam = maxTotalSupply.mul(10).div(100);
    uint256 public totalAllotmentByMarketingTeam;
    uint256 public maxAllotmentByDevelopmentTeam = maxTotalSupply.mul(10).div(100);
    uint256 public totalAllotmentByDevelopmentTeam;
    uint256 public maxAllotmentByStrategicAllianceTeam = maxTotalSupply.mul(10).div(100);
    uint256 public totalAllotmentByStrategicAllianceTeam;
    uint256 public maxPublicSupply = maxTotalSupply.mul(55).div(100);
    uint256 public totalAllotmentToPublic;
    uint256 public airdropTokenAmount = maxTotalSupply.mul(1).div(100); 
    uint256 public liquidityTokenAmount = maxTotalSupply.mul(4).div(100); 

    uint256 public totalTokensAllotedTillDate;
    uint256 public currentMillion;
    uint256 public rate;

    address public constant admin = 0x418084C5E6a34790c954D45Fc8eB8524a540E860;
    address public constant marketingTeamAddress = 0xde5222980234799300DD7f6D324E10435D1bD692;
    address public constant developmentTeamAddress = 0xF9dAF9cC3835b78591f09b22FDC6F552D9aE6E76;
    address public constant strategicAllianceTeamAddress = 0xd4E7371E22F1DdEca24b797473F6CBCfB0CA4BB0;
    address public constant airdropWalletAddress = 0x4A8CA6F4e245a3573A88Fbe5925F445BC1724419;
    address public constant liquidityWalletAddress = 0xcF6418116002B1e5681Cd3279aAB579E53742910;
    address public constant deadAddress = 0x000000000000000000000000000000000000dEaD;

    uint256[] public REFERRAL_PERCENTS = [100, 20, 20, 20, 20, 20];
    uint256 public constant PERCENTS_DIVIDER = 1000; 
    uint256 public totalPendingReferalWithdrawalAmount;

    IERC20 USDT = IERC20(0xc2132D05D31c914a87C6611C10748AEb04B58e8F);

    struct Allotment {
        uint256 allotmentID;
        address referedTo;
        address userAddress;
        uint256 startTime;
        uint256 tokenAlloted;
    }

    struct Referal {
        uint256[] referalIds;
        address referrer;
        uint256[6] levels;
        uint256 amount;
    }

    mapping(address => Referal) internal referals;
    mapping(address => uint256[]) public userReferalIds;
    mapping(address => uint256) public userReferalCount;
    mapping(uint256 => Allotment) public allotments;
    mapping(address => uint256) public userAllotmentCount;
    mapping(address => uint256[]) public userAllotmentIds;
    mapping(address => uint256) public totalTokensPurchased;
    mapping(address => uint256) public userMintedBalance;

    modifier onlyAdmin() {
        require(admin == msg.sender, "ONLY_ADMIN_CAN_EXECUTE_THIS_FUNCTION");
        _;
    }

    modifier onlyMarketingTeam() {
        require(
            marketingTeamAddress == msg.sender,
            "ONLY_MARKETING_TEAM_CAN_EXECUTE_THIS_FUNCTION"
        );
        _;
    }

    modifier onlyDevelopmentTeam() {
        require(
            developmentTeamAddress == msg.sender,
            "ONLY_DEVELOPMENT_TEAM_CAN_EXECUTE_THIS_FUNCTION"
        );
        _;
    }

    modifier onlyStrategicAllianceTeam() {
        require(
            strategicAllianceTeamAddress == msg.sender,
            "ONLY_STRATEGIC_ALLIANCE_TEAM_CAN_EXECUTE_THIS_FUNCTION"
        );
        _;
    }

    constructor() ERC20("Decentrawood", "Deod", maxTotalSupply) {
        _mint(airdropWalletAddress, airdropTokenAmount);
        _mint(liquidityWalletAddress, liquidityTokenAmount);
        rate = 400; 
    }

    // Function for admin to allot tokens to certain address
    function allotmentByAdmin(address _address, uint256 _amount)
        public
        onlyAdmin
    {
        totalAllotmentByAdmin = totalAllotmentByAdmin.add(_amount);
        require(totalAllotmentByAdmin <= maxAllotmentByAdmin,"MAX_ADMIN_ALLOTMENT_REACHED");
        allotmentCount = allotmentCount + 1;
        Allotment memory alt = Allotment(allotmentCount, deadAddress, _address, block.timestamp, _amount
        );
        allotments[allotmentCount] = alt;
        totalTokensPurchased[_address] = totalTokensPurchased[_address].add(_amount);
        userAllotmentIds[_address].push(allotmentCount);
        
    }

    // Function for marketing team to allot tokens to certain address
    function allotmentByMarketingTeam(address _address, uint256 _amount)
        public
        onlyMarketingTeam
    {
        totalAllotmentByMarketingTeam = totalAllotmentByMarketingTeam.add(_amount);
        require(totalAllotmentByMarketingTeam <= maxAllotmentByMarketingTeam,"MAX_MARKETING_TEAM_ALLOTMENT_REACHED");
        allotmentCount = allotmentCount + 1;
        Allotment memory alt = Allotment(allotmentCount,deadAddress,_address,block.timestamp,_amount);
        allotments[allotmentCount] = alt;
        totalTokensPurchased[_address] = totalTokensPurchased[_address].add(_amount);
        userAllotmentIds[_address].push(allotmentCount);
    }

    // Function for development team to allot tokens to certain address
    function allotmentByDevelopmentTeam(address _address, uint256 _amount)
        public
        onlyDevelopmentTeam
    {
        totalAllotmentByDevelopmentTeam = totalAllotmentByDevelopmentTeam.add(_amount);
        require(totalAllotmentByDevelopmentTeam <= maxAllotmentByDevelopmentTeam,"MAX_DEVELOPMENT_TEAM_ALLOTMENT_REACHED");
        allotmentCount = allotmentCount + 1;
        Allotment memory alt = Allotment(allotmentCount,deadAddress,_address,block.timestamp,_amount);
        allotments[allotmentCount] = alt;
        totalTokensPurchased[_address] = totalTokensPurchased[_address].add(_amount);
        userAllotmentIds[_address].push(allotmentCount);
    }

    // Function for Strategic Alliance Team to allot tokens to certain address
    function allotmentByStrategicAllianceTeam(address _address, uint256 _amount)
        public
        onlyStrategicAllianceTeam
    {
        totalAllotmentByStrategicAllianceTeam = totalAllotmentByStrategicAllianceTeam.add(_amount);
        require(totalAllotmentByStrategicAllianceTeam <=maxAllotmentByStrategicAllianceTeam,
            "MAX_STRATEGIC_ALLIANCE_TEAM_ALLOTMENT_REACHED");
        allotmentCount = allotmentCount + 1;
        Allotment memory alt = Allotment(allotmentCount,deadAddress,_address,block.timestamp,_amount);
        allotments[allotmentCount] = alt;
        totalTokensPurchased[_address] = totalTokensPurchased[_address].add(_amount);
        userAllotmentIds[_address].push(allotmentCount);
    }

    function getTokenAllotment(
        address _address,
        address _referedTo,
        uint256 _amount
    ) internal {
        totalAllotmentToPublic = totalAllotmentToPublic.add(_amount);
        require(
            totalAllotmentToPublic <= maxPublicSupply,
            "MAX_PUBLIC_SUPPLY_REACHED"
        );
        allotmentCount = allotmentCount + 1;
        Allotment memory alt = Allotment(
            allotmentCount,
            _referedTo,
            _address,
            block.timestamp,
            _amount
        );
        allotments[allotmentCount] = alt;
        totalTokensPurchased[_address] = totalTokensPurchased[_address].add(
            _amount
        );
        userAllotmentIds[_address].push(allotmentCount);
        userAllotmentCount[_address] = userAllotmentCount[_address] + 1;
        totalTokensAllotedTillDate = totalTokensAllotedTillDate.add(_amount);
    }

    function buyToken(uint256 _amount, address referrer) public {
        uint256 halfUSDT = _amount.mul(50).div(100);

        USDT.transferFrom(msg.sender, liquidityWalletAddress, halfUSDT);
        USDT.transferFrom(msg.sender, admin, halfUSDT);

        uint256 tokenAmount = _amount.mul(rate) * 10**12;

        getTokenAllotment(msg.sender, deadAddress, tokenAmount);

        Referal storage ref = referals[msg.sender];

        if (ref.referrer == address(0)) {
            if (
                referals[referrer].referalIds.length > 0 &&
                referrer != msg.sender
            ) {
                ref.referrer = referrer;
            }

            address upline = ref.referrer;
            for (uint256 i = 0; i < 6; i++) {
                if (upline != address(0)) {
                    referals[upline].levels[i] = referals[upline].levels[i].add(
                        1
                    );
                    upline = referals[upline].referrer;
                } else break;
            }
        }

        if (ref.referrer != address(0)) {
            address upline = ref.referrer;
            for (uint256 i = 0; i < 6; i++) {
                if (upline != address(0)) {
                    uint256 amount = tokenAmount.mul(REFERRAL_PERCENTS[i]).div(
                        PERCENTS_DIVIDER
                    );
                    getTokenAllotment(upline, msg.sender, amount);
                    userReferalCount[upline] = userReferalCount[upline] + 1;
                    userReferalIds[upline].push(allotmentCount);
                    upline = referals[upline].referrer;
                } else break;
            }
        }

        ref.referalIds.push(allotmentCount);
        uint256 newCurrentMillion = totalTokensAllotedTillDate.div(
            1000000 * 10**18
        );
        uint256 millionDifference = newCurrentMillion.sub(currentMillion);

        // Increment Price
        if (millionDifference >= 1) {
            rate = rate.sub(rate.mul(millionDifference).div(100));
            currentMillion = newCurrentMillion;
        }
    }

    // Function to get tokens available for minting for given address
    function tokensAvaliableForMinting(address _address)
        public
        view
        returns (uint256)
    {
        uint256 balance = 0;
        for (uint256 i = 0; i < userAllotmentIds[_address].length; i++) {
            uint256 numberOfDays = (
                block.timestamp.sub(
                    allotments[userAllotmentIds[_address][i]].startTime
                )
            ).div(1 days);
            if (numberOfDays <= 365) {
                // 1st Year
                uint256 firstYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(40).div(100);
                uint256 oneDayAllotment = firstYearAllotment.div(365);
                balance = balance + numberOfDays.mul(oneDayAllotment);
            } else if (numberOfDays > 365 && numberOfDays <= 730) {
                // 2nd Year
                uint256 firstYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(40).div(100);
                uint256 secondYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(30).div(100);
                uint256 oneDayAllotment = secondYearAllotment.div(365);
                balance =
                    balance +
                    firstYearAllotment.add(
                        numberOfDays.sub(365).mul(oneDayAllotment)
                    );
            } else if (numberOfDays > 730 && numberOfDays <= 1095) {
                // 3rd Year
                uint256 firstYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(40).div(100);
                uint256 secondYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(30).div(100);
                uint256 thirdYearAllotment = (
                    allotments[userAllotmentIds[_address][i]].tokenAlloted
                ).mul(30).div(100);
                uint256 oneDayAllotment = thirdYearAllotment.div(365);
                balance =
                    balance +
                    firstYearAllotment.add(secondYearAllotment).add(
                        numberOfDays.sub(730).mul(oneDayAllotment)
                    );
            } else {
                balance =
                    balance +
                    allotments[userAllotmentIds[_address][i]].tokenAlloted;
            }
        }

        return balance.sub(userMintedBalance[_address]);
    }

    // Function for users to claim the alloted tokens
    function claimTokens() public {
        _mint(msg.sender, tokensAvaliableForMinting(msg.sender));
        userMintedBalance[msg.sender] = userMintedBalance[msg.sender] + tokensAvaliableForMinting(msg.sender);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PERCENTS_DIVIDER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"REFERRAL_PERCENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"allotmentByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"allotmentByDevelopmentTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"allotmentByMarketingTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"allotmentByStrategicAllianceTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allotmentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allotments","outputs":[{"internalType":"uint256","name":"allotmentID","type":"uint256"},{"internalType":"address","name":"referedTo","type":"address"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tokenAlloted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"_amount","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentTeamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTeamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllotmentByAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllotmentByDevelopmentTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllotmentByMarketingTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllotmentByStrategicAllianceTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategicAllianceTeamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"tokensAvaliableForMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllotmentByAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllotmentByDevelopmentTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllotmentByMarketingTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllotmentByStrategicAllianceTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllotmentToPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPendingReferalWithdrawalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensAllotedTillDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalTokensPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userAllotmentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userAllotmentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userReferalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userReferalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526b06765c793fa10079d00000006008556200004b606462000037600a6008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b60095562000085606462000071600a6008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b600b55620000bf6064620000ab600a6008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b600d55620000f96064620000e5600a6008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b600f556200013360646200011f60376008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b6011556200016d60646200015960016008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b601355620001a760646200019360046008546200038f60201b62002d091790919060201c565b620003a760201b62002d1f1790919060201c565b6014556040518060c00160405280606460ff168152602001601460ff168152602001601460ff168152602001601460ff168152602001601460ff168152602001601460ff1681525060189060066200020192919062000658565b5073c2132d05d31c914a87c6611c10748aeb04b58e8f601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200026457600080fd5b506040518060400160405280600c81526020017f446563656e747261776f6f6400000000000000000000000000000000000000008152506040518060400160405280600481526020017f44656f6400000000000000000000000000000000000000000000000000000000815250600854620002f4620002e8620003bf60201b60201c565b620003c760201b60201c565b82600590805190602001906200030c929190620006af565b50816006908051906020019062000325929190620006af565b508060048190555050505062000358734a8ca6f4e245a3573a88fbe5925f445bc17244196013546200048b60201b60201c565b6200038073cf6418116002b1e5681cd3279aab579e537429106014546200048b60201b60201c565b61019060178190555062000a6a565b600081836200039f919062000798565b905092915050565b60008183620003b7919062000828565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f490620008c1565b60405180910390fd5b62000511600083836200064e60201b60201c565b8060036000828254620005259190620008e3565b92505081905550600454600354111562000576576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056d90620009b6565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005c79190620008e3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200062e9190620009e9565b60405180910390a36200064a600083836200065360201b60201c565b5050565b505050565b505050565b8280548282559060005260206000209081019282156200069c579160200282015b828111156200069b578251829060ff1690559160200191906001019062000679565b5b509050620006ab919062000740565b5090565b828054620006bd9062000a35565b90600052602060002090601f016020900481019282620006e157600085556200072d565b82601f10620006fc57805160ff19168380011785556200072d565b828001600101855582156200072d579182015b828111156200072c5782518255916020019190600101906200070f565b5b5090506200073c919062000740565b5090565b5b808211156200075b57600081600090555060010162000741565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620007a5826200075f565b9150620007b2836200075f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007ee57620007ed62000769565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000835826200075f565b915062000842836200075f565b925082620008555762000854620007f9565b5b828204905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008a9601f8362000860565b9150620008b68262000871565b602082019050919050565b60006020820190508181036000830152620008dc816200089a565b9050919050565b6000620008f0826200075f565b9150620008fd836200075f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000935576200093462000769565b5b828201905092915050565b7f45524332303a206d696e74696e6720616d6f756e742065786365656473206d6160008201527f7820746f74616c20737570706c79000000000000000000000000000000000000602082015250565b60006200099e602e8362000860565b9150620009ab8262000940565b604082019050919050565b60006020820190508181036000830152620009d1816200098f565b9050919050565b620009e3816200075f565b82525050565b600060208201905062000a006000830184620009d8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a4e57607f821691505b60208210810362000a645762000a6362000a06565b5b50919050565b614a048062000a7a6000396000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063816b07d1116101b8578063aaa79da811610104578063dd62ed3e116100a2578063f3d12d721161007c578063f3d12d7214610a03578063f4da0fd214610a21578063f851a44014610a51578063f8b9196f14610a6f57610342565b8063dd62ed3e14610999578063df880cc7146109c9578063f2fde38b146109e757610342565b8063c99d9d1c116100de578063c99d9d1c146108fb578063cfcc52c314610917578063d5aed0d814610947578063d7f350031461096557610342565b8063aaa79da81461087d578063adf033b3146108ad578063c52c3c1a146108cb57610342565b80639516669c11610171578063a0bce0e81161014b578063a0bce0e8146107e1578063a34775d1146107ff578063a457c2d71461081d578063a9059cbb1461084d57610342565b80639516669c1461078757806395d89b41146107a55780639ce3fdac146107c357610342565b8063816b07d1146106d757806381d8047f146106f5578063858970d0146107135780638da5cb5b1461072f5780638eb83f251461074d5780639134709e1461076b57610342565b80632c4e722e116102925780635384cb8211610230578063696bf3aa1161020a578063696bf3aa1461063b57806370a08231146106595780637384824a146106895780638123bdc8146106b957610342565b80635384cb82146105cf578063600d20ce146105ed57806361986ad51461061d57610342565b806348c54b9d1161026c57806348c54b9d1461056f578063498da85a146105795780634ce3f769146105975780634dd3b1eb146105b357610342565b80632c4e722e14610503578063313ce56714610521578063395093511461053f57610342565b806318160ddd116102ff57806323b872dd116102d957806323b872dd1461047957806326a74d8e146104a957806327c8f835146104c75780632ab4d052146104e557610342565b806318160ddd1461040d5780631ad0cc151461042b57806321bfb5161461044957610342565b8063016fd47e1461034757806301c234a81461036557806302678b531461038357806306fdde03146103a1578063095ea7b3146103bf5780630d5db702146103ef575b600080fd5b61034f610a9f565b60405161035c919061388e565b60405180910390f35b61036d610aa5565b60405161037a919061388e565b60405180910390f35b61038b610aab565b604051610398919061388e565b60405180910390f35b6103a9610ab1565b6040516103b69190613942565b60405180910390f35b6103d960048036038101906103d491906139f3565b610b43565b6040516103e69190613a4e565b60405180910390f35b6103f7610b66565b604051610404919061388e565b60405180910390f35b610415610b6c565b604051610422919061388e565b60405180910390f35b610433610b76565b604051610440919061388e565b60405180910390f35b610463600480360381019061045e91906139f3565b610b7c565b604051610470919061388e565b60405180910390f35b610493600480360381019061048e9190613a69565b610bad565b6040516104a09190613a4e565b60405180910390f35b6104b1610bdc565b6040516104be919061388e565b60405180910390f35b6104cf610be2565b6040516104dc9190613acb565b60405180910390f35b6104ed610be8565b6040516104fa919061388e565b60405180910390f35b61050b610bee565b604051610518919061388e565b60405180910390f35b610529610bf4565b6040516105369190613b02565b60405180910390f35b610559600480360381019061055491906139f3565b610bfd565b6040516105669190613a4e565b60405180910390f35b610577610c34565b005b610581610cde565b60405161058e919061388e565b60405180910390f35b6105b160048036038101906105ac91906139f3565b610ce4565b005b6105cd60048036038101906105c891906139f3565b610fff565b005b6105d761131a565b6040516105e4919061388e565b60405180910390f35b61060760048036038101906106029190613b1d565b611320565b604051610614919061388e565b60405180910390f35b610625611344565b604051610632919061388e565b60405180910390f35b61064361134a565b604051610650919061388e565b60405180910390f35b610673600480360381019061066e9190613b4a565b611350565b604051610680919061388e565b60405180910390f35b6106a3600480360381019061069e9190613b4a565b611399565b6040516106b0919061388e565b60405180910390f35b6106c16113b1565b6040516106ce919061388e565b60405180910390f35b6106df6113b7565b6040516106ec919061388e565b60405180910390f35b6106fd6113bd565b60405161070a919061388e565b60405180910390f35b61072d600480360381019061072891906139f3565b6113c3565b005b6107376116de565b6040516107449190613acb565b60405180910390f35b610755611707565b6040516107629190613acb565b60405180910390f35b61078560048036038101906107809190613b77565b61171f565b005b61078f611f59565b60405161079c919061388e565b60405180910390f35b6107ad611f5f565b6040516107ba9190613942565b60405180910390f35b6107cb611ff1565b6040516107d89190613acb565b60405180910390f35b6107e9612009565b6040516107f69190613acb565b60405180910390f35b610807612021565b604051610814919061388e565b60405180910390f35b610837600480360381019061083291906139f3565b612027565b6040516108449190613a4e565b60405180910390f35b610867600480360381019061086291906139f3565b61209e565b6040516108749190613a4e565b60405180910390f35b61089760048036038101906108929190613b4a565b6120c1565b6040516108a4919061388e565b60405180910390f35b6108b56120d9565b6040516108c2919061388e565b60405180910390f35b6108e560048036038101906108e09190613b4a565b6120df565b6040516108f2919061388e565b60405180910390f35b610915600480360381019061091091906139f3565b6127c0565b005b610931600480360381019061092c9190613b4a565b612adb565b60405161093e919061388e565b60405180910390f35b61094f612af3565b60405161095c919061388e565b60405180910390f35b61097f600480360381019061097a9190613b1d565b612af9565b604051610990959493929190613bb7565b60405180910390f35b6109b360048036038101906109ae9190613c0a565b612b6f565b6040516109c0919061388e565b60405180910390f35b6109d1612bf6565b6040516109de9190613acb565b60405180910390f35b610a0160048036038101906109fc9190613b4a565b612c0e565b005b610a0b612c91565b604051610a189190613acb565b60405180910390f35b610a3b6004803603810190610a369190613b4a565b612ca9565b604051610a48919061388e565b60405180910390f35b610a59612cc1565b604051610a669190613acb565b60405180910390f35b610a896004803603810190610a8491906139f3565b612cd9565b604051610a96919061388e565b60405180910390f35b600a5481565b6103e881565b600e5481565b606060058054610ac090613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec90613c79565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b600080610b4e612d35565b9050610b5b818585612d3d565b600191505092915050565b60105481565b6000600354905090565b600f5481565b601c6020528160005260406000208181548110610b9857600080fd5b90600052602060002001600091509150505481565b600080610bb8612d35565b9050610bc5858285612f06565b610bd0858585612f92565b60019150509392505050565b60115481565b61dead81565b60085481565b60175481565b60006012905090565b600080610c08612d35565b9050610c29818585610c1a8589612b6f565b610c249190613cd9565b612d3d565b600191505092915050565b610c4633610c41336120df565b613214565b610c4f336120df565b602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c999190613cd9565b602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1673d4e7371e22f1ddeca24b797473f6cbcfb0ca4bb073ffffffffffffffffffffffffffffffffffffffff1614610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90613da1565b60405180910390fd5b610d7b816010546133bb90919063ffffffff16565b601081905550600f546010541115610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613e33565b60405180910390fd5b6001600754610dd79190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050610f4f82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff1673418084c5e6a34790c954d45fc8eb8524a540e86073ffffffffffffffffffffffffffffffffffffffff1614611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613ec5565b60405180910390fd5b61109681600a546133bb90919063ffffffff16565b600a81905550600954600a5411156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613f31565b60405180910390fd5b60016007546110f29190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015590505061126a82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60135481565b6018818154811061133057600080fd5b906000526020600020016000915090505481565b60195481565b600b5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60216020528060005260406000206000915090505481565b60145481565b60155481565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff1673de5222980234799300dd7f6d324e10435d1bd69273ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613fc3565b60405180910390fd5b61145a81600c546133bb90919063ffffffff16565b600c81905550600b54600c5411156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614055565b60405180910390fd5b60016007546114b69190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015590505061162e82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73cf6418116002b1e5681cd3279aab579e5374291081565b6000611748606461173a603286612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3373cf6418116002b1e5681cd3279aab579e53742910846040518463ffffffff1660e01b81526004016117bd93929190614075565b6020604051808303816000875af11580156117dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180091906140d8565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3373418084c5e6a34790c954d45fc8eb8524a540e860846040518463ffffffff1660e01b815260040161187493929190614075565b6020604051808303816000875af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906140d8565b50600064e8d4a510006118d560175486612d0990919063ffffffff16565b6118df9190614105565b90506118ee3361dead836133d1565b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c03576000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050118015611a0a57503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a5357838160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b6006811015611c0057600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611be857611b256001601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018360068110611b1557611b1461415f565b5b01546133bb90919063ffffffff16565b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018260068110611b7957611b7861415f565b5b0181905550601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150611bed565b611c00565b8080611bf89061418e565b915050611a7f565b50505b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e955760008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b6006811015611e9257600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e7a576000611d0b6103e8611cfd60188581548110611ce357611ce261415f565b5b906000526020600020015488612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050611d188333836133d1565b6001601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d649190613cd9565b601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925050611e7f565b611e92565b8080611e8a9061418e565b915050611c87565b50505b8060000160075490806001815401808255809150506001900390600052602060002001600090919091909150556000611ee369d3c21bcecceda1000000601554612d1f90919063ffffffff16565b90506000611efc6016548361371390919063ffffffff16565b905060018110611f5057611f42611f316064611f2384601754612d0990919063ffffffff16565b612d1f90919063ffffffff16565b60175461371390919063ffffffff16565b601781905550816016819055505b50505050505050565b600c5481565b606060068054611f6e90613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9a90613c79565b8015611fe75780601f10611fbc57610100808354040283529160200191611fe7565b820191906000526020600020905b815481529060010190602001808311611fca57829003601f168201915b5050505050905090565b734a8ca6f4e245a3573a88fbe5925f445bc172441981565b73f9daf9cc3835b78591f09b22fdc6f552d9ae6e7681565b60165481565b600080612032612d35565b905060006120408286612b6f565b905083811015612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90614248565b60405180910390fd5b6120928286868403612d3d565b60019250505092915050565b6000806120a9612d35565b90506120b6818585612f92565b600191505092915050565b601d6020528060005260406000206000915090505481565b600d5481565b6000806000905060005b602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156127655760006121ce620151806121c0601e6000602060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481106121945761219361415f565b5b90600052602060002001548152602001908152602001600020600301544261371390919063ffffffff16565b612d1f90919063ffffffff16565b905061016d81116122b557600061227360646122656028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020898154811061223a5761223961415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061228c61016d83612d1f90919063ffffffff16565b90506122a18184612d0990919063ffffffff16565b856122ac9190613cd9565b94505050612751565b61016d811180156122c857506102da8111155b1561246b57600061236760646123596028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020898154811061232e5761232d61415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061240260646123f4601e806000602060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a815481106123c9576123c861415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061241b61016d83612d1f90919063ffffffff16565b90506124566124478261243961016d8861371390919063ffffffff16565b612d0990919063ffffffff16565b846133bb90919063ffffffff16565b866124619190613cd9565b9550505050612750565b6102da8111801561247e57506104478111155b156126cf57600061251d606461250f6028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106124e4576124e361415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b905060006125b860646125aa601e806000602060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a8154811061257f5761257e61415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b905060006126536064612645601e806000602060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b8154811061261a5761261961415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061266c61016d83612d1f90919063ffffffff16565b90506126b96126988261268a6102da8961371390919063ffffffff16565b612d0990919063ffffffff16565b6126ab85876133bb90919063ffffffff16565b6133bb90919063ffffffff16565b876126c49190613cd9565b96505050505061274f565b601e6000602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106127245761272361415f565b5b90600052602060002001548152602001908152602001600020600401548361274c9190613cd9565b92505b5b5b50808061275d9061418e565b9150506120e9565b506127b8602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261371390919063ffffffff16565b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff1673f9daf9cc3835b78591f09b22fdc6f552d9ae6e7673ffffffffffffffffffffffffffffffffffffffff1614612842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612839906142da565b60405180910390fd5b61285781600e546133bb90919063ffffffff16565b600e81905550600d54600e5411156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b9061436c565b60405180910390fd5b60016007546128b39190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050612a2b82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60226020528060005260406000206000915090505481565b60095481565b601e6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154905085565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b73d4e7371e22f1ddeca24b797473f6cbcfb0ca4bb081565b612c16613729565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7c906143fe565b60405180910390fd5b612c8e816137a7565b50565b73de5222980234799300dd7f6d324e10435d1bd69281565b601f6020528060005260406000206000915090505481565b73418084c5e6a34790c954d45fc8eb8524a540e86081565b602080528160005260406000208181548110612cf457600080fd5b90600052602060002001600091509150505481565b60008183612d179190614105565b905092915050565b60008183612d2d919061444d565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da3906144f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1290614582565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ef9919061388e565b60405180910390a3505050565b6000612f128484612b6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612f8c5781811015612f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f75906145ee565b60405180910390fd5b612f8b8484848403612d3d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890614680565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790614712565b60405180910390fd5b61307b83838361386b565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f9906147a4565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131979190613cd9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131fb919061388e565b60405180910390a361320e848484613870565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327a90614810565b60405180910390fd5b61328f6000838361386b565b80600360008282546132a19190613cd9565b9250508190555060045460035411156132ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e6906148a2565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461333e9190613cd9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133a3919061388e565b60405180910390a36133b760008383613870565b5050565b600081836133c99190613cd9565b905092915050565b6133e6816012546133bb90919063ffffffff16565b6012819055506011546012541115613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342a9061490e565b60405180910390fd5b60016007546134429190613cd9565b60078190555060006040518060a0016040528060075481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050506135b882602160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060075490806001815401808255809150506001900390600052602060002001600090919091909150556001601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136af9190613cd9565b601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613707826015546133bb90919063ffffffff16565b60158190555050505050565b60008183613721919061492e565b905092915050565b613731612d35565b73ffffffffffffffffffffffffffffffffffffffff1661374f6116de565b73ffffffffffffffffffffffffffffffffffffffff16146137a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379c906149ae565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b6000819050919050565b61388881613875565b82525050565b60006020820190506138a3600083018461387f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138e35780820151818401526020810190506138c8565b838111156138f2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613914826138a9565b61391e81856138b4565b935061392e8185602086016138c5565b613937816138f8565b840191505092915050565b6000602082019050818103600083015261395c8184613909565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061399482613969565b9050919050565b6139a481613989565b81146139af57600080fd5b50565b6000813590506139c18161399b565b92915050565b6139d081613875565b81146139db57600080fd5b50565b6000813590506139ed816139c7565b92915050565b60008060408385031215613a0a57613a09613964565b5b6000613a18858286016139b2565b9250506020613a29858286016139de565b9150509250929050565b60008115159050919050565b613a4881613a33565b82525050565b6000602082019050613a636000830184613a3f565b92915050565b600080600060608486031215613a8257613a81613964565b5b6000613a90868287016139b2565b9350506020613aa1868287016139b2565b9250506040613ab2868287016139de565b9150509250925092565b613ac581613989565b82525050565b6000602082019050613ae06000830184613abc565b92915050565b600060ff82169050919050565b613afc81613ae6565b82525050565b6000602082019050613b176000830184613af3565b92915050565b600060208284031215613b3357613b32613964565b5b6000613b41848285016139de565b91505092915050565b600060208284031215613b6057613b5f613964565b5b6000613b6e848285016139b2565b91505092915050565b60008060408385031215613b8e57613b8d613964565b5b6000613b9c858286016139de565b9250506020613bad858286016139b2565b9150509250929050565b600060a082019050613bcc600083018861387f565b613bd96020830187613abc565b613be66040830186613abc565b613bf3606083018561387f565b613c00608083018461387f565b9695505050505050565b60008060408385031215613c2157613c20613964565b5b6000613c2f858286016139b2565b9250506020613c40858286016139b2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9157607f821691505b602082108103613ca457613ca3613c4a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ce482613875565b9150613cef83613875565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2457613d23613caa565b5b828201905092915050565b7f4f4e4c595f5354524154454749435f414c4c49414e43455f5445414d5f43414e60008201527f5f455845435554455f544849535f46554e4354494f4e00000000000000000000602082015250565b6000613d8b6036836138b4565b9150613d9682613d2f565b604082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f4d41585f5354524154454749435f414c4c49414e43455f5445414d5f414c4c4f60008201527f544d454e545f5245414348454400000000000000000000000000000000000000602082015250565b6000613e1d602d836138b4565b9150613e2882613dc1565b604082019050919050565b60006020820190508181036000830152613e4c81613e10565b9050919050565b7f4f4e4c595f41444d494e5f43414e5f455845435554455f544849535f46554e4360008201527f54494f4e00000000000000000000000000000000000000000000000000000000602082015250565b6000613eaf6024836138b4565b9150613eba82613e53565b604082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4d41585f41444d494e5f414c4c4f544d454e545f524541434845440000000000600082015250565b6000613f1b601b836138b4565b9150613f2682613ee5565b602082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4f4e4c595f4d41524b4554494e475f5445414d5f43414e5f455845435554455f60008201527f544849535f46554e4354494f4e00000000000000000000000000000000000000602082015250565b6000613fad602d836138b4565b9150613fb882613f51565b604082019050919050565b60006020820190508181036000830152613fdc81613fa0565b9050919050565b7f4d41585f4d41524b4554494e475f5445414d5f414c4c4f544d454e545f52454160008201527f4348454400000000000000000000000000000000000000000000000000000000602082015250565b600061403f6024836138b4565b915061404a82613fe3565b604082019050919050565b6000602082019050818103600083015261406e81614032565b9050919050565b600060608201905061408a6000830186613abc565b6140976020830185613abc565b6140a4604083018461387f565b949350505050565b6140b581613a33565b81146140c057600080fd5b50565b6000815190506140d2816140ac565b92915050565b6000602082840312156140ee576140ed613964565b5b60006140fc848285016140c3565b91505092915050565b600061411082613875565b915061411b83613875565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415457614153613caa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061419982613875565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141cb576141ca613caa565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006142326025836138b4565b915061423d826141d6565b604082019050919050565b6000602082019050818103600083015261426181614225565b9050919050565b7f4f4e4c595f444556454c4f504d454e545f5445414d5f43414e5f45584543555460008201527f455f544849535f46554e4354494f4e0000000000000000000000000000000000602082015250565b60006142c4602f836138b4565b91506142cf82614268565b604082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f4d41585f444556454c4f504d454e545f5445414d5f414c4c4f544d454e545f5260008201527f4541434845440000000000000000000000000000000000000000000000000000602082015250565b60006143566026836138b4565b9150614361826142fa565b604082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143e86026836138b4565b91506143f38261438c565b604082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061445882613875565b915061446383613875565b9250826144735761447261441e565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144da6024836138b4565b91506144e58261447e565b604082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061456c6022836138b4565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145d8601d836138b4565b91506145e3826145a2565b602082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061466a6025836138b4565b91506146758261460e565b604082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006146fc6023836138b4565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061478e6026836138b4565b915061479982614732565b604082019050919050565b600060208201905081810360008301526147bd81614781565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006147fa601f836138b4565b9150614805826147c4565b602082019050919050565b60006020820190508181036000830152614829816147ed565b9050919050565b7f45524332303a206d696e74696e6720616d6f756e742065786365656473206d6160008201527f7820746f74616c20737570706c79000000000000000000000000000000000000602082015250565b600061488c602e836138b4565b915061489782614830565b604082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f4d41585f5055424c49435f535550504c595f5245414348454400000000000000600082015250565b60006148f86019836138b4565b9150614903826148c2565b602082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b600061493982613875565b915061494483613875565b92508282101561495757614956613caa565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149986020836138b4565b91506149a382614962565b602082019050919050565b600060208201905081810360008301526149c78161498b565b905091905056fea26469706673582212204aff76939ebc9df2d0523b5f0560f58b2cbd8721fa46fa5d15829b585fa4f45564736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103425760003560e01c8063816b07d1116101b8578063aaa79da811610104578063dd62ed3e116100a2578063f3d12d721161007c578063f3d12d7214610a03578063f4da0fd214610a21578063f851a44014610a51578063f8b9196f14610a6f57610342565b8063dd62ed3e14610999578063df880cc7146109c9578063f2fde38b146109e757610342565b8063c99d9d1c116100de578063c99d9d1c146108fb578063cfcc52c314610917578063d5aed0d814610947578063d7f350031461096557610342565b8063aaa79da81461087d578063adf033b3146108ad578063c52c3c1a146108cb57610342565b80639516669c11610171578063a0bce0e81161014b578063a0bce0e8146107e1578063a34775d1146107ff578063a457c2d71461081d578063a9059cbb1461084d57610342565b80639516669c1461078757806395d89b41146107a55780639ce3fdac146107c357610342565b8063816b07d1146106d757806381d8047f146106f5578063858970d0146107135780638da5cb5b1461072f5780638eb83f251461074d5780639134709e1461076b57610342565b80632c4e722e116102925780635384cb8211610230578063696bf3aa1161020a578063696bf3aa1461063b57806370a08231146106595780637384824a146106895780638123bdc8146106b957610342565b80635384cb82146105cf578063600d20ce146105ed57806361986ad51461061d57610342565b806348c54b9d1161026c57806348c54b9d1461056f578063498da85a146105795780634ce3f769146105975780634dd3b1eb146105b357610342565b80632c4e722e14610503578063313ce56714610521578063395093511461053f57610342565b806318160ddd116102ff57806323b872dd116102d957806323b872dd1461047957806326a74d8e146104a957806327c8f835146104c75780632ab4d052146104e557610342565b806318160ddd1461040d5780631ad0cc151461042b57806321bfb5161461044957610342565b8063016fd47e1461034757806301c234a81461036557806302678b531461038357806306fdde03146103a1578063095ea7b3146103bf5780630d5db702146103ef575b600080fd5b61034f610a9f565b60405161035c919061388e565b60405180910390f35b61036d610aa5565b60405161037a919061388e565b60405180910390f35b61038b610aab565b604051610398919061388e565b60405180910390f35b6103a9610ab1565b6040516103b69190613942565b60405180910390f35b6103d960048036038101906103d491906139f3565b610b43565b6040516103e69190613a4e565b60405180910390f35b6103f7610b66565b604051610404919061388e565b60405180910390f35b610415610b6c565b604051610422919061388e565b60405180910390f35b610433610b76565b604051610440919061388e565b60405180910390f35b610463600480360381019061045e91906139f3565b610b7c565b604051610470919061388e565b60405180910390f35b610493600480360381019061048e9190613a69565b610bad565b6040516104a09190613a4e565b60405180910390f35b6104b1610bdc565b6040516104be919061388e565b60405180910390f35b6104cf610be2565b6040516104dc9190613acb565b60405180910390f35b6104ed610be8565b6040516104fa919061388e565b60405180910390f35b61050b610bee565b604051610518919061388e565b60405180910390f35b610529610bf4565b6040516105369190613b02565b60405180910390f35b610559600480360381019061055491906139f3565b610bfd565b6040516105669190613a4e565b60405180910390f35b610577610c34565b005b610581610cde565b60405161058e919061388e565b60405180910390f35b6105b160048036038101906105ac91906139f3565b610ce4565b005b6105cd60048036038101906105c891906139f3565b610fff565b005b6105d761131a565b6040516105e4919061388e565b60405180910390f35b61060760048036038101906106029190613b1d565b611320565b604051610614919061388e565b60405180910390f35b610625611344565b604051610632919061388e565b60405180910390f35b61064361134a565b604051610650919061388e565b60405180910390f35b610673600480360381019061066e9190613b4a565b611350565b604051610680919061388e565b60405180910390f35b6106a3600480360381019061069e9190613b4a565b611399565b6040516106b0919061388e565b60405180910390f35b6106c16113b1565b6040516106ce919061388e565b60405180910390f35b6106df6113b7565b6040516106ec919061388e565b60405180910390f35b6106fd6113bd565b60405161070a919061388e565b60405180910390f35b61072d600480360381019061072891906139f3565b6113c3565b005b6107376116de565b6040516107449190613acb565b60405180910390f35b610755611707565b6040516107629190613acb565b60405180910390f35b61078560048036038101906107809190613b77565b61171f565b005b61078f611f59565b60405161079c919061388e565b60405180910390f35b6107ad611f5f565b6040516107ba9190613942565b60405180910390f35b6107cb611ff1565b6040516107d89190613acb565b60405180910390f35b6107e9612009565b6040516107f69190613acb565b60405180910390f35b610807612021565b604051610814919061388e565b60405180910390f35b610837600480360381019061083291906139f3565b612027565b6040516108449190613a4e565b60405180910390f35b610867600480360381019061086291906139f3565b61209e565b6040516108749190613a4e565b60405180910390f35b61089760048036038101906108929190613b4a565b6120c1565b6040516108a4919061388e565b60405180910390f35b6108b56120d9565b6040516108c2919061388e565b60405180910390f35b6108e560048036038101906108e09190613b4a565b6120df565b6040516108f2919061388e565b60405180910390f35b610915600480360381019061091091906139f3565b6127c0565b005b610931600480360381019061092c9190613b4a565b612adb565b60405161093e919061388e565b60405180910390f35b61094f612af3565b60405161095c919061388e565b60405180910390f35b61097f600480360381019061097a9190613b1d565b612af9565b604051610990959493929190613bb7565b60405180910390f35b6109b360048036038101906109ae9190613c0a565b612b6f565b6040516109c0919061388e565b60405180910390f35b6109d1612bf6565b6040516109de9190613acb565b60405180910390f35b610a0160048036038101906109fc9190613b4a565b612c0e565b005b610a0b612c91565b604051610a189190613acb565b60405180910390f35b610a3b6004803603810190610a369190613b4a565b612ca9565b604051610a48919061388e565b60405180910390f35b610a59612cc1565b604051610a669190613acb565b60405180910390f35b610a896004803603810190610a8491906139f3565b612cd9565b604051610a96919061388e565b60405180910390f35b600a5481565b6103e881565b600e5481565b606060058054610ac090613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec90613c79565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b600080610b4e612d35565b9050610b5b818585612d3d565b600191505092915050565b60105481565b6000600354905090565b600f5481565b601c6020528160005260406000208181548110610b9857600080fd5b90600052602060002001600091509150505481565b600080610bb8612d35565b9050610bc5858285612f06565b610bd0858585612f92565b60019150509392505050565b60115481565b61dead81565b60085481565b60175481565b60006012905090565b600080610c08612d35565b9050610c29818585610c1a8589612b6f565b610c249190613cd9565b612d3d565b600191505092915050565b610c4633610c41336120df565b613214565b610c4f336120df565b602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c999190613cd9565b602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1673d4e7371e22f1ddeca24b797473f6cbcfb0ca4bb073ffffffffffffffffffffffffffffffffffffffff1614610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90613da1565b60405180910390fd5b610d7b816010546133bb90919063ffffffff16565b601081905550600f546010541115610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613e33565b60405180910390fd5b6001600754610dd79190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050610f4f82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff1673418084c5e6a34790c954d45fc8eb8524a540e86073ffffffffffffffffffffffffffffffffffffffff1614611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613ec5565b60405180910390fd5b61109681600a546133bb90919063ffffffff16565b600a81905550600954600a5411156110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613f31565b60405180910390fd5b60016007546110f29190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015590505061126a82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60135481565b6018818154811061133057600080fd5b906000526020600020016000915090505481565b60195481565b600b5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60216020528060005260406000206000915090505481565b60145481565b60155481565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff1673de5222980234799300dd7f6d324e10435d1bd69273ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613fc3565b60405180910390fd5b61145a81600c546133bb90919063ffffffff16565b600c81905550600b54600c5411156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614055565b60405180910390fd5b60016007546114b69190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015590505061162e82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73cf6418116002b1e5681cd3279aab579e5374291081565b6000611748606461173a603286612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3373cf6418116002b1e5681cd3279aab579e53742910846040518463ffffffff1660e01b81526004016117bd93929190614075565b6020604051808303816000875af11580156117dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180091906140d8565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3373418084c5e6a34790c954d45fc8eb8524a540e860846040518463ffffffff1660e01b815260040161187493929190614075565b6020604051808303816000875af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b791906140d8565b50600064e8d4a510006118d560175486612d0990919063ffffffff16565b6118df9190614105565b90506118ee3361dead836133d1565b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c03576000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050118015611a0a57503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a5357838160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b6006811015611c0057600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611be857611b256001601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018360068110611b1557611b1461415f565b5b01546133bb90919063ffffffff16565b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018260068110611b7957611b7861415f565b5b0181905550601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150611bed565b611c00565b8080611bf89061418e565b915050611a7f565b50505b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e955760008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b6006811015611e9257600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e7a576000611d0b6103e8611cfd60188581548110611ce357611ce261415f565b5b906000526020600020015488612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050611d188333836133d1565b6001601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d649190613cd9565b601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925050611e7f565b611e92565b8080611e8a9061418e565b915050611c87565b50505b8060000160075490806001815401808255809150506001900390600052602060002001600090919091909150556000611ee369d3c21bcecceda1000000601554612d1f90919063ffffffff16565b90506000611efc6016548361371390919063ffffffff16565b905060018110611f5057611f42611f316064611f2384601754612d0990919063ffffffff16565b612d1f90919063ffffffff16565b60175461371390919063ffffffff16565b601781905550816016819055505b50505050505050565b600c5481565b606060068054611f6e90613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9a90613c79565b8015611fe75780601f10611fbc57610100808354040283529160200191611fe7565b820191906000526020600020905b815481529060010190602001808311611fca57829003601f168201915b5050505050905090565b734a8ca6f4e245a3573a88fbe5925f445bc172441981565b73f9daf9cc3835b78591f09b22fdc6f552d9ae6e7681565b60165481565b600080612032612d35565b905060006120408286612b6f565b905083811015612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90614248565b60405180910390fd5b6120928286868403612d3d565b60019250505092915050565b6000806120a9612d35565b90506120b6818585612f92565b600191505092915050565b601d6020528060005260406000206000915090505481565b600d5481565b6000806000905060005b602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156127655760006121ce620151806121c0601e6000602060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481106121945761219361415f565b5b90600052602060002001548152602001908152602001600020600301544261371390919063ffffffff16565b612d1f90919063ffffffff16565b905061016d81116122b557600061227360646122656028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020898154811061223a5761223961415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061228c61016d83612d1f90919063ffffffff16565b90506122a18184612d0990919063ffffffff16565b856122ac9190613cd9565b94505050612751565b61016d811180156122c857506102da8111155b1561246b57600061236760646123596028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020898154811061232e5761232d61415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061240260646123f4601e806000602060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a815481106123c9576123c861415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061241b61016d83612d1f90919063ffffffff16565b90506124566124478261243961016d8861371390919063ffffffff16565b612d0990919063ffffffff16565b846133bb90919063ffffffff16565b866124619190613cd9565b9550505050612750565b6102da8111801561247e57506104478111155b156126cf57600061251d606461250f6028601e6000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106124e4576124e361415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b905060006125b860646125aa601e806000602060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a8154811061257f5761257e61415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b905060006126536064612645601e806000602060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b8154811061261a5761261961415f565b5b9060005260206000200154815260200190815260200160002060040154612d0990919063ffffffff16565b612d1f90919063ffffffff16565b9050600061266c61016d83612d1f90919063ffffffff16565b90506126b96126988261268a6102da8961371390919063ffffffff16565b612d0990919063ffffffff16565b6126ab85876133bb90919063ffffffff16565b6133bb90919063ffffffff16565b876126c49190613cd9565b96505050505061274f565b601e6000602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106127245761272361415f565b5b90600052602060002001548152602001908152602001600020600401548361274c9190613cd9565b92505b5b5b50808061275d9061418e565b9150506120e9565b506127b8602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261371390919063ffffffff16565b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff1673f9daf9cc3835b78591f09b22fdc6f552d9ae6e7673ffffffffffffffffffffffffffffffffffffffff1614612842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612839906142da565b60405180910390fd5b61285781600e546133bb90919063ffffffff16565b600e81905550600d54600e5411156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b9061436c565b60405180910390fd5b60016007546128b39190613cd9565b60078190555060006040518060a00160405280600754815260200161dead73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050612a2b82602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007549080600181540180825580915050600190039060005260206000200160009091909190915055505050565b60226020528060005260406000206000915090505481565b60095481565b601e6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154905085565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b73d4e7371e22f1ddeca24b797473f6cbcfb0ca4bb081565b612c16613729565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7c906143fe565b60405180910390fd5b612c8e816137a7565b50565b73de5222980234799300dd7f6d324e10435d1bd69281565b601f6020528060005260406000206000915090505481565b73418084c5e6a34790c954d45fc8eb8524a540e86081565b602080528160005260406000208181548110612cf457600080fd5b90600052602060002001600091509150505481565b60008183612d179190614105565b905092915050565b60008183612d2d919061444d565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da3906144f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1290614582565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ef9919061388e565b60405180910390a3505050565b6000612f128484612b6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612f8c5781811015612f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f75906145ee565b60405180910390fd5b612f8b8484848403612d3d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff890614680565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790614712565b60405180910390fd5b61307b83838361386b565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f9906147a4565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131979190613cd9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131fb919061388e565b60405180910390a361320e848484613870565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327a90614810565b60405180910390fd5b61328f6000838361386b565b80600360008282546132a19190613cd9565b9250508190555060045460035411156132ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e6906148a2565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461333e9190613cd9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133a3919061388e565b60405180910390a36133b760008383613870565b5050565b600081836133c99190613cd9565b905092915050565b6133e6816012546133bb90919063ffffffff16565b6012819055506011546012541115613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342a9061490e565b60405180910390fd5b60016007546134429190613cd9565b60078190555060006040518060a0016040528060075481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200142815260200183815250905080601e600060075481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050506135b882602160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133bb90919063ffffffff16565b602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060075490806001815401808255809150506001900390600052602060002001600090919091909150556001601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136af9190613cd9565b601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613707826015546133bb90919063ffffffff16565b60158190555050505050565b60008183613721919061492e565b905092915050565b613731612d35565b73ffffffffffffffffffffffffffffffffffffffff1661374f6116de565b73ffffffffffffffffffffffffffffffffffffffff16146137a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379c906149ae565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b6000819050919050565b61388881613875565b82525050565b60006020820190506138a3600083018461387f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138e35780820151818401526020810190506138c8565b838111156138f2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613914826138a9565b61391e81856138b4565b935061392e8185602086016138c5565b613937816138f8565b840191505092915050565b6000602082019050818103600083015261395c8184613909565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061399482613969565b9050919050565b6139a481613989565b81146139af57600080fd5b50565b6000813590506139c18161399b565b92915050565b6139d081613875565b81146139db57600080fd5b50565b6000813590506139ed816139c7565b92915050565b60008060408385031215613a0a57613a09613964565b5b6000613a18858286016139b2565b9250506020613a29858286016139de565b9150509250929050565b60008115159050919050565b613a4881613a33565b82525050565b6000602082019050613a636000830184613a3f565b92915050565b600080600060608486031215613a8257613a81613964565b5b6000613a90868287016139b2565b9350506020613aa1868287016139b2565b9250506040613ab2868287016139de565b9150509250925092565b613ac581613989565b82525050565b6000602082019050613ae06000830184613abc565b92915050565b600060ff82169050919050565b613afc81613ae6565b82525050565b6000602082019050613b176000830184613af3565b92915050565b600060208284031215613b3357613b32613964565b5b6000613b41848285016139de565b91505092915050565b600060208284031215613b6057613b5f613964565b5b6000613b6e848285016139b2565b91505092915050565b60008060408385031215613b8e57613b8d613964565b5b6000613b9c858286016139de565b9250506020613bad858286016139b2565b9150509250929050565b600060a082019050613bcc600083018861387f565b613bd96020830187613abc565b613be66040830186613abc565b613bf3606083018561387f565b613c00608083018461387f565b9695505050505050565b60008060408385031215613c2157613c20613964565b5b6000613c2f858286016139b2565b9250506020613c40858286016139b2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9157607f821691505b602082108103613ca457613ca3613c4a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ce482613875565b9150613cef83613875565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2457613d23613caa565b5b828201905092915050565b7f4f4e4c595f5354524154454749435f414c4c49414e43455f5445414d5f43414e60008201527f5f455845435554455f544849535f46554e4354494f4e00000000000000000000602082015250565b6000613d8b6036836138b4565b9150613d9682613d2f565b604082019050919050565b60006020820190508181036000830152613dba81613d7e565b9050919050565b7f4d41585f5354524154454749435f414c4c49414e43455f5445414d5f414c4c4f60008201527f544d454e545f5245414348454400000000000000000000000000000000000000602082015250565b6000613e1d602d836138b4565b9150613e2882613dc1565b604082019050919050565b60006020820190508181036000830152613e4c81613e10565b9050919050565b7f4f4e4c595f41444d494e5f43414e5f455845435554455f544849535f46554e4360008201527f54494f4e00000000000000000000000000000000000000000000000000000000602082015250565b6000613eaf6024836138b4565b9150613eba82613e53565b604082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4d41585f41444d494e5f414c4c4f544d454e545f524541434845440000000000600082015250565b6000613f1b601b836138b4565b9150613f2682613ee5565b602082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4f4e4c595f4d41524b4554494e475f5445414d5f43414e5f455845435554455f60008201527f544849535f46554e4354494f4e00000000000000000000000000000000000000602082015250565b6000613fad602d836138b4565b9150613fb882613f51565b604082019050919050565b60006020820190508181036000830152613fdc81613fa0565b9050919050565b7f4d41585f4d41524b4554494e475f5445414d5f414c4c4f544d454e545f52454160008201527f4348454400000000000000000000000000000000000000000000000000000000602082015250565b600061403f6024836138b4565b915061404a82613fe3565b604082019050919050565b6000602082019050818103600083015261406e81614032565b9050919050565b600060608201905061408a6000830186613abc565b6140976020830185613abc565b6140a4604083018461387f565b949350505050565b6140b581613a33565b81146140c057600080fd5b50565b6000815190506140d2816140ac565b92915050565b6000602082840312156140ee576140ed613964565b5b60006140fc848285016140c3565b91505092915050565b600061411082613875565b915061411b83613875565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415457614153613caa565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061419982613875565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141cb576141ca613caa565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006142326025836138b4565b915061423d826141d6565b604082019050919050565b6000602082019050818103600083015261426181614225565b9050919050565b7f4f4e4c595f444556454c4f504d454e545f5445414d5f43414e5f45584543555460008201527f455f544849535f46554e4354494f4e0000000000000000000000000000000000602082015250565b60006142c4602f836138b4565b91506142cf82614268565b604082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f4d41585f444556454c4f504d454e545f5445414d5f414c4c4f544d454e545f5260008201527f4541434845440000000000000000000000000000000000000000000000000000602082015250565b60006143566026836138b4565b9150614361826142fa565b604082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143e86026836138b4565b91506143f38261438c565b604082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061445882613875565b915061446383613875565b9250826144735761447261441e565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144da6024836138b4565b91506144e58261447e565b604082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061456c6022836138b4565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145d8601d836138b4565b91506145e3826145a2565b602082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061466a6025836138b4565b91506146758261460e565b604082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006146fc6023836138b4565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061478e6026836138b4565b915061479982614732565b604082019050919050565b600060208201905081810360008301526147bd81614781565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006147fa601f836138b4565b9150614805826147c4565b602082019050919050565b60006020820190508181036000830152614829816147ed565b9050919050565b7f45524332303a206d696e74696e6720616d6f756e742065786365656473206d6160008201527f7820746f74616c20737570706c79000000000000000000000000000000000000602082015250565b600061488c602e836138b4565b915061489782614830565b604082019050919050565b600060208201905081810360008301526148bb8161487f565b9050919050565b7f4d41585f5055424c49435f535550504c595f5245414348454400000000000000600082015250565b60006148f86019836138b4565b9150614903826148c2565b602082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b600061493982613875565b915061494483613875565b92508282101561495757614956613caa565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149986020836138b4565b91506149a382614962565b602082019050919050565b600060208201905081810360008301526149c78161498b565b905091905056fea26469706673582212204aff76939ebc9df2d0523b5f0560f58b2cbd8721fa46fa5d15829b585fa4f45564736f6c634300080d0033

Deployed Bytecode Sourcemap

28585:12844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28827:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30402:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29089:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17257:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19749:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29233:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18377:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29142:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30963:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20571:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29292:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30244:80;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28694:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29643:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18219:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21275:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41209:217;;;:::i;:::-;;29363:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34636:737;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32406:634;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29407:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30333:62;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30457:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28870:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18548:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31253:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29481:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29559:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28658:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33119:667;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9240:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30146:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36314:2148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28953:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17476:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30050:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29848:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29607:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22048:505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18931:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31021:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29004:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38541:2605;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33867:681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31315:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28752:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31079:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;19228:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29946:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10039:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29752:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31133:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29671:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31193:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28827:36;;;;:::o;30402:47::-;30445:4;30402:47;:::o;29089:46::-;;;;:::o;17257:100::-;17311:13;17344:5;17337:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17257:100;:::o;19749:242::-;19868:4;19890:13;19906:12;:10;:12::i;:::-;19890:28;;19929:32;19938:5;19945:7;19954:6;19929:8;:32::i;:::-;19979:4;19972:11;;;19749:242;;;;:::o;29233:52::-;;;;:::o;18377:108::-;18438:7;18465:12;;18458:19;;18377:108;:::o;29142:84::-;;;;:::o;30963:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20571:295::-;20702:4;20719:15;20737:12;:10;:12::i;:::-;20719:30;;20760:38;20776:4;20782:7;20791:6;20760:15;:38::i;:::-;20809:27;20819:4;20825:2;20829:6;20809:9;:27::i;:::-;20854:4;20847:11;;;20571:295;;;;;:::o;29292:64::-;;;;:::o;30244:80::-;30282:42;30244:80;:::o;28694:51::-;;;;:::o;29643:19::-;;;;:::o;18219:93::-;18277:5;18302:2;18295:9;;18219:93;:::o;21275:270::-;21390:4;21412:13;21428:12;:10;:12::i;:::-;21412:28;;21451:64;21460:5;21467:7;21504:10;21476:25;21486:5;21493:7;21476:9;:25::i;:::-;:38;;;;:::i;:::-;21451:8;:64::i;:::-;21533:4;21526:11;;;21275:270;;;;:::o;41209:217::-;41250:56;41256:10;41268:37;41294:10;41268:25;:37::i;:::-;41250:5;:56::i;:::-;41381:37;41407:10;41381:25;:37::i;:::-;41349:17;:29;41367:10;41349:29;;;;;;;;;;;;;;;;:69;;;;:::i;:::-;41317:17;:29;41335:10;41317:29;;;;;;;;;;;;;;;:101;;;;41209:217::o;29363:37::-;;;;:::o;34636:737::-;32006:10;31974:42;;30001;31974;;;31952:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;34820:50:::1;34862:7;34820:37;;:41;;:50;;;;:::i;:::-;34780:37;:90;;;;34929:35;;34889:37;;:75;;34881:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;35072:1;35055:14;;:18;;;;:::i;:::-;35038:14;:35;;;;35084:20;35107:70;;;;;;;;35117:14;;35107:70;;;;30282:42;35107:70;;;;;;35144:8;35107:70;;;;;;35153:15;35107:70;;;;35169:7;35107:70;;::::0;35084:93:::1;;35217:3;35188:10;:26;35199:14;;35188:26;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35264:43;35299:7;35264:20;:30;35285:8;35264:30;;;;;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;35231:20;:30;35252:8;35231:30;;;;;;;;;;;;;;;:76;;;;35318:16;:26;35335:8;35318:26;;;;;;;;;;;;;;;35350:14;;35318:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34769:604;34636:737:::0;;:::o;32406:634::-;31425:10;31416:19;;29703:42;31416:19;;;31408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32542:34:::1;32568:7;32542:21;;:25;;:34;;;;:::i;:::-;32518:21;:58;;;;32620:19;;32595:21;;:44;;32587:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;32715:1;32698:14;;:18;;;;:::i;:::-;32681:14;:35;;;;32727:20;32750:84;;;;;;;;32760:14;;32750:84;;;;30282:42;32750:84;;;;;;32789:8;32750:84;;;;;;32799:15;32750:84;;;;32816:7;32750:84;;::::0;32727:107:::1;;32874:3;32845:10;:26;32856:14;;32845:26;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32921:43;32956:7;32921:20;:30;32942:8;32921:30;;;;;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;32888:20;:30;32909:8;32888:30;;;;;;;;;;;;;;;:76;;;;32975:16;:26;32992:8;32975:26;;;;;;;;;;;;;;;33007:14;;32975:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32507:533;32406:634:::0;;:::o;29407:66::-;;;;:::o;30333:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30457:50::-;;;;:::o;28870:76::-;;;;:::o;18548:177::-;18667:7;18699:9;:18;18709:7;18699:18;;;;;;;;;;;;;;;;18692:25;;18548:177;;;:::o;31253:55::-;;;;;;;;;;;;;;;;;:::o;29481:68::-;;;;:::o;29559:41::-;;;;:::o;28658:29::-;;;;:::o;33119:667::-;31590:10;31566:34;;29799:42;31566:34;;;31544:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;33279:42:::1;33313:7;33279:29;;:33;;:42;;;;:::i;:::-;33247:29;:74;;;;33373:27;;33340:29;;:60;;33332:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;33485:1;33468:14;;:18;;;;:::i;:::-;33451:14;:35;;;;33497:20;33520:70;;;;;;;;33530:14;;33520:70;;;;30282:42;33520:70;;;;;;33557:8;33520:70;;;;;;33566:15;33520:70;;;;33582:7;33520:70;;::::0;33497:93:::1;;33630:3;33601:10;:26;33612:14;;33601:26;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33677:43;33712:7;33677:20;:30;33698:8;33677:30;;;;;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;33644:20;:30;33665:8;33644:30;;;;;;;;;;;;;;;:76;;;;33731:16;:26;33748:8;33731:26;;;;;;;;;;;;;;;33763:14;;33731:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33236:550;33119:667:::0;;:::o;9240:87::-;9286:7;9313:6;;;;;;;;;;;9306:13;;9240:87;:::o;30146:91::-;30195:42;30146:91;:::o;36314:2148::-;36385:16;36404:24;36424:3;36404:15;36416:2;36404:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;36385:43;;36441:4;;;;;;;;;;;:17;;;36459:10;30195:42;36495:8;36441:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36515:4;;;;;;;;;;;:17;;;36533:10;29703:42;36552:8;36515:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36574:19;36616:6;36596:17;36608:4;;36596:7;:11;;:17;;;;:::i;:::-;:26;;;;:::i;:::-;36574:48;;36635:55;36653:10;30282:42;36678:11;36635:17;:55::i;:::-;36703:19;36725:8;:20;36734:10;36725:20;;;;;;;;;;;;;;;36703:42;;36786:1;36762:26;;:3;:12;;;;;;;;;;;;:26;;;36758:611;;36866:1;36827:8;:18;36836:8;36827:18;;;;;;;;;;;;;;;:29;;:36;;;;:40;:83;;;;;36900:10;36888:22;;:8;:22;;;;36827:83;36805:179;;;36960:8;36945:3;:12;;;:23;;;;;;;;;;;;;;;;;;36805:179;37000:14;37017:3;:12;;;;;;;;;;;;37000:29;;37049:9;37044:314;37068:1;37064;:5;37044:314;;;37117:1;37099:20;;:6;:20;;;37095:247;;37173:81;37230:1;37173:8;:16;37182:6;37173:16;;;;;;;;;;;;;;;:23;;37197:1;37173:26;;;;;;;:::i;:::-;;;;:30;;:81;;;;:::i;:::-;37144:8;:16;37153:6;37144:16;;;;;;;;;;;;;;;:23;;37168:1;37144:26;;;;;;;:::i;:::-;;;:110;;;;37286:8;:16;37295:6;37286:16;;;;;;;;;;;;;;;:25;;;;;;;;;;;;37277:34;;37095:247;;;37337:5;;37095:247;37071:3;;;;;:::i;:::-;;;;37044:314;;;;36790:579;36758:611;37409:1;37385:26;;:3;:12;;;;;;;;;;;;:26;;;37381:642;;37428:14;37445:3;:12;;;;;;;;;;;;37428:29;;37477:9;37472:540;37496:1;37492;:5;37472:540;;;37545:1;37527:20;;:6;:20;;;37523:473;;37572:14;37589:107;30445:4;37589:37;37605:17;37623:1;37605:20;;;;;;;;:::i;:::-;;;;;;;;;;37589:11;:15;;:37;;;;:::i;:::-;:41;;:107;;;;:::i;:::-;37572:124;;37719:45;37737:6;37745:10;37757:6;37719:17;:45::i;:::-;37841:1;37814:16;:24;37831:6;37814:24;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;37787:16;:24;37804:6;37787:24;;;;;;;;;;;;;;;:55;;;;37865:14;:22;37880:6;37865:22;;;;;;;;;;;;;;;37893:14;;37865:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37940:8;:16;37949:6;37940:16;;;;;;;;;;;;;;;:25;;;;;;;;;;;;37931:34;;37549:436;37523:473;;;37991:5;;37523:473;37499:3;;;;;:::i;:::-;;;;37472:540;;;;37413:610;37381:642;38035:3;:14;;38055;;38035:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38081:25;38109:72;38154:16;38109:26;;:30;;:72;;;;:::i;:::-;38081:100;;38192:25;38220:37;38242:14;;38220:17;:21;;:37;;;;:::i;:::-;38192:65;;38323:1;38302:17;:22;38298:157;;38348:46;38357:36;38389:3;38357:27;38366:17;38357:4;;:8;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;38348:4;;:8;;:46;;;;:::i;:::-;38341:4;:53;;;;38426:17;38409:14;:34;;;;38298:157;36374:2088;;;;;36314:2148;;:::o;28953:44::-;;;;:::o;17476:104::-;17532:13;17565:7;17558:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17476:104;:::o;30050:89::-;30097:42;30050:89;:::o;29848:91::-;29897:42;29848:91;:::o;29607:29::-;;;;:::o;22048:505::-;22168:4;22190:13;22206:12;:10;:12::i;:::-;22190:28;;22229:24;22256:25;22266:5;22273:7;22256:9;:25::i;:::-;22229:52;;22334:15;22314:16;:35;;22292:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;22450:60;22459:5;22466:7;22494:15;22475:16;:34;22450:8;:60::i;:::-;22541:4;22534:11;;;;22048:505;;;;:::o;18931:234::-;19046:4;19068:13;19084:12;:10;:12::i;:::-;19068:28;;19107;19117:5;19124:2;19128:6;19107:9;:28::i;:::-;19153:4;19146:11;;;18931:234;;;;:::o;31021:51::-;;;;;;;;;;;;;;;;;:::o;29004:78::-;;;;:::o;38541:2605::-;38642:7;38667:15;38685:1;38667:19;;38702:9;38697:2382;38721:16;:26;38738:8;38721:26;;;;;;;;;;;;;;;:33;;;;38717:1;:37;38697:2382;;;38776:20;38799:158;38950:6;38818:112;38860:10;:41;38871:16;:26;38888:8;38871:26;;;;;;;;;;;;;;;38898:1;38871:29;;;;;;;;:::i;:::-;;;;;;;;;;38860:41;;;;;;;;;;;:51;;;38818:15;:19;;:112;;;;:::i;:::-;38799:150;;:158;;;;:::i;:::-;38776:181;;38992:3;38976:12;:19;38972:2096;;39045:26;39074:113;39183:3;39074:104;39175:2;39097:10;:41;39108:16;:26;39125:8;39108:26;;;;;;;;;;;;;;;39135:1;39108:29;;;;;;;;:::i;:::-;;;;;;;;;;39097:41;;;;;;;;;;;:54;;;39074:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;39045:142;;39206:23;39232:27;39255:3;39232:18;:22;;:27;;;;:::i;:::-;39206:53;;39298:33;39315:15;39298:12;:16;;:33;;;;:::i;:::-;39288:7;:43;;;;:::i;:::-;39278:53;;38997:350;;38972:2096;;;39372:3;39357:12;:18;:41;;;;;39395:3;39379:12;:19;;39357:41;39353:1715;;;39448:26;39477:113;39586:3;39477:104;39578:2;39500:10;:41;39511:16;:26;39528:8;39511:26;;;;;;;;;;;;;;;39538:1;39511:29;;;;;;;;:::i;:::-;;;;;;;;;;39500:41;;;;;;;;;;;:54;;;39477:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;39448:142;;39609:27;39639:113;39748:3;39639:104;39740:2;39662:10;:41;39673:16;:26;39690:8;39673:26;;;;;;;;;;;;;;;39700:1;39673:29;;;;;;;;:::i;:::-;;;;;;;;;;39662:41;;;;;;;;;;;:54;;;39639:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;39609:143;;39771:23;39797:28;39821:3;39797:19;:23;;:28;;;;:::i;:::-;39771:54;;39906:114;39955:42;39981:15;39955:21;39972:3;39955:12;:16;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;39906:18;:22;;:114;;;;:::i;:::-;39875:7;:145;;;;:::i;:::-;39844:176;;39400:636;;;39353:1715;;;40061:3;40046:12;:18;:42;;;;;40084:4;40068:12;:20;;40046:42;40042:1026;;;40138:26;40167:113;40276:3;40167:104;40268:2;40190:10;:41;40201:16;:26;40218:8;40201:26;;;;;;;;;;;;;;;40228:1;40201:29;;;;;;;;:::i;:::-;;;;;;;;;;40190:41;;;;;;;;;;;:54;;;40167:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;40138:142;;40299:27;40329:113;40438:3;40329:104;40430:2;40352:10;:41;40363:16;:26;40380:8;40363:26;;;;;;;;;;;;;;;40390:1;40363:29;;;;;;;;:::i;:::-;;;;;;;;;;40352:41;;;;;;;;;;;:54;;;40329:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;40299:143;;40461:26;40490:113;40599:3;40490:104;40591:2;40513:10;:41;40524:16;:26;40541:8;40524:26;;;;;;;;;;;;;;;40551:1;40524:29;;;;;;;;:::i;:::-;;;;;;;;;;40513:41;;;;;;;;;;;:54;;;40490:100;;:104;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;40461:142;;40622:23;40648:27;40671:3;40648:18;:22;;:27;;;;:::i;:::-;40622:53;;40756:139;40830:42;40856:15;40830:21;40847:3;40830:12;:16;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;40756:43;40779:19;40756:18;:22;;:43;;;;:::i;:::-;:47;;:139;;;;:::i;:::-;40725:7;:170;;;;:::i;:::-;40694:201;;40090:821;;;;40042:1026;;;40998:10;:41;41009:16;:26;41026:8;41009:26;;;;;;;;;;;;;;;41036:1;41009:29;;;;;;;;:::i;:::-;;;;;;;;;;40998:41;;;;;;;;;;;:54;;;40967:7;:85;;;;:::i;:::-;40936:116;;40042:1026;39353:1715;38972:2096;38761:2318;38756:3;;;;;:::i;:::-;;;;38697:2382;;;;41098:40;41110:17;:27;41128:8;41110:27;;;;;;;;;;;;;;;;41098:7;:11;;:40;;;;:::i;:::-;41091:47;;;38541:2605;;;:::o;33867:681::-;31791:10;31765:36;;29897:42;31765:36;;;31743:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;34033:44:::1;34069:7;34033:31;;:35;;:44;;;;:::i;:::-;33999:31;:78;;;;34131:29;;34096:31;;:64;;34088:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;34247:1;34230:14;;:18;;;;:::i;:::-;34213:14;:35;;;;34259:20;34282:70;;;;;;;;34292:14;;34282:70;;;;30282:42;34282:70;;;;;;34319:8;34282:70;;;;;;34328:15;34282:70;;;;34344:7;34282:70;;::::0;34259:93:::1;;34392:3;34363:10;:26;34374:14;;34363:26;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34439:43;34474:7;34439:20;:30;34460:8;34439:30;;;;;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;34406:20;:30;34427:8;34406:30;;;;;;;;;;;;;;;:76;;;;34493:16;:26;34510:8;34493:26;;;;;;;;;;;;;;;34525:14;;34493:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33988:560;33867:681:::0;;:::o;31315:52::-;;;;;;;;;;;;;;;;;:::o;28752:68::-;;;;:::o;31079:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19228:201::-;19362:7;19394:11;:18;19406:5;19394:18;;;;;;;;;;;;;;;:27;19413:7;19394:27;;;;;;;;;;;;;;;;19387:34;;19228:201;;;;:::o;29946:97::-;30001:42;29946:97;:::o;10039:201::-;9126:13;:11;:13::i;:::-;10148:1:::1;10128:22;;:8;:22;;::::0;10120:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10204:28;10223:8;10204:18;:28::i;:::-;10039:201:::0;:::o;29752:89::-;29799:42;29752:89;:::o;31133:53::-;;;;;;;;;;;;;;;;;:::o;29671:74::-;29703:42;29671:74;:::o;31193:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3759:98::-;3817:7;3848:1;3844;:5;;;;:::i;:::-;3837:12;;3759:98;;;;:::o;4158:::-;4216:7;4247:1;4243;:5;;;;:::i;:::-;4236:12;;4158:98;;;;:::o;7916:::-;7969:7;7996:10;7989:17;;7916:98;:::o;25917:380::-;26070:1;26053:19;;:5;:19;;;26045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26151:1;26132:21;;:7;:21;;;26124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26235:6;26205:11;:18;26217:5;26205:18;;;;;;;;;;;;;;;:27;26224:7;26205:27;;;;;;;;;;;;;;;:36;;;;26273:7;26257:32;;26266:5;26257:32;;;26282:6;26257:32;;;;;;:::i;:::-;;;;;;;;25917:380;;;:::o;26588:502::-;26723:24;26750:25;26760:5;26767:7;26750:9;:25::i;:::-;26723:52;;26810:17;26790:16;:37;26786:297;;26890:6;26870:16;:26;;26844:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27005:51;27014:5;27021:7;27049:6;27030:16;:25;27005:8;:51::i;:::-;26786:297;26712:378;26588:502;;;:::o;23023:708::-;23170:1;23154:18;;:4;:18;;;23146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23247:1;23233:16;;:2;:16;;;23225:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23302:38;23323:4;23329:2;23333:6;23302:20;:38::i;:::-;23353:19;23375:9;:15;23385:4;23375:15;;;;;;;;;;;;;;;;23353:37;;23438:6;23423:11;:21;;23401:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23578:6;23564:11;:20;23546:9;:15;23556:4;23546:15;;;;;;;;;;;;;;;:38;;;;23623:6;23606:9;:13;23616:2;23606:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;23662:2;23647:26;;23656:4;23647:26;;;23666:6;23647:26;;;;;;:::i;:::-;;;;;;;;23686:37;23706:4;23712:2;23716:6;23686:19;:37::i;:::-;23135:596;23023:708;;;:::o;24018:537::-;24121:1;24102:21;;:7;:21;;;24094:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;24172:49;24201:1;24205:7;24214:6;24172:20;:49::i;:::-;24250:6;24234:12;;:22;;;;;;;:::i;:::-;;;;;;;;24305:15;;24289:12;;:31;;24267:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;24427:6;24405:9;:18;24415:7;24405:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;24470:7;24449:37;;24466:1;24449:37;;;24479:6;24449:37;;;;;;:::i;:::-;;;;;;;;24499:48;24527:1;24531:7;24540:6;24499:19;:48::i;:::-;24018:537;;:::o;3021:98::-;3079:7;3110:1;3106;:5;;;;:::i;:::-;3099:12;;3021:98;;;;:::o;35381:925::-;35542:35;35569:7;35542:22;;:26;;:35;;;;:::i;:::-;35517:22;:60;;;;35636:15;;35610:22;;:41;;35588:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;35749:1;35732:14;;:18;;;;:::i;:::-;35715:14;:35;;;;35761:20;35784:149;;;;;;;;35808:14;;35784:149;;;;35837:10;35784:149;;;;;;35862:8;35784:149;;;;;;35885:15;35784:149;;;;35915:7;35784:149;;;35761:172;;35973:3;35944:10;:26;35955:14;;35944:26;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36020:67;36069:7;36020:20;:30;36041:8;36020:30;;;;;;;;;;;;;;;;:34;;:67;;;;:::i;:::-;35987:20;:30;36008:8;35987:30;;;;;;;;;;;;;;;:100;;;;36098:16;:26;36115:8;36098:26;;;;;;;;;;;;;;;36130:14;;36098:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36218:1;36187:18;:28;36206:8;36187:28;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;36156:18;:28;36175:8;36156:28;;;;;;;;;;;;;;;:63;;;;36259:39;36290:7;36259:26;;:30;;:39;;;;:::i;:::-;36230:26;:68;;;;35506:800;35381:925;;;:::o;3402:98::-;3460:7;3491:1;3487;:5;;;;:::i;:::-;3480:12;;3402:98;;;;:::o;9405:132::-;9480:12;:10;:12::i;:::-;9469:23;;:7;:5;:7::i;:::-;:23;;;9461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9405:132::o;10400:191::-;10474:16;10493:6;;;;;;;;;;;10474:25;;10519:8;10510:6;;:17;;;;;;;;;;;;;;;;;;10574:8;10543:40;;10564:8;10543:40;;;;;;;;;;;;10463:128;10400:191;:::o;27690:125::-;;;;:::o;28419:124::-;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:307::-;790:1;800:113;814:6;811:1;808:13;800:113;;;899:1;894:3;890:11;884:18;880:1;875:3;871:11;864:39;836:2;833:1;829:10;824:15;;800:113;;;931:6;928:1;925:13;922:101;;;1011:1;1002:6;997:3;993:16;986:27;922:101;771:258;722:307;;;:::o;1035:102::-;1076:6;1127:2;1123:7;1118:2;1111:5;1107:14;1103:28;1093:38;;1035:102;;;:::o;1143:364::-;1231:3;1259:39;1292:5;1259:39;:::i;:::-;1314:71;1378:6;1373:3;1314:71;:::i;:::-;1307:78;;1394:52;1439:6;1434:3;1427:4;1420:5;1416:16;1394:52;:::i;:::-;1471:29;1493:6;1471:29;:::i;:::-;1466:3;1462:39;1455:46;;1235:272;1143:364;;;;:::o;1513:313::-;1626:4;1664:2;1653:9;1649:18;1641:26;;1713:9;1707:4;1703:20;1699:1;1688:9;1684:17;1677:47;1741:78;1814:4;1805:6;1741:78;:::i;:::-;1733:86;;1513:313;;;;:::o;1913:117::-;2022:1;2019;2012:12;2159:126;2196:7;2236:42;2229:5;2225:54;2214:65;;2159:126;;;:::o;2291:96::-;2328:7;2357:24;2375:5;2357:24;:::i;:::-;2346:35;;2291:96;;;:::o;2393:122::-;2466:24;2484:5;2466:24;:::i;:::-;2459:5;2456:35;2446:63;;2505:1;2502;2495:12;2446:63;2393:122;:::o;2521:139::-;2567:5;2605:6;2592:20;2583:29;;2621:33;2648:5;2621:33;:::i;:::-;2521:139;;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:118::-;4558:24;4576:5;4558:24;:::i;:::-;4553:3;4546:37;4471:118;;:::o;4595:222::-;4688:4;4726:2;4715:9;4711:18;4703:26;;4739:71;4807:1;4796:9;4792:17;4783:6;4739:71;:::i;:::-;4595:222;;;;:::o;4823:86::-;4858:7;4898:4;4891:5;4887:16;4876:27;;4823:86;;;:::o;4915:112::-;4998:22;5014:5;4998:22;:::i;:::-;4993:3;4986:35;4915:112;;:::o;5033:214::-;5122:4;5160:2;5149:9;5145:18;5137:26;;5173:67;5237:1;5226:9;5222:17;5213:6;5173:67;:::i;:::-;5033:214;;;;:::o;5253:329::-;5312:6;5361:2;5349:9;5340:7;5336:23;5332:32;5329:119;;;5367:79;;:::i;:::-;5329:119;5487:1;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5458:117;5253:329;;;;:::o;5588:::-;5647:6;5696:2;5684:9;5675:7;5671:23;5667:32;5664:119;;;5702:79;;:::i;:::-;5664:119;5822:1;5847:53;5892:7;5883:6;5872:9;5868:22;5847:53;:::i;:::-;5837:63;;5793:117;5588:329;;;;:::o;5923:474::-;5991:6;5999;6048:2;6036:9;6027:7;6023:23;6019:32;6016:119;;;6054:79;;:::i;:::-;6016:119;6174:1;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6145:117;6301:2;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6272:118;5923:474;;;;;:::o;6403:664::-;6608:4;6646:3;6635:9;6631:19;6623:27;;6660:71;6728:1;6717:9;6713:17;6704:6;6660:71;:::i;:::-;6741:72;6809:2;6798:9;6794:18;6785:6;6741:72;:::i;:::-;6823;6891:2;6880:9;6876:18;6867:6;6823:72;:::i;:::-;6905;6973:2;6962:9;6958:18;6949:6;6905:72;:::i;:::-;6987:73;7055:3;7044:9;7040:19;7031:6;6987:73;:::i;:::-;6403:664;;;;;;;;:::o;7073:474::-;7141:6;7149;7198:2;7186:9;7177:7;7173:23;7169:32;7166:119;;;7204:79;;:::i;:::-;7166:119;7324:1;7349:53;7394:7;7385:6;7374:9;7370:22;7349:53;:::i;:::-;7339:63;;7295:117;7451:2;7477:53;7522:7;7513:6;7502:9;7498:22;7477:53;:::i;:::-;7467:63;;7422:118;7073:474;;;;;:::o;7553:180::-;7601:77;7598:1;7591:88;7698:4;7695:1;7688:15;7722:4;7719:1;7712:15;7739:320;7783:6;7820:1;7814:4;7810:12;7800:22;;7867:1;7861:4;7857:12;7888:18;7878:81;;7944:4;7936:6;7932:17;7922:27;;7878:81;8006:2;7998:6;7995:14;7975:18;7972:38;7969:84;;8025:18;;:::i;:::-;7969:84;7790:269;7739:320;;;:::o;8065:180::-;8113:77;8110:1;8103:88;8210:4;8207:1;8200:15;8234:4;8231:1;8224:15;8251:305;8291:3;8310:20;8328:1;8310:20;:::i;:::-;8305:25;;8344:20;8362:1;8344:20;:::i;:::-;8339:25;;8498:1;8430:66;8426:74;8423:1;8420:81;8417:107;;;8504:18;;:::i;:::-;8417:107;8548:1;8545;8541:9;8534:16;;8251:305;;;;:::o;8562:241::-;8702:34;8698:1;8690:6;8686:14;8679:58;8771:24;8766:2;8758:6;8754:15;8747:49;8562:241;:::o;8809:366::-;8951:3;8972:67;9036:2;9031:3;8972:67;:::i;:::-;8965:74;;9048:93;9137:3;9048:93;:::i;:::-;9166:2;9161:3;9157:12;9150:19;;8809:366;;;:::o;9181:419::-;9347:4;9385:2;9374:9;9370:18;9362:26;;9434:9;9428:4;9424:20;9420:1;9409:9;9405:17;9398:47;9462:131;9588:4;9462:131;:::i;:::-;9454:139;;9181:419;;;:::o;9606:232::-;9746:34;9742:1;9734:6;9730:14;9723:58;9815:15;9810:2;9802:6;9798:15;9791:40;9606:232;:::o;9844:366::-;9986:3;10007:67;10071:2;10066:3;10007:67;:::i;:::-;10000:74;;10083:93;10172:3;10083:93;:::i;:::-;10201:2;10196:3;10192:12;10185:19;;9844:366;;;:::o;10216:419::-;10382:4;10420:2;10409:9;10405:18;10397:26;;10469:9;10463:4;10459:20;10455:1;10444:9;10440:17;10433:47;10497:131;10623:4;10497:131;:::i;:::-;10489:139;;10216:419;;;:::o;10641:223::-;10781:34;10777:1;10769:6;10765:14;10758:58;10850:6;10845:2;10837:6;10833:15;10826:31;10641:223;:::o;10870:366::-;11012:3;11033:67;11097:2;11092:3;11033:67;:::i;:::-;11026:74;;11109:93;11198:3;11109:93;:::i;:::-;11227:2;11222:3;11218:12;11211:19;;10870:366;;;:::o;11242:419::-;11408:4;11446:2;11435:9;11431:18;11423:26;;11495:9;11489:4;11485:20;11481:1;11470:9;11466:17;11459:47;11523:131;11649:4;11523:131;:::i;:::-;11515:139;;11242:419;;;:::o;11667:177::-;11807:29;11803:1;11795:6;11791:14;11784:53;11667:177;:::o;11850:366::-;11992:3;12013:67;12077:2;12072:3;12013:67;:::i;:::-;12006:74;;12089:93;12178:3;12089:93;:::i;:::-;12207:2;12202:3;12198:12;12191:19;;11850:366;;;:::o;12222:419::-;12388:4;12426:2;12415:9;12411:18;12403:26;;12475:9;12469:4;12465:20;12461:1;12450:9;12446:17;12439:47;12503:131;12629:4;12503:131;:::i;:::-;12495:139;;12222:419;;;:::o;12647:232::-;12787:34;12783:1;12775:6;12771:14;12764:58;12856:15;12851:2;12843:6;12839:15;12832:40;12647:232;:::o;12885:366::-;13027:3;13048:67;13112:2;13107:3;13048:67;:::i;:::-;13041:74;;13124:93;13213:3;13124:93;:::i;:::-;13242:2;13237:3;13233:12;13226:19;;12885:366;;;:::o;13257:419::-;13423:4;13461:2;13450:9;13446:18;13438:26;;13510:9;13504:4;13500:20;13496:1;13485:9;13481:17;13474:47;13538:131;13664:4;13538:131;:::i;:::-;13530:139;;13257:419;;;:::o;13682:223::-;13822:34;13818:1;13810:6;13806:14;13799:58;13891:6;13886:2;13878:6;13874:15;13867:31;13682:223;:::o;13911:366::-;14053:3;14074:67;14138:2;14133:3;14074:67;:::i;:::-;14067:74;;14150:93;14239:3;14150:93;:::i;:::-;14268:2;14263:3;14259:12;14252:19;;13911:366;;;:::o;14283:419::-;14449:4;14487:2;14476:9;14472:18;14464:26;;14536:9;14530:4;14526:20;14522:1;14511:9;14507:17;14500:47;14564:131;14690:4;14564:131;:::i;:::-;14556:139;;14283:419;;;:::o;14708:442::-;14857:4;14895:2;14884:9;14880:18;14872:26;;14908:71;14976:1;14965:9;14961:17;14952:6;14908:71;:::i;:::-;14989:72;15057:2;15046:9;15042:18;15033:6;14989:72;:::i;:::-;15071;15139:2;15128:9;15124:18;15115:6;15071:72;:::i;:::-;14708:442;;;;;;:::o;15156:116::-;15226:21;15241:5;15226:21;:::i;:::-;15219:5;15216:32;15206:60;;15262:1;15259;15252:12;15206:60;15156:116;:::o;15278:137::-;15332:5;15363:6;15357:13;15348:22;;15379:30;15403:5;15379:30;:::i;:::-;15278:137;;;;:::o;15421:345::-;15488:6;15537:2;15525:9;15516:7;15512:23;15508:32;15505:119;;;15543:79;;:::i;:::-;15505:119;15663:1;15688:61;15741:7;15732:6;15721:9;15717:22;15688:61;:::i;:::-;15678:71;;15634:125;15421:345;;;;:::o;15772:348::-;15812:7;15835:20;15853:1;15835:20;:::i;:::-;15830:25;;15869:20;15887:1;15869:20;:::i;:::-;15864:25;;16057:1;15989:66;15985:74;15982:1;15979:81;15974:1;15967:9;15960:17;15956:105;15953:131;;;16064:18;;:::i;:::-;15953:131;16112:1;16109;16105:9;16094:20;;15772:348;;;;:::o;16126:180::-;16174:77;16171:1;16164:88;16271:4;16268:1;16261:15;16295:4;16292:1;16285:15;16312:233;16351:3;16374:24;16392:5;16374:24;:::i;:::-;16365:33;;16420:66;16413:5;16410:77;16407:103;;16490:18;;:::i;:::-;16407:103;16537:1;16530:5;16526:13;16519:20;;16312:233;;;:::o;16551:224::-;16691:34;16687:1;16679:6;16675:14;16668:58;16760:7;16755:2;16747:6;16743:15;16736:32;16551:224;:::o;16781:366::-;16923:3;16944:67;17008:2;17003:3;16944:67;:::i;:::-;16937:74;;17020:93;17109:3;17020:93;:::i;:::-;17138:2;17133:3;17129:12;17122:19;;16781:366;;;:::o;17153:419::-;17319:4;17357:2;17346:9;17342:18;17334:26;;17406:9;17400:4;17396:20;17392:1;17381:9;17377:17;17370:47;17434:131;17560:4;17434:131;:::i;:::-;17426:139;;17153:419;;;:::o;17578:234::-;17718:34;17714:1;17706:6;17702:14;17695:58;17787:17;17782:2;17774:6;17770:15;17763:42;17578:234;:::o;17818:366::-;17960:3;17981:67;18045:2;18040:3;17981:67;:::i;:::-;17974:74;;18057:93;18146:3;18057:93;:::i;:::-;18175:2;18170:3;18166:12;18159:19;;17818:366;;;:::o;18190:419::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:131;18597:4;18471:131;:::i;:::-;18463:139;;18190:419;;;:::o;18615:225::-;18755:34;18751:1;18743:6;18739:14;18732:58;18824:8;18819:2;18811:6;18807:15;18800:33;18615:225;:::o;18846:366::-;18988:3;19009:67;19073:2;19068:3;19009:67;:::i;:::-;19002:74;;19085:93;19174:3;19085:93;:::i;:::-;19203:2;19198:3;19194:12;19187:19;;18846:366;;;:::o;19218:419::-;19384:4;19422:2;19411:9;19407:18;19399:26;;19471:9;19465:4;19461:20;19457:1;19446:9;19442:17;19435:47;19499:131;19625:4;19499:131;:::i;:::-;19491:139;;19218:419;;;:::o;19643:225::-;19783:34;19779:1;19771:6;19767:14;19760:58;19852:8;19847:2;19839:6;19835:15;19828:33;19643:225;:::o;19874:366::-;20016:3;20037:67;20101:2;20096:3;20037:67;:::i;:::-;20030:74;;20113:93;20202:3;20113:93;:::i;:::-;20231:2;20226:3;20222:12;20215:19;;19874:366;;;:::o;20246:419::-;20412:4;20450:2;20439:9;20435:18;20427:26;;20499:9;20493:4;20489:20;20485:1;20474:9;20470:17;20463:47;20527:131;20653:4;20527:131;:::i;:::-;20519:139;;20246:419;;;:::o;20671:180::-;20719:77;20716:1;20709:88;20816:4;20813:1;20806:15;20840:4;20837:1;20830:15;20857:185;20897:1;20914:20;20932:1;20914:20;:::i;:::-;20909:25;;20948:20;20966:1;20948:20;:::i;:::-;20943:25;;20987:1;20977:35;;20992:18;;:::i;:::-;20977:35;21034:1;21031;21027:9;21022:14;;20857:185;;;;:::o;21048:223::-;21188:34;21184:1;21176:6;21172:14;21165:58;21257:6;21252:2;21244:6;21240:15;21233:31;21048:223;:::o;21277:366::-;21419:3;21440:67;21504:2;21499:3;21440:67;:::i;:::-;21433:74;;21516:93;21605:3;21516:93;:::i;:::-;21634:2;21629:3;21625:12;21618:19;;21277:366;;;:::o;21649:419::-;21815:4;21853:2;21842:9;21838:18;21830:26;;21902:9;21896:4;21892:20;21888:1;21877:9;21873:17;21866:47;21930:131;22056:4;21930:131;:::i;:::-;21922:139;;21649:419;;;:::o;22074:221::-;22214:34;22210:1;22202:6;22198:14;22191:58;22283:4;22278:2;22270:6;22266:15;22259:29;22074:221;:::o;22301:366::-;22443:3;22464:67;22528:2;22523:3;22464:67;:::i;:::-;22457:74;;22540:93;22629:3;22540:93;:::i;:::-;22658:2;22653:3;22649:12;22642:19;;22301:366;;;:::o;22673:419::-;22839:4;22877:2;22866:9;22862:18;22854:26;;22926:9;22920:4;22916:20;22912:1;22901:9;22897:17;22890:47;22954:131;23080:4;22954:131;:::i;:::-;22946:139;;22673:419;;;:::o;23098:179::-;23238:31;23234:1;23226:6;23222:14;23215:55;23098:179;:::o;23283:366::-;23425:3;23446:67;23510:2;23505:3;23446:67;:::i;:::-;23439:74;;23522:93;23611:3;23522:93;:::i;:::-;23640:2;23635:3;23631:12;23624:19;;23283:366;;;:::o;23655:419::-;23821:4;23859:2;23848:9;23844:18;23836:26;;23908:9;23902:4;23898:20;23894:1;23883:9;23879:17;23872:47;23936:131;24062:4;23936:131;:::i;:::-;23928:139;;23655:419;;;:::o;24080:224::-;24220:34;24216:1;24208:6;24204:14;24197:58;24289:7;24284:2;24276:6;24272:15;24265:32;24080:224;:::o;24310:366::-;24452:3;24473:67;24537:2;24532:3;24473:67;:::i;:::-;24466:74;;24549:93;24638:3;24549:93;:::i;:::-;24667:2;24662:3;24658:12;24651:19;;24310:366;;;:::o;24682:419::-;24848:4;24886:2;24875:9;24871:18;24863:26;;24935:9;24929:4;24925:20;24921:1;24910:9;24906:17;24899:47;24963:131;25089:4;24963:131;:::i;:::-;24955:139;;24682:419;;;:::o;25107:222::-;25247:34;25243:1;25235:6;25231:14;25224:58;25316:5;25311:2;25303:6;25299:15;25292:30;25107:222;:::o;25335:366::-;25477:3;25498:67;25562:2;25557:3;25498:67;:::i;:::-;25491:74;;25574:93;25663:3;25574:93;:::i;:::-;25692:2;25687:3;25683:12;25676:19;;25335:366;;;:::o;25707:419::-;25873:4;25911:2;25900:9;25896:18;25888:26;;25960:9;25954:4;25950:20;25946:1;25935:9;25931:17;25924:47;25988:131;26114:4;25988:131;:::i;:::-;25980:139;;25707:419;;;:::o;26132:225::-;26272:34;26268:1;26260:6;26256:14;26249:58;26341:8;26336:2;26328:6;26324:15;26317:33;26132:225;:::o;26363:366::-;26505:3;26526:67;26590:2;26585:3;26526:67;:::i;:::-;26519:74;;26602:93;26691:3;26602:93;:::i;:::-;26720:2;26715:3;26711:12;26704:19;;26363:366;;;:::o;26735:419::-;26901:4;26939:2;26928:9;26924:18;26916:26;;26988:9;26982:4;26978:20;26974:1;26963:9;26959:17;26952:47;27016:131;27142:4;27016:131;:::i;:::-;27008:139;;26735:419;;;:::o;27160:181::-;27300:33;27296:1;27288:6;27284:14;27277:57;27160:181;:::o;27347:366::-;27489:3;27510:67;27574:2;27569:3;27510:67;:::i;:::-;27503:74;;27586:93;27675:3;27586:93;:::i;:::-;27704:2;27699:3;27695:12;27688:19;;27347:366;;;:::o;27719:419::-;27885:4;27923:2;27912:9;27908:18;27900:26;;27972:9;27966:4;27962:20;27958:1;27947:9;27943:17;27936:47;28000:131;28126:4;28000:131;:::i;:::-;27992:139;;27719:419;;;:::o;28144:233::-;28284:34;28280:1;28272:6;28268:14;28261:58;28353:16;28348:2;28340:6;28336:15;28329:41;28144:233;:::o;28383:366::-;28525:3;28546:67;28610:2;28605:3;28546:67;:::i;:::-;28539:74;;28622:93;28711:3;28622:93;:::i;:::-;28740:2;28735:3;28731:12;28724:19;;28383:366;;;:::o;28755:419::-;28921:4;28959:2;28948:9;28944:18;28936:26;;29008:9;29002:4;28998:20;28994:1;28983:9;28979:17;28972:47;29036:131;29162:4;29036:131;:::i;:::-;29028:139;;28755:419;;;:::o;29180:175::-;29320:27;29316:1;29308:6;29304:14;29297:51;29180:175;:::o;29361:366::-;29503:3;29524:67;29588:2;29583:3;29524:67;:::i;:::-;29517:74;;29600:93;29689:3;29600:93;:::i;:::-;29718:2;29713:3;29709:12;29702:19;;29361:366;;;:::o;29733:419::-;29899:4;29937:2;29926:9;29922:18;29914:26;;29986:9;29980:4;29976:20;29972:1;29961:9;29957:17;29950:47;30014:131;30140:4;30014:131;:::i;:::-;30006:139;;29733:419;;;:::o;30158:191::-;30198:4;30218:20;30236:1;30218:20;:::i;:::-;30213:25;;30252:20;30270:1;30252:20;:::i;:::-;30247:25;;30291:1;30288;30285:8;30282:34;;;30296:18;;:::i;:::-;30282:34;30341:1;30338;30334:9;30326:17;;30158:191;;;;:::o;30355:182::-;30495:34;30491:1;30483:6;30479:14;30472:58;30355:182;:::o;30543:366::-;30685:3;30706:67;30770:2;30765:3;30706:67;:::i;:::-;30699:74;;30782:93;30871:3;30782:93;:::i;:::-;30900:2;30895:3;30891:12;30884:19;;30543:366;;;:::o;30915:419::-;31081:4;31119:2;31108:9;31104:18;31096:26;;31168:9;31162:4;31158:20;31154:1;31143:9;31139:17;31132:47;31196:131;31322:4;31196:131;:::i;:::-;31188:139;;30915:419;;;:::o

Swarm Source

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