ETH Price: $2,933.47 (+7.54%)
 

Overview

Max Total Supply

3,078 OXD

Holders

449

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 OXD
0x0b2821876c5562d30f3ac9c76A6356B1E4fb2704
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

0xDragons and the Cult have arrived. $SCALE has started to shed and is being Hoarded. Customize your 0xDragons Rarity inside 0xItemShops.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/erc20interface.sol


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20_ {
   
    function totalSupply() external view returns (uint256);

   
    function balanceOf(address account) external view returns (uint256);

    
    function transfer(address to, uint256 amount) external returns (bool);

    
    function allowance(address owner, address spender) external view returns (uint256);


    function approve(address spender, uint256 amount) external returns (bool);

   
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

   
    event Transfer(address indexed from, address indexed to, uint256 value);


    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: 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/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: 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;
    }
}

// File: contracts/_ERC20.sol


pragma solidity ^0.8.0;



contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint counter;
    mapping (address =>bool) onlyapprovedcontractaddress;

    /**
     * @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_ ,uint amount,address owneraddress) {
        _name = name_;
        _symbol = symbol_;
        _mint(owneraddress,amount);

    }

    /**
     * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function setapprovedcontractaddress(address add,address addacient,address addbaby)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
         onlyapprovedcontractaddress[addacient] =true;
          onlyapprovedcontractaddress[addbaby] =true;

        counter+=1;
    }

    function mint(address add, uint amount)external{
        require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint");
        _mint(add,amount);
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

    function burn(address add,uint256 amount)public{
        require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint");
        _burn(add,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 Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: contracts/nftInterface.sol


pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface _IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

  function walletofNFT(address _owner)external view returns (uint256[] memory);

   function checkrewardbal(address add)external view returns(uint);
    function checkrewardbal()external view returns(uint);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

     function checkdragonnotbreeded(address add)external view returns(uint[] memory);
}
 
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/babynft.sol


pragma solidity ^0.8.0;












/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
interface erc20_{

  function mint(address add, uint amount)external;

}
contract babynft is Context, ERC165, IERC721, IERC721Metadata ,Ownable,IERC721Enumerable{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;

    uint counter;
    uint _counter;
    uint256 public maxSupply = 5555;
    
    erc20_ _erc20;
    bool   hassetcuurent;
    

    string public baseURI_ = "ipfs://QmQM5pmj9vyJhLXqdouYoUWJ58GVrRtMxS5UywgYbP22i9/";
    string public baseExtension = ".json";


    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    mapping(uint => mapping(address => uint)) private idtostartingtimet;

    mapping (address =>bool) onlyapprovedcontractaddress;


    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
       
    }

      /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = babynft.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = babynft.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

    function setapprovedcontractaddress(address add)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
        counter+=1;
    }

    function setmaxsupply(uint amount)public onlyOwner {
        maxSupply= amount;
    }

    function mint(address _to) public  {
     require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
      require( totalSupply() <= maxSupply);
        require (hassetcuurent==true,"please set setcurrentmintedamount ");
        if (_tokenIds.current()==0){
            _tokenIds.increment();
        }
        
        
        uint256 newTokenID = _tokenIds.current();
        _safeMint(_to, newTokenID);
        _tokenIds.increment();
        
    }

       function mint(address _to,uint newTokenID) public  {
     require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
      
        _safeMint(_to, newTokenID); 
        
        
    }
    
     function setcurrentmintedamount(uint totalmintedamount )public onlyOwner{
           hassetcuurent=true;
            if (_tokenIds.current()==0){
            _tokenIds.increment();
       }

       for (uint256 i = 1; i <=totalmintedamount; i++) {
          
            _tokenIds.increment();
         
        }
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = babynft.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
     
     function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }


    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = babynft.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
   function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    function seterc20address(address add)external {
        require(_counter<1, "already called this function");
         _erc20= erc20_(add);
         _counter++;
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }


    function checkrewardbal(address add)public view returns(uint){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((5*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function claimreward(address add) public {
          require(balanceOf(add)>0, "not qualified for reward");
         uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((5*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][add]=block.timestamp;
           }
        }

          _erc20.mint(add,rewardbal);


    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = babynft.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
       function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(babynft.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(babynft.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    // ) 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.
     * - `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 tokenId
    ) internal virtual {}
}
// File: contracts/ancientnft.sol


pragma solidity ^0.8.0;












/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
interface erc20{

  function mint(address add, uint amount)external;

}

contract ancientnft is Context, ERC165, IERC721, IERC721Metadata ,Ownable,IERC721Enumerable{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;

    uint counter;
    uint _counter;
    
    erc20 _erc20;
    bool   hassetcuurent;
    

    string public baseURI_ = "ipfs://QmcdpJpymYcd7ADgHSvJvkHpmuCVvQuexVBuMPdxmGrJy2/";
    string public baseExtension = ".json";


    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    mapping(uint => mapping(address => uint)) private idtostartingtimet;

    mapping (address =>bool) onlyapprovedcontractaddress;


    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

      /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ancientnft.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ancientnft.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

    function setapprovedcontractaddress(address add)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
        counter+=1;
    }

    function mint(address _to) public  {
        
    require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
     require (hassetcuurent==true,"please set setcurrentmintedamount ");
        
        if (_tokenIds.current()==0){
            _tokenIds.increment();
        }
        
        
        uint256 newTokenID = _tokenIds.current();
        _safeMint(_to, newTokenID);
        _tokenIds.increment();
        
    }

    function mint(address _to,uint newTokenID) public  {

     require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
    
        _safeMint(_to, newTokenID); 
        
        
    }

     function setcurrentmintedamount(uint totalmintedamount )public onlyOwner{
           hassetcuurent=true;
            if (_tokenIds.current()==0){
            _tokenIds.increment();
       }

       for (uint256 i = 1; i <=totalmintedamount; i++) {
          
            _tokenIds.increment();
         
        }
    }



    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ancientnft.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
     
     function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }


    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ancientnft.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
   function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    function seterc20address(address add)external {
        require(_counter<1, "already called this function");
         _erc20= erc20(add);
         _counter++;
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }


    function checkrewardbal(address add)public view returns(uint){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((50*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function claimreward(address add) public {
          require(balanceOf(add)>0, "not qualified for reward");
         uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((50*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][add]=block.timestamp;
           }
        }

          _erc20.mint(add,rewardbal);


    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ancientnft.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
       function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ancientnft.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ancientnft.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    // ) 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.
     * - `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 tokenId
    ) internal virtual {}
}
// File: contracts/NftMigrate.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

















contract ERC721  is Context, ERC165, IERC721, IERC721Metadata, Ownable, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    
   

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // uint public totalSupply;

    Counters.Counter private _tokenIds;
    
    

    string public baseURI_ = "ipfs://QmZkN9YuR1rrK1YXh1qxJxEotzrZbAfEYwzCHYz2Ln5Ear/";
    string public baseExtension = ".json";
    uint256 public cost = 0.03 ether;
    uint256 public maxSupply = 3333;
    uint256 public maxMintAmount = 20;
    bool public paused = false;
    bool public  _paused ;
   
     

     // wallet addresses for claims
    address private constant Jazzasaurus = 0xd848353706E5a26BAa6DD20265EDDe1e7047d9ba;
    address private constant munheezy = 0xB6D2ac64BDc24f76417b95b410ACf47cE31AdD07;
    address private constant _community = 0xe44CB360e48dA69fe75a78fD1649ccbd3CCf7AD1;
    address private constant _Dragoneer = 0x9817C311F6897D30e372C119a888028baC879d1c;

    mapping(uint => mapping(address => uint)) private idtostartingtimet;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

     mapping(address => mapping(uint256 => bool)) private _breeded;

     ERC20 _ERC20;
     ancientnft _ancientnft;  
     babynft _babynft; 

     IERC20_ iERC20_;
     _IERC721 mainERC721;
     _IERC721 ancientERC721;
     _IERC721 babyERC721;
     bool hassetcurrent;   

      




    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;


   
    constructor(string memory name_, string memory symbol_,string memory ERC20name_, string memory ERC20symbol_ ,uint ERC20amount,address ERC20owneraddress,string memory ancientnftname_, string memory ancientnftsymbol_,string memory babynftname_, string memory babynftsymbol_) {
        _name = name_;
        _symbol = symbol_;
       uint8[12] memory Ntokenid= [11, 13, 16, 17, 24, 29, 35, 42, 43, 63, 64, 65];   
       
        
        _ERC20= new ERC20(ERC20name_,ERC20symbol_,ERC20amount,ERC20owneraddress) ;
        
        _ancientnft = new ancientnft(ancientnftname_,ancientnftsymbol_);
        _ancientnft.setapprovedcontractaddress(address(this));
        _ancientnft.seterc20address(address(_ERC20));
        _babynft= new  babynft(babynftname_,babynftsymbol_);
        _babynft.setapprovedcontractaddress(address(this));
        _babynft.seterc20address(address(_ERC20)); 
        _ERC20.setapprovedcontractaddress(address(this),address(_ancientnft),address(_babynft));

         _mint(msg.sender,1);

         for (uint i ;i< Ntokenid.length;i++){
             
            _ancientnft.mint(msg.sender,Ntokenid[i]); 

          } 

    }

   
    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function pause() public onlyOwner  {
        paused = !paused;

     }

      function pausebreedandburn() public onlyOwner  {
        _paused = !_paused;

     }

    function checkPause() public view onlyOwner returns(bool) {
        return paused; 
    }
 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

  
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

  
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

   
    function name() public view virtual override returns (string memory) {
        return _name;
    }

   
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

  
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

   
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

   
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

  
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }


    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

  
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(paused == false);

        _transfer(from, to, tokenId);
    }

   
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

   
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }


    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

   
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }


    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

  

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];
        

        // totalSupply-=1;

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }
     
     function mint(
        address _to,
        uint256 _mintAmount
        
    ) public payable {
        // get total NFT token supply
      
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount);
        require( totalSupply() + _mintAmount <= maxSupply);
        require(paused == false);
        require (hassetcurrent==true,"please set setcurrentmintedamount ");
            
        
        require(msg.value >= cost * _mintAmount);
            
        

    

        // execute mint
       if (_tokenIds.current()==0){
            _tokenIds.increment();
       }
        
        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 newTokenID = _tokenIds.current();
            _safeMint(_to, newTokenID);
            _tokenIds.increment();
        }
    }

    function setcurrentmintedamount(uint totalmintedamount )public onlyOwner{
           hassetcurrent=true;
            if (_tokenIds.current()==0){
            _tokenIds.increment();
       }

       for (uint256 i = 1; i <=totalmintedamount; i++) {
          
            _tokenIds.increment();
         
        }
    }

    function checkdragonnotbreeded(address add)public view returns(uint[] memory){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);  
         
         
          uint count;
         for (uint i ;i<ownerTokenCount; i++){
             if (_breeded[address(this)][tokenIds[i]]==false){
                count++;   
             }
            
          
           }
          uint256[] memory notbreededbrtokenIds = new uint256[](count);
          uint _count;
            for (uint i ;i<ownerTokenCount; i++){
             if (_breeded[address(this)][tokenIds[i]]==false){
                   notbreededbrtokenIds[_count]=tokenIds[i];
                   _count++;
             }
            
          
           }

           return notbreededbrtokenIds;
        }
    
    

   
    function breed(uint id1,uint id2) public  {
        uint amount=1800*10**18;
        require(balanceOf(msg.sender)>=2, "Must Own 2 0xDragons");
        require (_ERC20.balanceOf(msg.sender) >= amount,"You Dont Have The $SCALE For That!");
        require (ownerOf(id1)==msg.sender,"NOT YOUR DRAGON");
        require (ownerOf(id2)==msg.sender,"NOT YOUR DRAGON");
        require( _paused == false);
        _ERC20.burn(msg.sender, amount);

       
         _breeded[address(this)][id1]=true;
           _breeded[address(this)][id2]=true;
            

        _babynft.mint(msg.sender);  
    }

    
    function burn(uint id1, uint id2, uint id3 ) public  {
    uint amount=1500*10**18;
    require(balanceOf(msg.sender)>=3, "Must Have 3 UNBRED Dragons");
    require (_ERC20.balanceOf(msg.sender) >= amount,"You Dont Have The $SCALE For That!");
    require (ownerOf(id1)==msg.sender,"NOT YOUR DRAGON");
    require (ownerOf(id2)==msg.sender,"NOT YOUR DRAGON");
    require (ownerOf(id3)==msg.sender,"NOT YOUR DRAGON"); 
    require( _breeded[address(this)][id1]==false ,"Bred Dragons CAN'T Be Sacrificed");
    require( _breeded[address(this)][id2]==false ,"Bred Dragons CAN'T Be Sacrificed"); 
    require( _breeded[address(this)][id3]==false ,"Bred Dragons CAN'T Be Sacrificed");
    require( _paused == false);
    _ERC20.burn(msg.sender, amount);

  _transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id1
);
_transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id2
);
_transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id3
);   
         
      _ancientnft.mint(msg.sender);   
        
        
     }

   function setpreviouscontaddress(address erc20add,address mainnftadd ,address ancientadd, address babyadd )public onlyOwner{
       
     iERC20_=IERC20_(erc20add) ;
     mainERC721 =  _IERC721(mainnftadd);
     ancientERC721= _IERC721(ancientadd);
     babyERC721=_IERC721(babyadd);



   }


   function setmaxsupplyforbabynft(uint amount)public onlyOwner{
        _babynft.setmaxsupply(amount);

   }

   function setbaseuriforbabynft(string memory _newBaseURI) public onlyOwner{
       _babynft.setBaseURI(_newBaseURI);
   }

   
   function setcurrentmintnumberforbabynft(uint amount) public onlyOwner{
       _babynft.setcurrentmintedamount(amount );   
   }

   
   function setbaseuriforancientnft(string memory _newBaseURI) public onlyOwner{
       _ancientnft.setBaseURI(_newBaseURI);
   }

    function setcurrentmintnumberforancient(uint amount) public onlyOwner{
        _ancientnft.setcurrentmintedamount(amount ); 
   }


    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    // set or update max number of mint per mint call
    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

   

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }

    // set metadata base extention
    function setBaseExtension(string memory _newBaseExtension)public onlyOwner    {
        baseExtension = _newBaseExtension;    }


    

    function claim() public onlyOwner {
        // get contract total balance
        uint256 balance = address(this).balance;
        // begin withdraw based on address percentage

       
        payable(Jazzasaurus).transfer((balance / 100) * 45);
        
        payable(munheezy).transfer((balance / 100) * 31);
      
        payable(_community).transfer((balance / 100) * 20);
        payable(_Dragoneer).transfer((balance / 100) * 4);
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function checkrewardbal()public view returns(uint){

        uint256 ownerTokenCount = balanceOf(msg.sender);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(msg.sender);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][msg.sender]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][msg.sender];
             reward = ((10*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function checkrewardforancientbal()public view returns(uint){
      return _ancientnft.checkrewardbal(msg.sender);
    }

    function checkrewardforbabybal()public view returns(uint){
      return _babynft.checkrewardbal(msg.sender);
    }

    function claimreward() public {
          require(balanceOf(msg.sender)>0, "Not Qualified For Reward");
         uint256 ownerTokenCount = balanceOf(msg.sender);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(msg.sender);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][msg.sender]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][msg.sender];
             reward = ((10*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][msg.sender]=block.timestamp;
           }
        }

         _ERC20.mint(msg.sender,rewardbal);
     if (_ancientnft.balanceOf(msg.sender)>0){
        _ancientnft.claimreward(msg.sender);

        }
    if (_babynft.balanceOf(msg.sender)>0){
        _babynft.claimreward(msg.sender);
        }


    }


        
    

    function migrate()public   {
          uint[] memory _tokenId= mainERC721.walletofNFT(msg.sender);  
          for (uint i ;i< _tokenId.length;i++){
              require(msg.sender==mainERC721.ownerOf(_tokenId[i]));

            mainERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId[i]);  
            _mint(msg.sender,_tokenId[i] );
          } 
          
           uint[] memory _tokenId1=  ancientERC721.walletofNFT(msg.sender);   
          for (uint i ;i< _tokenId1.length;i++){
              require(msg.sender== ancientERC721.ownerOf(_tokenId1[i]));
               ancientERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId1[i]);
               _ancientnft.mint(msg.sender,_tokenId1[i] ); 

          } 

           uint[] memory _tokenId2= babyERC721.walletofNFT(msg.sender);   
          for (uint i ;i< _tokenId2.length;i++){
              require(msg.sender==babyERC721.ownerOf(_tokenId2[i]));
              babyERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId2[i]);
              _babynft.mint(msg.sender,_tokenId2[i] ); 
          }   
 
          uint amount= iERC20_.balanceOf(msg.sender);
          uint mainnftamount= mainERC721.checkrewardbal();
          uint ancientnftamount= ancientERC721.checkrewardbal(msg.sender);
          uint babynftamount= babyERC721.checkrewardbal(msg.sender);
          uint totalamount=amount+ mainnftamount + ancientnftamount + babynftamount;
          iERC20_.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD, amount);
          _ERC20.mint(msg.sender,totalamount);
        
    } 

   

     function migrate2(uint[] memory main,uint[] memory ancient,uint[] memory baby)public   {
          uint[] memory _tokenId=  main;    
          for (uint i ;i< _tokenId.length;i++){
              require(msg.sender==mainERC721.ownerOf(_tokenId[i]));
              mainERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId[i]); 
              _mint(msg.sender,_tokenId[i] ); 
          } 
           uint[] memory _tokenId1=  ancient;  
          for (uint i ;i< _tokenId1.length;i++){
              require(msg.sender== ancientERC721.ownerOf(_tokenId1[i]));
               ancientERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId1[i]);
               _ancientnft.mint(msg.sender,_tokenId1[i] ); 

          } 

           uint[] memory _tokenId2= baby;    
          for (uint i ;i< _tokenId2.length;i++){
              require(msg.sender==babyERC721.ownerOf(_tokenId2[i]));
              babyERC721.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD,_tokenId2[i]);
              _babynft.mint(msg.sender,_tokenId2[i] ); 
          }   
 
          uint amount= iERC20_.balanceOf(msg.sender);
        //   uint mainnftamount= mainERC721.checkrewardbal();
          uint ancientnftamount= ancientERC721.checkrewardbal(msg.sender);
          uint babynftamount= babyERC721.checkrewardbal(msg.sender);
          uint totalamount=amount + ancientnftamount + babynftamount; 
          iERC20_.transferFrom(msg.sender,0x000000000000000000000000000000000000dEaD, amount);
          _ERC20.mint(msg.sender,totalamount);
        
    } 


     function checkerc20address()public view returns(address) {

     return  (address(_ERC20)); //  this is the deployed address of erc20token
     
 }

    
     function checkancientnftaddress()public view returns(address) {

     return  (address(_ancientnft)); //  this is the deployed address of ancienttoken
     
    }

    
     function checkbabynftaddress()public view returns(address) {

     return  (address(_babynft)); //  this is the deployed address of babytoken
     
 }

    function itemOne(uint256  _passedPrice) public  {
    uint amount=_passedPrice*10**18;
    require (_ERC20.balanceOf(msg.sender) >= amount,"You Dont Have The $SCALE For That!");
    _ERC20.burn(msg.sender, amount);
}



    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

   
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

  
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

function ownerMint(address _to, uint256 _mintAmount) public onlyOwner {
        // get total NFT token supply
      
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount);
        require( totalSupply() + _mintAmount <= maxSupply);
        // execute mint
       if (_tokenIds.current()==0){
            _tokenIds.increment();
       }
        
        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 newTokenID = _tokenIds.current();
            _safeMint(_to, newTokenID);
            _tokenIds.increment();
        }
    }

  
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"ERC20name_","type":"string"},{"internalType":"string","name":"ERC20symbol_","type":"string"},{"internalType":"uint256","name":"ERC20amount","type":"uint256"},{"internalType":"address","name":"ERC20owneraddress","type":"address"},{"internalType":"string","name":"ancientnftname_","type":"string"},{"internalType":"string","name":"ancientnftsymbol_","type":"string"},{"internalType":"string","name":"babynftname_","type":"string"},{"internalType":"string","name":"babynftsymbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"},{"internalType":"uint256","name":"id3","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkancientnftaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkbabynftaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"checkdragonnotbreeded","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkerc20address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardforancientbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardforbabybal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimreward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_passedPrice","type":"uint256"}],"name":"itemOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"main","type":"uint256[]"},{"internalType":"uint256[]","name":"ancient","type":"uint256[]"},{"internalType":"uint256[]","name":"baby","type":"uint256[]"}],"name":"migrate2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausebreedandburn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setbaseuriforancientnft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setbaseuriforbabynft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalmintedamount","type":"uint256"}],"name":"setcurrentmintedamount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setcurrentmintnumberforancient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setcurrentmintnumberforbabynft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setmaxsupplyforbabynft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20add","type":"address"},{"internalType":"address","name":"mainnftadd","type":"address"},{"internalType":"address","name":"ancientadd","type":"address"},{"internalType":"address","name":"babyadd","type":"address"}],"name":"setpreviouscontaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletofNFT","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60e060405260366080818152906200c12e60a03980516200002991600491602090910190620009d2565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000569181620009d2565b50666a94d74f430000600655610d0560075560146008556009805460ff191690553480156200008457600080fd5b506040516200c1643803806200c164833981016040819052620000a79162000b50565b620000b2336200050a565b8951620000c79060019060208d0190620009d2565b508851620000dd9060029060208c0190620009d2565b506040805161018081018252600b8152600d60208201526010818301526011606082015260186080820152601d60a0820152602360c0820152602a60e0820152602b610100820152603f6101208201526101408101829052604161016082015290518990899089908990620001529062000a61565b62000161949392919062000d26565b604051809103906000f0801580156200017e573d6000803e3d6000fd5b50601060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508484604051620001b59062000a6f565b620001c292919062000cf4565b604051809103906000f080158015620001df573d6000803e3d6000fd5b50601180546001600160a01b0319166001600160a01b0392909216918217905560405163b6b285d960e01b815230600482015263b6b285d990602401600060405180830381600087803b1580156200023657600080fd5b505af11580156200024b573d6000803e3d6000fd5b505060115460105460405163021a1ac760e51b81526001600160a01b0391821660048201529116925063434358e09150602401600060405180830381600087803b1580156200029957600080fd5b505af1158015620002ae573d6000803e3d6000fd5b505050508282604051620002c29062000a7d565b620002cf92919062000cf4565b604051809103906000f080158015620002ec573d6000803e3d6000fd5b50601280546001600160a01b0319166001600160a01b0392909216918217905560405163b6b285d960e01b815230600482015263b6b285d990602401600060405180830381600087803b1580156200034357600080fd5b505af115801562000358573d6000803e3d6000fd5b505060125460105460405163021a1ac760e51b81526001600160a01b0391821660048201529116925063434358e09150602401600060405180830381600087803b158015620003a657600080fd5b505af1158015620003bb573d6000803e3d6000fd5b5050601054601154601254604051630176245f60e61b81523060048201526001600160a01b039283166024820152908216604482015291169250635d8917c09150606401600060405180830381600087803b1580156200041a57600080fd5b505af11580156200042f573d6000803e3d6000fd5b50505050620004463360016200055a60201b60201c565b60005b600c811015620004f8576011546001600160a01b03166340c10f19338484600c81106200047a576200047a62000e60565b60200201516040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260ff166024820152604401600060405180830381600087803b158015620004c957600080fd5b505af1158015620004de573d6000803e3d6000fd5b505050508080620004ef9062000e16565b91505062000449565b50505050505050505050505062000e8c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620005b65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b6000818152601760205260409020546001600160a01b0316156200061d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620005ad565b6200062b60008383620006c8565b6001600160a01b03821660009081526018602052604081208054600192906200065690849062000d71565b9091555050600081815260176020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831662000726576200072081600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b6200074c565b816001600160a01b0316836001600160a01b0316146200074c576200074c838262000791565b6001600160a01b0382166200076b5762000766816200083e565b505050565b826001600160a01b0316826001600160a01b0316146200076657620007668282620008f8565b60006001620007ab846200094960201b62001afb1760201c565b620007b7919062000d8c565b6000838152600c60205260409020549091508082146200080b576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d54600090620008529060019062000d8c565b6000838152600e6020526040812054600d80549394509092849081106200087d576200087d62000e60565b9060005260206000200154905080600d8381548110620008a157620008a162000e60565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d805480620008dc57620008dc62000e4a565b6001900381819060005260206000200160009055905550505050565b600062000910836200094960201b62001afb1760201c565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b60006001600160a01b038216620009b65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620005ad565b506001600160a01b031660009081526018602052604090205490565b828054620009e09062000dd9565b90600052602060002090601f01602090048101928262000a04576000855562000a4f565b82601f1062000a1f57805160ff191683800117855562000a4f565b8280016001018555821562000a4f579182015b8281111562000a4f57825182559160200191906001019062000a32565b5062000a5d92915062000a8b565b5090565b61112c8062005ea283390190565b6128768062006fce83390190565b6128ea806200984483390190565b5b8082111562000a5d576000815560010162000a8c565b80516001600160a01b038116811462000aba57600080fd5b919050565b600082601f83011262000ad157600080fd5b81516001600160401b038082111562000aee5762000aee62000e76565b604051601f8301601f19908116603f0116810190828211818310171562000b195762000b1962000e76565b8160405283815286602085880101111562000b3357600080fd5b62000b4684602083016020890162000da6565b9695505050505050565b6000806000806000806000806000806101408b8d03121562000b7157600080fd5b8a516001600160401b038082111562000b8957600080fd5b62000b978e838f0162000abf565b9b5060208d015191508082111562000bae57600080fd5b62000bbc8e838f0162000abf565b9a5060408d015191508082111562000bd357600080fd5b62000be18e838f0162000abf565b995060608d015191508082111562000bf857600080fd5b62000c068e838f0162000abf565b985060808d0151975062000c1d60a08e0162000aa2565b965060c08d015191508082111562000c3457600080fd5b62000c428e838f0162000abf565b955060e08d015191508082111562000c5957600080fd5b62000c678e838f0162000abf565b94506101008d015191508082111562000c7f57600080fd5b62000c8d8e838f0162000abf565b93506101208d015191508082111562000ca557600080fd5b5062000cb48d828e0162000abf565b9150509295989b9194979a5092959850565b6000815180845262000ce081602086016020860162000da6565b601f01601f19169290920160200192915050565b60408152600062000d09604083018562000cc6565b828103602084015262000d1d818562000cc6565b95945050505050565b60808152600062000d3b608083018762000cc6565b828103602084015262000d4f818762000cc6565b604084019590955250506001600160a01b039190911660609091015292915050565b6000821982111562000d875762000d8762000e34565b500190565b60008282101562000da15762000da162000e34565b500390565b60005b8381101562000dc357818101518382015260200162000da9565b8381111562000dd3576000848401525b50505050565b600181811c9082168062000dee57607f821691505b6020821081141562000e1057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000e2d5762000e2d62000e34565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6150068062000e9c6000396000f3fe6080604052600436106103765760003560e01c806370a08231116101d1578063bb6bf51d11610102578063d9ecad7b116100a0578063ea7eeb061161006f578063ea7eeb06146109c7578063f259a29e146109e7578063f2fde38b146109fc578063f6368b8314610a1c57600080fd5b8063d9ecad7b14610920578063da3ef23f14610940578063e2d358ac14610960578063e985e9c51461097e57600080fd5b8063c87b56dd116100dc578063c87b56dd146108b5578063c8eade71146108d5578063cf7f9e95146108ea578063d5abeb011461090a57600080fd5b8063bb6bf51d1461086d578063be597c3e14610882578063c6682862146108a057600080fd5b80638da5cb5b1161016f578063a0b9f0e111610149578063a0b9f0e1146107f8578063a22cb4651461080d578063b34c0cea1461082d578063b88d4fde1461084d57600080fd5b80638da5cb5b146107b05780638fd3ab80146107ce57806395d89b41146107e357600080fd5b806377754a06116101ab57806377754a06146107465780637f00c7a6146107665780638456cb59146107865780638894038d1461079b57600080fd5b806370a08231146106fc578063715018a61461071c57806373508aec1461073157600080fd5b8063374fdb87116102ab5780634e71d92d116102495780635843029b116102235780635843029b146106825780635c975abb146106a2578063626b7a1e146106bc5780636352211e146106dc57600080fd5b80634e71d92d1461062d5780634f6ccce71461064257806355f804b31461066257600080fd5b806342842e0e1161028557806342842e0e146105b857806344a0d68a146105d8578063484b973c146105f85780634e1575691461061857600080fd5b8063374fdb87146105675780633dd407e11461058557806340c10f19146105a557600080fd5b8063155ad04a11610318578063239c70ae116102f2578063239c70ae146104e457806323b872dd146104fa5780632d38f11e1461051a5780632f745c591461054757600080fd5b8063155ad04a1461049057806316c61ccc146104b057806318160ddd146104cf57600080fd5b806306fdde031161035457806306fdde03146103f2578063081812fc14610414578063095ea7b31461044c57806313faede61461046c57600080fd5b806301ffc9a71461037b578063056e5a7f146103b057806305a10028146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004614a44565b610a3c565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb366004614a7e565b610a8e565b005b3480156103de57600080fd5b506103d06103ed366004614b1a565b610b26565b3480156103fe57600080fd5b50610407610e66565b6040516103a79190614c53565b34801561042057600080fd5b5061043461042f366004614ac6565b610ef8565b6040516001600160a01b0390911681526020016103a7565b34801561045857600080fd5b506103d06104673660046148dd565b610f8d565b34801561047857600080fd5b5061048260065481565b6040519081526020016103a7565b34801561049c57600080fd5b506103d06104ab366004614ac6565b6110a3565b3480156104bc57600080fd5b5060095461039b90610100900460ff1681565b3480156104db57600080fd5b50600d54610482565b3480156104f057600080fd5b5061048260085481565b34801561050657600080fd5b506103d06105153660046147ef565b6111bd565b34801561052657600080fd5b5061053a610535366004614720565b6111fe565b6040516103a79190614c1b565b34801561055357600080fd5b506104826105623660046148dd565b61129f565b34801561057357600080fd5b506012546001600160a01b0316610434565b34801561059157600080fd5b506103d06105a0366004614793565b611335565b6103d06105b33660046148dd565b6113af565b3480156105c457600080fd5b506103d06105d33660046147ef565b6114d7565b3480156105e457600080fd5b506103d06105f3366004614ac6565b6114f2565b34801561060457600080fd5b506103d06106133660046148dd565b611521565b34801561062457600080fd5b506104826115e0565b34801561063957600080fd5b506103d061174e565b34801561064e57600080fd5b5061048261065d366004614ac6565b6118d8565b34801561066e57600080fd5b506103d061067d366004614a7e565b61196b565b34801561068e57600080fd5b506103d061069d366004614a7e565b6119a8565b3480156106ae57600080fd5b5060095461039b9060ff1681565b3480156106c857600080fd5b506103d06106d7366004614ac6565b611a02565b3480156106e857600080fd5b506104346106f7366004614ac6565b611a84565b34801561070857600080fd5b50610482610717366004614720565b611afb565b34801561072857600080fd5b506103d0611b82565b34801561073d57600080fd5b50610482611bb8565b34801561075257600080fd5b506103d0610761366004614ac6565b611c3a565b34801561077257600080fd5b506103d0610781366004614ac6565b611c95565b34801561079257600080fd5b506103d0611cc4565b3480156107a757600080fd5b50610482611d02565b3480156107bc57600080fd5b506000546001600160a01b0316610434565b3480156107da57600080fd5b506103d0611d33565b3480156107ef57600080fd5b5061040761272c565b34801561080457600080fd5b5061039b61273b565b34801561081957600080fd5b506103d06108283660046148af565b612770565b34801561083957600080fd5b506103d0610848366004614ac6565b61277b565b34801561085957600080fd5b506103d0610868366004614830565b6127d6565b34801561087957600080fd5b506103d061280e565b34801561088e57600080fd5b506010546001600160a01b0316610434565b3480156108ac57600080fd5b50610407612c35565b3480156108c157600080fd5b506104076108d0366004614ac6565b612cc3565b3480156108e157600080fd5b506103d0612d9e565b3480156108f657600080fd5b506103d0610905366004614ac6565b612de5565b34801561091657600080fd5b5061048260075481565b34801561092c57600080fd5b506103d061093b366004614af8565b612e40565b34801561094c57600080fd5b506103d061095b366004614a7e565b6130a7565b34801561096c57600080fd5b506011546001600160a01b0316610434565b34801561098a57600080fd5b5061039b61099936600461475a565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205460ff1690565b3480156109d357600080fd5b506103d06109e23660046149a0565b6130e4565b3480156109f357600080fd5b506104076138ba565b348015610a0857600080fd5b506103d0610a17366004614720565b6138c7565b348015610a2857600080fd5b5061053a610a37366004614720565b613962565b60006001600160e01b031982166380ac58cd60e01b1480610a6d57506001600160e01b03198216635b5e139f60e01b145b80610a8857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610ac15760405162461bcd60e51b8152600401610ab890614ced565b60405180910390fd5b6012546040516355f804b360e01b81526001600160a01b03909116906355f804b390610af1908490600401614c53565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b5050505050565b685150ae84a8cdf000006003610b3b33611afb565b1015610b895760405162461bcd60e51b815260206004820152601a60248201527f4d7573742048617665203320554e4252454420447261676f6e730000000000006044820152606401610ab8565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c049190614adf565b1015610c225760405162461bcd60e51b8152600401610ab890614d73565b33610c2c85611a84565b6001600160a01b031614610c525760405162461bcd60e51b8152600401610ab890614db5565b33610c5c84611a84565b6001600160a01b031614610c825760405162461bcd60e51b8152600401610ab890614db5565b33610c8c83611a84565b6001600160a01b031614610cb25760405162461bcd60e51b8152600401610ab890614db5565b306000908152600f6020908152604080832087845290915290205460ff1615610ced5760405162461bcd60e51b8152600401610ab890614cb8565b306000908152600f6020908152604080832086845290915290205460ff1615610d285760405162461bcd60e51b8152600401610ab890614cb8565b306000908152600f6020908152604080832085845290915290205460ff1615610d635760405162461bcd60e51b8152600401610ab890614cb8565b600954610100900460ff1615610d7857600080fd5b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610daa9033908590600401614c02565b600060405180830381600087803b158015610dc457600080fd5b505af1158015610dd8573d6000803e3d6000fd5b50505050610de93361dead86613b34565b610df63361dead85613b34565b610e033361dead84613b34565b6011546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b5050505050505050565b606060018054610e7590614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea190614ebf565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b5050505050905090565b6000818152601760205260408120546001600160a01b0316610f715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab8565b506000908152601960205260409020546001600160a01b031690565b6000610f9882611a84565b9050806001600160a01b0316836001600160a01b031614156110065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab8565b336001600160a01b038216148061102257506110228133610999565b6110945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab8565b61109e8383613cf7565b505050565b60006110b782670de0b6b3a7640000614e5d565b6010546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156110ff57600080fd5b505afa158015611113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111379190614adf565b10156111555760405162461bcd60e51b8152600401610ab890614d73565b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906111879033908590600401614c02565b600060405180830381600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050505050565b6111c73382613d65565b6111e35760405162461bcd60e51b8152600401610ab890614d22565b60095460ff16156111f357600080fd5b61109e838383613b34565b6060600061120b83611afb565b90506000816001600160401b0381111561122757611227614f81565b604051908082528060200260200182016040528015611250578160200160208202803683370190505b50905060005b8281101561129757611268858261129f565b82828151811061127a5761127a614f6b565b60209081029190910101528061128f81614efa565b915050611256565b509392505050565b60006112aa83611afb565b821061130c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ab8565b506001600160a01b03919091166000908152600b60209081526040808320938352929052205490565b6000546001600160a01b0316331461135f5760405162461bcd60e51b8152600401610ab890614ced565b601380546001600160a01b039586166001600160a01b0319918216179091556014805494861694821694909417909355601580549285169284169290921790915560168054919093169116179055565b600081116113bc57600080fd5b6008548111156113cb57600080fd5b600754816113d8600d5490565b6113e29190614e31565b11156113ed57600080fd5b60095460ff16156113fd57600080fd5b601654600160a01b900460ff1615156001146114665760405162461bcd60e51b815260206004820152602260248201527f706c65617365207365742073657463757272656e746d696e746564616d6f756e60448201526103a160f51b6064820152608401610ab8565b806006546114749190614e5d565b34101561148057600080fd5b60035461149557611495600380546001019055565b60015b81811161109e5760006114aa60035490565b90506114b68482613e5c565b6114c4600380546001019055565b50806114cf81614efa565b915050611498565b61109e838383604051806020016040528060008152506127d6565b6000546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610ab890614ced565b600655565b6000546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610ab890614ced565b6000811161155857600080fd5b60085481111561156757600080fd5b60075481611574600d5490565b61157e9190614e31565b111561158957600080fd5b60035461159e5761159e600380546001019055565b60015b81811161109e5760006115b360035490565b90506115bf8482613e5c565b6115cd600380546001019055565b50806115d881614efa565b9150506115a1565b6000806115ec33611afb565b90506000816001600160401b0381111561160857611608614f81565b604051908082528060200260200182016040528015611631578160200160208202803683370190505b50905061163d336111fe565b90506000806000805b85811015611744576000600a600087848151811061166657611666614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054111561173257600a60008683815181106116bc576116bc614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054426117019190614e7c565b93506201518061171985678ac7230489e80000614e5d565b6117239190614e49565b925061172f8383614e31565b91505b8061173c81614efa565b915050611646565b5095945050505050565b6000546001600160a01b031633146117785760405162461bcd60e51b8152600401610ab890614ced565b4773d848353706e5a26baa6dd20265edde1e7047d9ba6108fc61179c606484614e49565b6117a790602d614e5d565b6040518115909202916000818181858888f193505050501580156117cf573d6000803e3d6000fd5b5073b6d2ac64bdc24f76417b95b410acf47ce31add076108fc6117f3606484614e49565b6117fe90601f614e5d565b6040518115909202916000818181858888f19350505050158015611826573d6000803e3d6000fd5b5073e44cb360e48da69fe75a78fd1649ccbd3ccf7ad16108fc61184a606484614e49565b611855906014614e5d565b6040518115909202916000818181858888f1935050505015801561187d573d6000803e3d6000fd5b50739817c311f6897d30e372c119a888028bac879d1c6108fc6118a1606484614e49565b6118ac906004614e5d565b6040518115909202916000818181858888f193505050501580156118d4573d6000803e3d6000fd5b5050565b60006118e3600d5490565b82106119465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ab8565b600d828154811061195957611959614f6b565b90600052602060002001549050919050565b6000546001600160a01b031633146119955760405162461bcd60e51b8152600401610ab890614ced565b80516118d49060049060208401906145be565b6000546001600160a01b031633146119d25760405162461bcd60e51b8152600401610ab890614ced565b6011546040516355f804b360e01b81526001600160a01b03909116906355f804b390610af1908490600401614c53565b6000546001600160a01b03163314611a2c5760405162461bcd60e51b8152600401610ab890614ced565b6016805460ff60a01b1916600160a01b179055611a4860035490565b611a5a57611a5a600380546001019055565b60015b8181116118d457611a72600380546001019055565b80611a7c81614efa565b915050611a5d565b6000818152601760205260408120546001600160a01b031680610a885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab8565b60006001600160a01b038216611b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab8565b506001600160a01b031660009081526018602052604090205490565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610ab890614ced565b611bb66000613e76565b565b601254604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c94906024015b60206040518083038186803b158015611bfd57600080fd5b505afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c359190614adf565b905090565b6000546001600160a01b03163314611c645760405162461bcd60e51b8152600401610ab890614ced565b601154604051633135bd0f60e11b8152600481018390526001600160a01b039091169063626b7a1e90602401610af1565b6000546001600160a01b03163314611cbf5760405162461bcd60e51b8152600401610ab890614ced565b600855565b6000546001600160a01b03163314611cee5760405162461bcd60e51b8152600401610ab890614ced565b6009805460ff19811660ff90911615179055565b601154604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c9490602401611be5565b60145460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b158015611d7757600080fd5b505afa158015611d8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db39190810190614909565b905060005b8151811015611f395760145482516001600160a01b0390911690636352211e90849084908110611dea57611dea614f6b565b60200260200101516040518263ffffffff1660e01b8152600401611e1091815260200190565b60206040518083038186803b158015611e2857600080fd5b505afa158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e60919061473d565b6001600160a01b0316336001600160a01b031614611e7d57600080fd5b60145482516001600160a01b03909116906323b872dd90339061dead90869086908110611eac57611eac614f6b565b60200260200101516040518463ffffffff1660e01b8152600401611ed293929190614ba1565b600060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b50505050611f2733838381518110611f1a57611f1a614f6b565b6020026020010151613ec6565b80611f3181614efa565b915050611db8565b5060155460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b158015611f7e57600080fd5b505afa158015611f92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fba9190810190614909565b905060005b81518110156121a05760155482516001600160a01b0390911690636352211e90849084908110611ff157611ff1614f6b565b60200260200101516040518263ffffffff1660e01b815260040161201791815260200190565b60206040518083038186803b15801561202f57600080fd5b505afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612067919061473d565b6001600160a01b0316336001600160a01b03161461208457600080fd5b60155482516001600160a01b03909116906323b872dd90339061dead908690869081106120b3576120b3614f6b565b60200260200101516040518463ffffffff1660e01b81526004016120d993929190614ba1565b600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505060115484516001600160a01b0390911692506340c10f199150339085908590811061213657612136614f6b565b60200260200101516040518363ffffffff1660e01b815260040161215b929190614c02565b600060405180830381600087803b15801561217557600080fd5b505af1158015612189573d6000803e3d6000fd5b50505050808061219890614efa565b915050611fbf565b5060165460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b1580156121e557600080fd5b505afa1580156121f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122219190810190614909565b905060005b81518110156124075760165482516001600160a01b0390911690636352211e9084908490811061225857612258614f6b565b60200260200101516040518263ffffffff1660e01b815260040161227e91815260200190565b60206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce919061473d565b6001600160a01b0316336001600160a01b0316146122eb57600080fd5b60165482516001600160a01b03909116906323b872dd90339061dead9086908690811061231a5761231a614f6b565b60200260200101516040518463ffffffff1660e01b815260040161234093929190614ba1565b600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b505060125484516001600160a01b0390911692506340c10f199150339085908590811061239d5761239d614f6b565b60200260200101516040518363ffffffff1660e01b81526004016123c2929190614c02565b600060405180830381600087803b1580156123dc57600080fd5b505af11580156123f0573d6000803e3d6000fd5b5050505080806123ff90614efa565b915050612226565b506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561244c57600080fd5b505afa158015612460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124849190614adf565b90506000601460009054906101000a90046001600160a01b03166001600160a01b0316634e1575696040518163ffffffff1660e01b815260040160206040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190614adf565b601554604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b15801561255757600080fd5b505afa15801561256b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258f9190614adf565b601654604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b1580156125d857600080fd5b505afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190614adf565b9050600081836126208688614e31565b61262a9190614e31565b6126349190614e31565b6013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061266b90339061dead908a90600401614ba1565b602060405180830381600087803b15801561268557600080fd5b505af1158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190614a27565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906126f09033908590600401614c02565b600060405180830381600087803b15801561270a57600080fd5b505af115801561271e573d6000803e3d6000fd5b505050505050505050505050565b606060028054610e7590614ebf565b600080546001600160a01b031633146127665760405162461bcd60e51b8152600401610ab890614ced565b5060095460ff1690565b6118d4338383614028565b6000546001600160a01b031633146127a55760405162461bcd60e51b8152600401610ab890614ced565b601254604051633135bd0f60e11b8152600481018390526001600160a01b039091169063626b7a1e90602401610af1565b6127e03383613d65565b6127fc5760405162461bcd60e51b8152600401610ab890614d22565b612808848484846140f7565b50505050565b600061281933611afb565b116128665760405162461bcd60e51b815260206004820152601860248201527f4e6f74205175616c696669656420466f722052657761726400000000000000006044820152606401610ab8565b600061287133611afb565b90506000816001600160401b0381111561288d5761288d614f81565b6040519080825280602002602001820160405280156128b6578160200160208202803683370190505b5090506128c2336111fe565b90506000806000805b85811015612a08576000600a60008784815181106128eb576128eb614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000205411156129f657600a600086838151811061294157612941614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054426129869190614e7c565b93506201518061299e85678ac7230489e80000614e5d565b6129a89190614e49565b92506129b48383614e31565b915042600a60008784815181106129cd576129cd614f6b565b602090810291909101810151825281810192909252604090810160009081203382529092529020555b80612a0081614efa565b9150506128cb565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990612a3b9033908590600401614c02565b600060405180830381600087803b158015612a5557600080fd5b505af1158015612a69573d6000803e3d6000fd5b50506011546040516370a0823160e01b8152336004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b158015612ab357600080fd5b505afa158015612ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aeb9190614adf565b1115612b4f5760115460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050505b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612b9357600080fd5b505afa158015612ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcb9190614adf565b1115610b1f5760125460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015612c1657600080fd5b505af1158015612c2a573d6000803e3d6000fd5b505050505050505050565b60058054612c4290614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6e90614ebf565b8015612cbb5780601f10612c9057610100808354040283529160200191612cbb565b820191906000526020600020905b815481529060010190602001808311612c9e57829003601f168201915b505050505081565b6000818152601760205260409020546060906001600160a01b0316612d425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ab8565b6000612d4c61412a565b90506000815111612d6c5760405180602001604052806000815250612d97565b80612d7684614139565b604051602001612d87929190614b72565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314612dc85760405162461bcd60e51b8152600401610ab890614ced565b6009805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314612e0f5760405162461bcd60e51b8152600401610ab890614ced565b601254604051631752e98560e21b8152600481018390526001600160a01b0390911690635d4ba61490602401610af1565b686194049f30f72000006002612e5533611afb565b1015612e9a5760405162461bcd60e51b81526020600482015260146024820152734d757374204f776e2032203078447261676f6e7360601b6044820152606401610ab8565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015612edd57600080fd5b505afa158015612ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f159190614adf565b1015612f335760405162461bcd60e51b8152600401610ab890614d73565b33612f3d84611a84565b6001600160a01b031614612f635760405162461bcd60e51b8152600401610ab890614db5565b33612f6d83611a84565b6001600160a01b031614612f935760405162461bcd60e51b8152600401610ab890614db5565b600954610100900460ff1615612fa857600080fd5b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90612fda9033908590600401614c02565b600060405180830381600087803b158015612ff457600080fd5b505af1158015613008573d6000803e3d6000fd5b5050306000908152600f602090815260408083208884529091528082208054600160ff1991821681179092558784529282902080549093161790915560125490516335313c2160e11b81523360048201526001600160a01b039091169250636a6278429150602401600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146130d15760405162461bcd60e51b8152600401610ab890614ced565b80516118d49060059060208401906145be565b8260005b815181101561325c5760145482516001600160a01b0390911690636352211e9084908490811061311a5761311a614f6b565b60200260200101516040518263ffffffff1660e01b815260040161314091815260200190565b60206040518083038186803b15801561315857600080fd5b505afa15801561316c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613190919061473d565b6001600160a01b0316336001600160a01b0316146131ad57600080fd5b60145482516001600160a01b03909116906323b872dd90339061dead908690869081106131dc576131dc614f6b565b60200260200101516040518463ffffffff1660e01b815260040161320293929190614ba1565b600060405180830381600087803b15801561321c57600080fd5b505af1158015613230573d6000803e3d6000fd5b5050505061324a33838381518110611f1a57611f1a614f6b565b8061325481614efa565b9150506130e8565b508260005b81518110156134425760155482516001600160a01b0390911690636352211e9084908490811061329357613293614f6b565b60200260200101516040518263ffffffff1660e01b81526004016132b991815260200190565b60206040518083038186803b1580156132d157600080fd5b505afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613309919061473d565b6001600160a01b0316336001600160a01b03161461332657600080fd5b60155482516001600160a01b03909116906323b872dd90339061dead9086908690811061335557613355614f6b565b60200260200101516040518463ffffffff1660e01b815260040161337b93929190614ba1565b600060405180830381600087803b15801561339557600080fd5b505af11580156133a9573d6000803e3d6000fd5b505060115484516001600160a01b0390911692506340c10f19915033908590859081106133d8576133d8614f6b565b60200260200101516040518363ffffffff1660e01b81526004016133fd929190614c02565b600060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b50505050808061343a90614efa565b915050613261565b508260005b81518110156136285760165482516001600160a01b0390911690636352211e9084908490811061347957613479614f6b565b60200260200101516040518263ffffffff1660e01b815260040161349f91815260200190565b60206040518083038186803b1580156134b757600080fd5b505afa1580156134cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ef919061473d565b6001600160a01b0316336001600160a01b03161461350c57600080fd5b60165482516001600160a01b03909116906323b872dd90339061dead9086908690811061353b5761353b614f6b565b60200260200101516040518463ffffffff1660e01b815260040161356193929190614ba1565b600060405180830381600087803b15801561357b57600080fd5b505af115801561358f573d6000803e3d6000fd5b505060125484516001600160a01b0390911692506340c10f19915033908590859081106135be576135be614f6b565b60200260200101516040518363ffffffff1660e01b81526004016135e3929190614c02565b600060405180830381600087803b1580156135fd57600080fd5b505af1158015613611573d6000803e3d6000fd5b50505050808061362090614efa565b915050613447565b506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561366d57600080fd5b505afa158015613681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a59190614adf565b601554604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b1580156136ee57600080fd5b505afa158015613702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137269190614adf565b601654604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b15801561376f57600080fd5b505afa158015613783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a79190614adf565b90506000816137b68486614e31565b6137c09190614e31565b6013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd906137f790339061dead908990600401614ba1565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138499190614a27565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061387c9033908590600401614c02565b600060405180830381600087803b15801561389657600080fd5b505af11580156138aa573d6000803e3d6000fd5b5050505050505050505050505050565b60048054612c4290614ebf565b6000546001600160a01b031633146138f15760405162461bcd60e51b8152600401610ab890614ced565b6001600160a01b0381166139565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab8565b61395f81613e76565b50565b6060600061396f83611afb565b90506000816001600160401b0381111561398b5761398b614f81565b6040519080825280602002602001820160405280156139b4578160200160208202803683370190505b5090506139c0846111fe565b90506000805b83811015613a3657306000908152600f6020526040812084519091908590849081106139f4576139f4614f6b565b60209081029190910181015182528101919091526040016000205460ff16613a245781613a2081614efa565b9250505b80613a2e81614efa565b9150506139c6565b506000816001600160401b03811115613a5157613a51614f81565b604051908082528060200260200182016040528015613a7a578160200160208202803683370190505b5090506000805b85811015613b2857306000908152600f602052604081208651909190879084908110613aaf57613aaf614f6b565b60209081029190910181015182528101919091526040016000205460ff16613b1657848181518110613ae357613ae3614f6b565b6020026020010151838381518110613afd57613afd614f6b565b602090810291909101015281613b1281614efa565b9250505b80613b2081614efa565b915050613a81565b50909695505050505050565b826001600160a01b0316613b4782611a84565b6001600160a01b031614613bab5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ab8565b6001600160a01b038216613c0d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab8565b613c18838383614236565b613c23600082613cf7565b6001600160a01b0383166000908152601860205260408120805460019290613c4c908490614e7c565b90915550506001600160a01b0382166000908152601860205260408120805460019290613c7a908490614e31565b9091555050600081815260176020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255600a84528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260196020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613d2c82611a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152601760205260408120546001600160a01b0316613dde5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab8565b6000613de983611a84565b9050806001600160a01b0316846001600160a01b03161480613e245750836001600160a01b0316613e1984610ef8565b6001600160a01b0316145b80613e5457506001600160a01b038082166000908152601a602090815260408083209388168352929052205460ff165b949350505050565b6118d48282604051806020016040528060008152506142ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216613f1c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab8565b6000818152601760205260409020546001600160a01b031615613f815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab8565b613f8d60008383614236565b6001600160a01b0382166000908152601860205260408120805460019290613fb6908490614e31565b9091555050600081815260176020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561408a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab8565b6001600160a01b038381166000818152601a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614102848484613b34565b61410e84848484614321565b6128085760405162461bcd60e51b8152600401610ab890614c66565b606060048054610e7590614ebf565b60608161415d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614187578061417181614efa565b91506141809050600a83614e49565b9150614161565b6000816001600160401b038111156141a1576141a1614f81565b6040519080825280601f01601f1916602001820160405280156141cb576020820181803683370190505b5090505b8415613e54576141e0600183614e7c565b91506141ed600a86614f15565b6141f8906030614e31565b60f81b81838151811061420d5761420d614f6b565b60200101906001600160f81b031916908160001a90535061422f600a86614e49565b94506141cf565b6001600160a01b0383166142915761428c81600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b6142b4565b816001600160a01b0316836001600160a01b0316146142b4576142b4838261442e565b6001600160a01b0382166142cb5761109e816144cb565b826001600160a01b0316826001600160a01b03161461109e5761109e828261457a565b6142f88383613ec6565b6143056000848484614321565b61109e5760405162461bcd60e51b8152600401610ab890614c66565b60006001600160a01b0384163b1561442357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614365903390899088908890600401614bc5565b602060405180830381600087803b15801561437f57600080fd5b505af19250505080156143af575060408051601f3d908101601f191682019092526143ac91810190614a61565b60015b614409573d8080156143dd576040519150601f19603f3d011682016040523d82523d6000602084013e6143e2565b606091505b5080516144015760405162461bcd60e51b8152600401610ab890614c66565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613e54565b506001949350505050565b6000600161443b84611afb565b6144459190614e7c565b6000838152600c6020526040902054909150808214614498576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d546000906144dd90600190614e7c565b6000838152600e6020526040812054600d805493945090928490811061450557614505614f6b565b9060005260206000200154905080600d838154811061452657614526614f6b565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d80548061455e5761455e614f55565b6001900381819060005260206000200160009055905550505050565b600061458583611afb565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b8280546145ca90614ebf565b90600052602060002090601f0160209004810192826145ec5760008555614632565b82601f1061460557805160ff1916838001178555614632565b82800160010185558215614632579182015b82811115614632578251825591602001919060010190614617565b5061463e929150614642565b5090565b5b8082111561463e5760008155600101614643565b60006001600160401b0383111561467057614670614f81565b614683601f8401601f1916602001614dde565b905082815283838301111561469757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126146bf57600080fd5b813560206146d46146cf83614e0e565b614dde565b80838252828201915082860187848660051b89010111156146f457600080fd5b60005b85811015614713578135845292840192908401906001016146f7565b5090979650505050505050565b60006020828403121561473257600080fd5b8135612d9781614f97565b60006020828403121561474f57600080fd5b8151612d9781614f97565b6000806040838503121561476d57600080fd5b823561477881614f97565b9150602083013561478881614f97565b809150509250929050565b600080600080608085870312156147a957600080fd5b84356147b481614f97565b935060208501356147c481614f97565b925060408501356147d481614f97565b915060608501356147e481614f97565b939692955090935050565b60008060006060848603121561480457600080fd5b833561480f81614f97565b9250602084013561481f81614f97565b929592945050506040919091013590565b6000806000806080858703121561484657600080fd5b843561485181614f97565b9350602085013561486181614f97565b92506040850135915060608501356001600160401b0381111561488357600080fd5b8501601f8101871361489457600080fd5b6148a387823560208401614657565b91505092959194509250565b600080604083850312156148c257600080fd5b82356148cd81614f97565b9150602083013561478881614fac565b600080604083850312156148f057600080fd5b82356148fb81614f97565b946020939093013593505050565b6000602080838503121561491c57600080fd5b82516001600160401b0381111561493257600080fd5b8301601f8101851361494357600080fd5b80516149516146cf82614e0e565b80828252848201915084840188868560051b870101111561497157600080fd5b600094505b83851015614994578051835260019490940193918501918501614976565b50979650505050505050565b6000806000606084860312156149b557600080fd5b83356001600160401b03808211156149cc57600080fd5b6149d8878388016146ae565b945060208601359150808211156149ee57600080fd5b6149fa878388016146ae565b93506040860135915080821115614a1057600080fd5b50614a1d868287016146ae565b9150509250925092565b600060208284031215614a3957600080fd5b8151612d9781614fac565b600060208284031215614a5657600080fd5b8135612d9781614fba565b600060208284031215614a7357600080fd5b8151612d9781614fba565b600060208284031215614a9057600080fd5b81356001600160401b03811115614aa657600080fd5b8201601f81018413614ab757600080fd5b613e5484823560208401614657565b600060208284031215614ad857600080fd5b5035919050565b600060208284031215614af157600080fd5b5051919050565b60008060408385031215614b0b57600080fd5b50508035926020909101359150565b600080600060608486031215614b2f57600080fd5b505081359360208301359350604090920135919050565b60008151808452614b5e816020860160208601614e93565b601f01601f19169290920160200192915050565b60008351614b84818460208801614e93565b835190830190614b98818360208801614e93565b01949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bf890830184614b46565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015613b2857835183529284019291840191600101614c37565b602081526000612d976020830184614b46565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4272656420447261676f6e732043414e27542042652053616372696669636564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f596f7520446f6e7420486176652054686520245343414c4520466f7220546861604082015261742160f01b606082015260800190565b6020808252600f908201526e2727aa102ca7aaa910222920a3a7a760891b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715614e0657614e06614f81565b604052919050565b60006001600160401b03821115614e2757614e27614f81565b5060051b60200190565b60008219821115614e4457614e44614f29565b500190565b600082614e5857614e58614f3f565b500490565b6000816000190483118215151615614e7757614e77614f29565b500290565b600082821015614e8e57614e8e614f29565b500390565b60005b83811015614eae578181015183820152602001614e96565b838111156128085750506000910152565b600181811c90821680614ed357607f821691505b60208210811415614ef457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f0e57614f0e614f29565b5060010190565b600082614f2457614f24614f3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461395f57600080fd5b801515811461395f57600080fd5b6001600160e01b03198116811461395f57600080fdfea2646970667358221220d7f4afdc879ce6a786c65ec71470931e1fd0d383006ea07f8d240a62250df68564736f6c6343000807003360806040523480156200001157600080fd5b506040516200112c3803806200112c8339810160408190526200003491620002bb565b8351620000499060039060208701906200015e565b5082516200005f9060049060208601906200015e565b506200006c818362000076565b50505050620003ca565b6001600160a01b038216620000d15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e5919062000350565b90915550506001600160a01b038216600090815260208190526040812080548392906200011490849062000350565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200016c9062000377565b90600052602060002090601f016020900481019282620001905760008555620001db565b82601f10620001ab57805160ff1916838001178555620001db565b82800160010185558215620001db579182015b82811115620001db578251825591602001919060010190620001be565b50620001e9929150620001ed565b5090565b5b80821115620001e95760008155600101620001ee565b600082601f8301126200021657600080fd5b81516001600160401b0380821115620002335762000233620003b4565b604051601f8301601f19908116603f011681019082821181831017156200025e576200025e620003b4565b816040528381526020925086838588010111156200027b57600080fd5b600091505b838210156200029f578582018301518183018401529082019062000280565b83821115620002b15760008385830101525b9695505050505050565b60008060008060808587031215620002d257600080fd5b84516001600160401b0380821115620002ea57600080fd5b620002f88883890162000204565b955060208701519150808211156200030f57600080fd5b506200031e8782880162000204565b60408701516060880151919550935090506001600160a01b03811681146200034557600080fd5b939692955090935050565b600082198211156200037257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200038c57607f821691505b60208210811415620003ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b610d5280620003da6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80635d8917c01161008c5780639dc29fac116100665780639dc29fac146101d0578063a457c2d7146101e3578063a9059cbb146101f6578063dd62ed3e1461020957600080fd5b80635d8917c01461018c57806370a082311461019f57806395d89b41146101c857600080fd5b806323b872dd116100c857806323b872dd14610142578063313ce56714610155578063395093511461016457806340c10f191461017757600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f7610242565b6040516101049190610c47565b60405180910390f35b61012061011b366004610c1d565b6102d4565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610be1565b6102ea565b60405160128152602001610104565b610120610172366004610c1d565b610399565b61018a610185366004610c1d565b6103d5565b005b61018a61019a366004610b9e565b610447565b6101346101ad366004610b49565b6001600160a01b031660009081526020819052604090205490565b6100f76104f1565b61018a6101de366004610c1d565b610500565b6101206101f1366004610c1d565b61056e565b610120610204366004610c1d565b610607565b610134610217366004610b6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461025190610ccb565b80601f016020809104026020016040519081016040528092919081815260200182805461027d90610ccb565b80156102ca5780601f1061029f576101008083540402835291602001916102ca565b820191906000526020600020905b8154815290600101906020018083116102ad57829003601f168201915b5050505050905090565b60006102e1338484610614565b50600192915050565b60006102f7848484610739565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156103815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61038e8533858403610614565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916102e19185906103d0908690610c9c565b610614565b3360009081526006602052604090205460ff1615156001146104395760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e740000006044820152606401610378565b6104438282610908565b5050565b60016005541061048a5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b6044820152606401610378565b6001600160a01b038381166000908152600660205260408082208054600160ff19918216811790925586851684528284208054821683179055938516835290822080549093168117909255600580549091906104e7908490610c9c565b9091555050505050565b60606004805461025190610ccb565b3360009081526006602052604090205460ff1615156001146105645760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e740000006044820152606401610378565b61044382826109e7565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156105f05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610378565b6105fd3385858403610614565b5060019392505050565b60006102e1338484610739565b6001600160a01b0383166106765760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610378565b6001600160a01b0382166106d75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610378565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661079d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b6001600160a01b0382166107ff5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610378565b6001600160a01b038316600090815260208190526040902054818110156108775760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610378565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906108ae908490610c9c565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108fa91815260200190565b60405180910390a350505050565b6001600160a01b03821661095e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610378565b80600260008282546109709190610c9c565b90915550506001600160a01b0382166000908152602081905260408120805483929061099d908490610c9c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610a475760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610378565b6001600160a01b03821660009081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610378565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610aea908490610cb4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161072c565b80356001600160a01b0381168114610b4457600080fd5b919050565b600060208284031215610b5b57600080fd5b610b6482610b2d565b9392505050565b60008060408385031215610b7e57600080fd5b610b8783610b2d565b9150610b9560208401610b2d565b90509250929050565b600080600060608486031215610bb357600080fd5b610bbc84610b2d565b9250610bca60208501610b2d565b9150610bd860408501610b2d565b90509250925092565b600080600060608486031215610bf657600080fd5b610bff84610b2d565b9250610c0d60208501610b2d565b9150604084013590509250925092565b60008060408385031215610c3057600080fd5b610c3983610b2d565b946020939093013593505050565b600060208083528351808285015260005b81811015610c7457858101830151858201604001528201610c58565b81811115610c86576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610caf57610caf610d06565b500190565b600082821015610cc657610cc6610d06565b500390565b600181811c90821680610cdf57607f821691505b60208210811415610d0057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212208bc7bc56e21d4fcfe579eebb502a9d433ba31c3a2c363542f4f5267e44de376464736f6c6343000807003360e060405260366080818152906200284060a0398051620000299160059160209091019062000118565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000589160069162000118565b503480156200006657600080fd5b506040516200287638038062002876833981016040819052620000899162000275565b6200009433620000c8565b8151620000a990600790602085019062000118565b508051620000bf90600890602084019062000118565b50505062000332565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200012690620002df565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b600082601f830112620001d057600080fd5b81516001600160401b0380821115620001ed57620001ed6200031c565b604051601f8301601f19908116603f011681019082821181831017156200021857620002186200031c565b816040528381526020925086838588010111156200023557600080fd5b600091505b838210156200025957858201830151818301840152908201906200023a565b838211156200026b5760008385830101525b9695505050505050565b600080604083850312156200028957600080fd5b82516001600160401b0380821115620002a157600080fd5b620002af86838701620001be565b93506020850151915080821115620002c657600080fd5b50620002d585828601620001be565b9150509250929050565b600181811c90821680620002f457607f821691505b602082108114156200031657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6124fe80620003426000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063626b7a1e11610104578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd146103e7578063e985e9c5146103fa578063f259a29e14610436578063f2fde38b1461043e57600080fd5b8063a22cb465146103a6578063b6b285d9146103b9578063b88d4fde146103cc578063c6682862146103df57600080fd5b806370a08231116100de57806370a0823114610372578063715018a6146103855780638da5cb5b1461038d57806395d89b411461039e57600080fd5b8063626b7a1e146103395780636352211e1461034c5780636a6278421461035f57600080fd5b80632d38f11e1161017c578063434358e01161014b578063434358e0146102ed5780634f6ccce714610300578063503d2e721461031357806355f804b31461032657600080fd5b80632d38f11e146102945780632f745c59146102b457806340c10f19146102c757806342842e0e146102da57600080fd5b8063095ea7b3116101b8578063095ea7b31461024757806318160ddd1461025c57806323b872dd1461026e5780632b875c941461028157600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed3660046120e9565b610451565b60405190151581526020015b60405180910390f35b61020f6104a3565b6040516101fe9190612261565b61022f61022a36600461216c565b610535565b6040516001600160a01b0390911681526020016101fe565b61025a6102553660046120bf565b6105cf565b005b600f545b6040519081526020016101fe565b61025a61027c366004611fcb565b6106e5565b61026061028f366004611f7d565b610716565b6102a76102a2366004611f7d565b610887565b6040516101fe919061221d565b6102606102c23660046120bf565b610929565b61025a6102d53660046120bf565b6109bf565b61025a6102e8366004611fcb565b610a31565b61025a6102fb366004611f7d565b610a4c565b61026061030e36600461216c565b610ad1565b61025a610321366004611f7d565b610b64565b61025a610334366004612123565b610de6565b61025a61034736600461216c565b610e23565b61022f61035a36600461216c565b610ea5565b61025a61036d366004611f7d565b610f1c565b610260610380366004611f7d565b611023565b61025a6110aa565b6000546001600160a01b031661022f565b61020f6110e0565b61025a6103b4366004612083565b6110ef565b61025a6103c7366004611f7d565b6110fa565b61025a6103da366004612007565b61117e565b61020f6111b6565b61020f6103f536600461216c565b611244565b6101f2610408366004611f98565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b61020f61131f565b61025a61044c366004611f7d565b61132c565b60006001600160e01b031982166380ac58cd60e01b148061048257506001600160e01b03198216635b5e139f60e01b145b8061049d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600780546104b2906123da565b80601f01602080910402602001604051908101604052809291908181526020018280546104de906123da565b801561052b5780601f106105005761010080835404028352916020019161052b565b820191906000526020600020905b81548152906001019060200180831161050e57829003601f168201915b5050505050905090565b6000818152600960205260408120546001600160a01b03166105b35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b60006105da82610ea5565b9050806001600160a01b0316836001600160a01b031614156106485760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105aa565b336001600160a01b038216148061066457506106648133610408565b6106d65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105aa565b6106e083836113c7565b505050565b6106ef3382611435565b61070b5760405162461bcd60e51b81526004016105aa906122fb565b6106e083838361152c565b60008061072283611023565b905060008167ffffffffffffffff81111561073f5761073f61249c565b604051908082528060200260200182016040528015610768578160200160208202803683370190505b50905061077484610887565b90506000806000805b8581101561087c5760006011600087848151811061079d5761079d612486565b6020026020010151815260200190815260200160002060008a6001600160a01b03166001600160a01b0316815260200190815260200160002054111561086a57601160008683815181106107f3576107f3612486565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054426108389190612397565b935062015180610851856802b5e3af16b1880000612378565b61085b9190612364565b9250610867838361234c565b91505b8061087481612415565b91505061077d565b509695505050505050565b6060600061089483611023565b905060008167ffffffffffffffff8111156108b1576108b161249c565b6040519080825280602002602001820160405280156108da578160200160208202803683370190505b50905060005b82811015610921576108f28582610929565b82828151811061090457610904612486565b60209081029190910101528061091981612415565b9150506108e0565b509392505050565b600061093483611023565b82106109965760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105aa565b506001600160a01b03919091166000908152600d60209081526040808320938352929052205490565b3360009081526012602052604090205460ff161515600114610a235760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e7400000060448201526064016105aa565b610a2d82826116ef565b5050565b6106e08383836040518060200160405280600081525061117e565b600160035410610a9e5760405162461bcd60e51b815260206004820152601c60248201527f616c72656164792063616c6c656420746869732066756e6374696f6e0000000060448201526064016105aa565b600480546001600160a01b0319166001600160a01b03831617905560038054906000610ac983612415565b919050555050565b6000610adc600f5490565b8210610b3f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105aa565b600f8281548110610b5257610b52612486565b90600052602060002001549050919050565b6000610b6f82611023565b11610bbc5760405162461bcd60e51b815260206004820152601860248201527f6e6f74207175616c696669656420666f7220726577617264000000000000000060448201526064016105aa565b6000610bc782611023565b905060008167ffffffffffffffff811115610be457610be461249c565b604051908082528060200260200182016040528015610c0d578160200160208202803683370190505b509050610c1983610887565b90506000806000805b85811015610d7557600060116000878481518110610c4257610c42612486565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020541115610d635760116000868381518110610c9857610c98612486565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205442610cdd9190612397565b935062015180610cf6856802b5e3af16b1880000612378565b610d009190612364565b9250610d0c838361234c565b91504260116000878481518110610d2557610d25612486565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020819055505b80610d6d81612415565b915050610c22565b50600480546040516340c10f1960e01b81526001600160a01b0389811693820193909352602481018490529116906340c10f1990604401600060405180830381600087803b158015610dc657600080fd5b505af1158015610dda573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314610e105760405162461bcd60e51b81526004016105aa906122c6565b8051610a2d906005906020840190611e52565b6000546001600160a01b03163314610e4d5760405162461bcd60e51b81526004016105aa906122c6565b6004805460ff60a01b1916600160a01b179055610e6960015490565b610e7b57610e7b600180546001019055565b60015b818111610a2d57610e93600180546001019055565b80610e9d81612415565b915050610e7e565b6000818152600960205260408120546001600160a01b03168061049d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105aa565b3360009081526012602052604090205460ff161515600114610f805760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e7400000060448201526064016105aa565b600454600160a01b900460ff161515600114610fe95760405162461bcd60e51b815260206004820152602260248201527f706c65617365207365742073657463757272656e746d696e746564616d6f756e60448201526103a160f51b60648201526084016105aa565b600154610ffe57610ffe600180546001019055565b600061100960015490565b905061101582826116ef565b610a2d600180546001019055565b60006001600160a01b03821661108e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105aa565b506001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b031633146110d45760405162461bcd60e51b81526004016105aa906122c6565b6110de6000611709565b565b6060600880546104b2906123da565b610a2d338383611759565b60016002541061113d5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b60448201526064016105aa565b6001600160a01b0381166000908152601260205260408120805460ff19166001908117909155600280549192909161117690849061234c565b909155505050565b6111883383611435565b6111a45760405162461bcd60e51b81526004016105aa906122fb565b6111b084848484611828565b50505050565b600680546111c3906123da565b80601f01602080910402602001604051908101604052809291908181526020018280546111ef906123da565b801561123c5780601f106112115761010080835404028352916020019161123c565b820191906000526020600020905b81548152906001019060200180831161121f57829003601f168201915b505050505081565b6000818152600960205260409020546060906001600160a01b03166112c35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105aa565b60006112cd61185b565b905060008151116112ed5760405180602001604052806000815250611318565b806112f78461186a565b6040516020016113089291906121b1565b6040516020818303038152906040525b9392505050565b600580546111c3906123da565b6000546001600160a01b031633146113565760405162461bcd60e51b81526004016105aa906122c6565b6001600160a01b0381166113bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105aa565b6113c481611709565b50565b6000818152600b6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113fc82610ea5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600960205260408120546001600160a01b03166114ae5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105aa565b60006114b983610ea5565b9050806001600160a01b0316846001600160a01b031614806114f45750836001600160a01b03166114e984610535565b6001600160a01b0316145b8061152457506001600160a01b038082166000908152600c602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661153f82610ea5565b6001600160a01b0316146115a35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105aa565b6001600160a01b0382166116055760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105aa565b611610838383611968565b61161b6000826113c7565b6001600160a01b0383166000908152600a60205260408120805460019290611644908490612397565b90915550506001600160a01b0382166000908152600a6020526040812080546001929061167290849061234c565b9091555050600081815260096020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255601184528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a2d828260405180602001604052806000815250611a20565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156117bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105aa565b6001600160a01b038381166000818152600c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61183384848461152c565b61183f84848484611a53565b6111b05760405162461bcd60e51b81526004016105aa90612274565b6060600580546104b2906123da565b60608161188e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118b857806118a281612415565b91506118b19050600a83612364565b9150611892565b60008167ffffffffffffffff8111156118d3576118d361249c565b6040519080825280601f01601f1916602001820160405280156118fd576020820181803683370190505b5090505b841561152457611912600183612397565b915061191f600a86612430565b61192a90603061234c565b60f81b81838151811061193f5761193f612486565b60200101906001600160f81b031916908160001a905350611961600a86612364565b9450611901565b6001600160a01b0383166119c3576119be81600f80546000838152601060205260408120829055600182018355919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020155565b6119e6565b816001600160a01b0316836001600160a01b0316146119e6576119e68382611b60565b6001600160a01b0382166119fd576106e081611bfd565b826001600160a01b0316826001600160a01b0316146106e0576106e08282611cac565b611a2a8383611cf0565b611a376000848484611a53565b6106e05760405162461bcd60e51b81526004016105aa90612274565b60006001600160a01b0384163b15611b5557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a979033908990889088906004016121e0565b602060405180830381600087803b158015611ab157600080fd5b505af1925050508015611ae1575060408051601f3d908101601f19168201909252611ade91810190612106565b60015b611b3b573d808015611b0f576040519150601f19603f3d011682016040523d82523d6000602084013e611b14565b606091505b508051611b335760405162461bcd60e51b81526004016105aa90612274565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611524565b506001949350505050565b60006001611b6d84611023565b611b779190612397565b6000838152600e6020526040902054909150808214611bca576001600160a01b0384166000908152600d602090815260408083208584528252808320548484528184208190558352600e90915290208190555b506000918252600e602090815260408084208490556001600160a01b039094168352600d81528383209183525290812055565b600f54600090611c0f90600190612397565b600083815260106020526040812054600f8054939450909284908110611c3757611c37612486565b9060005260206000200154905080600f8381548110611c5857611c58612486565b600091825260208083209091019290925582815260109091526040808220849055858252812055600f805480611c9057611c90612470565b6001900381819060005260206000200160009055905550505050565b6000611cb783611023565b6001600160a01b039093166000908152600d602090815260408083208684528252808320859055938252600e9052919091209190915550565b6001600160a01b038216611d465760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105aa565b6000818152600960205260409020546001600160a01b031615611dab5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105aa565b611db760008383611968565b6001600160a01b0382166000908152600a60205260408120805460019290611de090849061234c565b9091555050600081815260096020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560118352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611e5e906123da565b90600052602060002090601f016020900481019282611e805760008555611ec6565b82601f10611e9957805160ff1916838001178555611ec6565b82800160010185558215611ec6579182015b82811115611ec6578251825591602001919060010190611eab565b50611ed2929150611ed6565b5090565b5b80821115611ed25760008155600101611ed7565b600067ffffffffffffffff80841115611f0657611f0661249c565b604051601f8501601f19908116603f01168101908282118183101715611f2e57611f2e61249c565b81604052809350858152868686011115611f4757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f7857600080fd5b919050565b600060208284031215611f8f57600080fd5b61131882611f61565b60008060408385031215611fab57600080fd5b611fb483611f61565b9150611fc260208401611f61565b90509250929050565b600080600060608486031215611fe057600080fd5b611fe984611f61565b9250611ff760208501611f61565b9150604084013590509250925092565b6000806000806080858703121561201d57600080fd5b61202685611f61565b935061203460208601611f61565b925060408501359150606085013567ffffffffffffffff81111561205757600080fd5b8501601f8101871361206857600080fd5b61207787823560208401611eeb565b91505092959194509250565b6000806040838503121561209657600080fd5b61209f83611f61565b9150602083013580151581146120b457600080fd5b809150509250929050565b600080604083850312156120d257600080fd5b6120db83611f61565b946020939093013593505050565b6000602082840312156120fb57600080fd5b8135611318816124b2565b60006020828403121561211857600080fd5b8151611318816124b2565b60006020828403121561213557600080fd5b813567ffffffffffffffff81111561214c57600080fd5b8201601f8101841361215d57600080fd5b61152484823560208401611eeb565b60006020828403121561217e57600080fd5b5035919050565b6000815180845261219d8160208601602086016123ae565b601f01601f19169290920160200192915050565b600083516121c38184602088016123ae565b8351908301906121d78183602088016123ae565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221390830184612185565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561225557835183529284019291840191600101612239565b50909695505050505050565b6020815260006113186020830184612185565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561235f5761235f612444565b500190565b6000826123735761237361245a565b500490565b600081600019048311821515161561239257612392612444565b500290565b6000828210156123a9576123a9612444565b500390565b60005b838110156123c95781810151838201526020016123b1565b838111156111b05750506000910152565b600181811c908216806123ee57607f821691505b6020821081141561240f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561242957612429612444565b5060010190565b60008261243f5761243f61245a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113c457600080fdfea26469706673582212201030860525720a72c74bb9a0a38e6b2e6e0dfd33fcab278630ae87e1d108088864736f6c63430008070033697066733a2f2f516d6364704a70796d596364374144674853764a766b48706d75435676517565785642754d5064786d47724a79322f6115b360045560e06040526036608081815290620028b460a03980516200002f916006916020909101906200011e565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005e916007916200011e565b503480156200006c57600080fd5b50604051620028ea380380620028ea8339810160408190526200008f916200027b565b6200009a33620000ce565b8151620000af9060089060208501906200011e565b508051620000c59060099060208401906200011e565b50505062000338565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200012c90620002e5565b90600052602060002090601f0160209004810192826200015057600085556200019b565b82601f106200016b57805160ff19168380011785556200019b565b828001600101855582156200019b579182015b828111156200019b5782518255916020019190600101906200017e565b50620001a9929150620001ad565b5090565b5b80821115620001a95760008155600101620001ae565b600082601f830112620001d657600080fd5b81516001600160401b0380821115620001f357620001f362000322565b604051601f8301601f19908116603f011681019082821181831017156200021e576200021e62000322565b816040528381526020925086838588010111156200023b57600080fd5b600091505b838210156200025f578582018301518183018401529082019062000240565b83821115620002715760008385830101525b9695505050505050565b600080604083850312156200028f57600080fd5b82516001600160401b0380821115620002a757600080fd5b620002b586838701620001c4565b93506020850151915080821115620002cc57600080fd5b50620002db85828601620001c4565b9150509250929050565b600181811c90821680620002fa57607f821691505b602082108114156200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61256c80620003486000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063626b7a1e1161010f578063b6b285d9116100a2578063d5abeb0111610071578063d5abeb0114610423578063e985e9c51461042c578063f259a29e14610468578063f2fde38b1461047057600080fd5b8063b6b285d9146103e2578063b88d4fde146103f5578063c668286214610408578063c87b56dd1461041057600080fd5b8063715018a6116100de578063715018a6146103ae5780638da5cb5b146103b657806395d89b41146103c7578063a22cb465146103cf57600080fd5b8063626b7a1e146103625780636352211e146103755780636a6278421461038857806370a082311461039b57600080fd5b80632f745c59116101875780634f6ccce7116101565780634f6ccce714610316578063503d2e721461032957806355f804b31461033c5780635d4ba6141461034f57600080fd5b80632f745c59146102ca57806340c10f19146102dd57806342842e0e146102f0578063434358e01461030357600080fd5b806318160ddd116101c357806318160ddd1461027257806323b872dd146102845780632b875c94146102975780632d38f11e146102aa57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004612157565b610483565b60405190151581526020015b60405180910390f35b6102256104d5565b60405161021491906122cf565b6102456102403660046121da565b610567565b6040516001600160a01b039091168152602001610214565b61027061026b36600461212d565b610601565b005b6010545b604051908152602001610214565b610270610292366004612039565b610717565b6102766102a5366004611feb565b610748565b6102bd6102b8366004611feb565b6108b8565b604051610214919061228b565b6102766102d836600461212d565b61095a565b6102706102eb36600461212d565b6109f0565b6102706102fe366004612039565b610a62565b610270610311366004611feb565b610a7d565b6102766103243660046121da565b610b02565b610270610337366004611feb565b610b95565b61027061034a366004612191565b610e14565b61027061035d3660046121da565b610e51565b6102706103703660046121da565b610e80565b6102456103833660046121da565b610f02565b610270610396366004611feb565b610f79565b6102766103a9366004611feb565b611091565b610270611118565b6000546001600160a01b0316610245565b61022561114e565b6102706103dd3660046120f1565b61115d565b6102706103f0366004611feb565b611168565b610270610403366004612075565b6111ec565b610225611224565b61022561041e3660046121da565b6112b2565b61027660045481565b61020861043a366004612006565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b61022561138d565b61027061047e366004611feb565b61139a565b60006001600160e01b031982166380ac58cd60e01b14806104b457506001600160e01b03198216635b5e139f60e01b145b806104cf57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600880546104e490612448565b80601f016020809104026020016040519081016040528092919081815260200182805461051090612448565b801561055d5780601f106105325761010080835404028352916020019161055d565b820191906000526020600020905b81548152906001019060200180831161054057829003601f168201915b5050505050905090565b6000818152600a60205260408120546001600160a01b03166105e55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600c60205260409020546001600160a01b031690565b600061060c82610f02565b9050806001600160a01b0316836001600160a01b0316141561067a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105dc565b336001600160a01b03821614806106965750610696813361043a565b6107085760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105dc565b6107128383611435565b505050565b61072133826114a3565b61073d5760405162461bcd60e51b81526004016105dc90612369565b61071283838361159a565b60008061075483611091565b905060008167ffffffffffffffff8111156107715761077161250a565b60405190808252806020026020018201604052801561079a578160200160208202803683370190505b5090506107a6846108b8565b90506000806000805b858110156108ad576000601260008784815181106107cf576107cf6124f4565b6020026020010151815260200190815260200160002060008a6001600160a01b03166001600160a01b0316815260200190815260200160002054111561089b5760126000868381518110610825576108256124f4565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020544261086a9190612405565b93506201518061088285674563918244f400006123e6565b61088c91906123d2565b925061089883836123ba565b91505b806108a581612483565b9150506107af565b509695505050505050565b606060006108c583611091565b905060008167ffffffffffffffff8111156108e2576108e261250a565b60405190808252806020026020018201604052801561090b578160200160208202803683370190505b50905060005b8281101561095257610923858261095a565b828281518110610935576109356124f4565b60209081029190910101528061094a81612483565b915050610911565b509392505050565b600061096583611091565b82106109c75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105dc565b506001600160a01b03919091166000908152600e60209081526040808320938352929052205490565b3360009081526013602052604090205460ff161515600114610a545760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e7400000060448201526064016105dc565b610a5e828261175d565b5050565b610712838383604051806020016040528060008152506111ec565b600160035410610acf5760405162461bcd60e51b815260206004820152601c60248201527f616c72656164792063616c6c656420746869732066756e6374696f6e0000000060448201526064016105dc565b600580546001600160a01b0319166001600160a01b03831617905560038054906000610afa83612483565b919050555050565b6000610b0d60105490565b8210610b705760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105dc565b60108281548110610b8357610b836124f4565b90600052602060002001549050919050565b6000610ba082611091565b11610bed5760405162461bcd60e51b815260206004820152601860248201527f6e6f74207175616c696669656420666f7220726577617264000000000000000060448201526064016105dc565b6000610bf882611091565b905060008167ffffffffffffffff811115610c1557610c1561250a565b604051908082528060200260200182016040528015610c3e578160200160208202803683370190505b509050610c4a836108b8565b90506000806000805b85811015610da557600060126000878481518110610c7357610c736124f4565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020541115610d935760126000868381518110610cc957610cc96124f4565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205442610d0e9190612405565b935062015180610d2685674563918244f400006123e6565b610d3091906123d2565b9250610d3c83836123ba565b91504260126000878481518110610d5557610d556124f4565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020819055505b80610d9d81612483565b915050610c53565b506005546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314610e3e5760405162461bcd60e51b81526004016105dc90612334565b8051610a5e906006906020840190611ec0565b6000546001600160a01b03163314610e7b5760405162461bcd60e51b81526004016105dc90612334565b600455565b6000546001600160a01b03163314610eaa5760405162461bcd60e51b81526004016105dc90612334565b6005805460ff60a01b1916600160a01b179055610ec660015490565b610ed857610ed8600180546001019055565b60015b818111610a5e57610ef0600180546001019055565b80610efa81612483565b915050610edb565b6000818152600a60205260408120546001600160a01b0316806104cf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105dc565b3360009081526013602052604090205460ff161515600114610fdd5760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e7400000060448201526064016105dc565b6004546010541115610fee57600080fd5b600554600160a01b900460ff1615156001146110575760405162461bcd60e51b815260206004820152602260248201527f706c65617365207365742073657463757272656e746d696e746564616d6f756e60448201526103a160f51b60648201526084016105dc565b60015461106c5761106c600180546001019055565b600061107760015490565b9050611083828261175d565b610a5e600180546001019055565b60006001600160a01b0382166110fc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105dc565b506001600160a01b03166000908152600b602052604090205490565b6000546001600160a01b031633146111425760405162461bcd60e51b81526004016105dc90612334565b61114c6000611777565b565b6060600980546104e490612448565b610a5e3383836117c7565b6001600254106111ab5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b60448201526064016105dc565b6001600160a01b0381166000908152601360205260408120805460ff1916600190811790915560028054919290916111e49084906123ba565b909155505050565b6111f633836114a3565b6112125760405162461bcd60e51b81526004016105dc90612369565b61121e84848484611896565b50505050565b6007805461123190612448565b80601f016020809104026020016040519081016040528092919081815260200182805461125d90612448565b80156112aa5780601f1061127f576101008083540402835291602001916112aa565b820191906000526020600020905b81548152906001019060200180831161128d57829003601f168201915b505050505081565b6000818152600a60205260409020546060906001600160a01b03166113315760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105dc565b600061133b6118c9565b9050600081511161135b5760405180602001604052806000815250611386565b80611365846118d8565b60405160200161137692919061221f565b6040516020818303038152906040525b9392505050565b6006805461123190612448565b6000546001600160a01b031633146113c45760405162461bcd60e51b81526004016105dc90612334565b6001600160a01b0381166114295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105dc565b61143281611777565b50565b6000818152600c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061146a82610f02565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600a60205260408120546001600160a01b031661151c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105dc565b600061152783610f02565b9050806001600160a01b0316846001600160a01b031614806115625750836001600160a01b031661155784610567565b6001600160a01b0316145b8061159257506001600160a01b038082166000908152600d602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115ad82610f02565b6001600160a01b0316146116115760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105dc565b6001600160a01b0382166116735760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105dc565b61167e8383836119d6565b611689600082611435565b6001600160a01b0383166000908152600b602052604081208054600192906116b2908490612405565b90915550506001600160a01b0382166000908152600b602052604081208054600192906116e09084906123ba565b90915550506000818152600a6020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255601284528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a5e828260405180602001604052806000815250611a8e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156118295760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105dc565b6001600160a01b038381166000818152600d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118a184848461159a565b6118ad84848484611ac1565b61121e5760405162461bcd60e51b81526004016105dc906122e2565b6060600680546104e490612448565b6060816118fc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611926578061191081612483565b915061191f9050600a836123d2565b9150611900565b60008167ffffffffffffffff8111156119415761194161250a565b6040519080825280601f01601f19166020018201604052801561196b576020820181803683370190505b5090505b841561159257611980600183612405565b915061198d600a8661249e565b6119989060306123ba565b60f81b8183815181106119ad576119ad6124f4565b60200101906001600160f81b031916908160001a9053506119cf600a866123d2565b945061196f565b6001600160a01b038316611a3157611a2c81601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720155565b611a54565b816001600160a01b0316836001600160a01b031614611a5457611a548382611bce565b6001600160a01b038216611a6b5761071281611c6b565b826001600160a01b0316826001600160a01b031614610712576107128282611d1a565b611a988383611d5e565b611aa56000848484611ac1565b6107125760405162461bcd60e51b81526004016105dc906122e2565b60006001600160a01b0384163b15611bc357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b0590339089908890889060040161224e565b602060405180830381600087803b158015611b1f57600080fd5b505af1925050508015611b4f575060408051601f3d908101601f19168201909252611b4c91810190612174565b60015b611ba9573d808015611b7d576040519150601f19603f3d011682016040523d82523d6000602084013e611b82565b606091505b508051611ba15760405162461bcd60e51b81526004016105dc906122e2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611592565b506001949350505050565b60006001611bdb84611091565b611be59190612405565b6000838152600f6020526040902054909150808214611c38576001600160a01b0384166000908152600e602090815260408083208584528252808320548484528184208190558352600f90915290208190555b506000918252600f602090815260408084208490556001600160a01b039094168352600e81528383209183525290812055565b601054600090611c7d90600190612405565b60008381526011602052604081205460108054939450909284908110611ca557611ca56124f4565b906000526020600020015490508060108381548110611cc657611cc66124f4565b6000918252602080832090910192909255828152601190915260408082208490558582528120556010805480611cfe57611cfe6124de565b6001900381819060005260206000200160009055905550505050565b6000611d2583611091565b6001600160a01b039093166000908152600e602090815260408083208684528252808320859055938252600f9052919091209190915550565b6001600160a01b038216611db45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105dc565b6000818152600a60205260409020546001600160a01b031615611e195760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105dc565b611e25600083836119d6565b6001600160a01b0382166000908152600b60205260408120805460019290611e4e9084906123ba565b90915550506000818152600a6020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560128352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611ecc90612448565b90600052602060002090601f016020900481019282611eee5760008555611f34565b82601f10611f0757805160ff1916838001178555611f34565b82800160010185558215611f34579182015b82811115611f34578251825591602001919060010190611f19565b50611f40929150611f44565b5090565b5b80821115611f405760008155600101611f45565b600067ffffffffffffffff80841115611f7457611f7461250a565b604051601f8501601f19908116603f01168101908282118183101715611f9c57611f9c61250a565b81604052809350858152868686011115611fb557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611fe657600080fd5b919050565b600060208284031215611ffd57600080fd5b61138682611fcf565b6000806040838503121561201957600080fd5b61202283611fcf565b915061203060208401611fcf565b90509250929050565b60008060006060848603121561204e57600080fd5b61205784611fcf565b925061206560208501611fcf565b9150604084013590509250925092565b6000806000806080858703121561208b57600080fd5b61209485611fcf565b93506120a260208601611fcf565b925060408501359150606085013567ffffffffffffffff8111156120c557600080fd5b8501601f810187136120d657600080fd5b6120e587823560208401611f59565b91505092959194509250565b6000806040838503121561210457600080fd5b61210d83611fcf565b91506020830135801515811461212257600080fd5b809150509250929050565b6000806040838503121561214057600080fd5b61214983611fcf565b946020939093013593505050565b60006020828403121561216957600080fd5b813561138681612520565b60006020828403121561218657600080fd5b815161138681612520565b6000602082840312156121a357600080fd5b813567ffffffffffffffff8111156121ba57600080fd5b8201601f810184136121cb57600080fd5b61159284823560208401611f59565b6000602082840312156121ec57600080fd5b5035919050565b6000815180845261220b81602086016020860161241c565b601f01601f19169290920160200192915050565b6000835161223181846020880161241c565b83519083019061224581836020880161241c565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612281908301846121f3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122c3578351835292840192918401916001016122a7565b50909695505050505050565b60208152600061138660208301846121f3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156123cd576123cd6124b2565b500190565b6000826123e1576123e16124c8565b500490565b6000816000190483118215151615612400576124006124b2565b500290565b600082821015612417576124176124b2565b500390565b60005b8381101561243757818101518382015260200161241f565b8381111561121e5750506000910152565b600181811c9082168061245c57607f821691505b6020821081141561247d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612497576124976124b2565b5060010190565b6000826124ad576124ad6124c8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461143257600080fdfea26469706673582212206a1e6661de6383298f02d1cdae2b9967a37180dc83414a3195a95314d0f41f3764736f6c63430008070033697066733a2f2f516d514d35706d6a3976794a684c5871646f75596f55574a353847567252744d78533555797767596250323269392f697066733a2f2f516d5a6b4e395975523172724b315958683171784a78456f747a725a6241664559777a4348597a324c6e354561722f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add070000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000093078447261676f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f5844000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055363616c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008416e6369656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414e434e5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095779726d6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045759524d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103765760003560e01c806370a08231116101d1578063bb6bf51d11610102578063d9ecad7b116100a0578063ea7eeb061161006f578063ea7eeb06146109c7578063f259a29e146109e7578063f2fde38b146109fc578063f6368b8314610a1c57600080fd5b8063d9ecad7b14610920578063da3ef23f14610940578063e2d358ac14610960578063e985e9c51461097e57600080fd5b8063c87b56dd116100dc578063c87b56dd146108b5578063c8eade71146108d5578063cf7f9e95146108ea578063d5abeb011461090a57600080fd5b8063bb6bf51d1461086d578063be597c3e14610882578063c6682862146108a057600080fd5b80638da5cb5b1161016f578063a0b9f0e111610149578063a0b9f0e1146107f8578063a22cb4651461080d578063b34c0cea1461082d578063b88d4fde1461084d57600080fd5b80638da5cb5b146107b05780638fd3ab80146107ce57806395d89b41146107e357600080fd5b806377754a06116101ab57806377754a06146107465780637f00c7a6146107665780638456cb59146107865780638894038d1461079b57600080fd5b806370a08231146106fc578063715018a61461071c57806373508aec1461073157600080fd5b8063374fdb87116102ab5780634e71d92d116102495780635843029b116102235780635843029b146106825780635c975abb146106a2578063626b7a1e146106bc5780636352211e146106dc57600080fd5b80634e71d92d1461062d5780634f6ccce71461064257806355f804b31461066257600080fd5b806342842e0e1161028557806342842e0e146105b857806344a0d68a146105d8578063484b973c146105f85780634e1575691461061857600080fd5b8063374fdb87146105675780633dd407e11461058557806340c10f19146105a557600080fd5b8063155ad04a11610318578063239c70ae116102f2578063239c70ae146104e457806323b872dd146104fa5780632d38f11e1461051a5780632f745c591461054757600080fd5b8063155ad04a1461049057806316c61ccc146104b057806318160ddd146104cf57600080fd5b806306fdde031161035457806306fdde03146103f2578063081812fc14610414578063095ea7b31461044c57806313faede61461046c57600080fd5b806301ffc9a71461037b578063056e5a7f146103b057806305a10028146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004614a44565b610a3c565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb366004614a7e565b610a8e565b005b3480156103de57600080fd5b506103d06103ed366004614b1a565b610b26565b3480156103fe57600080fd5b50610407610e66565b6040516103a79190614c53565b34801561042057600080fd5b5061043461042f366004614ac6565b610ef8565b6040516001600160a01b0390911681526020016103a7565b34801561045857600080fd5b506103d06104673660046148dd565b610f8d565b34801561047857600080fd5b5061048260065481565b6040519081526020016103a7565b34801561049c57600080fd5b506103d06104ab366004614ac6565b6110a3565b3480156104bc57600080fd5b5060095461039b90610100900460ff1681565b3480156104db57600080fd5b50600d54610482565b3480156104f057600080fd5b5061048260085481565b34801561050657600080fd5b506103d06105153660046147ef565b6111bd565b34801561052657600080fd5b5061053a610535366004614720565b6111fe565b6040516103a79190614c1b565b34801561055357600080fd5b506104826105623660046148dd565b61129f565b34801561057357600080fd5b506012546001600160a01b0316610434565b34801561059157600080fd5b506103d06105a0366004614793565b611335565b6103d06105b33660046148dd565b6113af565b3480156105c457600080fd5b506103d06105d33660046147ef565b6114d7565b3480156105e457600080fd5b506103d06105f3366004614ac6565b6114f2565b34801561060457600080fd5b506103d06106133660046148dd565b611521565b34801561062457600080fd5b506104826115e0565b34801561063957600080fd5b506103d061174e565b34801561064e57600080fd5b5061048261065d366004614ac6565b6118d8565b34801561066e57600080fd5b506103d061067d366004614a7e565b61196b565b34801561068e57600080fd5b506103d061069d366004614a7e565b6119a8565b3480156106ae57600080fd5b5060095461039b9060ff1681565b3480156106c857600080fd5b506103d06106d7366004614ac6565b611a02565b3480156106e857600080fd5b506104346106f7366004614ac6565b611a84565b34801561070857600080fd5b50610482610717366004614720565b611afb565b34801561072857600080fd5b506103d0611b82565b34801561073d57600080fd5b50610482611bb8565b34801561075257600080fd5b506103d0610761366004614ac6565b611c3a565b34801561077257600080fd5b506103d0610781366004614ac6565b611c95565b34801561079257600080fd5b506103d0611cc4565b3480156107a757600080fd5b50610482611d02565b3480156107bc57600080fd5b506000546001600160a01b0316610434565b3480156107da57600080fd5b506103d0611d33565b3480156107ef57600080fd5b5061040761272c565b34801561080457600080fd5b5061039b61273b565b34801561081957600080fd5b506103d06108283660046148af565b612770565b34801561083957600080fd5b506103d0610848366004614ac6565b61277b565b34801561085957600080fd5b506103d0610868366004614830565b6127d6565b34801561087957600080fd5b506103d061280e565b34801561088e57600080fd5b506010546001600160a01b0316610434565b3480156108ac57600080fd5b50610407612c35565b3480156108c157600080fd5b506104076108d0366004614ac6565b612cc3565b3480156108e157600080fd5b506103d0612d9e565b3480156108f657600080fd5b506103d0610905366004614ac6565b612de5565b34801561091657600080fd5b5061048260075481565b34801561092c57600080fd5b506103d061093b366004614af8565b612e40565b34801561094c57600080fd5b506103d061095b366004614a7e565b6130a7565b34801561096c57600080fd5b506011546001600160a01b0316610434565b34801561098a57600080fd5b5061039b61099936600461475a565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205460ff1690565b3480156109d357600080fd5b506103d06109e23660046149a0565b6130e4565b3480156109f357600080fd5b506104076138ba565b348015610a0857600080fd5b506103d0610a17366004614720565b6138c7565b348015610a2857600080fd5b5061053a610a37366004614720565b613962565b60006001600160e01b031982166380ac58cd60e01b1480610a6d57506001600160e01b03198216635b5e139f60e01b145b80610a8857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610ac15760405162461bcd60e51b8152600401610ab890614ced565b60405180910390fd5b6012546040516355f804b360e01b81526001600160a01b03909116906355f804b390610af1908490600401614c53565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b5050505050565b685150ae84a8cdf000006003610b3b33611afb565b1015610b895760405162461bcd60e51b815260206004820152601a60248201527f4d7573742048617665203320554e4252454420447261676f6e730000000000006044820152606401610ab8565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c049190614adf565b1015610c225760405162461bcd60e51b8152600401610ab890614d73565b33610c2c85611a84565b6001600160a01b031614610c525760405162461bcd60e51b8152600401610ab890614db5565b33610c5c84611a84565b6001600160a01b031614610c825760405162461bcd60e51b8152600401610ab890614db5565b33610c8c83611a84565b6001600160a01b031614610cb25760405162461bcd60e51b8152600401610ab890614db5565b306000908152600f6020908152604080832087845290915290205460ff1615610ced5760405162461bcd60e51b8152600401610ab890614cb8565b306000908152600f6020908152604080832086845290915290205460ff1615610d285760405162461bcd60e51b8152600401610ab890614cb8565b306000908152600f6020908152604080832085845290915290205460ff1615610d635760405162461bcd60e51b8152600401610ab890614cb8565b600954610100900460ff1615610d7857600080fd5b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610daa9033908590600401614c02565b600060405180830381600087803b158015610dc457600080fd5b505af1158015610dd8573d6000803e3d6000fd5b50505050610de93361dead86613b34565b610df63361dead85613b34565b610e033361dead84613b34565b6011546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b5050505050505050565b606060018054610e7590614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea190614ebf565b8015610eee5780601f10610ec357610100808354040283529160200191610eee565b820191906000526020600020905b815481529060010190602001808311610ed157829003601f168201915b5050505050905090565b6000818152601760205260408120546001600160a01b0316610f715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab8565b506000908152601960205260409020546001600160a01b031690565b6000610f9882611a84565b9050806001600160a01b0316836001600160a01b031614156110065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab8565b336001600160a01b038216148061102257506110228133610999565b6110945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab8565b61109e8383613cf7565b505050565b60006110b782670de0b6b3a7640000614e5d565b6010546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156110ff57600080fd5b505afa158015611113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111379190614adf565b10156111555760405162461bcd60e51b8152600401610ab890614d73565b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906111879033908590600401614c02565b600060405180830381600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050505050565b6111c73382613d65565b6111e35760405162461bcd60e51b8152600401610ab890614d22565b60095460ff16156111f357600080fd5b61109e838383613b34565b6060600061120b83611afb565b90506000816001600160401b0381111561122757611227614f81565b604051908082528060200260200182016040528015611250578160200160208202803683370190505b50905060005b8281101561129757611268858261129f565b82828151811061127a5761127a614f6b565b60209081029190910101528061128f81614efa565b915050611256565b509392505050565b60006112aa83611afb565b821061130c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ab8565b506001600160a01b03919091166000908152600b60209081526040808320938352929052205490565b6000546001600160a01b0316331461135f5760405162461bcd60e51b8152600401610ab890614ced565b601380546001600160a01b039586166001600160a01b0319918216179091556014805494861694821694909417909355601580549285169284169290921790915560168054919093169116179055565b600081116113bc57600080fd5b6008548111156113cb57600080fd5b600754816113d8600d5490565b6113e29190614e31565b11156113ed57600080fd5b60095460ff16156113fd57600080fd5b601654600160a01b900460ff1615156001146114665760405162461bcd60e51b815260206004820152602260248201527f706c65617365207365742073657463757272656e746d696e746564616d6f756e60448201526103a160f51b6064820152608401610ab8565b806006546114749190614e5d565b34101561148057600080fd5b60035461149557611495600380546001019055565b60015b81811161109e5760006114aa60035490565b90506114b68482613e5c565b6114c4600380546001019055565b50806114cf81614efa565b915050611498565b61109e838383604051806020016040528060008152506127d6565b6000546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610ab890614ced565b600655565b6000546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610ab890614ced565b6000811161155857600080fd5b60085481111561156757600080fd5b60075481611574600d5490565b61157e9190614e31565b111561158957600080fd5b60035461159e5761159e600380546001019055565b60015b81811161109e5760006115b360035490565b90506115bf8482613e5c565b6115cd600380546001019055565b50806115d881614efa565b9150506115a1565b6000806115ec33611afb565b90506000816001600160401b0381111561160857611608614f81565b604051908082528060200260200182016040528015611631578160200160208202803683370190505b50905061163d336111fe565b90506000806000805b85811015611744576000600a600087848151811061166657611666614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054111561173257600a60008683815181106116bc576116bc614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054426117019190614e7c565b93506201518061171985678ac7230489e80000614e5d565b6117239190614e49565b925061172f8383614e31565b91505b8061173c81614efa565b915050611646565b5095945050505050565b6000546001600160a01b031633146117785760405162461bcd60e51b8152600401610ab890614ced565b4773d848353706e5a26baa6dd20265edde1e7047d9ba6108fc61179c606484614e49565b6117a790602d614e5d565b6040518115909202916000818181858888f193505050501580156117cf573d6000803e3d6000fd5b5073b6d2ac64bdc24f76417b95b410acf47ce31add076108fc6117f3606484614e49565b6117fe90601f614e5d565b6040518115909202916000818181858888f19350505050158015611826573d6000803e3d6000fd5b5073e44cb360e48da69fe75a78fd1649ccbd3ccf7ad16108fc61184a606484614e49565b611855906014614e5d565b6040518115909202916000818181858888f1935050505015801561187d573d6000803e3d6000fd5b50739817c311f6897d30e372c119a888028bac879d1c6108fc6118a1606484614e49565b6118ac906004614e5d565b6040518115909202916000818181858888f193505050501580156118d4573d6000803e3d6000fd5b5050565b60006118e3600d5490565b82106119465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ab8565b600d828154811061195957611959614f6b565b90600052602060002001549050919050565b6000546001600160a01b031633146119955760405162461bcd60e51b8152600401610ab890614ced565b80516118d49060049060208401906145be565b6000546001600160a01b031633146119d25760405162461bcd60e51b8152600401610ab890614ced565b6011546040516355f804b360e01b81526001600160a01b03909116906355f804b390610af1908490600401614c53565b6000546001600160a01b03163314611a2c5760405162461bcd60e51b8152600401610ab890614ced565b6016805460ff60a01b1916600160a01b179055611a4860035490565b611a5a57611a5a600380546001019055565b60015b8181116118d457611a72600380546001019055565b80611a7c81614efa565b915050611a5d565b6000818152601760205260408120546001600160a01b031680610a885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab8565b60006001600160a01b038216611b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab8565b506001600160a01b031660009081526018602052604090205490565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610ab890614ced565b611bb66000613e76565b565b601254604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c94906024015b60206040518083038186803b158015611bfd57600080fd5b505afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c359190614adf565b905090565b6000546001600160a01b03163314611c645760405162461bcd60e51b8152600401610ab890614ced565b601154604051633135bd0f60e11b8152600481018390526001600160a01b039091169063626b7a1e90602401610af1565b6000546001600160a01b03163314611cbf5760405162461bcd60e51b8152600401610ab890614ced565b600855565b6000546001600160a01b03163314611cee5760405162461bcd60e51b8152600401610ab890614ced565b6009805460ff19811660ff90911615179055565b601154604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c9490602401611be5565b60145460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b158015611d7757600080fd5b505afa158015611d8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db39190810190614909565b905060005b8151811015611f395760145482516001600160a01b0390911690636352211e90849084908110611dea57611dea614f6b565b60200260200101516040518263ffffffff1660e01b8152600401611e1091815260200190565b60206040518083038186803b158015611e2857600080fd5b505afa158015611e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e60919061473d565b6001600160a01b0316336001600160a01b031614611e7d57600080fd5b60145482516001600160a01b03909116906323b872dd90339061dead90869086908110611eac57611eac614f6b565b60200260200101516040518463ffffffff1660e01b8152600401611ed293929190614ba1565b600060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b50505050611f2733838381518110611f1a57611f1a614f6b565b6020026020010151613ec6565b80611f3181614efa565b915050611db8565b5060155460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b158015611f7e57600080fd5b505afa158015611f92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fba9190810190614909565b905060005b81518110156121a05760155482516001600160a01b0390911690636352211e90849084908110611ff157611ff1614f6b565b60200260200101516040518263ffffffff1660e01b815260040161201791815260200190565b60206040518083038186803b15801561202f57600080fd5b505afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612067919061473d565b6001600160a01b0316336001600160a01b03161461208457600080fd5b60155482516001600160a01b03909116906323b872dd90339061dead908690869081106120b3576120b3614f6b565b60200260200101516040518463ffffffff1660e01b81526004016120d993929190614ba1565b600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505060115484516001600160a01b0390911692506340c10f199150339085908590811061213657612136614f6b565b60200260200101516040518363ffffffff1660e01b815260040161215b929190614c02565b600060405180830381600087803b15801561217557600080fd5b505af1158015612189573d6000803e3d6000fd5b50505050808061219890614efa565b915050611fbf565b5060165460405163169c788f60e11b81523360048201526000916001600160a01b031690632d38f11e9060240160006040518083038186803b1580156121e557600080fd5b505afa1580156121f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122219190810190614909565b905060005b81518110156124075760165482516001600160a01b0390911690636352211e9084908490811061225857612258614f6b565b60200260200101516040518263ffffffff1660e01b815260040161227e91815260200190565b60206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce919061473d565b6001600160a01b0316336001600160a01b0316146122eb57600080fd5b60165482516001600160a01b03909116906323b872dd90339061dead9086908690811061231a5761231a614f6b565b60200260200101516040518463ffffffff1660e01b815260040161234093929190614ba1565b600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b505060125484516001600160a01b0390911692506340c10f199150339085908590811061239d5761239d614f6b565b60200260200101516040518363ffffffff1660e01b81526004016123c2929190614c02565b600060405180830381600087803b1580156123dc57600080fd5b505af11580156123f0573d6000803e3d6000fd5b5050505080806123ff90614efa565b915050612226565b506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561244c57600080fd5b505afa158015612460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124849190614adf565b90506000601460009054906101000a90046001600160a01b03166001600160a01b0316634e1575696040518163ffffffff1660e01b815260040160206040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190614adf565b601554604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b15801561255757600080fd5b505afa15801561256b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258f9190614adf565b601654604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b1580156125d857600080fd5b505afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190614adf565b9050600081836126208688614e31565b61262a9190614e31565b6126349190614e31565b6013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061266b90339061dead908a90600401614ba1565b602060405180830381600087803b15801561268557600080fd5b505af1158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190614a27565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906126f09033908590600401614c02565b600060405180830381600087803b15801561270a57600080fd5b505af115801561271e573d6000803e3d6000fd5b505050505050505050505050565b606060028054610e7590614ebf565b600080546001600160a01b031633146127665760405162461bcd60e51b8152600401610ab890614ced565b5060095460ff1690565b6118d4338383614028565b6000546001600160a01b031633146127a55760405162461bcd60e51b8152600401610ab890614ced565b601254604051633135bd0f60e11b8152600481018390526001600160a01b039091169063626b7a1e90602401610af1565b6127e03383613d65565b6127fc5760405162461bcd60e51b8152600401610ab890614d22565b612808848484846140f7565b50505050565b600061281933611afb565b116128665760405162461bcd60e51b815260206004820152601860248201527f4e6f74205175616c696669656420466f722052657761726400000000000000006044820152606401610ab8565b600061287133611afb565b90506000816001600160401b0381111561288d5761288d614f81565b6040519080825280602002602001820160405280156128b6578160200160208202803683370190505b5090506128c2336111fe565b90506000806000805b85811015612a08576000600a60008784815181106128eb576128eb614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000205411156129f657600a600086838151811061294157612941614f6b565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054426129869190614e7c565b93506201518061299e85678ac7230489e80000614e5d565b6129a89190614e49565b92506129b48383614e31565b915042600a60008784815181106129cd576129cd614f6b565b602090810291909101810151825281810192909252604090810160009081203382529092529020555b80612a0081614efa565b9150506128cb565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990612a3b9033908590600401614c02565b600060405180830381600087803b158015612a5557600080fd5b505af1158015612a69573d6000803e3d6000fd5b50506011546040516370a0823160e01b8152336004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b158015612ab357600080fd5b505afa158015612ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aeb9190614adf565b1115612b4f5760115460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050505b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612b9357600080fd5b505afa158015612ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcb9190614adf565b1115610b1f5760125460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015612c1657600080fd5b505af1158015612c2a573d6000803e3d6000fd5b505050505050505050565b60058054612c4290614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6e90614ebf565b8015612cbb5780601f10612c9057610100808354040283529160200191612cbb565b820191906000526020600020905b815481529060010190602001808311612c9e57829003601f168201915b505050505081565b6000818152601760205260409020546060906001600160a01b0316612d425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ab8565b6000612d4c61412a565b90506000815111612d6c5760405180602001604052806000815250612d97565b80612d7684614139565b604051602001612d87929190614b72565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314612dc85760405162461bcd60e51b8152600401610ab890614ced565b6009805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314612e0f5760405162461bcd60e51b8152600401610ab890614ced565b601254604051631752e98560e21b8152600481018390526001600160a01b0390911690635d4ba61490602401610af1565b686194049f30f72000006002612e5533611afb565b1015612e9a5760405162461bcd60e51b81526020600482015260146024820152734d757374204f776e2032203078447261676f6e7360601b6044820152606401610ab8565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015612edd57600080fd5b505afa158015612ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f159190614adf565b1015612f335760405162461bcd60e51b8152600401610ab890614d73565b33612f3d84611a84565b6001600160a01b031614612f635760405162461bcd60e51b8152600401610ab890614db5565b33612f6d83611a84565b6001600160a01b031614612f935760405162461bcd60e51b8152600401610ab890614db5565b600954610100900460ff1615612fa857600080fd5b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90612fda9033908590600401614c02565b600060405180830381600087803b158015612ff457600080fd5b505af1158015613008573d6000803e3d6000fd5b5050306000908152600f602090815260408083208884529091528082208054600160ff1991821681179092558784529282902080549093161790915560125490516335313c2160e11b81523360048201526001600160a01b039091169250636a6278429150602401600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146130d15760405162461bcd60e51b8152600401610ab890614ced565b80516118d49060059060208401906145be565b8260005b815181101561325c5760145482516001600160a01b0390911690636352211e9084908490811061311a5761311a614f6b565b60200260200101516040518263ffffffff1660e01b815260040161314091815260200190565b60206040518083038186803b15801561315857600080fd5b505afa15801561316c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613190919061473d565b6001600160a01b0316336001600160a01b0316146131ad57600080fd5b60145482516001600160a01b03909116906323b872dd90339061dead908690869081106131dc576131dc614f6b565b60200260200101516040518463ffffffff1660e01b815260040161320293929190614ba1565b600060405180830381600087803b15801561321c57600080fd5b505af1158015613230573d6000803e3d6000fd5b5050505061324a33838381518110611f1a57611f1a614f6b565b8061325481614efa565b9150506130e8565b508260005b81518110156134425760155482516001600160a01b0390911690636352211e9084908490811061329357613293614f6b565b60200260200101516040518263ffffffff1660e01b81526004016132b991815260200190565b60206040518083038186803b1580156132d157600080fd5b505afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613309919061473d565b6001600160a01b0316336001600160a01b03161461332657600080fd5b60155482516001600160a01b03909116906323b872dd90339061dead9086908690811061335557613355614f6b565b60200260200101516040518463ffffffff1660e01b815260040161337b93929190614ba1565b600060405180830381600087803b15801561339557600080fd5b505af11580156133a9573d6000803e3d6000fd5b505060115484516001600160a01b0390911692506340c10f19915033908590859081106133d8576133d8614f6b565b60200260200101516040518363ffffffff1660e01b81526004016133fd929190614c02565b600060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b50505050808061343a90614efa565b915050613261565b508260005b81518110156136285760165482516001600160a01b0390911690636352211e9084908490811061347957613479614f6b565b60200260200101516040518263ffffffff1660e01b815260040161349f91815260200190565b60206040518083038186803b1580156134b757600080fd5b505afa1580156134cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ef919061473d565b6001600160a01b0316336001600160a01b03161461350c57600080fd5b60165482516001600160a01b03909116906323b872dd90339061dead9086908690811061353b5761353b614f6b565b60200260200101516040518463ffffffff1660e01b815260040161356193929190614ba1565b600060405180830381600087803b15801561357b57600080fd5b505af115801561358f573d6000803e3d6000fd5b505060125484516001600160a01b0390911692506340c10f19915033908590859081106135be576135be614f6b565b60200260200101516040518363ffffffff1660e01b81526004016135e3929190614c02565b600060405180830381600087803b1580156135fd57600080fd5b505af1158015613611573d6000803e3d6000fd5b50505050808061362090614efa565b915050613447565b506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561366d57600080fd5b505afa158015613681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a59190614adf565b601554604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b1580156136ee57600080fd5b505afa158015613702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137269190614adf565b601654604051630ae1d72560e21b81523360048201529192506000916001600160a01b0390911690632b875c949060240160206040518083038186803b15801561376f57600080fd5b505afa158015613783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a79190614adf565b90506000816137b68486614e31565b6137c09190614e31565b6013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd906137f790339061dead908990600401614ba1565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138499190614a27565b506010546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061387c9033908590600401614c02565b600060405180830381600087803b15801561389657600080fd5b505af11580156138aa573d6000803e3d6000fd5b5050505050505050505050505050565b60048054612c4290614ebf565b6000546001600160a01b031633146138f15760405162461bcd60e51b8152600401610ab890614ced565b6001600160a01b0381166139565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab8565b61395f81613e76565b50565b6060600061396f83611afb565b90506000816001600160401b0381111561398b5761398b614f81565b6040519080825280602002602001820160405280156139b4578160200160208202803683370190505b5090506139c0846111fe565b90506000805b83811015613a3657306000908152600f6020526040812084519091908590849081106139f4576139f4614f6b565b60209081029190910181015182528101919091526040016000205460ff16613a245781613a2081614efa565b9250505b80613a2e81614efa565b9150506139c6565b506000816001600160401b03811115613a5157613a51614f81565b604051908082528060200260200182016040528015613a7a578160200160208202803683370190505b5090506000805b85811015613b2857306000908152600f602052604081208651909190879084908110613aaf57613aaf614f6b565b60209081029190910181015182528101919091526040016000205460ff16613b1657848181518110613ae357613ae3614f6b565b6020026020010151838381518110613afd57613afd614f6b565b602090810291909101015281613b1281614efa565b9250505b80613b2081614efa565b915050613a81565b50909695505050505050565b826001600160a01b0316613b4782611a84565b6001600160a01b031614613bab5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ab8565b6001600160a01b038216613c0d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab8565b613c18838383614236565b613c23600082613cf7565b6001600160a01b0383166000908152601860205260408120805460019290613c4c908490614e7c565b90915550506001600160a01b0382166000908152601860205260408120805460019290613c7a908490614e31565b9091555050600081815260176020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255600a84528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260196020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613d2c82611a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152601760205260408120546001600160a01b0316613dde5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab8565b6000613de983611a84565b9050806001600160a01b0316846001600160a01b03161480613e245750836001600160a01b0316613e1984610ef8565b6001600160a01b0316145b80613e5457506001600160a01b038082166000908152601a602090815260408083209388168352929052205460ff165b949350505050565b6118d48282604051806020016040528060008152506142ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216613f1c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab8565b6000818152601760205260409020546001600160a01b031615613f815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab8565b613f8d60008383614236565b6001600160a01b0382166000908152601860205260408120805460019290613fb6908490614e31565b9091555050600081815260176020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561408a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab8565b6001600160a01b038381166000818152601a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614102848484613b34565b61410e84848484614321565b6128085760405162461bcd60e51b8152600401610ab890614c66565b606060048054610e7590614ebf565b60608161415d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614187578061417181614efa565b91506141809050600a83614e49565b9150614161565b6000816001600160401b038111156141a1576141a1614f81565b6040519080825280601f01601f1916602001820160405280156141cb576020820181803683370190505b5090505b8415613e54576141e0600183614e7c565b91506141ed600a86614f15565b6141f8906030614e31565b60f81b81838151811061420d5761420d614f6b565b60200101906001600160f81b031916908160001a90535061422f600a86614e49565b94506141cf565b6001600160a01b0383166142915761428c81600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b6142b4565b816001600160a01b0316836001600160a01b0316146142b4576142b4838261442e565b6001600160a01b0382166142cb5761109e816144cb565b826001600160a01b0316826001600160a01b03161461109e5761109e828261457a565b6142f88383613ec6565b6143056000848484614321565b61109e5760405162461bcd60e51b8152600401610ab890614c66565b60006001600160a01b0384163b1561442357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614365903390899088908890600401614bc5565b602060405180830381600087803b15801561437f57600080fd5b505af19250505080156143af575060408051601f3d908101601f191682019092526143ac91810190614a61565b60015b614409573d8080156143dd576040519150601f19603f3d011682016040523d82523d6000602084013e6143e2565b606091505b5080516144015760405162461bcd60e51b8152600401610ab890614c66565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613e54565b506001949350505050565b6000600161443b84611afb565b6144459190614e7c565b6000838152600c6020526040902054909150808214614498576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d546000906144dd90600190614e7c565b6000838152600e6020526040812054600d805493945090928490811061450557614505614f6b565b9060005260206000200154905080600d838154811061452657614526614f6b565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d80548061455e5761455e614f55565b6001900381819060005260206000200160009055905550505050565b600061458583611afb565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b8280546145ca90614ebf565b90600052602060002090601f0160209004810192826145ec5760008555614632565b82601f1061460557805160ff1916838001178555614632565b82800160010185558215614632579182015b82811115614632578251825591602001919060010190614617565b5061463e929150614642565b5090565b5b8082111561463e5760008155600101614643565b60006001600160401b0383111561467057614670614f81565b614683601f8401601f1916602001614dde565b905082815283838301111561469757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126146bf57600080fd5b813560206146d46146cf83614e0e565b614dde565b80838252828201915082860187848660051b89010111156146f457600080fd5b60005b85811015614713578135845292840192908401906001016146f7565b5090979650505050505050565b60006020828403121561473257600080fd5b8135612d9781614f97565b60006020828403121561474f57600080fd5b8151612d9781614f97565b6000806040838503121561476d57600080fd5b823561477881614f97565b9150602083013561478881614f97565b809150509250929050565b600080600080608085870312156147a957600080fd5b84356147b481614f97565b935060208501356147c481614f97565b925060408501356147d481614f97565b915060608501356147e481614f97565b939692955090935050565b60008060006060848603121561480457600080fd5b833561480f81614f97565b9250602084013561481f81614f97565b929592945050506040919091013590565b6000806000806080858703121561484657600080fd5b843561485181614f97565b9350602085013561486181614f97565b92506040850135915060608501356001600160401b0381111561488357600080fd5b8501601f8101871361489457600080fd5b6148a387823560208401614657565b91505092959194509250565b600080604083850312156148c257600080fd5b82356148cd81614f97565b9150602083013561478881614fac565b600080604083850312156148f057600080fd5b82356148fb81614f97565b946020939093013593505050565b6000602080838503121561491c57600080fd5b82516001600160401b0381111561493257600080fd5b8301601f8101851361494357600080fd5b80516149516146cf82614e0e565b80828252848201915084840188868560051b870101111561497157600080fd5b600094505b83851015614994578051835260019490940193918501918501614976565b50979650505050505050565b6000806000606084860312156149b557600080fd5b83356001600160401b03808211156149cc57600080fd5b6149d8878388016146ae565b945060208601359150808211156149ee57600080fd5b6149fa878388016146ae565b93506040860135915080821115614a1057600080fd5b50614a1d868287016146ae565b9150509250925092565b600060208284031215614a3957600080fd5b8151612d9781614fac565b600060208284031215614a5657600080fd5b8135612d9781614fba565b600060208284031215614a7357600080fd5b8151612d9781614fba565b600060208284031215614a9057600080fd5b81356001600160401b03811115614aa657600080fd5b8201601f81018413614ab757600080fd5b613e5484823560208401614657565b600060208284031215614ad857600080fd5b5035919050565b600060208284031215614af157600080fd5b5051919050565b60008060408385031215614b0b57600080fd5b50508035926020909101359150565b600080600060608486031215614b2f57600080fd5b505081359360208301359350604090920135919050565b60008151808452614b5e816020860160208601614e93565b601f01601f19169290920160200192915050565b60008351614b84818460208801614e93565b835190830190614b98818360208801614e93565b01949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bf890830184614b46565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015613b2857835183529284019291840191600101614c37565b602081526000612d976020830184614b46565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4272656420447261676f6e732043414e27542042652053616372696669636564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f596f7520446f6e7420486176652054686520245343414c4520466f7220546861604082015261742160f01b606082015260800190565b6020808252600f908201526e2727aa102ca7aaa910222920a3a7a760891b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715614e0657614e06614f81565b604052919050565b60006001600160401b03821115614e2757614e27614f81565b5060051b60200190565b60008219821115614e4457614e44614f29565b500190565b600082614e5857614e58614f3f565b500490565b6000816000190483118215151615614e7757614e77614f29565b500290565b600082821015614e8e57614e8e614f29565b500390565b60005b83811015614eae578181015183820152602001614e96565b838111156128085750506000910152565b600181811c90821680614ed357607f821691505b60208210811415614ef457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f0e57614f0e614f29565b5060010190565b600082614f2457614f24614f3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461395f57600080fd5b801515811461395f57600080fd5b6001600160e01b03198116811461395f57600080fdfea2646970667358221220d7f4afdc879ce6a786c65ec71470931e1fd0d383006ea07f8d240a62250df68564736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add070000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000093078447261676f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f5844000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055363616c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008416e6369656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414e434e5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095779726d6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045759524d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): 0xDragons
Arg [1] : symbol_ (string): OXD
Arg [2] : ERC20name_ (string): Scale
Arg [3] : ERC20symbol_ (string): SCALE
Arg [4] : ERC20amount (uint256): 25000000000000000000000
Arg [5] : ERC20owneraddress (address): 0xB6D2ac64BDc24f76417b95b410ACf47cE31AdD07
Arg [6] : ancientnftname_ (string): Ancients
Arg [7] : ancientnftsymbol_ (string): ANCNT
Arg [8] : babynftname_ (string): Wyrmlings
Arg [9] : babynftsymbol_ (string): WYRM

-----Encoded View---------------
26 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 00000000000000000000000000000000000000000000054b40b1f852bda00000
Arg [5] : 000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add07
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [11] : 3078447261676f6e730000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 4f58440000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 5363616c65000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 5343414c45000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [19] : 416e6369656e7473000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [21] : 414e434e54000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [23] : 5779726d6c696e67730000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [25] : 5759524d00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

92704:28602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100402:305;;;;;;;;;;-1:-1:-1;100402:305:0;;;;;:::i;:::-;;:::i;:::-;;;11426:14:1;;11419:22;11401:41;;11389:2;11374:18;100402:305:0;;;;;;;;110440:122;;;;;;;;;;-1:-1:-1;110440:122:0;;;;;:::i;:::-;;:::i;:::-;;108872:1137;;;;;;;;;;-1:-1:-1;108872:1137:0;;;;;:::i;:::-;;:::i;101189:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;102360:221::-;;;;;;;;;;-1:-1:-1;102360:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9428:32:1;;;9410:51;;9398:2;9383:18;102360:221:0;9264:203:1;101936:411:0;;;;;;;;;;-1:-1:-1;101936:411:0;;;;;:::i;:::-;;:::i;93244:32::-;;;;;;;;;;;;;;;;;;;21594:25:1;;;21582:2;21567:18;93244:32:0;21448:177:1;118288:220:0;;;;;;;;;;-1:-1:-1;118288:220:0;;;;;:::i;:::-;;:::i;93394:20::-;;;;;;;;;;-1:-1:-1;93394:20:0;;;;;;;;;;;96663:113;;;;;;;;;;-1:-1:-1;96751:10:0;:17;96663:113;;93321:33;;;;;;;;;;;;;;;;102934:374;;;;;;;;;;-1:-1:-1;102934:374:0;;;;;:::i;:::-;;:::i;112040:388::-;;;;;;;;;;-1:-1:-1;112040:388:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;96338:249::-;;;;;;;;;;-1:-1:-1;96338:249:0;;;;;:::i;:::-;;:::i;118126:154::-;;;;;;;;;;-1:-1:-1;118212:8:0;;-1:-1:-1;;;;;118212:8:0;118126:154;;110016:299;;;;;;;;;;-1:-1:-1;110016:299:0;;;;;:::i;:::-;;:::i;106145:833::-;;;;;;:::i;:::-;;:::i;103321:185::-;;;;;;;;;;-1:-1:-1;103321:185:0;;;;;:::i;:::-;;:::i;110992:86::-;;;;;;;;;;-1:-1:-1;110992:86:0;;;;;:::i;:::-;;:::i;120582:584::-;;;;;;;;;;-1:-1:-1;120582:584:0;;;;;:::i;:::-;;:::i;112436:685::-;;;;;;;;;;;;;:::i;111573:457::-;;;;;;;;;;;;;:::i;96853:216::-;;;;;;;;;;-1:-1:-1;96853:216:0;;;;;:::i;:::-;;:::i;111278:105::-;;;;;;;;;;-1:-1:-1;111278:105:0;;;;;:::i;:::-;;:::i;110715:128::-;;;;;;;;;;-1:-1:-1;110715:128:0;;;;;:::i;:::-;;:::i;93361:26::-;;;;;;;;;;-1:-1:-1;93361:26:0;;;;;;;;106986:330;;;;;;;;;;-1:-1:-1;106986:330:0;;;;;:::i;:::-;;:::i;100937:239::-;;;;;;;;;;-1:-1:-1;100937:239:0;;;;;:::i;:::-;;:::i;100719:208::-;;;;;;;;;;-1:-1:-1;100719:208:0;;;;;:::i;:::-;;:::i;22688:103::-;;;;;;;;;;;;;:::i;113259:116::-;;;;;;;;;;;;;:::i;110851:131::-;;;;;;;;;;-1:-1:-1;110851:131:0;;;;;:::i;:::-;;:::i;111141:122::-;;;;;;;;;;-1:-1:-1;111141:122:0;;;;;:::i;:::-;;:::i;97077:73::-;;;;;;;;;;;;;:::i;113129:122::-;;;;;;;;;;;;;:::i;22037:87::-;;;;;;;;;;-1:-1:-1;22083:7:0;22110:6;-1:-1:-1;;;;;22110:6:0;22037:87;;114434:1682;;;;;;;;;;;;;:::i;101302:104::-;;;;;;;;;;;;;:::i;97255:91::-;;;;;;;;;;;;;:::i;102593:155::-;;;;;;;;;;-1:-1:-1;102593:155:0;;;;;:::i;:::-;;:::i;110574:129::-;;;;;;;;;;-1:-1:-1;110574:129:0;;;;;:::i;:::-;;:::i;103514:328::-;;;;;;;;;;-1:-1:-1;103514:328:0;;;;;:::i;:::-;;:::i;113383:1023::-;;;;;;;;;;;;;:::i;117779:151::-;;;;;;;;;;-1:-1:-1;117863:6:0;;-1:-1:-1;;;;;117863:6:0;117779:151;;93200:37;;;;;;;;;;;;;:::i;101477:334::-;;;;;;;;;;-1:-1:-1;101477:334:0;;;;;:::i;:::-;;:::i;97160:87::-;;;;;;;;;;;;;:::i;110324:109::-;;;;;;;;;;-1:-1:-1;110324:109:0;;;;;:::i;:::-;;:::i;93283:31::-;;;;;;;;;;;;;;;;108248:610;;;;;;;;;;-1:-1:-1;108248:610:0;;;;;:::i;:::-;;:::i;111427:128::-;;;;;;;;;;-1:-1:-1;111427:128:0;;;;;:::i;:::-;;:::i;117945:166::-;;;;;;;;;;-1:-1:-1;118034:11:0;;-1:-1:-1;;;;;118034:11:0;117945:166;;102758:164;;;;;;;;;;-1:-1:-1;102758:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;102879:25:0;;;102855:4;102879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;102758:164;116133:1634;;;;;;;;;;-1:-1:-1;116133:1634:0;;;;;:::i;:::-;;:::i;93112:81::-;;;;;;;;;;;;;:::i;22946:201::-;;;;;;;;;;-1:-1:-1;22946:201:0;;;;;:::i;:::-;;:::i;107324:899::-;;;;;;;;;;-1:-1:-1;107324:899:0;;;;;:::i;:::-;;:::i;100402:305::-;100504:4;-1:-1:-1;;;;;;100541:40:0;;-1:-1:-1;;;100541:40:0;;:105;;-1:-1:-1;;;;;;;100598:48:0;;-1:-1:-1;;;100598:48:0;100541:105;:158;;;-1:-1:-1;;;;;;;;;;39657:40:0;;;100663:36;100521:178;100402:305;-1:-1:-1;;100402:305:0:o;110440:122::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;;;;;;;;;110523:8:::1;::::0;:32:::1;::::0;-1:-1:-1;;;110523:32:0;;-1:-1:-1;;;;;110523:8:0;;::::1;::::0;:19:::1;::::0;:32:::1;::::0;110543:11;;110523:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;110440:122:::0;:::o;108872:1137::-;108944:11;108993:1;108970:21;108980:10;108970:9;:21::i;:::-;:24;;108962:63;;;;-1:-1:-1;;;108962:63:0;;19732:2:1;108962:63:0;;;19714:21:1;19771:2;19751:18;;;19744:30;19810:28;19790:18;;;19783:56;19856:18;;108962:63:0;19530:350:1;108962:63:0;109041:6;;:28;;-1:-1:-1;;;109041:28:0;;109058:10;109041:28;;;9410:51:1;109073:6:0;;-1:-1:-1;;;;;109041:6:0;;:16;;9383:18:1;;109041:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;109032:85;;;;-1:-1:-1;;;109032:85:0;;;;;;;:::i;:::-;109147:10;109133:12;109141:3;109133:7;:12::i;:::-;-1:-1:-1;;;;;109133:24:0;;109124:52;;;;-1:-1:-1;;;109124:52:0;;;;;;;:::i;:::-;109206:10;109192:12;109200:3;109192:7;:12::i;:::-;-1:-1:-1;;;;;109192:24:0;;109183:52;;;;-1:-1:-1;;;109183:52:0;;;;;;;:::i;:::-;109265:10;109251:12;109259:3;109251:7;:12::i;:::-;-1:-1:-1;;;;;109251:24:0;;109242:52;;;;-1:-1:-1;;;109242:52:0;;;;;;;:::i;:::-;109328:4;109311:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;109302:81;;;;-1:-1:-1;;;109302:81:0;;;;;;;:::i;:::-;109416:4;109399:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;109390:81;;;;-1:-1:-1;;;109390:81:0;;;;;;;:::i;:::-;109505:4;109488:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;109479:81;;;;-1:-1:-1;;;109479:81:0;;;;;;;:::i;:::-;109576:7;;;;;;;:16;109567:26;;;;;;109600:6;;:31;;-1:-1:-1;;;109600:31:0;;-1:-1:-1;;;;;109600:6:0;;;;:11;;:31;;109612:10;;109624:6;;109600:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109638:94;109656:10;109675:42;109726:3;109638:9;:94::i;:::-;109735;109753:10;109772:42;109823:3;109735:9;:94::i;:::-;109832;109850:10;109869:42;109920:3;109832:9;:94::i;:::-;109949:11;;:28;;-1:-1:-1;;;109949:28:0;;109966:10;109949:28;;;9410:51:1;-1:-1:-1;;;;;109949:11:0;;;;:16;;9383:18:1;;109949:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108925:1084;108872:1137;;;:::o;101189:100::-;101243:13;101276:5;101269:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101189:100;:::o;102360:221::-;102436:7;104267:16;;;:7;:16;;;;;;-1:-1:-1;;;;;104267:16:0;102456:73;;;;-1:-1:-1;;;102456:73:0;;17722:2:1;102456:73:0;;;17704:21:1;17761:2;17741:18;;;17734:30;17800:34;17780:18;;;17773:62;-1:-1:-1;;;17851:18:1;;;17844:42;17903:19;;102456:73:0;17520:408:1;102456:73:0;-1:-1:-1;102549:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;102549:24:0;;102360:221::o;101936:411::-;102017:13;102033:23;102048:7;102033:14;:23::i;:::-;102017:39;;102081:5;-1:-1:-1;;;;;102075:11:0;:2;-1:-1:-1;;;;;102075:11:0;;;102067:57;;;;-1:-1:-1;;;102067:57:0;;18912:2:1;102067:57:0;;;18894:21:1;18951:2;18931:18;;;18924:30;18990:34;18970:18;;;18963:62;-1:-1:-1;;;19041:18:1;;;19034:31;19082:19;;102067:57:0;18710:397:1;102067:57:0;9115:10;-1:-1:-1;;;;;102159:21:0;;;;:62;;-1:-1:-1;102184:37:0;102201:5;9115:10;102758:164;:::i;102184:37::-;102137:168;;;;-1:-1:-1;;;102137:168:0;;15754:2:1;102137:168:0;;;15736:21:1;15793:2;15773:18;;;15766:30;15832:34;15812:18;;;15805:62;15903:26;15883:18;;;15876:54;15947:19;;102137:168:0;15552:420:1;102137:168:0;102318:21;102327:2;102331:7;102318:8;:21::i;:::-;102006:341;101936:411;;:::o;118288:220::-;118343:11;118355:19;:12;118368:6;118355:19;:::i;:::-;118390:6;;:28;;-1:-1:-1;;;118390:28:0;;118407:10;118390:28;;;9410:51:1;118343:31:0;;-1:-1:-1;118343:31:0;;-1:-1:-1;;;;;118390:6:0;;;;:16;;9383:18:1;;118390:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;118381:85;;;;-1:-1:-1;;;118381:85:0;;;;;;;:::i;:::-;118473:6;;:31;;-1:-1:-1;;;118473:31:0;;-1:-1:-1;;;;;118473:6:0;;;;:11;;:31;;118485:10;;118497:6;;118473:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118336:172;118288:220;:::o;102934:374::-;103129:41;9115:10;103162:7;103129:18;:41::i;:::-;103121:103;;;;-1:-1:-1;;;103121:103:0;;;;;;;:::i;:::-;103243:6;;;;:15;103235:24;;;;;;103272:28;103282:4;103288:2;103292:7;103272:9;:28::i;112040:388::-;112125:16;112159:23;112185:17;112195:6;112185:9;:17::i;:::-;112159:43;;112213:25;112255:15;-1:-1:-1;;;;;112241:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112241:30:0;;112213:58;;112287:9;112282:113;112302:15;112298:1;:19;112282:113;;;112353:30;112373:6;112381:1;112353:19;:30::i;:::-;112339:8;112348:1;112339:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;112319:3;;;;:::i;:::-;;;;112282:113;;;-1:-1:-1;112412:8:0;112040:388;-1:-1:-1;;;112040:388:0:o;96338:249::-;96435:7;96471:16;96481:5;96471:9;:16::i;:::-;96463:5;:24;96455:80;;;;-1:-1:-1;;;96455:80:0;;11879:2:1;96455:80:0;;;11861:21:1;11918:2;11898:18;;;11891:30;11957:34;11937:18;;;11930:62;-1:-1:-1;;;12008:18:1;;;12001:41;12059:19;;96455:80:0;11677:407:1;96455:80:0;-1:-1:-1;;;;;;96553:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;96338:249::o;110016:299::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;110155:7:::1;:25:::0;;-1:-1:-1;;;;;110155:25:0;;::::1;-1:-1:-1::0;;;;;;110155:25:0;;::::1;;::::0;;;110189:10:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;110231:13:::1;:35:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;110274:10:::1;:28:::0;;;;;::::1;::::0;::::1;;::::0;;110016:299::o;106145:833::-;106323:1;106309:11;:15;106301:24;;;;;;106359:13;;106344:11;:28;;106336:37;;;;;;106424:9;;106409:11;106393:13;96751:10;:17;;96663:113;106393:13;:27;;;;:::i;:::-;:40;;106384:50;;;;;;106453:6;;;;:15;106445:24;;;;;;106489:13;;-1:-1:-1;;;106489:13:0;;;;:19;;106504:4;106489:19;106480:66;;;;-1:-1:-1;;;106480:66:0;;20087:2:1;106480:66:0;;;20069:21:1;20126:2;20106:18;;;20099:30;20165:34;20145:18;;;20138:62;-1:-1:-1;;;20216:18:1;;;20209:32;20258:19;;106480:66:0;19885:398:1;106480:66:0;106609:11;106602:4;;:18;;;;:::i;:::-;106589:9;:31;;106581:40;;;;;;106694:9;5625:14;106690:74;;106732:21;:9;5744:19;;5762:1;5744:19;;;5655:127;106732:21;106801:1;106784:187;106809:11;106804:1;:16;106784:187;;106842:18;106863:19;:9;5625:14;;5533:114;106863:19;106842:40;;106897:26;106907:3;106912:10;106897:9;:26::i;:::-;106938:21;:9;5744:19;;5762:1;5744:19;;;5655:127;106938:21;-1:-1:-1;106822:3:0;;;;:::i;:::-;;;;106784:187;;103321:185;103459:39;103476:4;103482:2;103486:7;103459:39;;;;;;;;;;;;:16;:39::i;110992:86::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;111055:4:::1;:15:::0;110992:86::o;120582:584::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;120732:1:::1;120718:11;:15;120710:24;;;::::0;::::1;;120768:13;;120753:11;:28;;120745:37;;;::::0;::::1;;120833:9;;120818:11;120802:13;96751:10:::0;:17;;96663:113;120802:13:::1;:27;;;;:::i;:::-;:40;;120793:50;;;::::0;::::1;;120882:9;5625:14:::0;120878:74:::1;;120920:21;:9;5744:19:::0;;5762:1;5744:19;;;5655:127;120920:21:::1;120989:1;120972:187;120997:11;120992:1;:16;120972:187;;121030:18;121051:19;:9;5625:14:::0;;5533:114;121051:19:::1;121030:40;;121085:26;121095:3;121100:10;121085:9;:26::i;:::-;121126:21;:9;5744:19:::0;;5762:1;5744:19;;;5655:127;121126:21:::1;-1:-1:-1::0;121010:3:0;::::1;::::0;::::1;:::i;:::-;;;;120972:187;;112436:685:::0;112481:4;112499:23;112525:21;112535:10;112525:9;:21::i;:::-;112499:47;;112560:25;112602:15;-1:-1:-1;;;;;112588:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112588:30:0;;112560:58;;112640:23;112652:10;112640:11;:23::i;:::-;112630:33;;112687:12;112712:11;112736:14;112767:6;112762:323;112777:15;112775:1;:17;112762:323;;;112876:1;112833:17;:30;112851:8;112860:1;112851:11;;;;;;;;:::i;:::-;;;;;;;112833:30;;;;;;;;;;;:42;112864:10;-1:-1:-1;;;;;112833:42:0;-1:-1:-1;;;;;112833:42:0;;;;;;;;;;;;;:44;112829:245;;;112921:17;:30;112939:8;112948:1;112939:11;;;;;;;;:::i;:::-;;;;;;;112921:30;;;;;;;;;;;:42;112952:10;-1:-1:-1;;;;;112921:42:0;-1:-1:-1;;;;;112921:42:0;;;;;;;;;;;;;112903:15;:60;;;;:::i;:::-;112893:70;-1:-1:-1;113010:5:0;112989:19;112893:70;112990:9;112989:19;:::i;:::-;112988:27;;;;:::i;:::-;112979:36;-1:-1:-1;113030:17:0;112979:36;113030:17;;:::i;:::-;;;112829:245;112794:3;;;;:::i;:::-;;;;112762:323;;;-1:-1:-1;113104:9:0;112436:685;-1:-1:-1;;;;;112436:685:0:o;111573:457::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;111675:21:::1;93512:42;111773:51;111804:13;111814:3;111675:21:::0;111804:13:::1;:::i;:::-;111803:20;::::0;111821:2:::1;111803:20;:::i;:::-;111773:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;93597:42:0::1;111845:48;111873:13;111883:3;111873:7:::0;:13:::1;:::i;:::-;111872:20;::::0;111890:2:::1;111872:20;:::i;:::-;111845:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;93684:42:0::1;111912:50;111942:13;111952:3;111942:7:::0;:13:::1;:::i;:::-;111941:20;::::0;111959:2:::1;111941:20;:::i;:::-;111912:50;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;93771:42:0::1;111973:49;112003:13;112013:3;112003:7:::0;:13:::1;:::i;:::-;112002:19;::::0;112020:1:::1;112002:19;:::i;:::-;111973:49;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;111607:423;111573:457::o:0;96853:216::-;96928:7;96964:13;96751:10;:17;;96663:113;96964:13;96956:5;:21;96948:78;;;;-1:-1:-1;;;96948:78:0;;20490:2:1;96948:78:0;;;20472:21:1;20529:2;20509:18;;;20502:30;20568:34;20548:18;;;20541:62;-1:-1:-1;;;20619:18:1;;;20612:42;20671:19;;96948:78:0;20288:408:1;96948:78:0;97044:10;97055:5;97044:17;;;;;;;;:::i;:::-;;;;;;;;;97037:24;;96853:216;;;:::o;111278:105::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;111353:22;;::::1;::::0;:8:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;110715:128::-:0;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;110801:11:::1;::::0;:35:::1;::::0;-1:-1:-1;;;110801:35:0;;-1:-1:-1;;;;;110801:11:0;;::::1;::::0;:22:::1;::::0;:35:::1;::::0;110824:11;;110801:35:::1;;;:::i;106986:330::-:0;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;107072:13:::1;:18:::0;;-1:-1:-1;;;;107072:18:0::1;-1:-1:-1::0;;;107072:18:0::1;::::0;;107109:19:::1;:9;5625:14:::0;;5533:114;107109:19:::1;107105:74;;107147:21;:9;5744:19:::0;;5762:1;5744:19;;;5655:127;107147:21:::1;107207:1;107190:119;107214:17;107210:1;:21;107190:119;;107265:21;:9;5744:19:::0;;5762:1;5744:19;;;5655:127;107265:21:::1;107233:3:::0;::::1;::::0;::::1;:::i;:::-;;;;107190:119;;100937:239:::0;101009:7;101045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;101045:16:0;101080:19;101072:73;;;;-1:-1:-1;;;101072:73:0;;16951:2:1;101072:73:0;;;16933:21:1;16990:2;16970:18;;;16963:30;17029:34;17009:18;;;17002:62;-1:-1:-1;;;17080:18:1;;;17073:39;17129:19;;101072:73:0;16749:405:1;100719:208:0;100791:7;-1:-1:-1;;;;;100819:19:0;;100811:74;;;;-1:-1:-1;;;100811:74:0;;16540:2:1;100811:74:0;;;16522:21:1;16579:2;16559:18;;;16552:30;16618:34;16598:18;;;16591:62;-1:-1:-1;;;16669:18:1;;;16662:40;16719:19;;100811:74:0;16338:406:1;100811:74:0;-1:-1:-1;;;;;;100903:16:0;;;;;:9;:16;;;;;;;100719:208::o;22688:103::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;22753:30:::1;22780:1;22753:18;:30::i;:::-;22688:103::o:0;113259:116::-;113332:8;;:35;;-1:-1:-1;;;113332:35:0;;113356:10;113332:35;;;9410:51:1;113311:4:0;;-1:-1:-1;;;;;113332:8:0;;:23;;9383:18:1;;113332:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;113325:42;;113259:116;:::o;110851:131::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;110931:11:::1;::::0;:43:::1;::::0;-1:-1:-1;;;110931:43:0;;::::1;::::0;::::1;21594:25:1::0;;;-1:-1:-1;;;;;110931:11:0;;::::1;::::0;:34:::1;::::0;21567:18:1;;110931:43:0::1;21448:177:1::0;111141:122:0;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;111222:13:::1;:33:::0;111141:122::o;97077:73::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;97133:6:::1;::::0;;-1:-1:-1;;97123:16:0;::::1;97133:6;::::0;;::::1;97132:7;97123:16;::::0;;97077:73::o;113129:122::-;113205:11;;:38;;-1:-1:-1;;;113205:38:0;;113232:10;113205:38;;;9410:51:1;113184:4:0;;-1:-1:-1;;;;;113205:11:0;;:26;;9383:18:1;;113205:38:0;9264:203:1;114434:1682:0;114498:10;;:34;;-1:-1:-1;;;114498:34:0;;114521:10;114498:34;;;9410:51:1;114474:22:0;;-1:-1:-1;;;;;114498:10:0;;:22;;9383:18:1;;114498:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;114498:34:0;;;;;;;;;;;;:::i;:::-;114474:58;;114552:6;114547:273;114563:8;:15;114560:1;:18;114547:273;;;114620:10;;114639:11;;-1:-1:-1;;;;;114620:10:0;;;;:18;;114639:8;;114648:1;;114639:11;;;;;;:::i;:::-;;;;;;;114620:31;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;114620:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;114608:43:0;:10;-1:-1:-1;;;;;114608:43:0;;114600:52;;;;;;114669:10;;114747:11;;-1:-1:-1;;;;;114669:10:0;;;;:23;;114693:10;;114704:42;;114747:8;;114756:1;;114747:11;;;;;;:::i;:::-;;;;;;;114669:90;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114776:30;114782:10;114793:8;114802:1;114793:11;;;;;;;;:::i;:::-;;;;;;;114776:5;:30::i;:::-;114579:3;;;;:::i;:::-;;;;114547:273;;;-1:-1:-1;114872:13:0;;:37;;-1:-1:-1;;;114872:37:0;;114898:10;114872:37;;;9410:51:1;114846:23:0;;-1:-1:-1;;;;;114872:13:0;;:25;;9383:18:1;;114872:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;114872:37:0;;;;;;;;;;;;:::i;:::-;114846:63;;114930:6;114925:300;114941:9;:16;114938:1;:19;114925:300;;;115000:13;;115022:12;;-1:-1:-1;;;;;115000:13:0;;;;:21;;115022:9;;115032:1;;115022:12;;;;;;:::i;:::-;;;;;;;115000:35;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;115000:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;114987:48:0;:10;-1:-1:-1;;;;;114987:48:0;;114979:57;;;;;;115054:13;;115135:12;;-1:-1:-1;;;;;115054:13:0;;;;:26;;115081:10;;115092:42;;115135:9;;115145:1;;115135:12;;;;;;:::i;:::-;;;;;;;115054:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;115166:11:0;;115194:12;;-1:-1:-1;;;;;115166:11:0;;;;-1:-1:-1;115166:16:0;;-1:-1:-1;115183:10:0;;115194:9;;115204:1;;115194:12;;;;;;:::i;:::-;;;;;;;115166:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114958:3;;;;;:::i;:::-;;;;114925:300;;;-1:-1:-1;115266:10:0;;:34;;-1:-1:-1;;;115266:34:0;;115289:10;115266:34;;;9410:51:1;115241:23:0;;-1:-1:-1;;;;;115266:10:0;;:22;;9383:18:1;;115266:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;115266:34:0;;;;;;;;;;;;:::i;:::-;115241:59;;115321:6;115316:286;115332:9;:16;115329:1;:19;115316:286;;;115390:10;;115409:12;;-1:-1:-1;;;;;115390:10:0;;;;:18;;115409:9;;115419:1;;115409:12;;;;;;:::i;:::-;;;;;;;115390:32;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;115390:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;115378:44:0;:10;-1:-1:-1;;;;;115378:44:0;;115370:53;;;;;;115440:10;;115518:12;;-1:-1:-1;;;;;115440:10:0;;;;:23;;115464:10;;115475:42;;115518:9;;115528:1;;115518:12;;;;;;:::i;:::-;;;;;;;115440:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;115548:8:0;;115573:12;;-1:-1:-1;;;;;115548:8:0;;;;-1:-1:-1;115548:13:0;;-1:-1:-1;115562:10:0;;115573:9;;115583:1;;115573:12;;;;;;:::i;:::-;;;;;;;115548:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115349:3;;;;;:::i;:::-;;;;115316:286;;;-1:-1:-1;115633:7:0;;:29;;-1:-1:-1;;;115633:29:0;;115651:10;115633:29;;;9410:51:1;115620:11:0;;-1:-1:-1;;;;;115633:7:0;;:17;;9383:18:1;;115633:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;115620:42;;115675:18;115695:10;;;;;;;;;-1:-1:-1;;;;;115695:10:0;-1:-1:-1;;;;;115695:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;115758:13;;:40;;-1:-1:-1;;;115758:40:0;;115787:10;115758:40;;;9410:51:1;115675:47:0;;-1:-1:-1;115735:21:0;;-1:-1:-1;;;;;115758:13:0;;;;:28;;9383:18:1;;115758:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;115831:10;;:37;;-1:-1:-1;;;115831:37:0;;115857:10;115831:37;;;9410:51:1;115735:63:0;;-1:-1:-1;115811:18:0;;-1:-1:-1;;;;;115831:10:0;;;;:25;;9383:18:1;;115831:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;115811:57;-1:-1:-1;115881:16:0;115811:57;115922:16;115898:21;115906:13;115898:6;:21;:::i;:::-;:40;;;;:::i;:::-;:56;;;;:::i;:::-;115967:7;;:83;;-1:-1:-1;;;115967:83:0;;115881:73;;-1:-1:-1;;;;;;115967:7:0;;:20;;:83;;115988:10;;115999:42;;116043:6;;115967:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;116063:6:0;;:35;;-1:-1:-1;;;116063:35:0;;-1:-1:-1;;;;;116063:6:0;;;;:11;;:35;;116075:10;;116086:11;;116063:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114461:1655;;;;;;;;114434:1682::o;101302:104::-;101358:13;101391:7;101384:14;;;;;:::i;97255:91::-;97307:4;22110:6;;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;-1:-1:-1;97331:6:0::1;::::0;::::1;;97255:91:::0;:::o;102593:155::-;102688:52;9115:10;102721:8;102731;102688:18;:52::i;110574:129::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;110653:8:::1;::::0;:40:::1;::::0;-1:-1:-1;;;110653:40:0;;::::1;::::0;::::1;21594:25:1::0;;;-1:-1:-1;;;;;110653:8:0;;::::1;::::0;:31:::1;::::0;21567:18:1;;110653:40:0::1;21448:177:1::0;103514:328:0;103689:41;9115:10;103722:7;103689:18;:41::i;:::-;103681:103;;;;-1:-1:-1;;;103681:103:0;;;;;;;:::i;:::-;103795:39;103809:4;103815:2;103819:7;103828:5;103795:13;:39::i;:::-;103514:328;;;;:::o;113383:1023::-;113456:1;113434:21;113444:10;113434:9;:21::i;:::-;:23;113426:60;;;;-1:-1:-1;;;113426:60:0;;14988:2:1;113426:60:0;;;14970:21:1;15027:2;15007:18;;;15000:30;15066:26;15046:18;;;15039:54;15110:18;;113426:60:0;14786:348:1;113426:60:0;113498:23;113524:21;113534:10;113524:9;:21::i;:::-;113498:47;;113559:25;113601:15;-1:-1:-1;;;;;113587:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113587:30:0;;113559:58;;113639:23;113651:10;113639:11;:23::i;:::-;113629:33;;113686:12;113711:11;113735:14;113766:6;113761:382;113776:15;113774:1;:17;113761:382;;;113875:1;113832:17;:30;113850:8;113859:1;113850:11;;;;;;;;:::i;:::-;;;;;;;113832:30;;;;;;;;;;;:42;113863:10;-1:-1:-1;;;;;113832:42:0;-1:-1:-1;;;;;113832:42:0;;;;;;;;;;;;;:44;113828:304;;;113920:17;:30;113938:8;113947:1;113938:11;;;;;;;;:::i;:::-;;;;;;;113920:30;;;;;;;;;;;:42;113951:10;-1:-1:-1;;;;;113920:42:0;-1:-1:-1;;;;;113920:42:0;;;;;;;;;;;;;113902:15;:60;;;;:::i;:::-;113892:70;-1:-1:-1;114009:5:0;113988:19;113892:70;113989:9;113988:19;:::i;:::-;113987:27;;;;:::i;:::-;113978:36;-1:-1:-1;114029:17:0;113978:36;114029:17;;:::i;:::-;;;114102:15;114059:17;:30;114077:8;114086:1;114077:11;;;;;;;;:::i;:::-;;;;;;;;;;;;114059:30;;;;;;;;;;;;;-1:-1:-1;114059:30:0;;;114090:10;114059:42;;;;;;;:58;113828:304;113793:3;;;;:::i;:::-;;;;113761:382;;;-1:-1:-1;114156:6:0;;:33;;-1:-1:-1;;;114156:33:0;;-1:-1:-1;;;;;114156:6:0;;;;:11;;:33;;114168:10;;114179:9;;114156:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;114201:11:0;;:33;;-1:-1:-1;;;114201:33:0;;114223:10;114201:33;;;9410:51:1;114235:1:0;;-1:-1:-1;;;;;;114201:11:0;;;;-1:-1:-1;114201:21:0;;9383:18:1;;114201:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;114197:100;;;114248:11;;:35;;-1:-1:-1;;;114248:35:0;;114272:10;114248:35;;;9410:51:1;-1:-1:-1;;;;;114248:11:0;;;;:23;;9383:18:1;;114248:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114197:100;114307:8;;:30;;-1:-1:-1;;;114307:30:0;;114326:10;114307:30;;;9410:51:1;114338:1:0;;-1:-1:-1;;;;;114307:8:0;;:18;;9383::1;;114307:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;114303:92;;;114351:8;;:32;;-1:-1:-1;;;114351:32:0;;114372:10;114351:32;;;9410:51:1;-1:-1:-1;;;;;114351:8:0;;;;:20;;9383:18:1;;114351:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113413:993;;;;;113383:1023::o;93200:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;101477:334::-;104243:4;104267:16;;;:7;:16;;;;;;101550:13;;-1:-1:-1;;;;;104267:16:0;101576:76;;;;-1:-1:-1;;;101576:76:0;;18496:2:1;101576:76:0;;;18478:21:1;18535:2;18515:18;;;18508:30;18574:34;18554:18;;;18547:62;-1:-1:-1;;;18625:18:1;;;18618:45;18680:19;;101576:76:0;18294:411:1;101576:76:0;101665:21;101689:10;:8;:10::i;:::-;101665:34;;101741:1;101723:7;101717:21;:25;:86;;;;;;;;;;;;;;;;;101769:7;101778:18;:7;:16;:18::i;:::-;101752:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;101717:86;101710:93;101477:334;-1:-1:-1;;;101477:334:0:o;97160:87::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;97229:7:::1;::::0;;-1:-1:-1;;97218:18:0;::::1;97229:7;::::0;;;::::1;;;97228:8;97218:18:::0;;::::1;;::::0;;97160:87::o;110324:109::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;110395:8:::1;::::0;:29:::1;::::0;-1:-1:-1;;;110395:29:0;;::::1;::::0;::::1;21594:25:1::0;;;-1:-1:-1;;;;;110395:8:0;;::::1;::::0;:21:::1;::::0;21567:18:1;;110395:29:0::1;21448:177:1::0;108248:610:0;108313:11;108366:1;108343:21;108353:10;108343:9;:21::i;:::-;:24;;108335:57;;;;-1:-1:-1;;;108335:57:0;;13880:2:1;108335:57:0;;;13862:21:1;13919:2;13899:18;;;13892:30;-1:-1:-1;;;13938:18:1;;;13931:50;13998:18;;108335:57:0;13678:344:1;108335:57:0;108412:6;;:28;;-1:-1:-1;;;108412:28:0;;108429:10;108412:28;;;9410:51:1;108444:6:0;;-1:-1:-1;;;;;108412:6:0;;:16;;9383:18:1;;108412:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;108403:85;;;;-1:-1:-1;;;108403:85:0;;;;;;;:::i;:::-;108522:10;108508:12;108516:3;108508:7;:12::i;:::-;-1:-1:-1;;;;;108508:24:0;;108499:52;;;;-1:-1:-1;;;108499:52:0;;;;;;;:::i;:::-;108585:10;108571:12;108579:3;108571:7;:12::i;:::-;-1:-1:-1;;;;;108571:24:0;;108562:52;;;;-1:-1:-1;;;108562:52:0;;;;;;;:::i;:::-;108634:7;;;;;;;:16;108625:26;;;;;;108662:6;;:31;;-1:-1:-1;;;108662:31:0;;-1:-1:-1;;;;;108662:6:0;;;;:11;;:31;;108674:10;;108686:6;;108662:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;108733:4:0;108716:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;:33;;108745:4;-1:-1:-1;;108716:33:0;;;;;;;;108763:28;;;;;;;:33;;;;;;;;;108823:8;;:25;;-1:-1:-1;;;108823:25:0;;108837:10;108823:25;;;9410:51:1;-1:-1:-1;;;;;108823:8:0;;;;-1:-1:-1;108823:13:0;;-1:-1:-1;9383:18:1;;108823:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108290:568;108248:610;;:::o;111427:128::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;111516:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;116133:1634::-:0;116258:4;116233:22;116279:275;116295:8;:15;116292:1;:18;116279:275;;;116352:10;;116371:11;;-1:-1:-1;;;;;116352:10:0;;;;:18;;116371:8;;116380:1;;116371:11;;;;;;:::i;:::-;;;;;;;116352:31;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;116352:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;116340:43:0;:10;-1:-1:-1;;;;;116340:43:0;;116332:52;;;;;;116401:10;;116479:11;;-1:-1:-1;;;;;116401:10:0;;;;:23;;116425:10;;116436:42;;116479:8;;116488:1;;116479:11;;;;;;:::i;:::-;;;;;;;116401:90;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116509:30;116515:10;116526:8;116535:1;116526:11;;;;;;;;:::i;116509:30::-;116311:3;;;;:::i;:::-;;;;116279:275;;;-1:-1:-1;116594:7:0;116568:23;116616:300;116632:9;:16;116629:1;:19;116616:300;;;116691:13;;116713:12;;-1:-1:-1;;;;;116691:13:0;;;;:21;;116713:9;;116723:1;;116713:12;;;;;;:::i;:::-;;;;;;;116691:35;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;116691:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;116678:48:0;:10;-1:-1:-1;;;;;116678:48:0;;116670:57;;;;;;116745:13;;116826:12;;-1:-1:-1;;;;;116745:13:0;;;;:26;;116772:10;;116783:42;;116826:9;;116836:1;;116826:12;;;;;;:::i;:::-;;;;;;;116745:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;116857:11:0;;116885:12;;-1:-1:-1;;;;;116857:11:0;;;;-1:-1:-1;116857:16:0;;-1:-1:-1;116874:10:0;;116885:9;;116895:1;;116885:12;;;;;;:::i;:::-;;;;;;;116857:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116649:3;;;;;:::i;:::-;;;;116616:300;;;-1:-1:-1;116957:4:0;116932:23;116978:286;116994:9;:16;116991:1;:19;116978:286;;;117052:10;;117071:12;;-1:-1:-1;;;;;117052:10:0;;;;:18;;117071:9;;117081:1;;117071:12;;;;;;:::i;:::-;;;;;;;117052:32;;;;;;;;;;;;;21594:25:1;;21582:2;21567:18;;21448:177;117052:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;117040:44:0;:10;-1:-1:-1;;;;;117040:44:0;;117032:53;;;;;;117102:10;;117180:12;;-1:-1:-1;;;;;117102:10:0;;;;:23;;117126:10;;117137:42;;117180:9;;117190:1;;117180:12;;;;;;:::i;:::-;;;;;;;117102:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;117210:8:0;;117235:12;;-1:-1:-1;;;;;117210:8:0;;;;-1:-1:-1;117210:13:0;;-1:-1:-1;117224:10:0;;117235:9;;117245:1;;117235:12;;;;;;:::i;:::-;;;;;;;117210:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117011:3;;;;;:::i;:::-;;;;116978:286;;;-1:-1:-1;117295:7:0;;:29;;-1:-1:-1;;;117295:29:0;;117313:10;117295:29;;;9410:51:1;117282:11:0;;-1:-1:-1;;;;;117295:7:0;;:17;;9383:18:1;;117295:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;117423:13;;:40;;-1:-1:-1;;;117423:40:0;;117452:10;117423:40;;;9410:51:1;117282:42:0;;-1:-1:-1;117400:21:0;;-1:-1:-1;;;;;117423:13:0;;;;:28;;9383:18:1;;117423:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;117496:10;;:37;;-1:-1:-1;;;117496:37:0;;117522:10;117496:37;;;9410:51:1;117400:63:0;;-1:-1:-1;117476:18:0;;-1:-1:-1;;;;;117496:10:0;;;;:25;;9383:18:1;;117496:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;117476:57;-1:-1:-1;117546:16:0;117476:57;117563:25;117572:16;117563:6;:25;:::i;:::-;:41;;;;:::i;:::-;117618:7;;:83;;-1:-1:-1;;;117618:83:0;;117546:58;;-1:-1:-1;;;;;;117618:7:0;;:20;;:83;;117639:10;;117650:42;;117694:6;;117618:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;117714:6:0;;:35;;-1:-1:-1;;;117714:35:0;;-1:-1:-1;;;;;117714:6:0;;;;:11;;:35;;117726:10;;117737:11;;117714:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116220:1547;;;;;;;116133:1634;;;:::o;93112:81::-;;;;;;;:::i;22946:201::-;22083:7;22110:6;-1:-1:-1;;;;;22110:6:0;9115:10;22257:23;22249:68;;;;-1:-1:-1;;;22249:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23035:22:0;::::1;23027:73;;;::::0;-1:-1:-1;;;23027:73:0;;12710:2:1;23027:73:0::1;::::0;::::1;12692:21:1::0;12749:2;12729:18;;;12722:30;12788:34;12768:18;;;12761:62;-1:-1:-1;;;12839:18:1;;;12832:36;12885:19;;23027:73:0::1;12508:402:1::0;23027:73:0::1;23111:28;23130:8;23111:18;:28::i;:::-;22946:201:::0;:::o;107324:899::-;107387:13;107414:23;107440:14;107450:3;107440:9;:14::i;:::-;107414:40;;107468:25;107510:15;-1:-1:-1;;;;;107496:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107496:30:0;;107468:58;;107548:16;107560:3;107548:11;:16::i;:::-;107538:26;;107601:10;107628:6;107623:186;107638:15;107636:1;:17;107623:186;;;107696:4;107679:23;;;;:8;:23;;;;;107703:11;;107679:23;;;107703:8;;107712:1;;107703:11;;;;;;:::i;:::-;;;;;;;;;;;;107679:36;;;;;;;;;;-1:-1:-1;107679:36:0;;;;107675:94;;107742:7;;;;:::i;:::-;;;;107675:94;107655:3;;;;:::i;:::-;;;;107623:186;;;;107821:37;107875:5;-1:-1:-1;;;;;107861:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107861:20:0;;107821:60;;107894:11;107925:6;107920:249;107935:15;107933:1;:17;107920:249;;;107993:4;107976:23;;;;:8;:23;;;;;108000:11;;107976:23;;;108000:8;;108009:1;;108000:11;;;;;;:::i;:::-;;;;;;;;;;;;107976:36;;;;;;;;;;-1:-1:-1;107976:36:0;;;;107972:157;;108071:8;108080:1;108071:11;;;;;;;;:::i;:::-;;;;;;;108042:20;108063:6;108042:28;;;;;;;;:::i;:::-;;;;;;;;;;:40;108104:8;;;;:::i;:::-;;;;107972:157;107952:3;;;;:::i;:::-;;;;107920:249;;;-1:-1:-1;108191:20:0;;107324:899;-1:-1:-1;;;;;;107324:899:0:o;118520:737::-;118679:4;-1:-1:-1;;;;;118652:31:0;:23;118667:7;118652:14;:23::i;:::-;-1:-1:-1;;;;;118652:31:0;;118644:81;;;;-1:-1:-1;;;118644:81:0;;13117:2:1;118644:81:0;;;13099:21:1;13156:2;13136:18;;;13129:30;13195:34;13175:18;;;13168:62;-1:-1:-1;;;13246:18:1;;;13239:35;13291:19;;118644:81:0;12915:401:1;118644:81:0;-1:-1:-1;;;;;118744:16:0;;118736:65;;;;-1:-1:-1;;;118736:65:0;;14229:2:1;118736:65:0;;;14211:21:1;14268:2;14248:18;;;14241:30;14307:34;14287:18;;;14280:62;-1:-1:-1;;;14358:18:1;;;14351:34;14402:19;;118736:65:0;14027:400:1;118736:65:0;118814:39;118835:4;118841:2;118845:7;118814:20;:39::i;:::-;118918:29;118935:1;118939:7;118918:8;:29::i;:::-;-1:-1:-1;;;;;118960:15:0;;;;;;:9;:15;;;;;:20;;118979:1;;118960:15;:20;;118979:1;;118960:20;:::i;:::-;;;;-1:-1:-1;;;;;;;118991:13:0;;;;;;:9;:13;;;;;:18;;119008:1;;118991:13;:18;;119008:1;;118991:18;:::i;:::-;;;;-1:-1:-1;;119020:16:0;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;119020:21:0;-1:-1:-1;;;;;119020:21:0;;;;;;;;;119052:17;:26;;;;;:30;;;;;;;;;119083:15;119052:46;;119109:32;;;;;;;;:34;;;119171:27;;119020:16;;119171:27;;;102006:341;101936:411;;:::o;119270:174::-;119345:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;119345:29:0;-1:-1:-1;;;;;119345:29:0;;;;;;;;:24;;119399:23;119345:24;119399:14;:23::i;:::-;-1:-1:-1;;;;;119390:46:0;;;;;;;;;;;119270:174;;:::o;104315:348::-;104408:4;104267:16;;;:7;:16;;;;;;-1:-1:-1;;;;;104267:16:0;104425:73;;;;-1:-1:-1;;;104425:73:0;;15341:2:1;104425:73:0;;;15323:21:1;15380:2;15360:18;;;15353:30;15419:34;15399:18;;;15392:62;-1:-1:-1;;;15470:18:1;;;15463:42;15522:19;;104425:73:0;15139:408:1;104425:73:0;104509:13;104525:23;104540:7;104525:14;:23::i;:::-;104509:39;;104578:5;-1:-1:-1;;;;;104567:16:0;:7;-1:-1:-1;;;;;104567:16:0;;:51;;;;104611:7;-1:-1:-1;;;;;104587:31:0;:20;104599:7;104587:11;:20::i;:::-;-1:-1:-1;;;;;104587:31:0;;104567:51;:87;;;-1:-1:-1;;;;;;102879:25:0;;;102855:4;102879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;104622:32;104559:96;104315:348;-1:-1:-1;;;;104315:348:0:o;104676:110::-;104752:26;104762:2;104766:7;104752:26;;;;;;;;;;;;:9;:26::i;23307:191::-;23381:16;23400:6;;-1:-1:-1;;;;;23417:17:0;;;-1:-1:-1;;;;;;23417:17:0;;;;;;23450:40;;23400:6;;;;;;;23450:40;;23381:16;23450:40;23370:128;23307:191;:::o;105131:526::-;-1:-1:-1;;;;;105211:16:0;;105203:61;;;;-1:-1:-1;;;105203:61:0;;17361:2:1;105203:61:0;;;17343:21:1;;;17380:18;;;17373:30;17439:34;17419:18;;;17412:62;17491:18;;105203:61:0;17159:356:1;105203:61:0;104243:4;104267:16;;;:7;:16;;;;;;-1:-1:-1;;;;;104267:16:0;:30;105275:58;;;;-1:-1:-1;;;105275:58:0;;13523:2:1;105275:58:0;;;13505:21:1;13562:2;13542:18;;;13535:30;13601;13581:18;;;13574:58;13649:18;;105275:58:0;13321:352:1;105275:58:0;105346:45;105375:1;105379:2;105383:7;105346:20;:45::i;:::-;-1:-1:-1;;;;;105404:13:0;;;;;;:9;:13;;;;;:18;;105421:1;;105404:13;:18;;105421:1;;105404:18;:::i;:::-;;;;-1:-1:-1;;105433:16:0;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;105433:21:0;-1:-1:-1;;;;;105433:21:0;;;;;;;;105465:17;:26;;;;;:30;;;;;;;;;105496:15;105465:46;;105559:33;105433:16;;;105559:33;;105433:16;;105559:33;111973:49:::1;111607:423;111573:457::o:0;119456:315::-;119611:8;-1:-1:-1;;;;;119602:17:0;:5;-1:-1:-1;;;;;119602:17:0;;;119594:55;;;;-1:-1:-1;;;119594:55:0;;14634:2:1;119594:55:0;;;14616:21:1;14673:2;14653:18;;;14646:30;14712:27;14692:18;;;14685:55;14757:18;;119594:55:0;14432:349:1;119594:55:0;-1:-1:-1;;;;;119660:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;119660:46:0;;;;;;;;;;119722:41;;11401::1;;;119722::0;;11374:18:1;119722:41:0;;;;;;;119456:315;;;:::o;103855:::-;104012:28;104022:4;104028:2;104032:7;104012:9;:28::i;:::-;104059:48;104082:4;104088:2;104092:7;104101:5;104059:22;:48::i;:::-;104051:111;;;;-1:-1:-1;;;104051:111:0;;;;;;;:::i;101823:100::-;101874:13;101907:8;101900:15;;;;;:::i;6544:723::-;6600:13;6821:10;6817:53;;-1:-1:-1;;6848:10:0;;;;;;;;;;;;-1:-1:-1;;;6848:10:0;;;;;6544:723::o;6817:53::-;6895:5;6880:12;6936:78;6943:9;;6936:78;;6969:8;;;;:::i;:::-;;-1:-1:-1;6992:10:0;;-1:-1:-1;7000:2:0;6992:10;;:::i;:::-;;;6936:78;;;7024:19;7056:6;-1:-1:-1;;;;;7046:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7046:17:0;;7024:39;;7074:154;7081:10;;7074:154;;7108:11;7118:1;7108:11;;:::i;:::-;;-1:-1:-1;7177:10:0;7185:2;7177:5;:10;:::i;:::-;7164:24;;:2;:24;:::i;:::-;7151:39;;7134:6;7141;7134:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7134:56:0;;;;;;;;-1:-1:-1;7205:11:0;7214:2;7205:11;;:::i;:::-;;;7074:154;;97355:532;-1:-1:-1;;;;;97504:18:0;;97500:187;;97539:40;97571:7;98238:10;:17;;98211:24;;;;:15;:24;;;;;:44;;;98266:24;;;;;;;;;;;;98134:164;97539:40;97500:187;;;97609:2;-1:-1:-1;;;;;97601:10:0;:4;-1:-1:-1;;;;;97601:10:0;;97597:90;;97628:47;97661:4;97667:7;97628:32;:47::i;:::-;-1:-1:-1;;;;;97701:16:0;;97697:183;;97734:45;97771:7;97734:36;:45::i;97697:183::-;97807:4;-1:-1:-1;;;;;97801:10:0;:2;-1:-1:-1;;;;;97801:10:0;;97797:83;;97828:40;97856:2;97860:7;97828:27;:40::i;104800:321::-;104930:18;104936:2;104940:7;104930:5;:18::i;:::-;104981:54;105012:1;105016:2;105020:7;105029:5;104981:22;:54::i;:::-;104959:154;;;;-1:-1:-1;;;104959:154:0;;;;;;;:::i;119779:799::-;119934:4;-1:-1:-1;;;;;119955:13:0;;25086:19;:23;119951:620;;119991:72;;-1:-1:-1;;;119991:72:0;;-1:-1:-1;;;;;119991:36:0;;;;;:72;;9115:10;;120042:4;;120048:7;;120057:5;;119991:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;119991:72:0;;;;;;;;-1:-1:-1;;119991:72:0;;;;;;;;;;;;:::i;:::-;;;119987:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;120233:13:0;;120229:272;;120276:60;;-1:-1:-1;;;120276:60:0;;;;;;;:::i;120229:272::-;120451:6;120445:13;120436:6;120432:2;120428:15;120421:38;119987:529;-1:-1:-1;;;;;;120114:51:0;-1:-1:-1;;;120114:51:0;;-1:-1:-1;120107:58:0;;119951:620;-1:-1:-1;120555:4:0;119779:799;;;;;;:::o;98310:988::-;98576:22;98626:1;98601:22;98618:4;98601:16;:22::i;:::-;:26;;;;:::i;:::-;98638:18;98659:26;;;:17;:26;;;;;;98576:51;;-1:-1:-1;98792:28:0;;;98788:328;;-1:-1:-1;;;;;98859:18:0;;98837:19;98859:18;;;:12;:18;;;;;;;;:34;;;;;;;;;98910:30;;;;;;:44;;;99027:30;;:17;:30;;;;;:43;;;98788:328;-1:-1:-1;99212:26:0;;;;:17;:26;;;;;;;;99205:33;;;-1:-1:-1;;;;;99256:18:0;;;;;:12;:18;;;;;:34;;;;;;;99249:41;98310:988::o;99311:1079::-;99589:10;:17;99564:22;;99589:21;;99609:1;;99589:21;:::i;:::-;99621:18;99642:24;;;:15;:24;;;;;;100015:10;:26;;99564:46;;-1:-1:-1;99642:24:0;;99564:46;;100015:26;;;;;;:::i;:::-;;;;;;;;;99993:48;;100079:11;100054:10;100065;100054:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;100159:28;;;:15;:28;;;;;;;:41;;;100331:24;;;;;100324:31;100366:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;99382:1008;;;99311:1079;:::o;97900:221::-;97985:14;98002:20;98019:2;98002:16;:20::i;:::-;-1:-1:-1;;;;;98033:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;98078:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;97900:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:673::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;636:60;652:43;692:2;652:43;:::i;:::-;636:60;:::i;:::-;718:3;742:2;737:3;730:15;770:2;765:3;761:12;754:19;;805:2;797:6;793:15;857:3;852:2;846;843:1;839:10;831:6;827:23;823:32;820:41;817:61;;;874:1;871;864:12;817:61;896:1;906:163;920:2;917:1;914:9;906:163;;;977:17;;965:30;;1015:12;;;;1047;;;;938:1;931:9;906:163;;;-1:-1:-1;1087:5:1;;425:673;-1:-1:-1;;;;;;;425:673:1:o;1103:247::-;1162:6;1215:2;1203:9;1194:7;1190:23;1186:32;1183:52;;;1231:1;1228;1221:12;1183:52;1270:9;1257:23;1289:31;1314:5;1289:31;:::i;1355:251::-;1425:6;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1526:9;1520:16;1545:31;1570:5;1545:31;:::i;1611:388::-;1679:6;1687;1740:2;1728:9;1719:7;1715:23;1711:32;1708:52;;;1756:1;1753;1746:12;1708:52;1795:9;1782:23;1814:31;1839:5;1814:31;:::i;:::-;1864:5;-1:-1:-1;1921:2:1;1906:18;;1893:32;1934:33;1893:32;1934:33;:::i;:::-;1986:7;1976:17;;;1611:388;;;;;:::o;2004:671::-;2090:6;2098;2106;2114;2167:3;2155:9;2146:7;2142:23;2138:33;2135:53;;;2184:1;2181;2174:12;2135:53;2223:9;2210:23;2242:31;2267:5;2242:31;:::i;:::-;2292:5;-1:-1:-1;2349:2:1;2334:18;;2321:32;2362:33;2321:32;2362:33;:::i;:::-;2414:7;-1:-1:-1;2473:2:1;2458:18;;2445:32;2486:33;2445:32;2486:33;:::i;:::-;2538:7;-1:-1:-1;2597:2:1;2582:18;;2569:32;2610:33;2569:32;2610:33;:::i;:::-;2004:671;;;;-1:-1:-1;2004:671:1;;-1:-1:-1;;2004:671:1:o;2680:456::-;2757:6;2765;2773;2826:2;2814:9;2805:7;2801:23;2797:32;2794:52;;;2842:1;2839;2832:12;2794:52;2881:9;2868:23;2900:31;2925:5;2900:31;:::i;:::-;2950:5;-1:-1:-1;3007:2:1;2992:18;;2979:32;3020:33;2979:32;3020:33;:::i;:::-;2680:456;;3072:7;;-1:-1:-1;;;3126:2:1;3111:18;;;;3098:32;;2680:456::o;3141:794::-;3236:6;3244;3252;3260;3313:3;3301:9;3292:7;3288:23;3284:33;3281:53;;;3330:1;3327;3320:12;3281:53;3369:9;3356:23;3388:31;3413:5;3388:31;:::i;:::-;3438:5;-1:-1:-1;3495:2:1;3480:18;;3467:32;3508:33;3467:32;3508:33;:::i;:::-;3560:7;-1:-1:-1;3614:2:1;3599:18;;3586:32;;-1:-1:-1;3669:2:1;3654:18;;3641:32;-1:-1:-1;;;;;3685:30:1;;3682:50;;;3728:1;3725;3718:12;3682:50;3751:22;;3804:4;3796:13;;3792:27;-1:-1:-1;3782:55:1;;3833:1;3830;3823:12;3782:55;3856:73;3921:7;3916:2;3903:16;3898:2;3894;3890:11;3856:73;:::i;:::-;3846:83;;;3141:794;;;;;;;:::o;3940:382::-;4005:6;4013;4066:2;4054:9;4045:7;4041:23;4037:32;4034:52;;;4082:1;4079;4072:12;4034:52;4121:9;4108:23;4140:31;4165:5;4140:31;:::i;:::-;4190:5;-1:-1:-1;4247:2:1;4232:18;;4219:32;4260:30;4219:32;4260:30;:::i;4327:315::-;4395:6;4403;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;4511:9;4498:23;4530:31;4555:5;4530:31;:::i;:::-;4580:5;4632:2;4617:18;;;;4604:32;;-1:-1:-1;;;4327:315:1:o;4647:892::-;4742:6;4773:2;4816;4804:9;4795:7;4791:23;4787:32;4784:52;;;4832:1;4829;4822:12;4784:52;4865:9;4859:16;-1:-1:-1;;;;;4890:6:1;4887:30;4884:50;;;4930:1;4927;4920:12;4884:50;4953:22;;5006:4;4998:13;;4994:27;-1:-1:-1;4984:55:1;;5035:1;5032;5025:12;4984:55;5064:2;5058:9;5087:60;5103:43;5143:2;5103:43;:::i;5087:60::-;5169:3;5193:2;5188:3;5181:15;5221:2;5216:3;5212:12;5205:19;;5252:2;5248;5244:11;5300:7;5295:2;5289;5286:1;5282:10;5278:2;5274:19;5270:28;5267:41;5264:61;;;5321:1;5318;5311:12;5264:61;5343:1;5334:10;;5353:156;5367:2;5364:1;5361:9;5353:156;;;5424:10;;5412:23;;5385:1;5378:9;;;;;5455:12;;;;5487;;5353:156;;;-1:-1:-1;5528:5:1;4647:892;-1:-1:-1;;;;;;;4647:892:1:o;5544:821::-;5696:6;5704;5712;5765:2;5753:9;5744:7;5740:23;5736:32;5733:52;;;5781:1;5778;5771:12;5733:52;5821:9;5808:23;-1:-1:-1;;;;;5891:2:1;5883:6;5880:14;5877:34;;;5907:1;5904;5897:12;5877:34;5930:61;5983:7;5974:6;5963:9;5959:22;5930:61;:::i;:::-;5920:71;;6044:2;6033:9;6029:18;6016:32;6000:48;;6073:2;6063:8;6060:16;6057:36;;;6089:1;6086;6079:12;6057:36;6112:63;6167:7;6156:8;6145:9;6141:24;6112:63;:::i;:::-;6102:73;;6228:2;6217:9;6213:18;6200:32;6184:48;;6257:2;6247:8;6244:16;6241:36;;;6273:1;6270;6263:12;6241:36;;6296:63;6351:7;6340:8;6329:9;6325:24;6296:63;:::i;:::-;6286:73;;;5544:821;;;;;:::o;6370:245::-;6437:6;6490:2;6478:9;6469:7;6465:23;6461:32;6458:52;;;6506:1;6503;6496:12;6458:52;6538:9;6532:16;6557:28;6579:5;6557:28;:::i;6620:245::-;6678:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:52;;;6747:1;6744;6737:12;6699:52;6786:9;6773:23;6805:30;6829:5;6805:30;:::i;6870:249::-;6939:6;6992:2;6980:9;6971:7;6967:23;6963:32;6960:52;;;7008:1;7005;6998:12;6960:52;7040:9;7034:16;7059:30;7083:5;7059:30;:::i;7124:450::-;7193:6;7246:2;7234:9;7225:7;7221:23;7217:32;7214:52;;;7262:1;7259;7252:12;7214:52;7302:9;7289:23;-1:-1:-1;;;;;7327:6:1;7324:30;7321:50;;;7367:1;7364;7357:12;7321:50;7390:22;;7443:4;7435:13;;7431:27;-1:-1:-1;7421:55:1;;7472:1;7469;7462:12;7421:55;7495:73;7560:7;7555:2;7542:16;7537:2;7533;7529:11;7495:73;:::i;7579:180::-;7638:6;7691:2;7679:9;7670:7;7666:23;7662:32;7659:52;;;7707:1;7704;7697:12;7659:52;-1:-1:-1;7730:23:1;;7579:180;-1:-1:-1;7579:180:1:o;7764:184::-;7834:6;7887:2;7875:9;7866:7;7862:23;7858:32;7855:52;;;7903:1;7900;7893:12;7855:52;-1:-1:-1;7926:16:1;;7764:184;-1:-1:-1;7764:184:1:o;7953:248::-;8021:6;8029;8082:2;8070:9;8061:7;8057:23;8053:32;8050:52;;;8098:1;8095;8088:12;8050:52;-1:-1:-1;;8121:23:1;;;8191:2;8176:18;;;8163:32;;-1:-1:-1;7953:248:1:o;8206:316::-;8283:6;8291;8299;8352:2;8340:9;8331:7;8327:23;8323:32;8320:52;;;8368:1;8365;8358:12;8320:52;-1:-1:-1;;8391:23:1;;;8461:2;8446:18;;8433:32;;-1:-1:-1;8512:2:1;8497:18;;;8484:32;;8206:316;-1:-1:-1;8206:316:1:o;8527:257::-;8568:3;8606:5;8600:12;8633:6;8628:3;8621:19;8649:63;8705:6;8698:4;8693:3;8689:14;8682:4;8675:5;8671:16;8649:63;:::i;:::-;8766:2;8745:15;-1:-1:-1;;8741:29:1;8732:39;;;;8773:4;8728:50;;8527:257;-1:-1:-1;;8527:257:1:o;8789:470::-;8968:3;9006:6;9000:13;9022:53;9068:6;9063:3;9056:4;9048:6;9044:17;9022:53;:::i;:::-;9138:13;;9097:16;;;;9160:57;9138:13;9097:16;9194:4;9182:17;;9160:57;:::i;:::-;9233:20;;8789:470;-1:-1:-1;;;;8789:470:1:o;9472:375::-;-1:-1:-1;;;;;9730:15:1;;;9712:34;;9782:15;;;;9777:2;9762:18;;9755:43;9829:2;9814:18;;9807:34;;;;9662:2;9647:18;;9472:375::o;9852:488::-;-1:-1:-1;;;;;10121:15:1;;;10103:34;;10173:15;;10168:2;10153:18;;10146:43;10220:2;10205:18;;10198:34;;;10268:3;10263:2;10248:18;;10241:31;;;10046:4;;10289:45;;10314:19;;10306:6;10289:45;:::i;:::-;10281:53;9852:488;-1:-1:-1;;;;;;9852:488:1:o;10345:274::-;-1:-1:-1;;;;;10537:32:1;;;;10519:51;;10601:2;10586:18;;10579:34;10507:2;10492:18;;10345:274::o;10624:632::-;10795:2;10847:21;;;10917:13;;10820:18;;;10939:22;;;10766:4;;10795:2;11018:15;;;;10992:2;10977:18;;;10766:4;11061:169;11075:6;11072:1;11069:13;11061:169;;;11136:13;;11124:26;;11205:15;;;;11170:12;;;;11097:1;11090:9;11061:169;;11453:219;11602:2;11591:9;11584:21;11565:4;11622:44;11662:2;11651:9;11647:18;11639:6;11622:44;:::i;12089:414::-;12291:2;12273:21;;;12330:2;12310:18;;;12303:30;12369:34;12364:2;12349:18;;12342:62;-1:-1:-1;;;12435:2:1;12420:18;;12413:48;12493:3;12478:19;;12089:414::o;15977:356::-;16179:2;16161:21;;;16198:18;;;16191:30;16257:34;16252:2;16237:18;;16230:62;16324:2;16309:18;;15977:356::o;17933:::-;18135:2;18117:21;;;18154:18;;;18147:30;18213:34;18208:2;18193:18;;18186:62;18280:2;18265:18;;17933:356::o;19112:413::-;19314:2;19296:21;;;19353:2;19333:18;;;19326:30;19392:34;19387:2;19372:18;;19365:62;-1:-1:-1;;;19458:2:1;19443:18;;19436:47;19515:3;19500:19;;19112:413::o;20701:398::-;20903:2;20885:21;;;20942:2;20922:18;;;20915:30;20981:34;20976:2;20961:18;;20954:62;-1:-1:-1;;;21047:2:1;21032:18;;21025:32;21089:3;21074:19;;20701:398::o;21104:339::-;21306:2;21288:21;;;21345:2;21325:18;;;21318:30;-1:-1:-1;;;21379:2:1;21364:18;;21357:45;21434:2;21419:18;;21104:339::o;21630:275::-;21701:2;21695:9;21766:2;21747:13;;-1:-1:-1;;21743:27:1;21731:40;;-1:-1:-1;;;;;21786:34:1;;21822:22;;;21783:62;21780:88;;;21848:18;;:::i;:::-;21884:2;21877:22;21630:275;;-1:-1:-1;21630:275:1:o;21910:183::-;21970:4;-1:-1:-1;;;;;21995:6:1;21992:30;21989:56;;;22025:18;;:::i;:::-;-1:-1:-1;22070:1:1;22066:14;22082:4;22062:25;;21910:183::o;22098:128::-;22138:3;22169:1;22165:6;22162:1;22159:13;22156:39;;;22175:18;;:::i;:::-;-1:-1:-1;22211:9:1;;22098:128::o;22231:120::-;22271:1;22297;22287:35;;22302:18;;:::i;:::-;-1:-1:-1;22336:9:1;;22231:120::o;22356:168::-;22396:7;22462:1;22458;22454:6;22450:14;22447:1;22444:21;22439:1;22432:9;22425:17;22421:45;22418:71;;;22469:18;;:::i;:::-;-1:-1:-1;22509:9:1;;22356:168::o;22529:125::-;22569:4;22597:1;22594;22591:8;22588:34;;;22602:18;;:::i;:::-;-1:-1:-1;22639:9:1;;22529:125::o;22659:258::-;22731:1;22741:113;22755:6;22752:1;22749:13;22741:113;;;22831:11;;;22825:18;22812:11;;;22805:39;22777:2;22770:10;22741:113;;;22872:6;22869:1;22866:13;22863:48;;;-1:-1:-1;;22907:1:1;22889:16;;22882:27;22659:258::o;22922:380::-;23001:1;22997:12;;;;23044;;;23065:61;;23119:4;23111:6;23107:17;23097:27;;23065:61;23172:2;23164:6;23161:14;23141:18;23138:38;23135:161;;;23218:10;23213:3;23209:20;23206:1;23199:31;23253:4;23250:1;23243:15;23281:4;23278:1;23271:15;23135:161;;22922:380;;;:::o;23307:135::-;23346:3;-1:-1:-1;;23367:17:1;;23364:43;;;23387:18;;:::i;:::-;-1:-1:-1;23434:1:1;23423:13;;23307:135::o;23447:112::-;23479:1;23505;23495:35;;23510:18;;:::i;:::-;-1:-1:-1;23544:9:1;;23447:112::o;23564:127::-;23625:10;23620:3;23616:20;23613:1;23606:31;23656:4;23653:1;23646:15;23680:4;23677:1;23670:15;23696:127;23757:10;23752:3;23748:20;23745:1;23738:31;23788:4;23785:1;23778:15;23812:4;23809:1;23802:15;23828:127;23889:10;23884:3;23880:20;23877:1;23870:31;23920:4;23917:1;23910:15;23944:4;23941:1;23934:15;23960:127;24021:10;24016:3;24012:20;24009:1;24002:31;24052:4;24049:1;24042:15;24076:4;24073:1;24066:15;24092:127;24153:10;24148:3;24144:20;24141:1;24134:31;24184:4;24181:1;24174:15;24208:4;24205:1;24198:15;24224:131;-1:-1:-1;;;;;24299:31:1;;24289:42;;24279:70;;24345:1;24342;24335:12;24360:118;24446:5;24439:13;24432:21;24425:5;24422:32;24412:60;;24468:1;24465;24458:12;24483:131;-1:-1:-1;;;;;;24557:32:1;;24547:43;;24537:71;;24604:1;24601;24594:12

Swarm Source

ipfs://6a1e6661de6383298f02d1cdae2b9967a37180dc83414a3195a95314d0f41f37
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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