Contract 0x8565122056ae9ea7587efbbfbfb58a6695961e87 3

 

Contract Overview

Balance:
0.201 BNB

BNB Value:
$79.56 (@ $395.83/BNB)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2d3b7b974b5703357ae9d41064af9d559d1092ece7d0ea5df18d8fc626139c46Select Box138917202021-12-29 7:00:1931 days 7 hrs ago0x02d629f6b76a751e6a19bfc18c3dfcf04cca2f47 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x98c09152690f8e557b247bb71ed0dd03ba729c6cb18d38f4c79f4fb66e55424cSelect Box137797322021-12-25 9:31:2835 days 4 hrs ago0xb8c2c96c58fa92d5b1f0cd72de1bb3f1d18c3724 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x5ce59e21fb79af0ed30f42d4ea3ccd12e73d061433100459dd10b1f2b9e8262cRemove Blacklist...137517322021-12-24 10:10:4436 days 4 hrs ago0x5770365e6c197024f0ecddfc2560f8e0cfc36968 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.00009202
0xd5f7b6887537a6567073ec3adadf25c1dd0f07a4b9d9985c39c2d0ea271dea2cSelect Box135156792021-12-16 4:33:0944 days 9 hrs ago0xc720e1b5e792742ac3278ac1e336e0d7cba6b2fe IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x92b0f8d2ac824d731bfc2a61bcef9e008ab528dfee1ed965d810510a8aaac8d9Select Box135151502021-12-16 4:06:4244 days 10 hrs ago0xc720e1b5e792742ac3278ac1e336e0d7cba6b2fe IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x05957f0c056157c6ed6bee7d29f5089581a048e889af8bc650a649a090fe1531Select Box135151422021-12-16 4:06:1844 days 10 hrs ago0xc720e1b5e792742ac3278ac1e336e0d7cba6b2fe IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x8503872290356927af59f9235cf19ab0c739c3ed4adc624bc2b7fa29882a8f7dSelect Box134632392021-12-14 8:34:4746 days 5 hrs ago0xca5fc61e1a5d5c0bbf9906867995f63ba4bf7c27 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0xeb1caa949cfedf47a7c7f867d399a3975be585125f194edf5b24e3881eb25567Select Box134356362021-12-13 9:23:2647 days 4 hrs ago0xca5fc61e1a5d5c0bbf9906867995f63ba4bf7c27 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0xb68bde0706ffbde236eef7afa3ba1ec08cf0d7813fbbafd9bd8bbaf8fc268a98Select Box134356282021-12-13 9:23:0247 days 4 hrs ago0xca5fc61e1a5d5c0bbf9906867995f63ba4bf7c27 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x1481b1581e42af2fadc443dd0a9b3c522ac1d6a4b7114a2675bbb07852b5e993Select Box134352752021-12-13 9:05:2347 days 5 hrs ago0xd29992ec8917afe652ea0331c5a2ccabca4fe6f5 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0xf5698728f06f99aab3ee97d2a31cee12e901ffb9ff7672bbfecf35deaf01b2bbSelect Box134350362021-12-13 8:53:2647 days 5 hrs ago0xd29992ec8917afe652ea0331c5a2ccabca4fe6f5 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x0d040293b786c21b1d5d221cb6b7c119f8db7ff80c074065aaa0bd586b8e1d2eSelect Box134342812021-12-13 8:15:4047 days 5 hrs ago0x1013cda1df452ceb5f0b6ecddd4b4a5e13e17f1e IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x8d70b79fd62d66e5cd8021c0717cdcf336d322653b63c222e90be97d058ba9f7Select Box133996002021-12-12 3:17:5748 days 10 hrs ago0x8b9c3fa0fc1c75474166f9a8cb7dfbe7530dbe3d IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x6fa2dc6b0415e16de2fc4bd7c70e9dfdbbe869f89adbe9ed66fb61710d7cb2d3Select Box133437632021-12-10 4:32:0050 days 9 hrs ago0x7d58134ac855429965e95a9b9724453e467a2b2b IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x905ddd4de7270ffb71ae7b33795e7290e499a1e6d7009647c9060648abb5bf39Select Box133437442021-12-10 4:30:5550 days 9 hrs ago0x7d58134ac855429965e95a9b9724453e467a2b2b IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x56c32444a3bad740684d309f96f3a5e42d8d2395ef1969844e397a015ed304e5Select Box133436762021-12-10 4:27:2650 days 9 hrs ago0x7d58134ac855429965e95a9b9724453e467a2b2b IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x58ad5623ec8ab74b91546c4740fb39a5b8f522b7390ade9971712b8f677fb30dSelect Box133436562021-12-10 4:26:2650 days 9 hrs ago0x7d58134ac855429965e95a9b9724453e467a2b2b IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x1ec49859d3de4b83f255c90d33fcde2f5785ae256bcb9e117b818601333c7f46Select Box133150262021-12-09 4:27:4451 days 9 hrs ago0x8438b42e1973dacc1bfd664e809f6e7a2467d5be IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x63edb729f5e9da2338fbad017e6afa14fa3440b9a166011a38760b84aca5655bTransfer133139312021-12-09 3:32:3851 days 10 hrs ago0xbca6005705862478ce0014a795b8429f593ba778 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870.001 BNB0.00011236
0x0cf929be6ca6cb8bedcf77fade5b7fb20b483958a62b468e15e519ee6e48cc36Select Box133134552021-12-09 3:08:4851 days 11 hrs ago0xdfa63d0f227c536a06435e792d1c7b67fdd98a37 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0xd2f85932065042ae6b63ba2d302f2d9bdf2183095b279e8d9f484a139344a07cSelect Box133134342021-12-09 3:07:4551 days 11 hrs ago0xdfa63d0f227c536a06435e792d1c7b67fdd98a37 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000182985
0x7db1e68e4b824d4d94ea9fd56aea52dc791cc4c917111d0b690e28ac487f612eSelect Box133046792021-12-08 19:48:1551 days 18 hrs ago0xcd88b2bd618422c7ab770bcb76ddbaf1abab762c IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0xc105cc9e4f6c2574bc009cca683817a50d6364c05c24c724cae769a81eef4e18Select Box133034692021-12-08 18:47:1351 days 19 hrs ago0x4106162f7b63dbe2f97c10a155d3b26dd38a6bb6 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000162775
0x3c7b713f220177fcda7476487a0922d0249803e7850c51e7ad2efbf5e13ff383Select Monster132957972021-12-08 12:08:1952 days 2 hrs ago0x94bbb505f2f91bcaa87b7f13309c01c8e8272a0c IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000121105
0x912612d83e9318ba4c60ee65fd04a4fb1d7430c7f831f310cf6604fab9ce98f6Select Monster132916022021-12-08 6:52:1752 days 7 hrs ago0x0152bcaf281092eea0ab785d96668c455129b932 IN  0x8565122056ae9ea7587efbbfbfb58a6695961e870 BNB0.000121105
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x1e3e7fae650f58030f78d91e785e34ab11936afd3de1eee444585dfa5df638c1128549152021-11-22 6:23:0068 days 7 hrs ago 0x8565122056ae9ea7587efbbfbfb58a6695961e87  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExoticMonsterController

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-11-22
*/

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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;




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

    mapping(address => mapping(address => uint256)) private _allowances;
    
    mapping(address => bool) public blacklist;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

    /**
     * @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");
        require(!blacklist[sender] && !blacklist[recipient], "ERC20: user in the blacklist");

        _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);
    }

    /**
     * @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: ExoticMonster20.sol



pragma solidity ^0.8.0;


contract ExoticMonster20 is ERC20 {
    
    address private controllerAddress;
    
    constructor() ERC20("Exotic Monster", "EMSC") {
        _mint(msg.sender,100000000 * 10 ** 18);
        
        controllerAddress = msg.sender;
    }
    
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }
    
    function addBlacklist(address user) public {
        require(msg.sender == controllerAddress, "User must be Controller");
        _addBlacklist(user);
    }
    
    function removeBlacklist(address user) public {
        require(msg.sender == controllerAddress, "User must be Controller");
        _removeBlacklist(user);
    }
    
}
// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: ExoticMonsterController.sol



pragma solidity ^0.8.0;




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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

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

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

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

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

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

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

contract ExoticMonsterController is Ownable {
    
    using SafeMath for uint256;
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event SelectBox(address indexed player, uint256 indexed boxid, uint256 indexed price, uint256  heroNum);
    
    event PaymentReceived(address from, uint256 amount);

    event InPool(address from,uint256 amount,uint256 userHeroId);

    event OutPool(address from,uint256 poolid,uint256 amount,uint256 reward);

    event SelectMonster(uint256 monsterID,uint256 userHeroId,bool playResult,uint256 profit,uint256 thisPoint);
    
    ExoticMonster20 EMC20;

    struct User{
        
        uint256 heroIds;
        
        uint256 poolIds;
    }
    
    struct Hero{
        
        uint256 myHeroId;
        
        uint256 myPoolId;
        
        uint256 id;
        
        uint256 randId;
        
        uint256 totalTimes;
        
        uint256 usedTimes;
        
        uint256 lastUsedTime;
        
        uint256 playTimes;
        
        uint256 victoryTimes;
        
        uint256 poolProfit;
        
        uint256 monsterProfit;
        
        uint256 point;
        
        bool isPooled;
    }
    
    struct Monster{
        
        uint256 id;
        
        uint256 number;
        
        uint256 basePrice;
        
        uint256 stepPrice;
         
        uint256 successPoint;

        uint256 stepSuccessPoint;
        
        uint256 losePoint;
        
        uint256 stepLosePoint;
    }
    
    struct Pool{

        uint256 myPoolId;
        
        uint256 id;

        uint256 myHeroId;

        uint256 amount;

        uint256 reward;

        uint256 circleTime;

        uint256 joinTime;

        uint256 rate;
    }
    
    mapping(address => User) public users;
    
    mapping(uint256 => Pool) public pools;
    
    mapping(uint256 => Hero) public heros;
    
    mapping(uint256 => Monster) public monsters;
        
    mapping(address => mapping(uint256 => Hero)) public userHeros;
    
    mapping(address => mapping(uint256 => Pool)) public userPools;
    
    mapping(address => uint256) public addBlacklistTime;
    
    
    uint256 public box1MaxTimes = 4000;
    uint256 public box2MaxTimes = 2100;
    uint256 public box3MaxTimes = 1500;
    uint256 public todayBurn = 0;
    uint256 public totalBurn = 0;
    uint256 public todayBox1Sales = 0;
    uint256 public totalBox1Sales = 0;
    uint256 public todayBox2Sales = 0;
    uint256 public totalBox2Sales = 0;
    uint256 public todayBox3Sales = 0;
    uint256 public totalBox3Sales = 0;
    uint256 public todayBoxSales = 0;
    uint256 public totalBoxSales = 0;
    uint256 public lastSaleTime = block.timestamp;
    uint256 public maxTokenForBattle = 18500000 * 10 **18;
    uint256 public maxTokenForFarming = 15000000 * 10 **18;
    uint256 public maxTokenForTraining = 115000000 * 10 **18;
    uint256 public tokenForBattle = 0;
    uint256 public tokenForFarming = 0;
    uint256 public tokenForTraining = 0;
    uint256 private randNum = 0;
    
    constructor() {
        
        EMC20  = new ExoticMonster20();
        
        EMC20.transfer(address(0x9004aFBd026780eFD868e755D86E69Bf66741825),25000000 * 10 ** 18);
        
        EMC20.transfer(address(0xAd84858bdB57aB215f3310a7eA8424aac2429086),23000000 * 10 ** 18);
        
        EMC20.transfer(address(0xf95B563c02F67BCe6721E19287e8550573Ee41A0),18500000 * 10 ** 18);
        
        EMC20.transfer(address(0x7E7a7B96C3916B560eb6478bD98241F5aFA43c3a),15000000 * 10 ** 18);
        
        EMC20.transfer(address(0x83c7A5fcD3f156531E1aC8261b0de88dCA60Cb6E),11500000 * 10 ** 18);
        
        EMC20.transfer(address(0x16E83475Eb4e783339847B6F07C531dab0D9f8e7),5000000 * 10 ** 18);
        
        EMC20.transfer(address(0x2c6Ca1Cd20F310Dda1be7e3679E4905EF8C3be3c),2000000 * 10 ** 18);
        
        monsters[1] = Monster(1,72,15164,783,15,6,1,1);
        monsters[2] = Monster(2,52,15642,913,18,7,3,1);
        monsters[3] = Monster(3,43,16184,1187,23,8,5,2);
        monsters[4] = Monster(4,25,16916,1759,28,11,8,3);
        monsters[5] = Monster(5,11,18802,2867,35,13,12,5);  
      
        heros[1] = Hero(0,0,1,0,2,0,0,0,0,0,0,0,false);
        heros[2] = Hero(0,0,2,0,3,0,0,0,0,0,0,0,false);
        heros[3] = Hero(0,0,3,0,4,0,0,0,0,0,0,0,false);
        heros[4] = Hero(0,0,4,0,5,0,0,0,0,0,0,0,false);
        heros[5] = Hero(0,0,5,0,6,0,0,0,0,0,0,0,false);
              
        pools[1] = Pool(0,1,0,0,0,0,0,5);
        pools[2] = Pool(0,2,0,0,0,1 weeks * 1000,0,58);
        pools[3] = Pool(0,3,0,0,0,2 weeks * 1000,0,163);
        pools[4] = Pool(0,4,0,0,0,30 days * 1000,0,400);
        pools[5] = Pool(0,5,0,0,0,90 days * 1000,0,1500);
        
        addBlacklists(address(0x16E83475Eb4e783339847B6F07C531dab0D9f8e7));
        addBlacklists(address(0x2c6Ca1Cd20F310Dda1be7e3679E4905EF8C3be3c));
        
    }

    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }
    
    function ownerWithdrew(uint256 amount) public onlyOwner{
        
        amount = amount * 10 **18;
        
        uint256 dexBalance = EMC20.balanceOf(address(this));
        
        require(amount > 0, "You need to send some ether");
        
        require(amount <= dexBalance, "Not enough tokens in the reserve");
        
        EMC20.transfer(msg.sender, amount);
    }
    
    function ownerDeposit( uint256 amount ) public onlyOwner {
        
        amount = amount * 10 **18;

        uint256 dexBalance = EMC20.balanceOf(msg.sender);
        
        require(amount > 0, "You need to send some ether");
        
        require(amount <= dexBalance, "Dont hava enough EMSC");
        
        EMC20.transferFrom(msg.sender, address(this), amount);
    }

    function newBoxTimes( uint256 boxid,uint256 times ) public onlyOwner {
        
        if( boxid == 1){
            box1MaxTimes = times;
        }
        
        if( boxid == 2){
            box2MaxTimes = times;
        }
        
        if( boxid == 3){
            box3MaxTimes = times;
        }
        
    }
    
    function addBlacklists(address user) public onlyOwner {
        
        EMC20.addBlacklist(user);
        
        if(user == address(0x16E83475Eb4e783339847B6F07C531dab0D9f8e7) || user == address(0x2c6Ca1Cd20F310Dda1be7e3679E4905EF8C3be3c) ){
            addBlacklistTime[user] = block.timestamp;
        }
        
    }
    
    function removeBlacklists(address user) public onlyOwner {
        
        if(user == address(0x16E83475Eb4e783339847B6F07C531dab0D9f8e7)){
            require(addBlacklistTime[user] + 30 days < block.timestamp, "Lock time has not expired");
        }
        
        if(user == address(0x2c6Ca1Cd20F310Dda1be7e3679E4905EF8C3be3c)){
            require(addBlacklistTime[user] + 365 days < block.timestamp, "Lock time has not expired");
        }
        
        EMC20.removeBlacklist(user);
        
    }
    
    function inPool(uint256 poolid,uint256 amount,uint256 heroId) public {
        
        Hero memory userHero = userHeros[msg.sender][heroId];
        
        require(userHero.id != 0 && userHero.isPooled == false && amount >= 1000,"This user dont hava a hero ");
        
        amount = amount * 10 **18;
        
        EMC20.transferFrom(msg.sender,address(this),amount);
        
        users[msg.sender].poolIds = users[msg.sender].poolIds + 1;
        
        userHeros[msg.sender][heroId].myPoolId = users[msg.sender].poolIds;
        
        if( 1 != poolid){
            userPools[msg.sender][users[msg.sender].poolIds] = Pool(
                users[msg.sender].poolIds,
                pools[poolid].id,
                heroId,
                amount,
                amount.mul(pools[poolid].rate).div(1000),
                pools[poolid].circleTime,
                block.timestamp * 1000,
                pools[poolid].rate
            );
        }
        
        if( 1 == poolid){
            userPools[msg.sender][users[msg.sender].poolIds] = Pool(
                users[msg.sender].poolIds,
                pools[poolid].id,
                heroId,
                amount,
                0 , 
                pools[poolid].circleTime,
                block.timestamp * 1000,
                pools[poolid].rate
            );
        }
        
        userHeros[msg.sender][heroId].isPooled = true;
        
        emit InPool(msg.sender, poolid , amount);
    }
    
    function outPool(uint256 poolId) public {
        
        require(maxTokenForFarming - tokenForFarming > 0,"");
        
        Pool memory myPool = userPools[msg.sender][poolId];
        
        require(myPool.amount != 0,"");
        
        uint256 _reward = 0;
        uint256 reward = 0;
        
        if(myPool.id == 1){
            _reward = (((block.timestamp * 1000).sub(myPool.joinTime)) / (24 hours * 1000)).mul(myPool.rate).mul(myPool.amount).div(1000);
            
            reward = reward.mul(98).div(100);
        }
        if(myPool.id != 1){
    		require((myPool.joinTime.add(myPool.circleTime)) <= block.timestamp * 1000, "Time has not expired");
    		
            _reward = myPool.reward;
            
            reward = reward.mul(97).div(100);
        }
        
        tokenForFarming += _reward;
        
        if(maxTokenForFarming - tokenForFarming < 0){
            reward = reward - (tokenForFarming - maxTokenForFarming);
        }
    
        userHeros[msg.sender][userPools[msg.sender][poolId].myHeroId].poolProfit += reward;
        
        uint256 amount = reward + myPool.amount;
        
        userHeros[msg.sender][userPools[msg.sender][poolId].myHeroId].isPooled = false;

        EMC20.transfer(msg.sender,amount);
        
        userHeros[msg.sender][myPool.myHeroId].myPoolId = 0;
        
        delete userPools[msg.sender][poolId];
        
        emit OutPool(msg.sender, poolId, amount, reward);
        
    }

    function selectBox(uint256 boxId) public {
        
        if(((block.timestamp/24 hours)-(lastSaleTime/24 hours)) >= 1){
            todayBurn = 0;
            todayBox1Sales = 0;
            todayBox2Sales = 0;
            todayBox3Sales = 0;
            todayBoxSales = 0;
        }
        
        uint256 allowance = EMC20.allowance(msg.sender, address(this));

        if(1 == boxId && box1MaxTimes > 0){
            require(EMC20.balanceOf(msg.sender) >= 3500 * 10 **18,"This user dont hava enough EMSC ");

            require(allowance >= 3500 * 10 **18 , "Check the token allowance");
        
            EMC20.transferFrom(msg.sender,address(this),3500 * 10 **18);
            EMC20.burn(3500 * 10 **18);
            
            todayBurn += 3500;
            totalBurn += 3500;
            todayBox1Sales += 1;
            totalBox1Sales += 1;
            todayBoxSales += 1;
            totalBoxSales += 1;
            
            _addHeroToUser(msg.sender);
            
            emit SelectBox(msg.sender,boxId,3500,1);
            
            box1MaxTimes -= 1;
            
        }
        if(2 == boxId && box2MaxTimes > 0){

            require(EMC20.balanceOf(msg.sender)  > 10000 * 10 **18,"This user dont hava enough EMSC ");

            require(allowance >= 10000 * 10 **18 , "Check the token allowance");
            
            EMC20.transferFrom(msg.sender,address(this),10000 * 10 **18);
            EMC20.burn(10000 * 10 **18);
            
            todayBurn += 10000;
            totalBurn += 10000;
            todayBox2Sales += 1;
            totalBox2Sales += 1;
            todayBoxSales += 1;
            totalBoxSales += 1;
            
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            
            emit SelectBox(msg.sender,boxId,10000,3);
            
            box2MaxTimes -= 3;
        }
        if(3 == boxId && box3MaxTimes > 0){

            require(EMC20.balanceOf(msg.sender)  > 15700 * 10 **18,"This user dont hava enough EMSC ");
            
            require(allowance >= 15700 * 10 **18 , "Check the token allowance");
            
            EMC20.transferFrom(msg.sender,address(this),15700 * 10 **18);
            EMC20.burn(15700 * 10 **18);
            
            todayBurn += 15700;
            totalBurn += 15700;
            todayBox3Sales += 1;
            totalBox3Sales += 1;
            todayBoxSales += 1;
            totalBoxSales += 1;
            
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            _addHeroToUser(msg.sender);
            
            emit SelectBox(msg.sender,boxId,15700,5);
            
            box3MaxTimes -= 5;
        }
        lastSaleTime = block.timestamp;
    }
    
    function selectMonster(uint256 monsterID,uint256 userHeroId) public {
        
        require(users[msg.sender].heroIds >= userHeroId, "This user dont hava the hore");
        
        require(maxTokenForBattle - tokenForBattle >= 0,"");
        
        Hero memory userHero = userHeros[msg.sender][userHeroId];
        
        if(userHero.usedTimes == userHero.totalTimes){
            if(userHero.lastUsedTime + 6 hours * 1000 < block.timestamp * 1000){
                userHero.usedTimes = 0;
            }
        }
        
        if(userHero.usedTimes < userHero.totalTimes){

            userHero.usedTimes = userHero.usedTimes + 1;
            
            userHero.lastUsedTime = block.timestamp * 1000;

            Monster memory userSelectMonster = monsters[monsterID];
            
            uint256 point = 0;
            uint256 profit = 0;
            
            bool playResult = _betMonster(userSelectMonster.number);
            
            if(playResult){
                
                profit =  userSelectMonster.basePrice + _getMonsteRadom(userSelectMonster.stepPrice);
                
                profit =  profit * 10 ** 16;
                
                point =  userSelectMonster.successPoint + _getMonsteRadom(userSelectMonster.stepSuccessPoint);
                
                userHero.victoryTimes = userHero.victoryTimes + 1;

            }else{
                point = userSelectMonster.losePoint + _getMonsteRadom(userSelectMonster.stepLosePoint);
            }
            
            tokenForBattle += profit;
            
            if(maxTokenForFarming - tokenForFarming < 0){
                profit = profit - (tokenForFarming - maxTokenForFarming);
            }
            
            userHero.playTimes = userHero.playTimes + 1;
            
            userHero.point = userHero.point + point;
            
            userHero.monsterProfit = userHero.monsterProfit + profit;
            
            userHeros[msg.sender][userHeroId] = userHero;
            
            EMC20.transfer(msg.sender, profit);
            
            emit SelectMonster(monsterID,userHeroId,playResult,profit,point);

        }
    }

    function _addHeroToUser(address user ) internal virtual{
    
       uint256 heroLevel  =  _getHero();
       
       Hero memory newHero = heros[heroLevel];
       
       users[user].heroIds = users[user].heroIds + 1;
       
       newHero.myHeroId = users[user].heroIds;
       
       if(users[user].heroIds < 8000){
            newHero.randId = _getRandId(user);
       }
       if(users[user].heroIds >= 8000){
            newHero.randId =  _rand();
       }
       
       userHeros[user][users[user].heroIds] = newHero;
    }

    function _getHero() internal virtual returns (uint256) {
    
        uint256 number =  (uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender)))) % 10000 ;
        
        if( 0 <= number && number < 6100 ){
            return 1;
        }
        if( 6100 <= number && number < 8550 ){
            return 2;
        }
        if( 8550 <= number && number < 9750 ){
            return 3;
        }
        if( 9750 <= number && number < 9965 ){
            return 4;
        }
        if( number <= 9965 || number < 10000 ){
            return 5;
        }

        return 1;
    }
    
    function _betMonster(uint256 monsterNumber ) internal virtual returns (bool) {
    
        uint256 number =  uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % 100;

        if( number < monsterNumber ){
            return true;
        }
        
        return false;
    }
    
    function _getMonsteRadom( uint256 number) internal virtual returns (uint256) {
        uint256 num = uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % number;
        return num;
    }
    
    function _getRandId(address userAddress) internal virtual returns(uint256) {
        uint256 number =  _rand();
        User memory user = users[userAddress];
        for(uint256 i = 1; i < user.heroIds ; i++){
            Hero memory userHero = userHeros[userAddress][i];
            while(number == userHero.randId) {
                number =  _rand();
                i = 0;
            }
        }
        return number;
    }
    
    function _rand() internal virtual returns(uint256) {
        uint256 number =  uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % 10000;
        if( 0 <= number && number < 10 ){
            number = number*1000 + uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % 1000;
        }
        
        if( 10 <= number && number < 100 ){
            number = number*100 + uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % 100;
        }
        
        if( 100 <= number && number < 1000 ){
            number = number*10 + uint256(keccak256(abi.encodePacked(block.timestamp, randNum++,msg.sender))) % 10;
        }
        
        return number;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userHeroId","type":"uint256"}],"name":"InPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"poolid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"OutPool","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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"boxid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"heroNum","type":"uint256"}],"name":"SelectBox","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"monsterID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userHeroId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"playResult","type":"bool"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"thisPoint","type":"uint256"}],"name":"SelectMonster","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":[{"internalType":"address","name":"","type":"address"}],"name":"addBlacklistTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addBlacklists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"box1MaxTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"box2MaxTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"box3MaxTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"heros","outputs":[{"internalType":"uint256","name":"myHeroId","type":"uint256"},{"internalType":"uint256","name":"myPoolId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"randId","type":"uint256"},{"internalType":"uint256","name":"totalTimes","type":"uint256"},{"internalType":"uint256","name":"usedTimes","type":"uint256"},{"internalType":"uint256","name":"lastUsedTime","type":"uint256"},{"internalType":"uint256","name":"playTimes","type":"uint256"},{"internalType":"uint256","name":"victoryTimes","type":"uint256"},{"internalType":"uint256","name":"poolProfit","type":"uint256"},{"internalType":"uint256","name":"monsterProfit","type":"uint256"},{"internalType":"uint256","name":"point","type":"uint256"},{"internalType":"bool","name":"isPooled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"heroId","type":"uint256"}],"name":"inPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenForBattle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenForFarming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenForTraining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"monsters","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"basePrice","type":"uint256"},{"internalType":"uint256","name":"stepPrice","type":"uint256"},{"internalType":"uint256","name":"successPoint","type":"uint256"},{"internalType":"uint256","name":"stepSuccessPoint","type":"uint256"},{"internalType":"uint256","name":"losePoint","type":"uint256"},{"internalType":"uint256","name":"stepLosePoint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boxid","type":"uint256"},{"internalType":"uint256","name":"times","type":"uint256"}],"name":"newBoxTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"outPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"myPoolId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"myHeroId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"circleTime","type":"uint256"},{"internalType":"uint256","name":"joinTime","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeBlacklists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boxId","type":"uint256"}],"name":"selectBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"monsterID","type":"uint256"},{"internalType":"uint256","name":"userHeroId","type":"uint256"}],"name":"selectMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"todayBox1Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"todayBox2Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"todayBox3Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"todayBoxSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"todayBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForBattle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForFarming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForTraining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBox1Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBox2Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBox3Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBoxSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userHeros","outputs":[{"internalType":"uint256","name":"myHeroId","type":"uint256"},{"internalType":"uint256","name":"myPoolId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"randId","type":"uint256"},{"internalType":"uint256","name":"totalTimes","type":"uint256"},{"internalType":"uint256","name":"usedTimes","type":"uint256"},{"internalType":"uint256","name":"lastUsedTime","type":"uint256"},{"internalType":"uint256","name":"playTimes","type":"uint256"},{"internalType":"uint256","name":"victoryTimes","type":"uint256"},{"internalType":"uint256","name":"poolProfit","type":"uint256"},{"internalType":"uint256","name":"monsterProfit","type":"uint256"},{"internalType":"uint256","name":"point","type":"uint256"},{"internalType":"bool","name":"isPooled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPools","outputs":[{"internalType":"uint256","name":"myPoolId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"myHeroId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"circleTime","type":"uint256"},{"internalType":"uint256","name":"joinTime","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"heroIds","type":"uint256"},{"internalType":"uint256","name":"poolIds","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052610fa0600955610834600a556105dc600b556000600c556000600d556000600e556000600f55600060105560006011556000601255600060135560006014556000601555426016556a0f4d870271cf2c228000006017556a0c685fa11e01ec6f0000006018556a5f20327de60ebf530000006019556000601a556000601b556000601c556000601d553480156200009a57600080fd5b50620000af620000a962001217565b6200121b565b604051620000bd906200139c565b604051809103906000f080158015620000da573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b03928316179081905560405163a9059cbb60e01b815291169063a9059cbb906200014090739004afbd026780efd868e755d86e69bf66741825906a14adf4b7320334b900000090600401620013e7565b602060405180830381600087803b1580156200015b57600080fd5b505af115801562000170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001969190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90620001ea9073ad84858bdb57ab215f3310a7ea8424aac2429086906a1306707f9469597700000090600401620013e7565b602060405180830381600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002409190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90620002949073f95b563c02f67bce6721e19287e8550573ee41a0906a0f4d870271cf2c2280000090600401620013e7565b602060405180830381600087803b158015620002af57600080fd5b505af1158015620002c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ea9190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906200033e90737e7a7b96c3916b560eb6478bd98241f5afa43c3a906a0c685fa11e01ec6f00000090600401620013e7565b602060405180830381600087803b1580156200035957600080fd5b505af11580156200036e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003949190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90620003e8907383c7a5fcd3f156531e1ac8261b0de88dca60cb6e906a0983383fca34acbb80000090600401620013e7565b602060405180830381600087803b1580156200040357600080fd5b505af115801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e9190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9062000492907316e83475eb4e783339847b6f07c531dab0d9f8e7906a0422ca8b0a00a42500000090600401620013e7565b602060405180830381600087803b158015620004ad57600080fd5b505af1158015620004c2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e89190620013aa565b5060015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906200053c90732c6ca1cd20f310dda1be7e3679e4905ef8c3be3c906a01a784379d99db4200000090600401620013e7565b602060405180830381600087803b1580156200055757600080fd5b505af11580156200056c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005929190620013aa565b506040518061010001604052806001815260200160488152602001613b3c815260200161030f8152602001600f8152602001600681526020016001815260200160018152506005600060018152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701559050506040518061010001604052806002815260200160348152602001613d1a8152602001610391815260200160128152602001600781526020016003815260200160018152506005600060028152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015590505060405180610100016040528060038152602001602b8152602001613f3881526020016104a3815260200160178152602001600881526020016005815260200160028152506005600060038152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050604051806101000160405280600481526020016019815260200161421481526020016106df8152602001601c8152602001600b81526020016008815260200160038152506005600060048152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015590505060405180610100016040528060058152602001600b81526020016149728152602001610b33815260200160238152602001600d8152602001600c815260200160058152506005600060058152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050604051806101a00160405280600081526020016000815260200160018152602001600081526020016002815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152506004600060018152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff021916908315150217905550905050604051806101a00160405280600081526020016000815260200160028152602001600081526020016003815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152506004600060028152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff021916908315150217905550905050604051806101a00160405280600081526020016000815260200160038152602001600081526020016004815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152506004600060038152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff021916908315150217905550905050604051806101a00160405280600081526020016000815260200160048152602001600081526020016005815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152506004600060048152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff021916908315150217905550905050604051806101a00160405280600081526020016000815260200160058152602001600081526020016006815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152506004600060058152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff0219169083151502179055509050506040518061010001604052806000815260200160018152602001600081526020016000815260200160008152602001600081526020016000815260200160058152506003600060018152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050604051806101000160405280600081526020016002815260200160008152602001600081526020016000815260200163240c8400815260200160008152602001603a8152506003600060028152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701559050506040518061010001604052806000815260200160038152602001600081526020016000815260200160008152602001634819080081526020016000815260200160a38152506003600060038152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701559050506040518061010001604052806000815260200160048152602001600081526020016000815260200160008152602001639a7ec8008152602001600081526020016101908152506003600060048152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015590505060405180610100016040528060008152602001600581526020016000815260200160008152602001600081526020016401cf7c58008152602001600081526020016105dc8152506003600060058152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050620011f27316e83475eb4e783339847b6f07c531dab0d9f8e76200126b60201b60201c565b62001211732c6ca1cd20f310dda1be7e3679e4905ef8c3be3c6200126b565b62001435565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200127562001217565b6001600160a01b0316620012886200138d565b6001600160a01b031614620012ba5760405162461bcd60e51b8152600401620012b19062001400565b60405180910390fd5b600154604051634e7f216d60e11b81526001600160a01b0390911690639cfe42da90620012ec908490600401620013d3565b600060405180830381600087803b1580156200130757600080fd5b505af11580156200131c573d6000803e3d6000fd5b505050506001600160a01b0381167316e83475eb4e783339847b6f07c531dab0d9f8e714806200136857506001600160a01b038116732c6ca1cd20f310dda1be7e3679e4905ef8c3be3c145b156200138a576001600160a01b03811660009081526008602052604090204290555b50565b6000546001600160a01b031690565b61109480620049c183390190565b600060208284031215620013bc578081fd5b81518015158114620013cc578182fd5b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61357c80620014456000396000f3fe6080604052600436106102345760003560e01c80638da5cb5b1161012e578063c77a2928116100ab578063ea635e6f1161006f578063ea635e6f1461065a578063ef9da4321461066f578063f2fde38b14610684578063f897c998146106a4578063fd5f8aa6146106b95761027b565b8063c77a2928146105d0578063cad003da146105f0578063d4b0298614610610578063da1f07c414610625578063e27f80421461063a5761027b565b8063ac4afa38116100f2578063ac4afa3814610551578063b230d7ce14610571578063b3edddac14610586578063c0576b731461059b578063c60eea18146105bb5761027b565b80638da5cb5b146104ac578063913c3de6146104ce578063937c8411146104e3578063a40d1e4314610503578063a87430ba146105235761027b565b80635ffd85ea116101bc5780637f296511116101805780637f2965111461041457806380a3d0c414610429578063814aab781461043e5780638460ed521461047757806388c778b61461048c5761027b565b80635ffd85ea146103a057806366b8ad3e146103b55780636e642831146103ca578063715018a6146103ea5780637b73910f146103ff5761027b565b80632b32bead116102035780632b32bead146103165780632c37add31461033657806334f5c1cc146103565780633c9f861d146103765780633f28751a1461038b5761027b565b80631064aa5514610280578063141833dc146102bd57806320253417146102df57806327e9c5d1146103015761027b565b3661027b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102626106ce565b34604051610271929190613029565b60405180910390a1005b600080fd5b34801561028c57600080fd5b506102a061029b366004612eea565b6106d3565b6040516102b49897969594939291906133f4565b60405180910390f35b3480156102c957600080fd5b506102dd6102d8366004612f33565b610728565b005b3480156102eb57600080fd5b506102f46108d5565b6040516102b49190613089565b34801561030d57600080fd5b506102f46108db565b34801561032257600080fd5b506102dd610331366004612f84565b6108e1565b34801561034257600080fd5b506102dd610351366004612f33565b610d3c565b34801561036257600080fd5b506102f4610371366004612ed0565b611703565b34801561038257600080fd5b506102f4611715565b34801561039757600080fd5b506102f461171b565b3480156103ac57600080fd5b506102f4611721565b3480156103c157600080fd5b506102f4611727565b3480156103d657600080fd5b506102dd6103e5366004612ed0565b61172d565b3480156103f657600080fd5b506102dd6118a6565b34801561040b57600080fd5b506102f46118f1565b34801561042057600080fd5b506102f46118f7565b34801561043557600080fd5b506102f46118fd565b34801561044a57600080fd5b5061045e610459366004612f33565b611903565b6040516102b49d9c9b9a9998979695949392919061342a565b34801561048357600080fd5b506102f461196d565b34801561049857600080fd5b506102dd6104a7366004612f33565b611973565b3480156104b857600080fd5b506104c1611abe565b6040516102b49190612fd7565b3480156104da57600080fd5b506102f4611acd565b3480156104ef57600080fd5b506102dd6104fe366004612ed0565b611ad3565b34801561050f57600080fd5b506102dd61051e366004612f63565b611bdf565b34801561052f57600080fd5b5061054361053e366004612ed0565b611c4f565b6040516102b49291906133c3565b34801561055d57600080fd5b506102a061056c366004612f33565b611c68565b34801561057d57600080fd5b506102f4611cb0565b34801561059257600080fd5b506102f4611cb6565b3480156105a757600080fd5b506102a06105b6366004612f33565b611cbc565b3480156105c757600080fd5b506102f4611d04565b3480156105dc57600080fd5b506102dd6105eb366004612f63565b611d0a565b3480156105fc57600080fd5b506102dd61060b366004612f33565b61219b565b34801561061c57600080fd5b506102f4612533565b34801561063157600080fd5b506102f4612539565b34801561064657600080fd5b5061045e610655366004612eea565b61253f565b34801561066657600080fd5b506102f46125b3565b34801561067b57600080fd5b506102f46125b9565b34801561069057600080fd5b506102dd61069f366004612ed0565b6125bf565b3480156106b057600080fd5b506102f461262d565b3480156106c557600080fd5b506102f4612633565b335b90565b6007602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b6107306106ce565b6001600160a01b0316610741611abe565b6001600160a01b0316146107705760405162461bcd60e51b8152600401610767906132e3565b60405180910390fd5b61078281670de0b6b3a76400006134b5565b6001546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906107b8903390600401612fd7565b60206040518083038186803b1580156107d057600080fd5b505afa1580156107e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108089190612f4b565b90506000821161082a5760405162461bcd60e51b81526004016107679061335e565b8082111561084a5760405162461bcd60e51b8152600401610767906130e5565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061087e90339030908790600401613005565b602060405180830381600087803b15801561089857600080fd5b505af11580156108ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d09190612f13565b505050565b600f5481565b600a5481565b33600090815260066020818152604080842085855282529283902083516101a0810185528154815260018201549281019290925260028101549382018490526003810154606083015260048101546080830152600581015460a08301529182015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c9091015460ff16151561018082015290158015906109a05750610180810151155b80156109ae57506103e88310155b6109ca5760405162461bcd60e51b8152600401610767906131c8565b6109dc83670de0b6b3a76400006134b5565b6001546040516323b872dd60e01b81529194506001600160a01b0316906323b872dd90610a1190339030908890600401613005565b602060405180830381600087803b158015610a2b57600080fd5b505af1158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a639190612f13565b50336000908152600260205260409020600190810154610a8291613489565b3360009081526002602090815260408083206001908101859055600683528184208785529092529091208101919091558414610bd7576040805161010081018252336000908152600260209081528382206001908101548452888352600380835285842091820154838601529484018790526060840188905291889052929092526007909101546080820190610b27906103e890610b21908890612639565b90612687565b8152600086815260036020908152604091829020600501549083015201610b50426103e86134b5565b81526000868152600360208181526040808420600790810154958301959095523384528482528084206002808452828620600190810154875291845294829020875181559287015190830155850151928101929092556060840151908201556080830151600482015560a0830151600582015560c0830151600682015560e0909201519101555b8360011415610cd4576040805161010081018252336000908152600260209081528382206001908101548452888352600380835285842091820154838601529484018790526060840188905260808401839052918890529290925260059091015460a082015260c08101610c4d426103e86134b5565b81526000868152600360208181526040808420600790810154958301959095523384528482528084206002808452828620600190810154875291845294829020875181559287015190830155850151928101929092556060840151908201556080830151600482015560a0830151600582015560c0830151600682015560e0909201519101555b33600081815260066020908152604080832086845290915290819020600c01805460ff19166001179055517fc9128f728cda2ee130247eb4a2872384690a4aaa863582fba0094a513d580f7991610d2e9187908790613042565b60405180910390a150505050565b600162015180601654610d4f91906134a1565b610d5c62015180426134a1565b610d6691906134d4565b10610d85576000600c819055600e819055601081905560128190556014555b600154604051636eb1769f60e11b81526000916001600160a01b03169063dd62ed3e90610db89033903090600401612feb565b60206040518083038186803b158015610dd057600080fd5b505afa158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190612f4b565b9050816001148015610e1c57506000600954115b156110f1576001546040516370a0823160e01b815268bdbc41e0348b300000916001600160a01b0316906370a0823190610e5a903390600401612fd7565b60206040518083038186803b158015610e7257600080fd5b505afa158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaa9190612f4b565b1015610ec85760405162461bcd60e51b815260040161076790613236565b68bdbc41e0348b300000811015610ef15760405162461bcd60e51b8152600401610767906131ff565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610f2e903390309068bdbc41e0348b30000090600401613005565b602060405180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f809190612f13565b50600154604051630852cd8d60e31b81526001600160a01b03909116906342966c6890610fba9068bdbc41e0348b30000090600401613089565b600060405180830381600087803b158015610fd457600080fd5b505af1158015610fe8573d6000803e3d6000fd5b50505050610dac600c60008282546110009190613489565b92505081905550610dac600d600082825461101b9190613489565b925050819055506001600e60008282546110359190613489565b925050819055506001600f600082825461104f9190613489565b925050819055506001601460008282546110699190613489565b925050819055506001601560008282546110839190613489565b909155506110929050336126c9565b610dac82336001600160a01b03167f03debcf361d96deb44862dbee1d685b710b16b57543472c236047020d0e129bf60016040516110d09190613089565b60405180910390a46001600960008282546110eb91906134d4565b90915550505b81600214801561110357506000600a54115b156113ed576001546040516370a0823160e01b815269021e19e0c9bab2400000916001600160a01b0316906370a0823190611142903390600401612fd7565b60206040518083038186803b15801561115a57600080fd5b505afa15801561116e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111929190612f4b565b116111af5760405162461bcd60e51b815260040161076790613236565b69021e19e0c9bab24000008110156111d95760405162461bcd60e51b8152600401610767906131ff565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611217903390309069021e19e0c9bab240000090600401613005565b602060405180830381600087803b15801561123157600080fd5b505af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190612f13565b50600154604051630852cd8d60e31b81526001600160a01b03909116906342966c68906112a49069021e19e0c9bab240000090600401613089565b600060405180830381600087803b1580156112be57600080fd5b505af11580156112d2573d6000803e3d6000fd5b50505050612710600c60008282546112ea9190613489565b92505081905550612710600d60008282546113059190613489565b9250508190555060016010600082825461131f9190613489565b925050819055506001601160008282546113399190613489565b925050819055506001601460008282546113539190613489565b9250508190555060016015600082825461136d9190613489565b9091555061137c9050336126c9565b611385336126c9565b61138e336126c9565b61271082336001600160a01b03167f03debcf361d96deb44862dbee1d685b710b16b57543472c236047020d0e129bf60036040516113cc9190613089565b60405180910390a46003600a60008282546113e791906134d4565b90915550505b8160031480156113ff57506000600b54115b156116fb576001546040516370a0823160e01b81526903531944c1d5c0d00000916001600160a01b0316906370a082319061143e903390600401612fd7565b60206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f4b565b116114ab5760405162461bcd60e51b815260040161076790613236565b6903531944c1d5c0d000008110156114d55760405162461bcd60e51b8152600401610767906131ff565b6001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061151390339030906903531944c1d5c0d0000090600401613005565b602060405180830381600087803b15801561152d57600080fd5b505af1158015611541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115659190612f13565b50600154604051630852cd8d60e31b81526001600160a01b03909116906342966c68906115a0906903531944c1d5c0d0000090600401613089565b600060405180830381600087803b1580156115ba57600080fd5b505af11580156115ce573d6000803e3d6000fd5b50505050613d54600c60008282546115e69190613489565b92505081905550613d54600d60008282546116019190613489565b9250508190555060016012600082825461161b9190613489565b925050819055506001601360008282546116359190613489565b9250508190555060016014600082825461164f9190613489565b925050819055506001601560008282546116699190613489565b909155506116789050336126c9565b611681336126c9565b61168a336126c9565b611693336126c9565b61169c336126c9565b613d5482336001600160a01b03167f03debcf361d96deb44862dbee1d685b710b16b57543472c236047020d0e129bf60056040516116da9190613089565b60405180910390a46005600b60008282546116f591906134d4565b90915550505b505042601655565b60086020526000908152604090205481565b600d5481565b601a5481565b60105481565b601c5481565b6117356106ce565b6001600160a01b0316611746611abe565b6001600160a01b03161461176c5760405162461bcd60e51b8152600401610767906132e3565b6001600160a01b0381167316e83475eb4e783339847b6f07c531dab0d9f8e714156117d6576001600160a01b03811660009081526008602052604090205442906117b99062278d00613489565b106117d65760405162461bcd60e51b815260040161076790613191565b6001600160a01b038116732c6ca1cd20f310dda1be7e3679e4905ef8c3be3c1415611841576001600160a01b0381166000908152600860205260409020544290611824906301e13380613489565b106118415760405162461bcd60e51b815260040161076790613191565b60015460405163eb91e65160e01b81526001600160a01b039091169063eb91e65190611871908490600401612fd7565b600060405180830381600087803b15801561188b57600080fd5b505af115801561189f573d6000803e3d6000fd5b5050505050565b6118ae6106ce565b6001600160a01b03166118bf611abe565b6001600160a01b0316146118e55760405162461bcd60e51b8152600401610767906132e3565b6118ef60006128c3565b565b60175481565b601b5481565b600b5481565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006860154600787015460088801546009890154600a8a0154600b8b0154600c909b0154999b989a979996979596949593949293919290919060ff168d565b60125481565b61197b6106ce565b6001600160a01b031661198c611abe565b6001600160a01b0316146119b25760405162461bcd60e51b8152600401610767906132e3565b6119c481670de0b6b3a76400006134b5565b6001546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906119fa903090600401612fd7565b60206040518083038186803b158015611a1257600080fd5b505afa158015611a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612f4b565b905060008211611a6c5760405162461bcd60e51b81526004016107679061335e565b80821115611a8c5760405162461bcd60e51b815260040161076790613329565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061087e9033908690600401613029565b6000546001600160a01b031690565b60095481565b611adb6106ce565b6001600160a01b0316611aec611abe565b6001600160a01b031614611b125760405162461bcd60e51b8152600401610767906132e3565b600154604051634e7f216d60e11b81526001600160a01b0390911690639cfe42da90611b42908490600401612fd7565b600060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b505050506001600160a01b0381167316e83475eb4e783339847b6f07c531dab0d9f8e71480611bbb57506001600160a01b038116732c6ca1cd20f310dda1be7e3679e4905ef8c3be3c145b15611bdc576001600160a01b03811660009081526008602052604090204290555b50565b611be76106ce565b6001600160a01b0316611bf8611abe565b6001600160a01b031614611c1e5760405162461bcd60e51b8152600401610767906132e3565b8160011415611c2d5760098190555b8160021415611c3c57600a8190555b8160031415611c4b57600b8190555b5050565b6002602052600090815260409020805460019091015482565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b600e5481565b60145481565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b60185481565b33600090815260026020526040902054811115611d395760405162461bcd60e51b81526004016107679061326b565b6000601a54601754611d4b91906134d4565b1015611d695760405162461bcd60e51b815260040161076790613318565b33600090815260066020818152604080842085855282529283902083516101a0810185528154815260018201549281019290925260028101549382019390935260038301546060820152600483015460808201819052600584015460a083018190529284015460c0830152600784015460e083015260088401546101008301526009840154610120830152600a840154610140830152600b840154610160830152600c9093015460ff161515610180820152911415611e4f57611e2e426103e86134b5565b60c0820151611e41906301499700613489565b1015611e4f57600060a08201525b80608001518160a0015110156108d05760a0810151611e6f906001613489565b60a0820152611e80426103e86134b5565b60c080830191909152600084815260056020818152604080842081516101008101835281548152600182015493810184905260028201549281019290925260038101546060830152600481015460808301529283015460a082015260068301549481019490945260079091015460e084015281908190611eff90612913565b90508015611f7357611f148460600151612985565b8460400151611f239190613489565b9150611f3682662386f26fc100006134b5565b9150611f458460a00151612985565b8460800151611f549190613489565b92508461010001516001611f689190613489565b610100860152611f92565b611f808460e00151612985565b8460c00151611f8f9190613489565b92505b81601a6000828254611fa49190613489565b9091555050601b54601854600091611fbb916134d4565b1015611fde57601854601b54611fd191906134d4565b611fdb90836134d4565b91505b60e0850151611fee906001613489565b60e0860152610160850151612004908490613489565b61016086015261014085015161201b908390613489565b61014086019081523360008181526006602081815260408084208c85528252928390208a518155908a0151600180830191909155838b0151600283015560608b0151600383015560808b015160048084019190915560a08c0151600584015560c08c01519383019390935560e08b015160078301556101008b015160088301556101208b015160098301559451600a8201556101608a0151600b8201556101808a0151600c909101805460ff19169115159190911790559254905163a9059cbb60e01b81526001600160a01b039091169263a9059cbb92612100929091879101613029565b602060405180830381600087803b15801561211a57600080fd5b505af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190612f13565b507ff75e577f4c7c002e5da86b89a860ea87802b7c7fcb04952d5b237bfd3ce75567878783858760405161218a9594939291906133d1565b60405180910390a150505050505050565b6000601b546018546121ad91906134d4565b116121ca5760405162461bcd60e51b815260040161076790613318565b3360009081526007602081815260408084208585528252928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820181905260048401546080830152600584015460a0830152600684015460c0830152929091015460e08201529061225b5760405162461bcd60e51b815260040161076790613318565b6000808260200151600114156122c7576122b26103e8610b2185606001516122ac8760e001516305265c006122a28a60c00151426103e861229c91906134b5565b906129de565b6122ac91906134a1565b90612639565b91506122c46064610b21836062612639565b90505b826020015160011461232a576122df426103e86134b5565b60a084015160c08501516122f291612a20565b11156123105760405162461bcd60e51b815260040161076790613395565b608083015191506123276064610b21836061612639565b90505b81601b600082825461233c9190613489565b9091555050601b54601854600091612353916134d4565b101561237657601854601b5461236991906134d4565b61237390826134d4565b90505b336000908152600660209081526040808320600783528184208885528352818420600201548452909152812060090180548392906123b5908490613489565b909155505060608301516000906123cc9083613489565b336000818152600660209081526040808320600783528184208b8552835281842060020154845290915290819020600c01805460ff19169055600154905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb91612435918590600401613029565b602060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124879190612f13565b503360008181526006602081815260408084208982015185528252808420600190810185905585855260078084528286208c875290935281852085815590810185905560028101859055600381018590556004810185905560058101859055928301849055910191909155517f8e28f9b12f40c66446a041a9f1096458a0ec30799c2540ddb0ea1d209dbc61079161252491889085908790613063565b60405180910390a15050505050565b60115481565b60195481565b6006602081815260009384526040808520909152918352912080546001820154600283015460038401546004850154600586015496860154600787015460088801546009890154600a8a0154600b8b0154600c909b0154999b989a9799969895979596949593949293919290919060ff168d565b600c5481565b60135481565b6125c76106ce565b6001600160a01b03166125d8611abe565b6001600160a01b0316146125fe5760405162461bcd60e51b8152600401610767906132e3565b6001600160a01b0381166126245760405162461bcd60e51b815260040161076790613114565b611bdc816128c3565b60165481565b60155481565b60008261264857506000612681565b600061265483856134b5565b90508261266185836134a1565b1461267e5760405162461bcd60e51b8152600401610767906132a2565b90505b92915050565b600061267e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a4f565b60006126d3612a86565b600081815260046020818152604080842081516101a08101835281548152600180830154828601526002808401548386015260038401546060840152958301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546101008301526009830154610120830152600a830154610140830152600b830154610160830152600c9092015460ff1615156101808201526001600160a01b038916865293909252909220549293509161279491613489565b6001600160a01b03841660008181526002602081815260408320859055848652929091529052611f4011156127d2576127cc83612b7f565b60608201525b6001600160a01b038316600090815260026020526040902054611f4011612801576127fb612cc0565b60608201525b6001600160a01b039290921660009081526006602081815260408084206002808452828620548652908352938190208651815591860151600183015585015192810192909255606084015160038301556080840151600483015560a0840151600583015560c08401519082015560e0830151600782015561010083015160088201556101208301516009820155610140830151600a820155610160830151600b82015561018090920151600c909201805460ff19169215159290921790915550565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080606442601d600081548092919061292c906134eb565b919050553360405160200161294393929190612faf565b6040516020818303038152906040528051906020012060001c6129669190613506565b90508281101561297a576001915050612980565b60009150505b919050565b6000808242601d600081548092919061299d906134eb565b91905055336040516020016129b493929190612faf565b6040516020818303038152906040528051906020012060001c6129d79190613506565b9392505050565b600061267e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e88565b600080612a2d8385613489565b90508381101561267e5760405162461bcd60e51b81526004016107679061315a565b60008183612a705760405162461bcd60e51b81526004016107679190613092565b506000612a7d84866134a1565b95945050505050565b60008061271042601d6000815480929190612aa0906134eb565b9190505533604051602001612ab793929190612faf565b6040516020818303038152906040528051906020012060001c612ada9190613506565b90506117d4811015612af05760019150506106d0565b806117d411158015612b03575061216681105b15612b125760029150506106d0565b8061216611158015612b25575061261681105b15612b345760039150506106d0565b8061261611158015612b4757506126ed81105b15612b565760049150506106d0565b6126ed81111580612b68575061271081105b15612b775760059150506106d0565b600191505090565b600080612b8a612cc0565b6001600160a01b03841660009081526002602090815260409182902082518084019093528054835260019081015491830191909152919250905b8151811015612cb7576001600160a01b038516600090815260066020818152604080842085855282529283902083516101a081018552815481526001820154928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a08201529082015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c9091015460ff1615156101808201525b8060600151841415612ca457612c99612cc0565b935060009150612c85565b5080612caf816134eb565b915050612bc4565b50909392505050565b60008061271042601d6000815480929190612cda906134eb565b9190505533604051602001612cf193929190612faf565b6040516020818303038152906040528051906020012060001c612d149190613506565b9050600a811015612d8857601d80546103e8914291906000612d35836134eb565b9190505533604051602001612d4c93929190612faf565b6040516020818303038152906040528051906020012060001c612d6f9190613506565b612d7b826103e86134b5565b612d859190613489565b90505b80600a11158015612d995750606481105b15612e0557601d80546064914291906000612db3836134eb565b9190505533604051602001612dca93929190612faf565b6040516020818303038152906040528051906020012060001c612ded9190613506565b612df88260646134b5565b612e029190613489565b90505b80606411158015612e1757506103e881105b15612e8357601d8054600a914291906000612e31836134eb565b9190505533604051602001612e4893929190612faf565b6040516020818303038152906040528051906020012060001c612e6b9190613506565b612e7682600a6134b5565b612e809190613489565b90505b905090565b60008184841115612eac5760405162461bcd60e51b81526004016107679190613092565b506000612a7d84866134d4565b80356001600160a01b038116811461298057600080fd5b600060208284031215612ee1578081fd5b61267e82612eb9565b60008060408385031215612efc578081fd5b612f0583612eb9565b946020939093013593505050565b600060208284031215612f24578081fd5b8151801515811461267e578182fd5b600060208284031215612f44578081fd5b5035919050565b600060208284031215612f5c578081fd5b5051919050565b60008060408385031215612f75578182fd5b50508035926020909101359150565b600080600060608486031215612f98578081fd5b505081359360208301359350604090920135919050565b928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b90815260200190565b6000602080835283518082850152825b818110156130be578581018301518582016040015282016130a2565b818111156130cf5783604083870101525b50601f01601f1916929092016040019392505050565b602080825260159082015274446f6e74206861766120656e6f75676820454d534360581b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526019908201527f4c6f636b2074696d6520686173206e6f74206578706972656400000000000000604082015260600190565b6020808252601b908201527f54686973207573657220646f6e7420686176612061206865726f200000000000604082015260600190565b60208082526019908201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604082015260600190565b6020808252818101527f54686973207573657220646f6e74206861766120656e6f75676820454d534320604082015260600190565b6020808252601c908201527f54686973207573657220646f6e7420686176612074686520686f726500000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260009082015260400190565b6020808252818101527f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665604082015260600190565b6020808252601b908201527f596f75206e65656420746f2073656e6420736f6d652065746865720000000000604082015260600190565b602080825260149082015273151a5b59481a185cc81b9bdd08195e1c1a5c995960621b604082015260600190565b918252602082015260400190565b948552602085019390935290151560408401526060830152608082015260a00190565b978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b9c8d5260208d019b909b5260408c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015215156101808201526101a00190565b6000821982111561349c5761349c61351a565b500190565b6000826134b0576134b0613530565b500490565b60008160001904831182151516156134cf576134cf61351a565b500290565b6000828210156134e6576134e661351a565b500390565b60006000198214156134ff576134ff61351a565b5060010190565b60008261351557613515613530565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea2646970667358221220792f462b37850c6af96429116f5e841c3904b7933144bbdc4f866abaf01f04f264736f6c6343000800003360806040523480156200001157600080fd5b506040518060400160405280600e81526020016d22bc37ba34b19026b7b739ba32b960911b81525060405180604001604052806004815260200163454d534360e01b81525081600490805190602001906200006e929190620001a3565b50805162000084906005906020840190620001a3565b505050620000a4336a52b7d2dcc80cd2e4000000620000bc60201b60201c565b600680546001600160a01b03191633179055620002eb565b6001600160a01b038216620000ee5760405162461bcd60e51b8152600401620000e59062000249565b60405180910390fd5b620000fc600083836200019e565b806003600082825462000110919062000289565b90915550506001600160a01b038216600090815260208190526040812080548392906200013f90849062000289565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200018490859062000280565b60405180910390a36200019a600083836200019e565b5050565b505050565b828054620001b190620002ae565b90600052602060002090601f016020900481019282620001d5576000855562000220565b82601f10620001f057805160ff191683800117855562000220565b8280016001018555821562000220579182015b828111156200022057825182559160200191906001019062000203565b506200022e92915062000232565b5090565b5b808211156200022e576000815560010162000233565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620002a957634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620002c357607f821691505b60208210811415620002e557634e487b7160e01b600052602260045260246000fd5b50919050565b610d9980620002fb6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb146101de578063dd62ed3e146101f1578063eb91e65114610204578063f9f92be414610217576100f5565b806370a082311461019d57806395d89b41146101b05780639cfe42da146101b8578063a457c2d7146101cb576100f5565b806323b872dd116100d357806323b872dd1461014d578063313ce56714610160578063395093511461017557806342966c6814610188576100f5565b806306fdde03146100fa578063095ea7b31461011857806318160ddd14610138575b600080fd5b61010261022a565b60405161010f91906109a7565b60405180910390f35b61012b61012636600461095b565b6102bc565b60405161010f919061099c565b6101406102d9565b60405161010f9190610ccc565b61012b61015b366004610920565b6102df565b610168610378565b60405161010f9190610cd5565b61012b61018336600461095b565b61037d565b61019b610196366004610984565b6103d1565b005b6101406101ab3660046108cd565b6103de565b6101026103fd565b61019b6101c63660046108cd565b61040c565b61012b6101d936600461095b565b61043f565b61012b6101ec36600461095b565b6104b8565b6101406101ff3660046108ee565b6104cc565b61019b6102123660046108cd565b6104f7565b61012b6102253660046108cd565b61052a565b60606004805461023990610d12565b80601f016020809104026020016040519081016040528092919081815260200182805461026590610d12565b80156102b25780601f10610287576101008083540402835291602001916102b2565b820191906000526020600020905b81548152906001019060200180831161029557829003601f168201915b5050505050905090565b60006102d06102c961053f565b8484610543565b50600192915050565b60035490565b60006102ec8484846105f7565b6001600160a01b03841660009081526001602052604081208161030d61053f565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156103595760405162461bcd60e51b815260040161035090610b3e565b60405180910390fd5b61036d8561036561053f565b858403610543565b506001949350505050565b601290565b60006102d061038a61053f565b84846001600061039861053f565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546103cc9190610ce3565b610543565b6103db338261077f565b50565b6001600160a01b0381166000908152602081905260409020545b919050565b60606005805461023990610d12565b6006546001600160a01b031633146104365760405162461bcd60e51b815260040161035090610bc7565b6103db81610871565b6000806001600061044e61053f565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561049a5760405162461bcd60e51b815260040161035090610c87565b6104ae6104a561053f565b85858403610543565b5060019392505050565b60006102d06104c561053f565b84846105f7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6006546001600160a01b031633146105215760405162461bcd60e51b815260040161035090610bc7565b6103db81610895565b60026020526000908152604090205460ff1681565b3390565b6001600160a01b0383166105695760405162461bcd60e51b815260040161035090610c43565b6001600160a01b03821661058f5760405162461bcd60e51b815260040161035090610a7f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105ea908590610ccc565b60405180910390a3505050565b6001600160a01b03831661061d5760405162461bcd60e51b815260040161035090610bfe565b6001600160a01b0382166106435760405162461bcd60e51b8152600401610350906109fa565b6001600160a01b03831660009081526002602052604090205460ff1615801561068557506001600160a01b03821660009081526002602052604090205460ff16155b6106a15760405162461bcd60e51b815260040161035090610b07565b6106ac83838361086c565b6001600160a01b038316600090815260208190526040902054818110156106e55760405162461bcd60e51b815260040161035090610ac1565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061071c908490610ce3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107669190610ccc565b60405180910390a361077984848461086c565b50505050565b6001600160a01b0382166107a55760405162461bcd60e51b815260040161035090610b86565b6107b18260008361086c565b6001600160a01b038216600090815260208190526040902054818110156107ea5760405162461bcd60e51b815260040161035090610a3d565b6001600160a01b0383166000908152602081905260408120838303905560038054849290610819908490610cfb565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061085c908690610ccc565b60405180910390a361086c836000845b505050565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6001600160a01b03166000908152600260205260409020805460ff19169055565b80356001600160a01b03811681146103f857600080fd5b6000602082840312156108de578081fd5b6108e7826108b6565b9392505050565b60008060408385031215610900578081fd5b610909836108b6565b9150610917602084016108b6565b90509250929050565b600080600060608486031215610934578081fd5b61093d846108b6565b925061094b602085016108b6565b9150604084013590509250925092565b6000806040838503121561096d578182fd5b610976836108b6565b946020939093013593505050565b600060208284031215610995578081fd5b5035919050565b901515815260200190565b6000602080835283518082850152825b818110156109d3578581018301518582016040015282016109b7565b818111156109e45783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252601c908201527f45524332303a207573657220696e2074686520626c61636b6c69737400000000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526017908201527f55736572206d75737420626520436f6e74726f6c6c6572000000000000000000604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60008219821115610cf657610cf6610d4d565b500190565b600082821015610d0d57610d0d610d4d565b500390565b600281046001821680610d2657607f821691505b60208210811415610d4757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220771cb5053f4ee16ad725116dedefc2fad748f678e6f1f81b00f3ef30c9210cfd64736f6c63430008000033

Deployed ByteCode Sourcemap

27696:18505:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32856:40;32872:12;:10;:12::i;:::-;32886:9;32856:40;;;;;;;:::i;:::-;;;;;;;;27696:18505;;;;;29855:61;;;;;;;;;;-1:-1:-1;29855:61:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;33321:392;;;;;;;;;;-1:-1:-1;33321:392:0;;;;;:::i;:::-;;:::i;:::-;;30232:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30040:34::-;;;;;;;;;;;;;:::i;34941:1531::-;;;;;;;;;;-1:-1:-1;34941:1531:0;;;;;:::i;:::-;;:::i;38016:2972::-;;;;;;;;;;-1:-1:-1;38016:2972:0;;;;;:::i;:::-;;:::i;29929:51::-;;;;;;;;;;-1:-1:-1;29929:51:0;;;;;:::i;:::-;;:::i;30157:28::-;;;;;;;;;;;;;:::i;30746:33::-;;;;;;;;;;;;;:::i;30272:::-;;;;;;;;;;;;;:::i;30827:35::-;;;;;;;;;;;;;:::i;34409:520::-;;;;;;;;;;-1:-1:-1;34409:520:0;;;;;:::i;:::-;;:::i;19151:94::-;;;;;;;;;;;;;:::i;30562:53::-;;;;;;;;;;;;;:::i;30786:34::-;;;;;;;;;;;;;:::i;30081:::-;;;;;;;;;;;;;:::i;29671:37::-;;;;;;;;;;-1:-1:-1;29671:37:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;30352:33::-;;;;;;;;;;;;;:::i;32916:393::-;;;;;;;;;;-1:-1:-1;32916:393:0;;;;;:::i;:::-;;:::i;18500:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29999:34::-;;;;;;;;;;;;;:::i;34066:331::-;;;;;;;;;;-1:-1:-1;34066:331:0;;;;;:::i;:::-;;:::i;33721:333::-;;;;;;;;;;-1:-1:-1;33721:333:0;;;;;:::i;:::-;;:::i;29571:37::-;;;;;;;;;;-1:-1:-1;29571:37:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;29621:::-;;;;;;;;;;-1:-1:-1;29621:37:0;;;;;:::i;:::-;;:::i;30192:33::-;;;;;;;;;;;;;:::i;30432:32::-;;;;;;;;;;;;;:::i;29721:43::-;;;;;;;;;;-1:-1:-1;29721:43:0;;;;;:::i;:::-;;:::i;30622:54::-;;;;;;;;;;;;;:::i;41000:2244::-;;;;;;;;;;-1:-1:-1;41000:2244:0;;;;;:::i;:::-;;:::i;36484:1524::-;;;;;;;;;;-1:-1:-1;36484:1524:0;;;;;:::i;:::-;;:::i;30312:33::-;;;;;;;;;;;;;:::i;30683:56::-;;;;;;;;;;;;;:::i;29781:61::-;;;;;;;;;;-1:-1:-1;29781:61:0;;;;;:::i;:::-;;:::i;30122:28::-;;;;;;;;;;;;;:::i;30392:33::-;;;;;;;;;;;;;:::i;19400:192::-;;;;;;;;;;-1:-1:-1;19400:192:0;;;;;:::i;:::-;;:::i;30510:45::-;;;;;;;;;;;;;:::i;30471:32::-;;;;;;;;;;;;;:::i;4119:98::-;4199:10;4119:98;;:::o;29855:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33321:392::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;;;;;;;;;33408:16:::1;:6:::0;33417:7:::1;33408:16;:::i;:::-;33458:5;::::0;:27:::1;::::0;-1:-1:-1;;;33458:27:0;;33399:25;;-1:-1:-1;33437:18:0::1;::::0;-1:-1:-1;;;;;33458:5:0;;::::1;::::0;:15:::1;::::0;:27:::1;::::0;33474:10:::1;::::0;33458:27:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33437:48;;33523:1;33514:6;:10;33506:50;;;;-1:-1:-1::0;;;33506:50:0::1;;;;;;;:::i;:::-;33595:10;33585:6;:20;;33577:54;;;;-1:-1:-1::0;;;33577:54:0::1;;;;;;;:::i;:::-;33652:5;::::0;:53:::1;::::0;-1:-1:-1;;;33652:53:0;;-1:-1:-1;;;;;33652:5:0;;::::1;::::0;:18:::1;::::0;:53:::1;::::0;33671:10:::1;::::0;33691:4:::1;::::0;33698:6;;33652:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18791:1;33321:392:::0;:::o;30232:33::-;;;;:::o;30040:34::-;;;;:::o;34941:1531::-;35064:10;35031:20;35054:21;;;:9;:21;;;;;;;;:29;;;;;;;;;35031:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35112:16;;;;:46;;-1:-1:-1;35132:17:0;;;;:26;35112:46;:64;;;;;35172:4;35162:6;:14;;35112:64;35104:103;;;;-1:-1:-1;;;35104:103:0;;;;;;;:::i;:::-;35237:16;:6;35246:7;35237:16;:::i;:::-;35274:5;;:51;;-1:-1:-1;;;35274:51:0;;35228:25;;-1:-1:-1;;;;;;35274:5:0;;:18;;:51;;35293:10;;35312:4;;35228:25;;35274:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35380:10:0;35374:17;;;;:5;:17;;;;;:25;;;;;:29;;;:::i;:::-;35352:10;35346:17;;;;:5;:17;;;;;;;;:25;;;;:57;;;35424:9;:21;;;;;:29;;;;;;;;;:38;;:66;;;;35515:11;;35511:422;;35593:328;;;;;;;;35622:10;-1:-1:-1;35616:17:0;;;:5;:17;;;;;;;:25;;;;;35593:328;;35660:13;;;:5;:13;;;;;;:16;;;;35593:328;;;;;;;;;;;;;;;;35756:13;;;;;;;;:18;;;;;35593:328;;;;35745:40;;35780:4;;35745:30;;35720:6;;35745:10;:30::i;:::-;:34;;:40::i;:::-;35593:328;;35804:13;;;;:5;35593:328;35804:13;;;;;;;;:24;;;35593:328;;;;;35847:22;:15;35865:4;35847:22;:::i;:::-;35593:328;;35888:13;;;;:5;35593:328;35888:13;;;;;;;:18;;;;;35593:328;;;;;;;35552:10;35542:21;;;;;;;;35564:5;:17;;;;;;:25;;;;;35542:48;;;;;;;;;:379;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35511:422;35962:6;35957:1;:11;35953:385;;;36035:291;;;;;;;;36064:10;-1:-1:-1;36058:17:0;;;:5;:17;;;;;;;:25;;;;;36035:291;;36102:13;;;:5;:13;;;;;;:16;;;;36035:291;;;;;;;;;;;;;;;;;;;;;;36209:13;;;;;;;;:24;;;;;36035:291;;;;;;;36252:22;:15;36270:4;36252:22;:::i;:::-;36035:291;;36293:13;;;;:5;36035:291;36293:13;;;;;;;:18;;;;;36035:291;;;;;;;35994:10;35984:21;;;;;;;;36006:5;:17;;;;;;:25;;;;;35984:48;;;;;;;;;:342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35953:385;36368:10;36358:21;;;;:9;:21;;;;;;;;:29;;;;;;;;;;:38;;:45;;-1:-1:-1;;36358:45:0;36399:4;36358:45;;;36429:35;;;;;36448:6;;36457;;36429:35;:::i;:::-;;;;;;;;34941:1531;;;;:::o;38016:2972::-;38137:1;38123:8;38110:12;;:21;;;;:::i;:::-;38083:24;38099:8;38083:15;:24;:::i;:::-;38082:50;;;;:::i;:::-;38081:57;38078:232;;38166:1;38154:9;:13;;;38182:14;:18;;;38215:14;:18;;;38248:14;:18;;;38281:13;:17;38078:232;38350:5;;:42;;-1:-1:-1;;;38350:42:0;;38330:17;;-1:-1:-1;;;;;38350:5:0;;:15;;:42;;38366:10;;38386:4;;38350:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38330:62;;38413:5;38408:1;:10;:30;;;;;38437:1;38422:12;;:16;38408:30;38405:753;;;38462:5;;:27;;-1:-1:-1;;;38462:27:0;;38493:14;;-1:-1:-1;;;;;38462:5:0;;:15;;:27;;38478:10;;38462:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;38454:89;;;;-1:-1:-1;;;38454:89:0;;;;;;;:::i;:::-;38581:14;38568:9;:27;;38560:66;;;;-1:-1:-1;;;38560:66:0;;;;;;;:::i;:::-;38651:5;;:59;;-1:-1:-1;;;38651:59:0;;-1:-1:-1;;;;;38651:5:0;;;;:18;;:59;;38670:10;;38689:4;;38695:14;;38651:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38725:5:0;;:26;;-1:-1:-1;;;38725:26:0;;-1:-1:-1;;;;;38725:5:0;;;;:10;;:26;;38736:14;;38725:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38793:4;38780:9;;:17;;;;;;;:::i;:::-;;;;;;;;38825:4;38812:9;;:17;;;;;;;:::i;:::-;;;;;;;;38862:1;38844:14;;:19;;;;;;;:::i;:::-;;;;;;;;38896:1;38878:14;;:19;;;;;;;:::i;:::-;;;;;;;;38929:1;38912:13;;:18;;;;;;;:::i;:::-;;;;;;;;38962:1;38945:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;38992:26:0;;-1:-1:-1;39007:10:0;38992:14;:26::i;:::-;39079:4;39073:5;39062:10;-1:-1:-1;;;;;39052:34:0;;39084:1;39052:34;;;;;;:::i;:::-;;;;;;;;39131:1;39115:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;38405:753:0;39176:5;39171:1;:10;:30;;;;;39200:1;39185:12;;:16;39171:30;39168:834;;;39227:5;;:27;;-1:-1:-1;;;39227:27:0;;39258:15;;-1:-1:-1;;;;;39227:5:0;;:15;;:27;;39243:10;;39227:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;39219:90;;;;-1:-1:-1;;;39219:90:0;;;;;;;:::i;:::-;39347:15;39334:9;:28;;39326:67;;;;-1:-1:-1;;;39326:67:0;;;;;;;:::i;:::-;39422:5;;:60;;-1:-1:-1;;;39422:60:0;;-1:-1:-1;;;;;39422:5:0;;;;:18;;:60;;39441:10;;39460:4;;39466:15;;39422:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39497:5:0;;:27;;-1:-1:-1;;;39497:27:0;;-1:-1:-1;;;;;39497:5:0;;;;:10;;:27;;39508:15;;39497:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39566:5;39553:9;;:18;;;;;;;:::i;:::-;;;;;;;;39599:5;39586:9;;:18;;;;;;;:::i;:::-;;;;;;;;39637:1;39619:14;;:19;;;;;;;:::i;:::-;;;;;;;;39671:1;39653:14;;:19;;;;;;;:::i;:::-;;;;;;;;39704:1;39687:13;;:18;;;;;;;:::i;:::-;;;;;;;;39737:1;39720:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;39767:26:0;;-1:-1:-1;39782:10:0;39767:14;:26::i;:::-;39808;39823:10;39808:14;:26::i;:::-;39849;39864:10;39849:14;:26::i;:::-;39936:5;39930;39919:10;-1:-1:-1;;;;;39909:35:0;;39942:1;39909:35;;;;;;:::i;:::-;;;;;;;;39989:1;39973:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;39168:834:0;40020:5;40015:1;:10;:30;;;;;40044:1;40029:12;;:16;40015:30;40012:928;;;40071:5;;:27;;-1:-1:-1;;;40071:27:0;;40102:15;;-1:-1:-1;;;;;40071:5:0;;:15;;:27;;40087:10;;40071:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;40063:90;;;;-1:-1:-1;;;40063:90:0;;;;;;;:::i;:::-;40203:15;40190:9;:28;;40182:67;;;;-1:-1:-1;;;40182:67:0;;;;;;;:::i;:::-;40278:5;;:60;;-1:-1:-1;;;40278:60:0;;-1:-1:-1;;;;;40278:5:0;;;;:18;;:60;;40297:10;;40316:4;;40322:15;;40278:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40353:5:0;;:27;;-1:-1:-1;;;40353:27:0;;-1:-1:-1;;;;;40353:5:0;;;;:10;;:27;;40364:15;;40353:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40422:5;40409:9;;:18;;;;;;;:::i;:::-;;;;;;;;40455:5;40442:9;;:18;;;;;;;:::i;:::-;;;;;;;;40493:1;40475:14;;:19;;;;;;;:::i;:::-;;;;;;;;40527:1;40509:14;;:19;;;;;;;:::i;:::-;;;;;;;;40560:1;40543:13;;:18;;;;;;;:::i;:::-;;;;;;;;40593:1;40576:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;40623:26:0;;-1:-1:-1;40638:10:0;40623:14;:26::i;:::-;40664;40679:10;40664:14;:26::i;:::-;40705;40720:10;40705:14;:26::i;:::-;40746;40761:10;40746:14;:26::i;:::-;40787;40802:10;40787:14;:26::i;:::-;40874:5;40868;40857:10;-1:-1:-1;;;;;40847:35:0;;40880:1;40847:35;;;;;;:::i;:::-;;;;;;;;40927:1;40911:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;40012:928:0;-1:-1:-1;;40965:15:0;40950:12;:30;38016:2972::o;29929:51::-;;;;;;;;;;;;;:::o;30157:28::-;;;;:::o;30746:33::-;;;;:::o;30272:::-;;;;:::o;30827:35::-;;;;:::o;34409:520::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34490:59:0;::::1;34506:42;34490:59;34487:178;;;-1:-1:-1::0;;;;;34573:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;34608:15:::1;::::0;34573:32:::1;::::0;34598:7:::1;34573:32;:::i;:::-;:50;34565:88;;;;-1:-1:-1::0;;;34565:88:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34688:59:0;::::1;34704:42;34688:59;34685:179;;;-1:-1:-1::0;;;;;34771:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;34807:15:::1;::::0;34771:33:::1;::::0;34796:8:::1;34771:33;:::i;:::-;:51;34763:89;;;;-1:-1:-1::0;;;34763:89:0::1;;;;;;;:::i;:::-;34884:5;::::0;:27:::1;::::0;-1:-1:-1;;;34884:27:0;;-1:-1:-1;;;;;34884:5:0;;::::1;::::0;:21:::1;::::0;:27:::1;::::0;34906:4;;34884:27:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34409:520:::0;:::o;19151:94::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;19216:21:::1;19234:1;19216:9;:21::i;:::-;19151:94::o:0;30562:53::-;;;;:::o;30786:34::-;;;;:::o;30081:::-;;;;:::o;29671:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30352:33::-;;;;:::o;32916:393::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;33001:16:::1;:6:::0;33010:7:::1;33001:16;:::i;:::-;33059:5;::::0;:30:::1;::::0;-1:-1:-1;;;33059:30:0;;32992:25;;-1:-1:-1;33038:18:0::1;::::0;-1:-1:-1;;;;;33059:5:0;;::::1;::::0;:15:::1;::::0;:30:::1;::::0;33083:4:::1;::::0;33059:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33038:51;;33127:1;33118:6;:10;33110:50;;;;-1:-1:-1::0;;;33110:50:0::1;;;;;;;:::i;:::-;33199:10;33189:6;:20;;33181:65;;;;-1:-1:-1::0;;;33181:65:0::1;;;;;;;:::i;:::-;33267:5;::::0;:34:::1;::::0;-1:-1:-1;;;33267:34:0;;-1:-1:-1;;;;;33267:5:0;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;33282:10:::1;::::0;33294:6;;33267:34:::1;;;:::i;18500:87::-:0;18546:7;18573:6;-1:-1:-1;;;;;18573:6:0;18500:87;:::o;29999:34::-;;;;:::o;34066:331::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;34141:5:::1;::::0;:24:::1;::::0;-1:-1:-1;;;34141:24:0;;-1:-1:-1;;;;;34141:5:0;;::::1;::::0;:18:::1;::::0;:24:::1;::::0;34160:4;;34141:24:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;34189:59:0;::::1;34205:42;34189:59;::::0;:122:::1;;-1:-1:-1::0;;;;;;34252:59:0;::::1;34268:42;34252:59;34189:122;34186:194;;;-1:-1:-1::0;;;;;34328:22:0;::::1;;::::0;;;:16:::1;:22;::::0;;;;34353:15:::1;34328:40:::0;;34186:194:::1;34066:331:::0;:::o;33721:333::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;33815:5:::1;33824:1;33815:10;33811:62;;;33841:12;:20:::0;;;33811:62:::1;33897:5;33906:1;33897:10;33893:62;;;33923:12;:20:::0;;;33893:62:::1;33979:5;33988:1;33979:10;33975:62;;;34005:12;:20:::0;;;33975:62:::1;33721:333:::0;;:::o;29571:37::-;;;;;;;;;;;;;;;;;;;:::o;29621:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30192:33::-;;;;:::o;30432:32::-;;;;:::o;29721:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30622:54::-;;;;:::o;41000:2244::-;41103:10;41097:17;;;;:5;:17;;;;;:25;:39;-1:-1:-1;41097:39:0;41089:80;;;;-1:-1:-1;;;41089:80:0;;;;;;;:::i;:::-;41236:1;41218:14;;41198:17;;:34;;;;:::i;:::-;:39;;41190:51;;;;-1:-1:-1;;;41190:51:0;;;;;;;:::i;:::-;41295:10;41262:20;41285:21;;;:9;:21;;;;;;;;:33;;;;;;;;;41262:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41342:41;41339:195;;;41443:22;:15;41461:4;41443:22;:::i;:::-;41402:21;;;;:38;;41426:14;41402:38;:::i;:::-;:63;41399:124;;;41506:1;41485:18;;;:22;41399:124;41578:8;:19;;;41557:8;:18;;;:40;41554:1683;;;41636:18;;;;:22;;41657:1;41636:22;:::i;:::-;41615:18;;;:43;41711:22;:15;41729:4;41711:22;:::i;:::-;41687:21;;;;:46;;;;41750:32;41785:19;;;:8;:19;;;;;;;;41750:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;41930:37;;:11;:37::i;:::-;41912:55;;41999:10;41996:558;;;42087:44;42103:17;:27;;;42087:15;:44::i;:::-;42057:17;:27;;;:74;;;;:::i;:::-;42047:84;-1:-1:-1;42178:17:0;42047:84;42187:8;42178:17;:::i;:::-;42168:27;;42274:51;42290:17;:34;;;42274:15;:51::i;:::-;42241:17;:30;;;:84;;;;:::i;:::-;42232:93;;42386:8;:21;;;42410:1;42386:25;;;;:::i;:::-;42362:21;;;:49;41996:558;;;42490:48;42506:17;:31;;;42490:15;:48::i;:::-;42460:17;:27;;;:78;;;;:::i;:::-;42452:86;;41996:558;42600:6;42582:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;42659:15:0;;42638:18;;42677:1;;42638:36;;;:::i;:::-;:40;42635:135;;;42735:18;;42717:15;;:36;;;;:::i;:::-;42707:47;;:6;:47;:::i;:::-;42698:56;;42635:135;42819:18;;;;:22;;42840:1;42819:22;:::i;:::-;42798:18;;;:43;42887:14;;;;:22;;42904:5;;42887:22;:::i;:::-;42870:14;;;:39;42963:22;;;;:31;;42988:6;;42963:31;:::i;:::-;42938:22;;;:56;;;43033:10;43023:21;;;;:9;:21;;;;;;;;:33;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43023:44:0;;;;;;;;;;43096:5;;:34;;-1:-1:-1;;;43096:34:0;;-1:-1:-1;;;;;43096:5:0;;;;:14;;:34;;43033:10;;43123:6;;43096:34;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43164:59;43178:9;43188:10;43199;43210:6;43217:5;43164:59;;;;;;;;;;:::i;:::-;;;;;;;;41554:1683;;;;41000:2244;;;:::o;36484:1524::-;36592:1;36574:15;;36553:18;;:36;;;;:::i;:::-;:40;36545:52;;;;-1:-1:-1;;;36545:52:0;;;;;;;:::i;:::-;36649:10;36618:18;36639:21;;;:9;:21;;;;;;;;:29;;;;;;;;;36618:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36689:30;;;;-1:-1:-1;;;36689:30:0;;;;;;;:::i;:::-;36740:15;36770:14;36812:6;:9;;;36825:1;36812:14;36809:231;;;36852:115;36962:4;36852:105;36943:6;:13;;;36852:86;36926:6;:11;;;36904:15;36854:45;36883:6;:15;;;36855;36873:4;36855:22;;;;:::i;:::-;36854:28;;:45::i;:::-;36853:67;;;;:::i;:::-;36852:73;;:86::i;:115::-;36842:125;-1:-1:-1;37005:23:0;37024:3;37005:14;:6;37016:2;37005:10;:14::i;:23::-;36996:32;;36809:231;37053:6;:9;;;37066:1;37053:14;37050:245;;37129:22;:15;37147:4;37129:22;:::i;:::-;37106:17;;;;37086:15;;;;:38;;:19;:38::i;:::-;37085:66;;37077:99;;;;-1:-1:-1;;;37077:99:0;;;;;;;:::i;:::-;37209:13;;;;;-1:-1:-1;37260:23:0;37279:3;37260:14;:6;37271:2;37260:10;:14::i;:23::-;37251:32;;37050:245;37334:7;37315:15;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;37386:15:0;;37365:18;;37404:1;;37365:36;;;:::i;:::-;:40;37362:127;;;37458:18;;37440:15;;:36;;;;:::i;:::-;37430:47;;:6;:47;:::i;:::-;37421:56;;37362:127;37515:10;37505:21;;;;:9;:21;;;;;;;;37527:9;:21;;;;;:29;;;;;;;;:38;;;37505:61;;;;;;;:72;;:82;;37581:6;;37505:21;:82;;37581:6;;37505:82;:::i;:::-;;;;-1:-1:-1;;37634:13:0;;;;37608:14;;37625:22;;:6;:22;:::i;:::-;37678:10;37741:5;37668:21;;;:9;:21;;;;;;;;37690:9;:21;;;;;:29;;;;;;;;:38;;;37668:61;;;;;;;;;:70;;:78;;-1:-1:-1;;37668:78:0;;;;37759:5;:33;;-1:-1:-1;;;37759:33:0;;37608:39;;-1:-1:-1;;;;;;37759:5:0;;:14;;:33;;37608:39;;37759:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37823:10:0;37863:1;37813:21;;;:9;:21;;;;;;;;37835:15;;;;37813:38;;;;;;;:47;;;;:51;;;37892:21;;;:9;:21;;;;;;:29;;;;;;;;;37885:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37947:43;;;;;37914:6;;37975;;37983;;37947:43;:::i;:::-;;;;;;;;36484:1524;;;;;:::o;30312:33::-;;;;:::o;30683:56::-;;;;:::o;29781:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30122:28::-;;;;:::o;30392:33::-;;;;:::o;19400:192::-;18731:12;:10;:12::i;:::-;-1:-1:-1;;;;;18720:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18720:23:0;;18712:68;;;;-1:-1:-1;;;18712:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19489:22:0;::::1;19481:73;;;;-1:-1:-1::0;;;19481:73:0::1;;;;;;;:::i;:::-;19565:19;19575:8;19565:9;:19::i;30510:45::-:0;;;;:::o;30471:32::-;;;;:::o;21442:471::-;21500:7;21745:6;21741:47;;-1:-1:-1;21775:1:0;21768:8;;21741:47;21800:9;21812:5;21816:1;21812;:5;:::i;:::-;21800:17;-1:-1:-1;21845:1:0;21836:5;21840:1;21800:17;21836:5;:::i;:::-;:10;21828:56;;;;-1:-1:-1;;;21828:56:0;;;;;;;:::i;:::-;21904:1;-1:-1:-1;21442:471:0;;;;;:::o;22381:132::-;22439:7;22466:39;22470:1;22473;22466:39;;;;;;;;;;;;;;;;;:3;:39::i;43252:552::-;43323:17;43345:10;:8;:10::i;:::-;43374:19;43396:16;;;:5;:16;;;;;;;;43374:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43453:11:0;;;;;;;;;;;:19;43323:32;;-1:-1:-1;43374:38:0;43453:23;;;:::i;:::-;-1:-1:-1;;;;;43431:11:0;;;;;;:5;:11;;;;;;;:45;;;43495:38;;;43555:11;;;;;;43577:4;-1:-1:-1;43552:89:0;;;43614:16;43625:4;43614:10;:16::i;:::-;43597:14;;;:33;43552:89;-1:-1:-1;;;;;43653:11:0;;;;;;:5;:11;;;;;:19;43676:4;-1:-1:-1;43650:82:0;;43714:7;:5;:7::i;:::-;43696:14;;;:25;43650:82;-1:-1:-1;;;;;43750:15:0;;;;;;;;:9;:15;;;;;;;;43766:5;:11;;;;;;:19;43750:36;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43750:46:0;;;;;;;;;;;-1:-1:-1;43252:552:0:o;19600:173::-;19656:16;19675:6;;-1:-1:-1;;;;;19692:17:0;;;-1:-1:-1;;;;;;19692:17:0;;;;;;19725:40;;19675:6;;;;;;;19725:40;;19656:16;19725:40;19600:173;;:::o;44447:312::-;44518:4;44541:14;44637:3;44594:15;44611:7;;:9;;;;;;;;;:::i;:::-;;;;;44621:10;44577:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44567:66;;;;;;44559:75;;:81;;;;:::i;:::-;44541:99;;44666:13;44657:6;:22;44653:66;;;44703:4;44696:11;;;;;44653:66;44746:5;44739:12;;;44447:312;;;;:::o;44771:215::-;44839:7;44859:11;44951:6;44908:15;44925:7;;:9;;;;;;;;;:::i;:::-;;;;;44935:10;44891:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44881:66;;;;;;44873:75;;:84;;;;:::i;:::-;44859:98;44771:215;-1:-1:-1;;;44771:215:0:o;20568:136::-;20626:7;20653:43;20657:1;20660;20653:43;;;;;;;;;;;;;;;;;:3;:43::i;20112:181::-;20170:7;;20202:5;20206:1;20202;:5;:::i;:::-;20190:17;;20231:1;20226;:6;;20218:46;;;;-1:-1:-1;;;20218:46:0;;;;;;;:::i;23001:345::-;23087:7;23189:12;23182:5;23174:28;;;;-1:-1:-1;;;23174:28:0;;;;;;;;:::i;:::-;-1:-1:-1;23213:9:0;23225:5;23229:1;23225;:5;:::i;:::-;23213:17;23001:345;-1:-1:-1;;;;;23001:345:0:o;43812:623::-;43858:7;43884:14;43982:5;43938:15;43955:7;;:9;;;;;;;;;:::i;:::-;;;;;43965:10;43921:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43911:66;;;;;;43903:75;;43902:85;;;;:::i;:::-;43884:103;-1:-1:-1;44037:4:0;44028:6;:13;44009:69;;;44065:1;44058:8;;;;;44009:69;44100:6;44092:4;:14;;:31;;;;;44119:4;44110:6;:13;44092:31;44088:72;;;44147:1;44140:8;;;;;44088:72;44182:6;44174:4;:14;;:31;;;;;44201:4;44192:6;:13;44174:31;44170:72;;;44229:1;44222:8;;;;;44170:72;44264:6;44256:4;:14;;:31;;;;;44283:4;44274:6;:13;44256:31;44252:72;;;44311:1;44304:8;;;;;44252:72;44348:4;44338:6;:14;;:32;;;;44365:5;44356:6;:14;44338:32;44334:73;;;44394:1;44387:8;;;;;44334:73;44426:1;44419:8;;;43812:623;:::o;44998:441::-;45064:7;45084:14;45102:7;:5;:7::i;:::-;-1:-1:-1;;;;;45139:18:0;;45120:16;45139:18;;;:5;:18;;;;;;;;;45120:37;;;;;;;;;;;;;;;;;;;;;;;;45084:25;;-1:-1:-1;45120:37:0;45168:240;45191:12;;45187:16;;45168:240;;;-1:-1:-1;;;;;45248:22:0;;45225:20;45248:22;;;:9;:22;;;;;;;;:25;;;;;;;;;45225:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45288:109;45304:8;:15;;;45294:6;:25;45288:109;;;45350:7;:5;:7::i;:::-;45340:17;;45380:1;45376:5;;45288:109;;;-1:-1:-1;45206:3:0;;;;:::i;:::-;;;;45168:240;;;-1:-1:-1;45425:6:0;;44998:441;-1:-1:-1;;;44998:441:0:o;45451:747::-;45493:7;45513:14;45609:5;45566:15;45583:7;;:9;;;;;;;;;:::i;:::-;;;;;45593:10;45549:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45539:66;;;;;;45531:75;;:83;;;;:::i;:::-;45513:101;-1:-1:-1;45653:2:0;45644:6;:11;45625:164;;;45747:7;:9;;45773:4;;45730:15;;45747:9;:7;:9;;;:::i;:::-;;;;;45757:10;45713:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45703:66;;;;;;45695:75;;:82;;;;:::i;:::-;45681:11;:6;45688:4;45681:11;:::i;:::-;:96;;;;:::i;:::-;45672:105;;45625:164;45819:6;45813:2;:12;;:28;;;;;45838:3;45829:6;:12;45813:28;45809:164;;;45932:7;:9;;45958:3;;45915:15;;45932:9;:7;:9;;;:::i;:::-;;;;;45942:10;45898:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45888:66;;;;;;45880:75;;:81;;;;:::i;:::-;45867:10;:6;45874:3;45867:10;:::i;:::-;:94;;;;:::i;:::-;45858:103;;45809:164;46004:6;45997:3;:13;;:30;;;;;46023:4;46014:6;:13;45997:30;45993:164;;;46117:7;:9;;46143:2;;46100:15;;46117:9;:7;:9;;;:::i;:::-;;;;;46127:10;46083:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46073:66;;;;;;46065:75;;:80;;;;:::i;:::-;46053:9;:6;46060:2;46053:9;:::i;:::-;:92;;;;:::i;:::-;46044:101;;45993:164;46184:6;-1:-1:-1;45451:747:0;:::o;20999:192::-;21085:7;21121:12;21113:6;;;;21105:29;;;;-1:-1:-1;;;21105:29:0;;;;;;;;:::i;:::-;-1:-1:-1;21145:9:0;21157:5;21161:1;21157;:5;:::i;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:266::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;653:2;638:18;;;;625:32;;-1:-1:-1;;;484:179:1:o;668:297::-;;788:2;776:9;767:7;763:23;759:32;756:2;;;809:6;801;794:22;756:2;846:9;840:16;899:5;892:13;885:21;878:5;875:32;865:2;;926:6;918;911:22;970:190;;1082:2;1070:9;1061:7;1057:23;1053:32;1050:2;;;1103:6;1095;1088:22;1050:2;-1:-1:-1;1131:23:1;;1040:120;-1:-1:-1;1040:120:1:o;1165:194::-;;1288:2;1276:9;1267:7;1263:23;1259:32;1256:2;;;1309:6;1301;1294:22;1256:2;-1:-1:-1;1337:16:1;;1246:113;-1:-1:-1;1246:113:1:o;1364:258::-;;;1493:2;1481:9;1472:7;1468:23;1464:32;1461:2;;;1514:6;1506;1499:22;1461:2;-1:-1:-1;;1542:23:1;;;1612:2;1597:18;;;1584:32;;-1:-1:-1;1451:171:1:o;1627:326::-;;;;1773:2;1761:9;1752:7;1748:23;1744:32;1741:2;;;1794:6;1786;1779:22;1741:2;-1:-1:-1;;1822:23:1;;;1892:2;1877:18;;1864:32;;-1:-1:-1;1943:2:1;1928:18;;;1915:32;;1731:222;-1:-1:-1;1731:222:1:o;1958:359::-;2143:19;;;2187:2;2178:12;;2171:28;;;;2237:2;2233:15;-1:-1:-1;;2229:53:1;2224:2;2215:12;;2208:75;2308:2;2299:12;;2133:184::o;2322:203::-;-1:-1:-1;;;;;2486:32:1;;;;2468:51;;2456:2;2441:18;;2423:102::o;2530:304::-;-1:-1:-1;;;;;2760:15:1;;;2742:34;;2812:15;;2807:2;2792:18;;2785:43;2692:2;2677:18;;2659:175::o;2839:405::-;-1:-1:-1;;;;;3127:15:1;;;3109:34;;3179:15;;;;3174:2;3159:18;;3152:43;3226:2;3211:18;;3204:34;;;;3059:2;3044:18;;3026:218::o;4448:274::-;-1:-1:-1;;;;;4640:32:1;;;;4622:51;;4704:2;4689:18;;4682:34;4610:2;4595:18;;4577:145::o;4727:345::-;-1:-1:-1;;;;;4947:32:1;;;;4929:51;;5011:2;4996:18;;4989:34;;;;5054:2;5039:18;;5032:34;4917:2;4902:18;;4884:188::o;5077:417::-;-1:-1:-1;;;;;5326:32:1;;;;5308:51;;5390:2;5375:18;;5368:34;;;;5433:2;5418:18;;5411:34;5476:2;5461:18;;5454:34;5295:3;5280:19;;5262:232::o;5499:207::-;5675:25;;;5663:2;5648:18;;5630:76::o;6704:603::-;;6845:2;6874;6863:9;6856:21;6906:6;6900:13;6949:6;6944:2;6933:9;6929:18;6922:34;6974:4;6987:140;7001:6;6998:1;6995:13;6987:140;;;7096:14;;;7092:23;;7086:30;7062:17;;;7081:2;7058:26;7051:66;7016:10;;6987:140;;;7145:6;7142:1;7139:13;7136:2;;;7215:4;7210:2;7201:6;7190:9;7186:22;7182:31;7175:45;7136:2;-1:-1:-1;7291:2:1;7270:15;-1:-1:-1;;7266:29:1;7251:45;;;;7298:2;7247:54;;6825:482;-1:-1:-1;;;6825:482:1:o;7312:345::-;7514:2;7496:21;;;7553:2;7533:18;;;7526:30;-1:-1:-1;;;7587:2:1;7572:18;;7565:51;7648:2;7633:18;;7486:171::o;7662:402::-;7864:2;7846:21;;;7903:2;7883:18;;;7876:30;7942:34;7937:2;7922:18;;7915:62;-1:-1:-1;;;8008:2:1;7993:18;;7986:36;8054:3;8039:19;;7836:228::o;8069:351::-;8271:2;8253:21;;;8310:2;8290:18;;;8283:30;8349:29;8344:2;8329:18;;8322:57;8411:2;8396:18;;8243:177::o;8425:349::-;8627:2;8609:21;;;8666:2;8646:18;;;8639:30;8705:27;8700:2;8685:18;;8678:55;8765:2;8750:18;;8599:175::o;8779:351::-;8981:2;8963:21;;;9020:2;9000:18;;;8993:30;9059:29;9054:2;9039:18;;9032:57;9121:2;9106:18;;8953:177::o;9135:349::-;9337:2;9319:21;;;9376:2;9356:18;;;9349:30;9415:27;9410:2;9395:18;;9388:55;9475:2;9460:18;;9309:175::o;9489:356::-;9691:2;9673:21;;;9710:18;;;9703:30;9769:34;9764:2;9749:18;;9742:62;9836:2;9821:18;;9663:182::o;9850:352::-;10052:2;10034:21;;;10091:2;10071:18;;;10064:30;10130;10125:2;10110:18;;10103:58;10193:2;10178:18;;10024:178::o;10207:397::-;10409:2;10391:21;;;10448:2;10428:18;;;10421:30;10487:34;10482:2;10467:18;;10460:62;-1:-1:-1;;;10553:2:1;10538:18;;10531:31;10594:3;10579:19;;10381:223::o;10609:356::-;10811:2;10793:21;;;10830:18;;;10823:30;10889:34;10884:2;10869:18;;10862:62;10956:2;10941:18;;10783:182::o;10970:287::-;11172:2;11154:21;;;10970:287;11191:18;;;11184:32;11248:2;11233:18;;11144:113::o;11262:356::-;11464:2;11446:21;;;11483:18;;;11476:30;11542:34;11537:2;11522:18;;11515:62;11609:2;11594:18;;11436:182::o;11623:351::-;11825:2;11807:21;;;11864:2;11844:18;;;11837:30;11903:29;11898:2;11883:18;;11876:57;11965:2;11950:18;;11797:177::o;11979:344::-;12181:2;12163:21;;;12220:2;12200:18;;;12193:30;-1:-1:-1;;;12254:2:1;12239:18;;12232:50;12314:2;12299:18;;12153:170::o;12510:248::-;12684:25;;;12740:2;12725:18;;12718:34;12672:2;12657:18;;12639:119::o;12763:473::-;13016:25;;;13072:2;13057:18;;13050:34;;;;13127:14;;13120:22;13115:2;13100:18;;13093:50;13174:2;13159:18;;13152:34;13217:3;13202:19;;13195:35;13003:3;12988:19;;12970:266::o;13241:679::-;13584:25;;;13640:2;13625:18;;13618:34;;;;13683:2;13668:18;;13661:34;;;;13726:2;13711:18;;13704:34;;;;13769:3;13754:19;;13747:35;13813:3;13798:19;;13791:35;13857:3;13842:19;;13835:35;13901:3;13886:19;;13879:35;13571:3;13556:19;;13538:382::o;13925:1055::-;14405:25;;;14461:2;14446:18;;14439:34;;;;14504:2;14489:18;;14482:34;;;;14547:2;14532:18;;14525:34;;;;14590:3;14575:19;;14568:35;;;;14634:3;14619:19;;14612:35;;;;14678:3;14663:19;;14656:35;;;;14722:3;14707:19;;14700:35;14766:3;14751:19;;14744:35;14810:3;14795:19;;14788:35;14854:3;14839:19;;14832:36;14899:3;14884:19;;14877:36;14957:15;14950:23;14944:3;14929:19;;14922:52;14392:3;14377:19;;14359:621::o;14985:128::-;;15056:1;15052:6;15049:1;15046:13;15043:2;;;15062:18;;:::i;:::-;-1:-1:-1;15098:9:1;;15033:80::o;15118:120::-;;15184:1;15174:2;;15189:18;;:::i;:::-;-1:-1:-1;15223:9:1;;15164:74::o;15243:168::-;;15349:1;15345;15341:6;15337:14;15334:1;15331:21;15326:1;15319:9;15312:17;15308:45;15305:2;;;15356:18;;:::i;:::-;-1:-1:-1;15396:9:1;;15295:116::o;15416:125::-;;15484:1;15481;15478:8;15475:2;;;15489:18;;:::i;:::-;-1:-1:-1;15526:9:1;;15465:76::o;15546:135::-;;-1:-1:-1;;15606:17:1;;15603:2;;;15626:18;;:::i;:::-;-1:-1:-1;15673:1:1;15662:13;;15593:88::o;15686:112::-;;15744:1;15734:2;;15749:18;;:::i;:::-;-1:-1:-1;15783:9:1;;15724:74::o;15803:127::-;15864:10;15859:3;15855:20;15852:1;15845:31;15895:4;15892:1;15885:15;15919:4;15916:1;15909:15;15935:127;15996:10;15991:3;15987:20;15984:1;15977:31;16027:4;16024:1;16017:15;16051:4;16048:1;16041:15

Swarm Source

ipfs://771cb5053f4ee16ad725116dedefc2fad748f678e6f1f81b00f3ef30c9210cfd
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.