ETH Price: $3,184.40 (-4.60%)
 

Overview

Max Total Supply

100,000,000 BXR

Holders

46

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2.885030969610271444 BXR

Value
$0.00
0xb9fcd147f33d6cc2bb4dcee2979c4fa94bf1a288
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
boxerinu

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-26
*/

// SPDX-License-Identifier: MIT

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/[email protected]

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/[email protected]

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/[email protected]

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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");

        _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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]

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 @openzeppelin/contracts/utils/math/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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


// File contracts/interface/IUniswapV2Router02.sol

pragma solidity >0.6.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// File contracts/apecyborg.sol

pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;
contract boxerinu is ERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public buyBackWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
    uint256 public tradingActiveBlock; 
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBuyBackFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBuyBackFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForBuyBack;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    mapping (address => bool) public _isExcludedFromContractBuyingLimit;

    // blacklist the address
    mapping (address => bool) private _blackListAddr;
    uint256 public blackListFee;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    // decreasing tax 
    bool public _decreasing;
    uint256 private _percent;
    uint256 private _perBlock;
    uint256 private _limit;
    uint256 private _prevUpdatedBlock;

    modifier onlyNonContract {
        if (_isExcludedFromContractBuyingLimit[msg.sender]) {
            _;
        } else {
            require(!address(msg.sender).isContract(), 'Contract not allowed to call');
            _;
        }
    }

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event buyBackWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event BuyBackTriggered(uint256 amount);

    constructor() ERC20("Boxer Inu", "BXR") {

        address newOwner = msg.sender;
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyMarketingFee = 7;
        uint256 _buyLiquidityFee = 1;
        uint256 _buyBuyBackFee = 2;

        
        uint256 _sellMarketingFee = 15;
        uint256 _sellLiquidityFee = 2;
        uint256 _sellBuyBackFee = 3;
        
        uint256 totalSupply = 1 * 1e8 * 1e18; // 100 million
        
        maxTransactionAmount = totalSupply * 20 / 1000; // 0.1% maxTransactionAmountTxn
        // swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet
        swapTokensAtAmount = 1000 * 1e18; 
        maxWallet = totalSupply * 20 / 1000; // 0.5% max wallet

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyBuyBackFee = _buyBuyBackFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBuyBackFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellBuyBackFee = _sellBuyBackFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBuyBackFee;
        
        blackListFee = 99;

    	marketingWallet = msg.sender; // set as marketing wallet
    	buyBackWallet = msg.sender; // set as buyback wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(buyBackWallet, true);
        
        excludeFromMaxTransaction(newOwner, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(buyBackWallet, true);
        excludeFromMaxTransaction(address(0xdead), true);

        _isExcludedFromContractBuyingLimit[address(this)] = true;
        _isExcludedFromContractBuyingLimit[0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D] = true;
        _isExcludedFromContractBuyingLimit[address(uniswapV2Pair)] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {

  	}

    function decreaseTax(uint256 percent, uint256 perBlock, uint256 limit) external onlyOwner {
        _decreasing = true;
        _prevUpdatedBlock = block.number;
        _percent = percent;
        _perBlock = perBlock;
        _limit = limit;
    }

    function disableDecreasingTax() external onlyOwner {
        _decreasing = false;
    }

    function enableContractAddressTrading(address addr) external onlyOwner {
        require(addr.isContract(), 'Only contract address is allowed!');
        _isExcludedFromContractBuyingLimit[addr] = true;
    }

    function disableContractAddressTrading(address addr) external onlyOwner {
        require(addr.isContract(), 'Only contract address is allowed!');
        _isExcludedFromContractBuyingLimit[addr] = false;
    }
    // Enable Trading
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
    }

    // Disable Trading
    function disableTrading() external onlyOwner {
        tradingActive = false;
        swapEnabled = false;
        tradingActiveBlock = 0;
    }
     
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }

    function enableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = true;
        return true;
    }

    function blackListAddress(address addr) external onlyOwner returns (bool) {
        _blackListAddr[addr] = true;
        return true;
    }
    
    function blackListAddresses(address[] memory addrs) external onlyOwner returns (bool) {
        for(uint256 i = 0; i < addrs.length; i++) {
            _blackListAddr[addrs[i]] = true;
        }
        return true;
    }

    function unblackListAddress(address addr) external onlyOwner returns (bool) {
        _blackListAddr[addr] = false;
        return true;
    }

    function unblackListAddresses(address[] memory addrs) external onlyOwner returns (bool) {
        for(uint256 i = 0; i < addrs.length; i++) {
            _blackListAddr[addrs[i]] = false;
        }
        return true;
    }

    function setBlackListFee(uint256 _fee) external onlyOwner returns (bool) {
        blackListFee = _fee;
        return true;
    }
    
    // remove limits after token is stable
    function updateLimitsInEffect(bool limitEffect) external onlyOwner returns (bool){
        limitsInEffect = limitEffect;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function setMaxTransactionAmount(uint256 newNum) external onlyOwner {
        maxTransactionAmount = newNum * (10**18);
    }

    function setMaxWalletAmount(uint256 newNum) external onlyOwner {
        maxWallet = newNum * (10**18);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function setBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _buyBackFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyBuyBackFee = _buyBackFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBuyBackFee;
        // require(buyTotalFees <= 15, "Must keep fees at 15% or less");
        if (_decreasing) {
            uint256 const10 = 10;
            _limit = const10.sub(_liquidityFee);
        }
    }
    
    function setSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _buyBackFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellBuyBackFee = _buyBackFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBuyBackFee;
        // require(sellTotalFees <= 15, "Must keep fees at 30% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function setMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }
    
    function setBuyBackWallet(address newWallet) external onlyOwner {
        emit buyBackWalletUpdated(newWallet, buyBackWallet);
        buyBackWallet = newWallet;
    }
    
    function clearStuckBNBBalance(address addr) external onlyOwner{
        (bool sent,) =payable(addr).call{value: (address(this).balance)}("");
        require(sent);
    }

    function clearStuckTokenBalance(address addr, address tokenAddress) external onlyOwner{
        uint256 _bal = IERC20(tokenAddress).balanceOf(address(this));
        IERC20(tokenAddress).safeTransfer(addr, _bal);
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override onlyNonContract {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if (_blackListAddr[from] || _blackListAddr[to]) {
            uint256 feeAmount = amount * blackListFee / 100;
            uint256 restAmount = amount - feeAmount;
            super._transfer(from, address(this), feeAmount);
            super._transfer(from, to, restAmount);
            return;
        }

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (_decreasing && _limit > 0 && _perBlock > 0 && _percent > 0) {
            // require(_prevBuyMarketingFee < buyMarketingFee, "");
            uint256 curBlockNumber = block.number;
            if (curBlockNumber.sub(_prevUpdatedBlock) > _perBlock) {
                uint256 deductAmount = curBlockNumber.sub(_prevUpdatedBlock).div(_perBlock) * _percent;
                if (deductAmount >= buyMarketingFee + _limit) {
                    _decreasing = false;
                    buyMarketingFee = _limit;
                    buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBuyBackFee;
                } else {
                    if (buyMarketingFee - deductAmount > _limit) {
                        buyMarketingFee = buyMarketingFee - deductAmount;
                        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBuyBackFee;
                        _prevUpdatedBlock = curBlockNumber;
                    } else {
                        _decreasing = false;
                        buyMarketingFee = _limit;
                        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBuyBackFee;
                    }
                }
            }
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
        
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            if(tradingActiveBlock + 2 >= block.number && (automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from])){
                fees = amount.mul(99).div(100);
                tokensForLiquidity += fees * 33 / 99;
                tokensForBuyBack += fees * 33 / 99;
                tokensForMarketing += fees * 33 / 99;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForBuyBack += fees * sellBuyBackFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForBuyBack += fees * buyBuyBackFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForBuyBack;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForBuyBack = ethBalance.mul(tokensForBuyBack).div(totalTokensToSwap);
        
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForBuyBack;
        
        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForBuyBack = 0;
        
        (bool success,) = address(marketingWallet).call{value: ethForMarketing}("");
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        // keep leftover ETH for buyback
        (success,) = address(buyBackWallet).call{value: address(this).balance}("");
    }
    
    // useful for buybacks or to reclaim any BNB on the contract in a way that helps holders.
    function buyBackTokens(uint256 bnbAmountInWei) external onlyOwner {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
        emit BuyBackTriggered(bnbAmountInWei);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"buyBackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[],"name":"_decreasing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromContractBuyingLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"blackListAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"blackListAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blackListFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bnbAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"clearStuckBNBBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"clearStuckTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"perBlock","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"decreaseTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"disableContractAddressTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableDecreasingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"enableContractAddressTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setBlackListFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setBuyBackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buyBackFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buyBackFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"unblackListAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"unblackListAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"limitEffect","type":"bool"}],"name":"updateLimitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600c8054600160ff19918216811762ffff001916909255600f805490911690911790553480156200003457600080fd5b5060405180604001604052806009815260200168426f78657220496e7560b81b81525060405180604001604052806003815260200162212c2960e91b81525081600390805190602001906200008b929190620007d3565b508051620000a1906004906020840190620007d3565b505050620000be620000b86200049e60201b60201c565b620004a2565b33737a250d5630b4cf539739df2c5dacb4c659f2488d620000e1816001620004f4565b806001600160a01b03166080816001600160a01b031660601b81525050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200013857600080fd5b505afa1580156200014d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000173919062000879565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001bc57600080fd5b505afa158015620001d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f7919062000879565b6040518363ffffffff1660e01b815260040162000216929190620008a9565b602060405180830381600087803b1580156200023157600080fd5b505af115801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c919062000879565b600680546001600160a01b0319166001600160a01b0392831617908190556200029891166001620004f4565b600654620002b1906001600160a01b031660016200056e565b600760016002600f8160036a52b7d2dcc80cd2e40000006103e8620002d8826014620009c5565b620002e49190620009a4565b600955683635c9adc5dea00000600a556103e862000304826014620009c5565b620003109190620009a4565b600b55601187905560128690556013859055846200032f878962000989565b6200033b919062000989565b601055601584905560168390556017829055816200035a848662000989565b62000366919062000989565b6014556063601f5560078054336001600160a01b031991821681179092556008805490911690911790556200039d896001620005c1565b620003aa306001620005c1565b620003b961dead6001620005c1565b600854620003d2906001600160a01b03166001620005c1565b620003df896001620004f4565b620003ec306001620004f4565b60085462000405906001600160a01b03166001620004f4565b6200041461dead6001620004f4565b306000908152601d60205260408082208054600160ff1991821681179092557f8103d83ffc7442b4d4b2de196808679d4cd54aa09ff1c14c4990815f34df37b880548216831790556006546001600160a01b03168452919092208054909116909117905562000484898262000669565b6200048f8962000742565b50505050505050505062000a3a565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004fe6200049e565b6001600160a01b031662000511620007bf565b6001600160a01b031614620005435760405162461bcd60e51b81526004016200053a9062000914565b60405180910390fd5b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6001600160a01b0382166000818152602080526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620005cb6200049e565b6001600160a01b0316620005de620007bf565b6001600160a01b031614620006075760405162461bcd60e51b81526004016200053a9062000914565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7906200065d908490620008c3565b60405180910390a25050565b6001600160a01b038216620006925760405162461bcd60e51b81526004016200053a9062000949565b620006a060008383620007ce565b8060026000828254620006b4919062000989565b90915550506001600160a01b03821660009081526020819052604081208054839290620006e390849062000989565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200072890859062000980565b60405180910390a36200073e60008383620007ce565b5050565b6200074c6200049e565b6001600160a01b03166200075f620007bf565b6001600160a01b031614620007885760405162461bcd60e51b81526004016200053a9062000914565b6001600160a01b038116620007b15760405162461bcd60e51b81526004016200053a90620008ce565b620007bc81620004a2565b50565b6005546001600160a01b031690565b505050565b828054620007e190620009e7565b90600052602060002090601f01602090048101928262000805576000855562000850565b82601f106200082057805160ff191683800117855562000850565b8280016001018555821562000850579182015b828111156200085057825182559160200191906001019062000833565b506200085e92915062000862565b5090565b5b808211156200085e576000815560010162000863565b6000602082840312156200088b578081fd5b81516001600160a01b0381168114620008a2578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200099f576200099f62000a24565b500190565b600082620009c057634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620009e257620009e262000a24565b500290565b600281046001821680620009fc57607f821691505b6020821081141562000a1e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160601c61469c62000a9860003960008181610da701528181611cd701528181611dee0152818161237a01528181612cd901528181613809015281816138df0152818161391b0152818161399501526139d1015261469c6000f3fe60806040526004361061041f5760003560e01c8063857ebd4b1161021e578063c876d0b911610123578063ee40166e116100ab578063f63743421161007a578063f637434214610b56578063f77dbdc614610b6b578063f8b45b0514610b8b578063fc155d1d14610ba0578063fe98afed14610bc057610426565b8063ee40166e14610af7578063f11a24d314610b0c578063f22857a814610b21578063f2fde38b14610b3657610426565b8063d85ba063116100f2578063d85ba06314610a78578063dd62ed3e14610a8d578063e2f4560514610aad578063e3f8da5514610ac2578063e884f26014610ae257610426565b8063c876d0b914610a19578063c8c8ebe414610a2e578063d049901814610a43578063d498031214610a6357610426565b80639a7a23d6116101a6578063a9059cbb11610175578063a9059cbb14610984578063afa4f3b2146109a4578063b62496f5146109c4578063bbc0c742146109e4578063c0246668146109f957610426565b80639a7a23d614610904578063a457c2d714610924578063a4640b8214610944578063a67096e21461096457610426565b80638da5cb5b116101ed5780638da5cb5b14610885578063921369131461089a578063924de9b7146108af5780639485b9d8146108cf57806395d89b41146108ef57610426565b8063857ebd4b1461081b57806387dbd21d1461083b5780638a8c523c146108505780638b992b111461086557610426565b8063313ce567116103245780635d098b38116102ac578063715018a61161027b578063715018a61461079c5780637571336a146107b157806375f0a874146107d15780637bce5a04146107e6578063800db58e146107fb57610426565b80635d098b38146107325780636a486a8e146107525780636ddd17131461076757806370a082311461077c57610426565b806349bd5a5e116102f357806349bd5a5e146106a85780634a62bb65146106bd5780634fbee193146106d257806351c7cd5f146106f257806352ba99211461071257610426565b8063313ce5671461063157806339509351146106535780633b0e01331461067357806345d377a41461069357610426565b80631a221dbb116103a75780631f3fed8f116103765780631f3fed8f146105b25780631fe70a98146105c757806323b872dd146105dc57806327a14fc2146105fc57806327c8f8351461061c57610426565b80631a221dbb146105535780631a8145bb146105685780631cd348c01461057d5780631e293c101461059257610426565b80630f683e90116103ee5780630f683e90146104c757806310d5de53146104e75780631694505e1461050757806317700f011461052957806318160ddd1461053e57610426565b806306fdde031461042b578063095ea7b3146104565780630b166d50146104835780630d075d9c146104a557610426565b3661042657005b600080fd5b34801561043757600080fd5b50610440610be0565b60405161044d9190613f1c565b60405180910390f35b34801561046257600080fd5b50610476610471366004613c66565b610c72565b60405161044d9190613edc565b34801561048f57600080fd5b50610498610c8f565b60405161044d91906144be565b3480156104b157600080fd5b506104c56104c0366004613dba565b610c95565b005b3480156104d357600080fd5b506104c56104e2366004613dba565b610d25565b3480156104f357600080fd5b50610476610502366004613b89565b610d90565b34801561051357600080fd5b5061051c610da5565b60405161044d9190613e74565b34801561053557600080fd5b506104c5610dc9565b34801561054a57600080fd5b50610498610e1b565b34801561055f57600080fd5b50610498610e21565b34801561057457600080fd5b50610498610e27565b34801561058957600080fd5b5061051c610e2d565b34801561059e57600080fd5b506104c56105ad366004613d8a565b610e3c565b3480156105be57600080fd5b50610498610e93565b3480156105d357600080fd5b50610498610e99565b3480156105e857600080fd5b506104766105f7366004613bf9565b610e9f565b34801561060857600080fd5b506104c5610617366004613d8a565b610f31565b34801561062857600080fd5b5061051c610f88565b34801561063d57600080fd5b50610646610f8e565b60405161044d9190614519565b34801561065f57600080fd5b5061047661066e366004613c66565b610f93565b34801561067f57600080fd5b5061047661068e366004613b89565b610fe7565b34801561069f57600080fd5b50610476611055565b3480156106b457600080fd5b5061051c61105e565b3480156106c957600080fd5b5061047661106d565b3480156106de57600080fd5b506104766106ed366004613b89565b611076565b3480156106fe57600080fd5b506104c561070d366004613dba565b611094565b34801561071e57600080fd5b5061047661072d366004613c91565b6110f2565b34801561073e57600080fd5b506104c561074d366004613b89565b6111a9565b34801561075e57600080fd5b50610498611245565b34801561077357600080fd5b5061047661124b565b34801561078857600080fd5b50610498610797366004613b89565b61125a565b3480156107a857600080fd5b506104c5611275565b3480156107bd57600080fd5b506104c56107cc366004613c39565b6112c0565b3480156107dd57600080fd5b5061051c61132a565b3480156107f257600080fd5b50610498611339565b34801561080757600080fd5b506104c5610816366004613b89565b61133f565b34801561082757600080fd5b50610476610836366004613b89565b6113d0565b34801561084757600080fd5b506104c5611436565b34801561085c57600080fd5b506104c5611481565b34801561087157600080fd5b50610476610880366004613d8a565b6114e2565b34801561089157600080fd5b5061051c61152c565b3480156108a657600080fd5b5061049861153b565b3480156108bb57600080fd5b506104c56108ca366004613d52565b611541565b3480156108db57600080fd5b506104c56108ea366004613b89565b61159c565b3480156108fb57600080fd5b50610440611648565b34801561091057600080fd5b506104c561091f366004613c39565b611657565b34801561093057600080fd5b5061047661093f366004613c66565b6116ce565b34801561095057600080fd5b506104c561095f366004613b89565b611747565b34801561097057600080fd5b506104c561097f366004613bc1565b6117e3565b34801561099057600080fd5b5061047661099f366004613c66565b6118b7565b3480156109b057600080fd5b506104766109bf366004613d8a565b6118cb565b3480156109d057600080fd5b506104766109df366004613b89565b611915565b3480156109f057600080fd5b50610476611929565b348015610a0557600080fd5b506104c5610a14366004613c39565b611937565b348015610a2557600080fd5b506104766119d6565b348015610a3a57600080fd5b506104986119df565b348015610a4f57600080fd5b50610476610a5e366004613c91565b6119e5565b348015610a6f57600080fd5b50610498611a9c565b348015610a8457600080fd5b50610498611aa2565b348015610a9957600080fd5b50610498610aa8366004613bc1565b611aa8565b348015610ab957600080fd5b50610498611ad3565b348015610ace57600080fd5b50610476610add366004613d52565b611ad9565b348015610aee57600080fd5b50610476611b31565b348015610b0357600080fd5b50610498611b82565b348015610b1857600080fd5b50610498611b88565b348015610b2d57600080fd5b50610476611b8e565b348015610b4257600080fd5b506104c5610b51366004613b89565b611be3565b348015610b6257600080fd5b50610498611c54565b348015610b7757600080fd5b50610476610b86366004613b89565b611c5a565b348015610b9757600080fd5b50610498611c6f565b348015610bac57600080fd5b506104c5610bbb366004613d8a565b611c75565b348015610bcc57600080fd5b506104c5610bdb366004613b89565b611e9d565b606060038054610bef906145c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1b906145c1565b8015610c685780601f10610c3d57610100808354040283529160200191610c68565b820191906000526020600020905b815481529060010190602001808311610c4b57829003601f168201915b5050505050905090565b6000610c86610c7f611f2b565b8484611f2f565b50600192915050565b601a5481565b610c9d611f2b565b6001600160a01b0316610cae61152c565b6001600160a01b031614610cdd5760405162461bcd60e51b8152600401610cd490614295565b60405180910390fd5b60118390556012829055601381905580610cf78385614527565b610d019190614527565b60105560215460ff1615610d2057600a610d1b8184611fe3565b602455505b505050565b610d2d611f2b565b6001600160a01b0316610d3e61152c565b6001600160a01b031614610d645760405162461bcd60e51b8152600401610cd490614295565b60158390556016829055601781905580610d7e8385614527565b610d889190614527565b601455505050565b601c6020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610dd1611f2b565b6001600160a01b0316610de261152c565b6001600160a01b031614610e085760405162461bcd60e51b8152600401610cd490614295565b600c805462ffff00191690556000600d55565b60025490565b60175481565b60195481565b6008546001600160a01b031681565b610e44611f2b565b6001600160a01b0316610e5561152c565b6001600160a01b031614610e7b5760405162461bcd60e51b8152600401610cd490614295565b610e8d81670de0b6b3a764000061455f565b60095550565b60185481565b60135481565b6000610eac848484611fef565b6001600160a01b038416600090815260016020526040812081610ecd611f2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610f105760405162461bcd60e51b8152600401610cd49061424d565b610f2485610f1c611f2b565b858403611f2f565b60019150505b9392505050565b610f39611f2b565b6001600160a01b0316610f4a61152c565b6001600160a01b031614610f705760405162461bcd60e51b8152600401610cd490614295565b610f8281670de0b6b3a764000061455f565b600b5550565b61dead81565b601290565b6000610c86610fa0611f2b565b848460016000610fae611f2b565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610fe29190614527565b611f2f565b6000610ff1611f2b565b6001600160a01b031661100261152c565b6001600160a01b0316146110285760405162461bcd60e51b8152600401610cd490614295565b506001600160a01b0381166000908152601e60205260409020805460ff191660019081179091555b919050565b60215460ff1681565b6006546001600160a01b031681565b600c5460ff1681565b6001600160a01b03166000908152601b602052604090205460ff1690565b61109c611f2b565b6001600160a01b03166110ad61152c565b6001600160a01b0316146110d35760405162461bcd60e51b8152600401610cd490614295565b6021805460ff1916600117905543602555602292909255602355602455565b60006110fc611f2b565b6001600160a01b031661110d61152c565b6001600160a01b0316146111335760405162461bcd60e51b8152600401610cd490614295565b60005b8251811015610c86576001601e600085848151811061116557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806111a1816145fc565b915050611136565b6111b1611f2b565b6001600160a01b03166111c261152c565b6001600160a01b0316146111e85760405162461bcd60e51b8152600401610cd490614295565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b600c5462010000900460ff1681565b6001600160a01b031660009081526020819052604090205490565b61127d611f2b565b6001600160a01b031661128e61152c565b6001600160a01b0316146112b45760405162461bcd60e51b8152600401610cd490614295565b6112be60006132a9565b565b6112c8611f2b565b6001600160a01b03166112d961152c565b6001600160a01b0316146112ff5760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6007546001600160a01b031681565b60115481565b611347611f2b565b6001600160a01b031661135861152c565b6001600160a01b03161461137e5760405162461bcd60e51b8152600401610cd490614295565b611390816001600160a01b03166132fb565b6113ac5760405162461bcd60e51b8152600401610cd4906143ee565b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b60006113da611f2b565b6001600160a01b03166113eb61152c565b6001600160a01b0316146114115760405162461bcd60e51b8152600401610cd490614295565b506001600160a01b03166000908152601e60205260409020805460ff19169055600190565b61143e611f2b565b6001600160a01b031661144f61152c565b6001600160a01b0316146114755760405162461bcd60e51b8152600401610cd490614295565b6021805460ff19169055565b611489611f2b565b6001600160a01b031661149a61152c565b6001600160a01b0316146114c05760405162461bcd60e51b8152600401610cd490614295565b600c805462ff00001961ff001990911661010017166201000017905543600d55565b60006114ec611f2b565b6001600160a01b03166114fd61152c565b6001600160a01b0316146115235760405162461bcd60e51b8152600401610cd490614295565b50601f55600190565b6005546001600160a01b031690565b60155481565b611549611f2b565b6001600160a01b031661155a61152c565b6001600160a01b0316146115805760405162461bcd60e51b8152600401610cd490614295565b600c8054911515620100000262ff000019909216919091179055565b6115a4611f2b565b6001600160a01b03166115b561152c565b6001600160a01b0316146115db5760405162461bcd60e51b8152600401610cd490614295565b6000816001600160a01b0316476040516115f490613e71565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061164457600080fd5b5050565b606060048054610bef906145c1565b61165f611f2b565b6001600160a01b031661167061152c565b6001600160a01b0316146116965760405162461bcd60e51b8152600401610cd490614295565b6006546001600160a01b03838116911614156116c45760405162461bcd60e51b8152600401610cd49061404a565b6116448282613301565b600080600160006116dd611f2b565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156117295760405162461bcd60e51b8152600401610cd490614479565b61173d611734611f2b565b85858403611f2f565b5060019392505050565b61174f611f2b565b6001600160a01b031661176061152c565b6001600160a01b0316146117865760405162461bcd60e51b8152600401610cd490614295565b6008546040516001600160a01b03918216918316907f15e571905a1c816ac9ad091c2b82079da1ad3668d345e3894c424c5e5b47d97b90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6117eb611f2b565b6001600160a01b03166117fc61152c565b6001600160a01b0316146118225760405162461bcd60e51b8152600401610cd490614295565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190611851903090600401613e74565b60206040518083038186803b15801561186957600080fd5b505afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190613da2565b9050610d206001600160a01b0383168483613354565b6000610c866118c4611f2b565b8484611fef565b60006118d5611f2b565b6001600160a01b03166118e661152c565b6001600160a01b03161461190c5760405162461bcd60e51b8152600401610cd490614295565b50600a55600190565b602080526000908152604090205460ff1681565b600c54610100900460ff1681565b61193f611f2b565b6001600160a01b031661195061152c565b6001600160a01b0316146119765760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7906119ca908490613edc565b60405180910390a25050565b600f5460ff1681565b60095481565b60006119ef611f2b565b6001600160a01b0316611a0061152c565b6001600160a01b031614611a265760405162461bcd60e51b8152600401610cd490614295565b60005b8251811015610c86576000601e6000858481518110611a5857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a94816145fc565b915050611a29565b601f5481565b60105481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6000611ae3611f2b565b6001600160a01b0316611af461152c565b6001600160a01b031614611b1a5760405162461bcd60e51b8152600401610cd490614295565b50600c805460ff1916911515919091179055600190565b6000611b3b611f2b565b6001600160a01b0316611b4c61152c565b6001600160a01b031614611b725760405162461bcd60e51b8152600401610cd490614295565b50600f805460ff19169055600190565b600d5481565b60125481565b6000611b98611f2b565b6001600160a01b0316611ba961152c565b6001600160a01b031614611bcf5760405162461bcd60e51b8152600401610cd490614295565b50600f805460ff1916600190811790915590565b611beb611f2b565b6001600160a01b0316611bfc61152c565b6001600160a01b031614611c225760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b038116611c485760405162461bcd60e51b8152600401610cd490613fc2565b611c51816132a9565b50565b60165481565b601d6020526000908152604090205460ff1681565b600b5481565b611c7d611f2b565b6001600160a01b0316611c8e61152c565b6001600160a01b031614611cb45760405162461bcd60e51b8152600401610cd490614295565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2e57600080fd5b505afa158015611d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d669190613ba5565b81600081518110611d8757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611dc957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de95908490611e3090600090869061dead904290600401613ee7565b6000604051808303818588803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051611e9191906144be565b60405180910390a15050565b611ea5611f2b565b6001600160a01b0316611eb661152c565b6001600160a01b031614611edc5760405162461bcd60e51b8152600401610cd490614295565b611eee816001600160a01b03166132fb565b611f0a5760405162461bcd60e51b8152600401610cd4906143ee565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b3390565b6001600160a01b038316611f555760405162461bcd60e51b8152600401610cd490614346565b6001600160a01b038216611f7b5760405162461bcd60e51b8152600401610cd490614008565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611fd69085906144be565b60405180910390a3505050565b6000610f2a828461457e565b336000908152601d602052604090205460ff161561294b576001600160a01b03831661202d5760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166120535760405162461bcd60e51b8152600401610cd490613f4f565b6001600160a01b0383166000908152601e602052604090205460ff168061209257506001600160a01b0382166000908152601e602052604090205460ff165b156120e05760006064601f54836120a9919061455f565b6120b3919061453f565b905060006120c1828461457e565b90506120ce8530846133aa565b6120d98585836133aa565b5050612946565b806120f6576120f1838360006133aa565b612946565b60215460ff16801561210a57506000602454115b801561211857506000602354115b801561212657506000602254115b1561224c5760235460255443919061213f908390611fe3565b111561224a57600060225461216b60235461216560255486611fe390919063ffffffff16565b906134d4565b612175919061455f565b90506024546011546121879190614527565b81106121c3576021805460ff19169055602454601181905560135460125490916121b19190614527565b6121bb9190614527565b601055612248565b602454816011546121d4919061457e565b111561221657806011546121e8919061457e565b601181905560135460125490916121ff9190614527565b6122099190614527565b6010556025829055612248565b6021805460ff191690556024546011819055601354601254909161223a9190614527565b6122449190614527565b6010555b505b505b600c5460ff161561254a5761225f61152c565b6001600160a01b0316836001600160a01b031614158015612299575061228361152c565b6001600160a01b0316826001600160a01b031614155b80156122ad57506001600160a01b03821615155b80156122c457506001600160a01b03821661dead14155b80156122da5750600654600160a01b900460ff16155b1561254a57600c54610100900460ff16612349576001600160a01b0383166000908152601b602052604090205460ff168061232d57506001600160a01b0382166000908152601b602052604090205460ff165b6123495760405162461bcd60e51b8152600401610cd490613f92565b600f5460ff161561240f5761235c61152c565b6001600160a01b0316826001600160a01b0316141580156123af57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156123c957506006546001600160a01b03838116911614155b1561240f57326000908152600e602052604090205443116123fc5760405162461bcd60e51b8152600401610cd4906141de565b326000908152600e602052604090204390555b6001600160a01b038316600090815260208052604090205460ff16801561244f57506001600160a01b0382166000908152601c602052604090205460ff16155b156124af576009548111156124765760405162461bcd60e51b8152600401610cd490614189565b600b546124828361125a565b61248c9083614527565b11156124aa5760405162461bcd60e51b8152600401610cd4906143c1565b61254a565b6001600160a01b038216600090815260208052604090205460ff1680156124ef57506001600160a01b0383166000908152601c602052604090205460ff16155b15612516576009548111156124aa5760405162461bcd60e51b8152600401610cd4906140ed565b600b546125228361125a565b61252c9083614527565b111561254a5760405162461bcd60e51b8152600401610cd4906143c1565b60006125553061125a565b600a54909150811080159081906125745750600c5462010000900460ff165b801561258a5750600654600160a01b900460ff16155b80156125ae57506001600160a01b038516600090815260208052604090205460ff16155b80156125d357506001600160a01b0385166000908152601b602052604090205460ff16155b80156125f857506001600160a01b0384166000908152601b602052604090205460ff16155b15612626576006805460ff60a01b1916600160a01b1790556126186134e0565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b90920482161591168061267457506001600160a01b0385166000908152601b602052604090205460ff165b1561267d575060005b600081156129365743600d5460026126959190614527565b101580156126db57506001600160a01b038616600090815260208052604090205460ff16806126db57506001600160a01b038716600090815260208052604090205460ff165b15612781576126f06064612165876063613709565b905060636126ff82602161455f565b612709919061453f565b6019600082825461271a9190614527565b909155506063905061272d82602161455f565b612737919061453f565b601a60008282546127489190614527565b909155506063905061275b82602161455f565b612765919061453f565b601860008282546127769190614527565b909155506129189050565b6001600160a01b038616600090815260208052604090205460ff1680156127aa57506000601454115b1561283c576127c960646121656014548861370990919063ffffffff16565b9050601454601654826127dc919061455f565b6127e6919061453f565b601960008282546127f79190614527565b909155505060145460175461280c908361455f565b612816919061453f565b601a60008282546128279190614527565b909155505060145460155461275b908361455f565b6001600160a01b038716600090815260208052604090205460ff16801561286557506000601054115b156129185761288460646121656010548861370990919063ffffffff16565b905060105460125482612897919061455f565b6128a1919061453f565b601960008282546128b29190614527565b90915550506010546013546128c7908361455f565b6128d1919061453f565b601a60008282546128e29190614527565b90915550506010546011546128f7908361455f565b612901919061453f565b601860008282546129129190614527565b90915550505b8015612929576129298730836133aa565b612933818661457e565b94505b6129418787876133aa565b505050505b610d20565b612954336132fb565b156129715760405162461bcd60e51b8152600401610cd49061430f565b6001600160a01b0383166129975760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166129bd5760405162461bcd60e51b8152600401610cd490613f4f565b6001600160a01b0383166000908152601e602052604090205460ff16806129fc57506001600160a01b0382166000908152601e602052604090205460ff165b15612a4a5760006064601f5483612a13919061455f565b612a1d919061453f565b90506000612a2b828461457e565b9050612a388530846133aa565b612a438585836133aa565b5050610d20565b80612a5b57612946838360006133aa565b60215460ff168015612a6f57506000602454115b8015612a7d57506000602354115b8015612a8b57506000602254115b15612bab57602354602554439190612aa4908390611fe3565b1115612ba9576000602254612aca60235461216560255486611fe390919063ffffffff16565b612ad4919061455f565b9050602454601154612ae69190614527565b8110612b22576021805460ff1916905560245460118190556013546012549091612b109190614527565b612b1a9190614527565b601055612ba7565b60245481601154612b33919061457e565b1115612b755780601154612b47919061457e565b60118190556013546012549091612b5e9190614527565b612b689190614527565b6010556025829055612ba7565b6021805460ff1916905560245460118190556013546012549091612b999190614527565b612ba39190614527565b6010555b505b505b600c5460ff1615612ea957612bbe61152c565b6001600160a01b0316836001600160a01b031614158015612bf85750612be261152c565b6001600160a01b0316826001600160a01b031614155b8015612c0c57506001600160a01b03821615155b8015612c2357506001600160a01b03821661dead14155b8015612c395750600654600160a01b900460ff16155b15612ea957600c54610100900460ff16612ca8576001600160a01b0383166000908152601b602052604090205460ff1680612c8c57506001600160a01b0382166000908152601b602052604090205460ff165b612ca85760405162461bcd60e51b8152600401610cd490613f92565b600f5460ff1615612d6e57612cbb61152c565b6001600160a01b0316826001600160a01b031614158015612d0e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015612d2857506006546001600160a01b03838116911614155b15612d6e57326000908152600e60205260409020544311612d5b5760405162461bcd60e51b8152600401610cd4906141de565b326000908152600e602052604090204390555b6001600160a01b038316600090815260208052604090205460ff168015612dae57506001600160a01b0382166000908152601c602052604090205460ff16155b15612e0e57600954811115612dd55760405162461bcd60e51b8152600401610cd490614189565b600b54612de18361125a565b612deb9083614527565b1115612e095760405162461bcd60e51b8152600401610cd4906143c1565b612ea9565b6001600160a01b038216600090815260208052604090205460ff168015612e4e57506001600160a01b0383166000908152601c602052604090205460ff16155b15612e7557600954811115612e095760405162461bcd60e51b8152600401610cd4906140ed565b600b54612e818361125a565b612e8b9083614527565b1115612ea95760405162461bcd60e51b8152600401610cd4906143c1565b6000612eb43061125a565b600a5490915081108015908190612ed35750600c5462010000900460ff165b8015612ee95750600654600160a01b900460ff16155b8015612f0d57506001600160a01b038516600090815260208052604090205460ff16155b8015612f3257506001600160a01b0385166000908152601b602052604090205460ff16155b8015612f5757506001600160a01b0384166000908152601b602052604090205460ff16155b15612f85576006805460ff60a01b1916600160a01b179055612f776134e0565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680612fd357506001600160a01b0385166000908152601b602052604090205460ff165b15612fdc575060005b600081156132955743600d546002612ff49190614527565b1015801561303a57506001600160a01b038616600090815260208052604090205460ff168061303a57506001600160a01b038716600090815260208052604090205460ff165b156130e05761304f6064612165876063613709565b9050606361305e82602161455f565b613068919061453f565b601960008282546130799190614527565b909155506063905061308c82602161455f565b613096919061453f565b601a60008282546130a79190614527565b90915550606390506130ba82602161455f565b6130c4919061453f565b601860008282546130d59190614527565b909155506132779050565b6001600160a01b038616600090815260208052604090205460ff16801561310957506000601454115b1561319b5761312860646121656014548861370990919063ffffffff16565b90506014546016548261313b919061455f565b613145919061453f565b601960008282546131569190614527565b909155505060145460175461316b908361455f565b613175919061453f565b601a60008282546131869190614527565b90915550506014546015546130ba908361455f565b6001600160a01b038716600090815260208052604090205460ff1680156131c457506000601054115b15613277576131e360646121656010548861370990919063ffffffff16565b9050601054601254826131f6919061455f565b613200919061453f565b601960008282546132119190614527565b9091555050601054601354613226908361455f565b613230919061453f565b601a60008282546132419190614527565b9091555050601054601154613256908361455f565b613260919061453f565b601860008282546132719190614527565b90915550505b8015613288576132888730836133aa565b613292818661457e565b94505b6132a08787876133aa565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3b151590565b6001600160a01b0382166000818152602080526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b610d208363a9059cbb60e01b8484604051602401613373929190613e88565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613715565b6001600160a01b0383166133d05760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166133f65760405162461bcd60e51b8152600401610cd490613f4f565b613401838383610d20565b6001600160a01b0383166000908152602081905260409020548181101561343a5760405162461bcd60e51b8152600401610cd4906140a7565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613471908490614527565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bb91906144be565b60405180910390a36134ce848484610d20565b50505050565b6000610f2a828461453f565b60006134eb3061125a565b90506000601a546018546019546135029190614527565b61350c9190614527565b9050811580613519575080155b156135255750506112be565b600060028260195485613538919061455f565b613542919061453f565b61354c919061453f565b9050600061355a8483611fe3565b905047613566826137a4565b60006135724783611fe3565b9050600061358f866121656018548561370990919063ffffffff16565b905060006135ac87612165601a548661370990919063ffffffff16565b90506000816135bb848661457e565b6135c5919061457e565b600060198190556018819055601a81905560075460405192935090916001600160a01b039091169085906135f890613e71565b60006040518083038185875af1925050503d8060008114613635576040519150601f19603f3d011682016040523d82523d6000602084013e61363a565b606091505b5050905060008811801561364e5750600082115b1561369b5761365d888361398f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561878360195460405161369293929190614503565b60405180910390a15b6008546040516001600160a01b039091169047906136b890613e71565b60006040518083038185875af1925050503d80600081146136f5576040519150601f19603f3d011682016040523d82523d6000602084013e6136fa565b606091505b50505050505050505050505050565b6000610f2a828461455f565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a6e9092919063ffffffff16565b805190915015610d2057808060200190518101906137889190613d6e565b610d205760405162461bcd60e51b8152600401610cd49061442f565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137e757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561386057600080fd5b505afa158015613874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138989190613ba5565b816001815181106138b957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050613904307f000000000000000000000000000000000000000000000000000000000000000084611f2f565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906139599085906000908690309042906004016144c7565b600060405180830381600087803b15801561397357600080fd5b505af1158015613987573d6000803e3d6000fd5b505050505050565b6139ba307f000000000000000000000000000000000000000000000000000000000000000084611f2f565b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f305d719908390613a159030908790600090819061dead904290600401613ea1565b6060604051808303818588803b158015613a2e57600080fd5b505af1158015613a42573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613a679190613de5565b5050505050565b6060613a7d8484600085613a85565b949350505050565b606082471015613aa75760405162461bcd60e51b8152600401610cd490614143565b613ab0856132fb565b613acc5760405162461bcd60e51b8152600401610cd49061438a565b600080866001600160a01b03168587604051613ae89190613e55565b60006040518083038185875af1925050503d8060008114613b25576040519150601f19603f3d011682016040523d82523d6000602084013e613b2a565b606091505b5091509150613b3a828286613b45565b979650505050505050565b60608315613b54575081610f2a565b825115613b645782518084602001fd5b8160405162461bcd60e51b8152600401610cd49190613f1c565b803561105081614643565b600060208284031215613b9a578081fd5b8135610f2a81614643565b600060208284031215613bb6578081fd5b8151610f2a81614643565b60008060408385031215613bd3578081fd5b8235613bde81614643565b91506020830135613bee81614643565b809150509250929050565b600080600060608486031215613c0d578081fd5b8335613c1881614643565b92506020840135613c2881614643565b929592945050506040919091013590565b60008060408385031215613c4b578182fd5b8235613c5681614643565b91506020830135613bee81614658565b60008060408385031215613c78578182fd5b8235613c8381614643565b946020939093013593505050565b60006020808385031215613ca3578182fd5b823567ffffffffffffffff80821115613cba578384fd5b818501915085601f830112613ccd578384fd5b813581811115613cdf57613cdf61462d565b83810260405185828201018181108582111715613cfe57613cfe61462d565b604052828152858101935084860182860187018a1015613d1c578788fd5b8795505b83861015613d4557613d3181613b7e565b855260019590950194938601938601613d20565b5098975050505050505050565b600060208284031215613d63578081fd5b8135610f2a81614658565b600060208284031215613d7f578081fd5b8151610f2a81614658565b600060208284031215613d9b578081fd5b5035919050565b600060208284031215613db3578081fd5b5051919050565b600080600060608486031215613dce578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215613df9578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613e4a5781516001600160a01b031687529582019590820190600101613e25565b509495945050505050565b60008251613e67818460208701614595565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b600085825260806020830152613f006080830186613e12565b6001600160a01b03949094166040830152506060015292915050565b6000602082528251806020840152613f3b816040850160208701614595565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601c908201527f436f6e7472616374206e6f7420616c6c6f77656420746f2063616c6c00000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526021908201527f4f6e6c7920636f6e7472616374206164647265737320697320616c6c6f7765646040820152602160f81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600086825285602083015260a060408301526144e660a0830186613e12565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561453a5761453a614617565b500190565b60008261455a57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561457957614579614617565b500290565b60008282101561459057614590614617565b500390565b60005b838110156145b0578181015183820152602001614598565b838111156134ce5750506000910152565b6002810460018216806145d557607f821691505b602082108114156145f657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561461057614610614617565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611c5157600080fd5b8015158114611c5157600080fdfea26469706673582212205ede4ab2815e33d8219c45518b00c583d6325a1967bbdfdd2c8628107988754b64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061041f5760003560e01c8063857ebd4b1161021e578063c876d0b911610123578063ee40166e116100ab578063f63743421161007a578063f637434214610b56578063f77dbdc614610b6b578063f8b45b0514610b8b578063fc155d1d14610ba0578063fe98afed14610bc057610426565b8063ee40166e14610af7578063f11a24d314610b0c578063f22857a814610b21578063f2fde38b14610b3657610426565b8063d85ba063116100f2578063d85ba06314610a78578063dd62ed3e14610a8d578063e2f4560514610aad578063e3f8da5514610ac2578063e884f26014610ae257610426565b8063c876d0b914610a19578063c8c8ebe414610a2e578063d049901814610a43578063d498031214610a6357610426565b80639a7a23d6116101a6578063a9059cbb11610175578063a9059cbb14610984578063afa4f3b2146109a4578063b62496f5146109c4578063bbc0c742146109e4578063c0246668146109f957610426565b80639a7a23d614610904578063a457c2d714610924578063a4640b8214610944578063a67096e21461096457610426565b80638da5cb5b116101ed5780638da5cb5b14610885578063921369131461089a578063924de9b7146108af5780639485b9d8146108cf57806395d89b41146108ef57610426565b8063857ebd4b1461081b57806387dbd21d1461083b5780638a8c523c146108505780638b992b111461086557610426565b8063313ce567116103245780635d098b38116102ac578063715018a61161027b578063715018a61461079c5780637571336a146107b157806375f0a874146107d15780637bce5a04146107e6578063800db58e146107fb57610426565b80635d098b38146107325780636a486a8e146107525780636ddd17131461076757806370a082311461077c57610426565b806349bd5a5e116102f357806349bd5a5e146106a85780634a62bb65146106bd5780634fbee193146106d257806351c7cd5f146106f257806352ba99211461071257610426565b8063313ce5671461063157806339509351146106535780633b0e01331461067357806345d377a41461069357610426565b80631a221dbb116103a75780631f3fed8f116103765780631f3fed8f146105b25780631fe70a98146105c757806323b872dd146105dc57806327a14fc2146105fc57806327c8f8351461061c57610426565b80631a221dbb146105535780631a8145bb146105685780631cd348c01461057d5780631e293c101461059257610426565b80630f683e90116103ee5780630f683e90146104c757806310d5de53146104e75780631694505e1461050757806317700f011461052957806318160ddd1461053e57610426565b806306fdde031461042b578063095ea7b3146104565780630b166d50146104835780630d075d9c146104a557610426565b3661042657005b600080fd5b34801561043757600080fd5b50610440610be0565b60405161044d9190613f1c565b60405180910390f35b34801561046257600080fd5b50610476610471366004613c66565b610c72565b60405161044d9190613edc565b34801561048f57600080fd5b50610498610c8f565b60405161044d91906144be565b3480156104b157600080fd5b506104c56104c0366004613dba565b610c95565b005b3480156104d357600080fd5b506104c56104e2366004613dba565b610d25565b3480156104f357600080fd5b50610476610502366004613b89565b610d90565b34801561051357600080fd5b5061051c610da5565b60405161044d9190613e74565b34801561053557600080fd5b506104c5610dc9565b34801561054a57600080fd5b50610498610e1b565b34801561055f57600080fd5b50610498610e21565b34801561057457600080fd5b50610498610e27565b34801561058957600080fd5b5061051c610e2d565b34801561059e57600080fd5b506104c56105ad366004613d8a565b610e3c565b3480156105be57600080fd5b50610498610e93565b3480156105d357600080fd5b50610498610e99565b3480156105e857600080fd5b506104766105f7366004613bf9565b610e9f565b34801561060857600080fd5b506104c5610617366004613d8a565b610f31565b34801561062857600080fd5b5061051c610f88565b34801561063d57600080fd5b50610646610f8e565b60405161044d9190614519565b34801561065f57600080fd5b5061047661066e366004613c66565b610f93565b34801561067f57600080fd5b5061047661068e366004613b89565b610fe7565b34801561069f57600080fd5b50610476611055565b3480156106b457600080fd5b5061051c61105e565b3480156106c957600080fd5b5061047661106d565b3480156106de57600080fd5b506104766106ed366004613b89565b611076565b3480156106fe57600080fd5b506104c561070d366004613dba565b611094565b34801561071e57600080fd5b5061047661072d366004613c91565b6110f2565b34801561073e57600080fd5b506104c561074d366004613b89565b6111a9565b34801561075e57600080fd5b50610498611245565b34801561077357600080fd5b5061047661124b565b34801561078857600080fd5b50610498610797366004613b89565b61125a565b3480156107a857600080fd5b506104c5611275565b3480156107bd57600080fd5b506104c56107cc366004613c39565b6112c0565b3480156107dd57600080fd5b5061051c61132a565b3480156107f257600080fd5b50610498611339565b34801561080757600080fd5b506104c5610816366004613b89565b61133f565b34801561082757600080fd5b50610476610836366004613b89565b6113d0565b34801561084757600080fd5b506104c5611436565b34801561085c57600080fd5b506104c5611481565b34801561087157600080fd5b50610476610880366004613d8a565b6114e2565b34801561089157600080fd5b5061051c61152c565b3480156108a657600080fd5b5061049861153b565b3480156108bb57600080fd5b506104c56108ca366004613d52565b611541565b3480156108db57600080fd5b506104c56108ea366004613b89565b61159c565b3480156108fb57600080fd5b50610440611648565b34801561091057600080fd5b506104c561091f366004613c39565b611657565b34801561093057600080fd5b5061047661093f366004613c66565b6116ce565b34801561095057600080fd5b506104c561095f366004613b89565b611747565b34801561097057600080fd5b506104c561097f366004613bc1565b6117e3565b34801561099057600080fd5b5061047661099f366004613c66565b6118b7565b3480156109b057600080fd5b506104766109bf366004613d8a565b6118cb565b3480156109d057600080fd5b506104766109df366004613b89565b611915565b3480156109f057600080fd5b50610476611929565b348015610a0557600080fd5b506104c5610a14366004613c39565b611937565b348015610a2557600080fd5b506104766119d6565b348015610a3a57600080fd5b506104986119df565b348015610a4f57600080fd5b50610476610a5e366004613c91565b6119e5565b348015610a6f57600080fd5b50610498611a9c565b348015610a8457600080fd5b50610498611aa2565b348015610a9957600080fd5b50610498610aa8366004613bc1565b611aa8565b348015610ab957600080fd5b50610498611ad3565b348015610ace57600080fd5b50610476610add366004613d52565b611ad9565b348015610aee57600080fd5b50610476611b31565b348015610b0357600080fd5b50610498611b82565b348015610b1857600080fd5b50610498611b88565b348015610b2d57600080fd5b50610476611b8e565b348015610b4257600080fd5b506104c5610b51366004613b89565b611be3565b348015610b6257600080fd5b50610498611c54565b348015610b7757600080fd5b50610476610b86366004613b89565b611c5a565b348015610b9757600080fd5b50610498611c6f565b348015610bac57600080fd5b506104c5610bbb366004613d8a565b611c75565b348015610bcc57600080fd5b506104c5610bdb366004613b89565b611e9d565b606060038054610bef906145c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1b906145c1565b8015610c685780601f10610c3d57610100808354040283529160200191610c68565b820191906000526020600020905b815481529060010190602001808311610c4b57829003601f168201915b5050505050905090565b6000610c86610c7f611f2b565b8484611f2f565b50600192915050565b601a5481565b610c9d611f2b565b6001600160a01b0316610cae61152c565b6001600160a01b031614610cdd5760405162461bcd60e51b8152600401610cd490614295565b60405180910390fd5b60118390556012829055601381905580610cf78385614527565b610d019190614527565b60105560215460ff1615610d2057600a610d1b8184611fe3565b602455505b505050565b610d2d611f2b565b6001600160a01b0316610d3e61152c565b6001600160a01b031614610d645760405162461bcd60e51b8152600401610cd490614295565b60158390556016829055601781905580610d7e8385614527565b610d889190614527565b601455505050565b601c6020526000908152604090205460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b610dd1611f2b565b6001600160a01b0316610de261152c565b6001600160a01b031614610e085760405162461bcd60e51b8152600401610cd490614295565b600c805462ffff00191690556000600d55565b60025490565b60175481565b60195481565b6008546001600160a01b031681565b610e44611f2b565b6001600160a01b0316610e5561152c565b6001600160a01b031614610e7b5760405162461bcd60e51b8152600401610cd490614295565b610e8d81670de0b6b3a764000061455f565b60095550565b60185481565b60135481565b6000610eac848484611fef565b6001600160a01b038416600090815260016020526040812081610ecd611f2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610f105760405162461bcd60e51b8152600401610cd49061424d565b610f2485610f1c611f2b565b858403611f2f565b60019150505b9392505050565b610f39611f2b565b6001600160a01b0316610f4a61152c565b6001600160a01b031614610f705760405162461bcd60e51b8152600401610cd490614295565b610f8281670de0b6b3a764000061455f565b600b5550565b61dead81565b601290565b6000610c86610fa0611f2b565b848460016000610fae611f2b565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610fe29190614527565b611f2f565b6000610ff1611f2b565b6001600160a01b031661100261152c565b6001600160a01b0316146110285760405162461bcd60e51b8152600401610cd490614295565b506001600160a01b0381166000908152601e60205260409020805460ff191660019081179091555b919050565b60215460ff1681565b6006546001600160a01b031681565b600c5460ff1681565b6001600160a01b03166000908152601b602052604090205460ff1690565b61109c611f2b565b6001600160a01b03166110ad61152c565b6001600160a01b0316146110d35760405162461bcd60e51b8152600401610cd490614295565b6021805460ff1916600117905543602555602292909255602355602455565b60006110fc611f2b565b6001600160a01b031661110d61152c565b6001600160a01b0316146111335760405162461bcd60e51b8152600401610cd490614295565b60005b8251811015610c86576001601e600085848151811061116557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806111a1816145fc565b915050611136565b6111b1611f2b565b6001600160a01b03166111c261152c565b6001600160a01b0316146111e85760405162461bcd60e51b8152600401610cd490614295565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b600c5462010000900460ff1681565b6001600160a01b031660009081526020819052604090205490565b61127d611f2b565b6001600160a01b031661128e61152c565b6001600160a01b0316146112b45760405162461bcd60e51b8152600401610cd490614295565b6112be60006132a9565b565b6112c8611f2b565b6001600160a01b03166112d961152c565b6001600160a01b0316146112ff5760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6007546001600160a01b031681565b60115481565b611347611f2b565b6001600160a01b031661135861152c565b6001600160a01b03161461137e5760405162461bcd60e51b8152600401610cd490614295565b611390816001600160a01b03166132fb565b6113ac5760405162461bcd60e51b8152600401610cd4906143ee565b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b60006113da611f2b565b6001600160a01b03166113eb61152c565b6001600160a01b0316146114115760405162461bcd60e51b8152600401610cd490614295565b506001600160a01b03166000908152601e60205260409020805460ff19169055600190565b61143e611f2b565b6001600160a01b031661144f61152c565b6001600160a01b0316146114755760405162461bcd60e51b8152600401610cd490614295565b6021805460ff19169055565b611489611f2b565b6001600160a01b031661149a61152c565b6001600160a01b0316146114c05760405162461bcd60e51b8152600401610cd490614295565b600c805462ff00001961ff001990911661010017166201000017905543600d55565b60006114ec611f2b565b6001600160a01b03166114fd61152c565b6001600160a01b0316146115235760405162461bcd60e51b8152600401610cd490614295565b50601f55600190565b6005546001600160a01b031690565b60155481565b611549611f2b565b6001600160a01b031661155a61152c565b6001600160a01b0316146115805760405162461bcd60e51b8152600401610cd490614295565b600c8054911515620100000262ff000019909216919091179055565b6115a4611f2b565b6001600160a01b03166115b561152c565b6001600160a01b0316146115db5760405162461bcd60e51b8152600401610cd490614295565b6000816001600160a01b0316476040516115f490613e71565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061164457600080fd5b5050565b606060048054610bef906145c1565b61165f611f2b565b6001600160a01b031661167061152c565b6001600160a01b0316146116965760405162461bcd60e51b8152600401610cd490614295565b6006546001600160a01b03838116911614156116c45760405162461bcd60e51b8152600401610cd49061404a565b6116448282613301565b600080600160006116dd611f2b565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156117295760405162461bcd60e51b8152600401610cd490614479565b61173d611734611f2b565b85858403611f2f565b5060019392505050565b61174f611f2b565b6001600160a01b031661176061152c565b6001600160a01b0316146117865760405162461bcd60e51b8152600401610cd490614295565b6008546040516001600160a01b03918216918316907f15e571905a1c816ac9ad091c2b82079da1ad3668d345e3894c424c5e5b47d97b90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6117eb611f2b565b6001600160a01b03166117fc61152c565b6001600160a01b0316146118225760405162461bcd60e51b8152600401610cd490614295565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190611851903090600401613e74565b60206040518083038186803b15801561186957600080fd5b505afa15801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190613da2565b9050610d206001600160a01b0383168483613354565b6000610c866118c4611f2b565b8484611fef565b60006118d5611f2b565b6001600160a01b03166118e661152c565b6001600160a01b03161461190c5760405162461bcd60e51b8152600401610cd490614295565b50600a55600190565b602080526000908152604090205460ff1681565b600c54610100900460ff1681565b61193f611f2b565b6001600160a01b031661195061152c565b6001600160a01b0316146119765760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7906119ca908490613edc565b60405180910390a25050565b600f5460ff1681565b60095481565b60006119ef611f2b565b6001600160a01b0316611a0061152c565b6001600160a01b031614611a265760405162461bcd60e51b8152600401610cd490614295565b60005b8251811015610c86576000601e6000858481518110611a5857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a94816145fc565b915050611a29565b601f5481565b60105481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6000611ae3611f2b565b6001600160a01b0316611af461152c565b6001600160a01b031614611b1a5760405162461bcd60e51b8152600401610cd490614295565b50600c805460ff1916911515919091179055600190565b6000611b3b611f2b565b6001600160a01b0316611b4c61152c565b6001600160a01b031614611b725760405162461bcd60e51b8152600401610cd490614295565b50600f805460ff19169055600190565b600d5481565b60125481565b6000611b98611f2b565b6001600160a01b0316611ba961152c565b6001600160a01b031614611bcf5760405162461bcd60e51b8152600401610cd490614295565b50600f805460ff1916600190811790915590565b611beb611f2b565b6001600160a01b0316611bfc61152c565b6001600160a01b031614611c225760405162461bcd60e51b8152600401610cd490614295565b6001600160a01b038116611c485760405162461bcd60e51b8152600401610cd490613fc2565b611c51816132a9565b50565b60165481565b601d6020526000908152604090205460ff1681565b600b5481565b611c7d611f2b565b6001600160a01b0316611c8e61152c565b6001600160a01b031614611cb45760405162461bcd60e51b8152600401610cd490614295565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2e57600080fd5b505afa158015611d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d669190613ba5565b81600081518110611d8757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611dc957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063b6f9de95908490611e3090600090869061dead904290600401613ee7565b6000604051808303818588803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051611e9191906144be565b60405180910390a15050565b611ea5611f2b565b6001600160a01b0316611eb661152c565b6001600160a01b031614611edc5760405162461bcd60e51b8152600401610cd490614295565b611eee816001600160a01b03166132fb565b611f0a5760405162461bcd60e51b8152600401610cd4906143ee565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b3390565b6001600160a01b038316611f555760405162461bcd60e51b8152600401610cd490614346565b6001600160a01b038216611f7b5760405162461bcd60e51b8152600401610cd490614008565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611fd69085906144be565b60405180910390a3505050565b6000610f2a828461457e565b336000908152601d602052604090205460ff161561294b576001600160a01b03831661202d5760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166120535760405162461bcd60e51b8152600401610cd490613f4f565b6001600160a01b0383166000908152601e602052604090205460ff168061209257506001600160a01b0382166000908152601e602052604090205460ff165b156120e05760006064601f54836120a9919061455f565b6120b3919061453f565b905060006120c1828461457e565b90506120ce8530846133aa565b6120d98585836133aa565b5050612946565b806120f6576120f1838360006133aa565b612946565b60215460ff16801561210a57506000602454115b801561211857506000602354115b801561212657506000602254115b1561224c5760235460255443919061213f908390611fe3565b111561224a57600060225461216b60235461216560255486611fe390919063ffffffff16565b906134d4565b612175919061455f565b90506024546011546121879190614527565b81106121c3576021805460ff19169055602454601181905560135460125490916121b19190614527565b6121bb9190614527565b601055612248565b602454816011546121d4919061457e565b111561221657806011546121e8919061457e565b601181905560135460125490916121ff9190614527565b6122099190614527565b6010556025829055612248565b6021805460ff191690556024546011819055601354601254909161223a9190614527565b6122449190614527565b6010555b505b505b600c5460ff161561254a5761225f61152c565b6001600160a01b0316836001600160a01b031614158015612299575061228361152c565b6001600160a01b0316826001600160a01b031614155b80156122ad57506001600160a01b03821615155b80156122c457506001600160a01b03821661dead14155b80156122da5750600654600160a01b900460ff16155b1561254a57600c54610100900460ff16612349576001600160a01b0383166000908152601b602052604090205460ff168061232d57506001600160a01b0382166000908152601b602052604090205460ff165b6123495760405162461bcd60e51b8152600401610cd490613f92565b600f5460ff161561240f5761235c61152c565b6001600160a01b0316826001600160a01b0316141580156123af57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b80156123c957506006546001600160a01b03838116911614155b1561240f57326000908152600e602052604090205443116123fc5760405162461bcd60e51b8152600401610cd4906141de565b326000908152600e602052604090204390555b6001600160a01b038316600090815260208052604090205460ff16801561244f57506001600160a01b0382166000908152601c602052604090205460ff16155b156124af576009548111156124765760405162461bcd60e51b8152600401610cd490614189565b600b546124828361125a565b61248c9083614527565b11156124aa5760405162461bcd60e51b8152600401610cd4906143c1565b61254a565b6001600160a01b038216600090815260208052604090205460ff1680156124ef57506001600160a01b0383166000908152601c602052604090205460ff16155b15612516576009548111156124aa5760405162461bcd60e51b8152600401610cd4906140ed565b600b546125228361125a565b61252c9083614527565b111561254a5760405162461bcd60e51b8152600401610cd4906143c1565b60006125553061125a565b600a54909150811080159081906125745750600c5462010000900460ff165b801561258a5750600654600160a01b900460ff16155b80156125ae57506001600160a01b038516600090815260208052604090205460ff16155b80156125d357506001600160a01b0385166000908152601b602052604090205460ff16155b80156125f857506001600160a01b0384166000908152601b602052604090205460ff16155b15612626576006805460ff60a01b1916600160a01b1790556126186134e0565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b90920482161591168061267457506001600160a01b0385166000908152601b602052604090205460ff165b1561267d575060005b600081156129365743600d5460026126959190614527565b101580156126db57506001600160a01b038616600090815260208052604090205460ff16806126db57506001600160a01b038716600090815260208052604090205460ff165b15612781576126f06064612165876063613709565b905060636126ff82602161455f565b612709919061453f565b6019600082825461271a9190614527565b909155506063905061272d82602161455f565b612737919061453f565b601a60008282546127489190614527565b909155506063905061275b82602161455f565b612765919061453f565b601860008282546127769190614527565b909155506129189050565b6001600160a01b038616600090815260208052604090205460ff1680156127aa57506000601454115b1561283c576127c960646121656014548861370990919063ffffffff16565b9050601454601654826127dc919061455f565b6127e6919061453f565b601960008282546127f79190614527565b909155505060145460175461280c908361455f565b612816919061453f565b601a60008282546128279190614527565b909155505060145460155461275b908361455f565b6001600160a01b038716600090815260208052604090205460ff16801561286557506000601054115b156129185761288460646121656010548861370990919063ffffffff16565b905060105460125482612897919061455f565b6128a1919061453f565b601960008282546128b29190614527565b90915550506010546013546128c7908361455f565b6128d1919061453f565b601a60008282546128e29190614527565b90915550506010546011546128f7908361455f565b612901919061453f565b601860008282546129129190614527565b90915550505b8015612929576129298730836133aa565b612933818661457e565b94505b6129418787876133aa565b505050505b610d20565b612954336132fb565b156129715760405162461bcd60e51b8152600401610cd49061430f565b6001600160a01b0383166129975760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166129bd5760405162461bcd60e51b8152600401610cd490613f4f565b6001600160a01b0383166000908152601e602052604090205460ff16806129fc57506001600160a01b0382166000908152601e602052604090205460ff165b15612a4a5760006064601f5483612a13919061455f565b612a1d919061453f565b90506000612a2b828461457e565b9050612a388530846133aa565b612a438585836133aa565b5050610d20565b80612a5b57612946838360006133aa565b60215460ff168015612a6f57506000602454115b8015612a7d57506000602354115b8015612a8b57506000602254115b15612bab57602354602554439190612aa4908390611fe3565b1115612ba9576000602254612aca60235461216560255486611fe390919063ffffffff16565b612ad4919061455f565b9050602454601154612ae69190614527565b8110612b22576021805460ff1916905560245460118190556013546012549091612b109190614527565b612b1a9190614527565b601055612ba7565b60245481601154612b33919061457e565b1115612b755780601154612b47919061457e565b60118190556013546012549091612b5e9190614527565b612b689190614527565b6010556025829055612ba7565b6021805460ff1916905560245460118190556013546012549091612b999190614527565b612ba39190614527565b6010555b505b505b600c5460ff1615612ea957612bbe61152c565b6001600160a01b0316836001600160a01b031614158015612bf85750612be261152c565b6001600160a01b0316826001600160a01b031614155b8015612c0c57506001600160a01b03821615155b8015612c2357506001600160a01b03821661dead14155b8015612c395750600654600160a01b900460ff16155b15612ea957600c54610100900460ff16612ca8576001600160a01b0383166000908152601b602052604090205460ff1680612c8c57506001600160a01b0382166000908152601b602052604090205460ff165b612ca85760405162461bcd60e51b8152600401610cd490613f92565b600f5460ff1615612d6e57612cbb61152c565b6001600160a01b0316826001600160a01b031614158015612d0e57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015612d2857506006546001600160a01b03838116911614155b15612d6e57326000908152600e60205260409020544311612d5b5760405162461bcd60e51b8152600401610cd4906141de565b326000908152600e602052604090204390555b6001600160a01b038316600090815260208052604090205460ff168015612dae57506001600160a01b0382166000908152601c602052604090205460ff16155b15612e0e57600954811115612dd55760405162461bcd60e51b8152600401610cd490614189565b600b54612de18361125a565b612deb9083614527565b1115612e095760405162461bcd60e51b8152600401610cd4906143c1565b612ea9565b6001600160a01b038216600090815260208052604090205460ff168015612e4e57506001600160a01b0383166000908152601c602052604090205460ff16155b15612e7557600954811115612e095760405162461bcd60e51b8152600401610cd4906140ed565b600b54612e818361125a565b612e8b9083614527565b1115612ea95760405162461bcd60e51b8152600401610cd4906143c1565b6000612eb43061125a565b600a5490915081108015908190612ed35750600c5462010000900460ff165b8015612ee95750600654600160a01b900460ff16155b8015612f0d57506001600160a01b038516600090815260208052604090205460ff16155b8015612f3257506001600160a01b0385166000908152601b602052604090205460ff16155b8015612f5757506001600160a01b0384166000908152601b602052604090205460ff16155b15612f85576006805460ff60a01b1916600160a01b179055612f776134e0565b6006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680612fd357506001600160a01b0385166000908152601b602052604090205460ff165b15612fdc575060005b600081156132955743600d546002612ff49190614527565b1015801561303a57506001600160a01b038616600090815260208052604090205460ff168061303a57506001600160a01b038716600090815260208052604090205460ff165b156130e05761304f6064612165876063613709565b9050606361305e82602161455f565b613068919061453f565b601960008282546130799190614527565b909155506063905061308c82602161455f565b613096919061453f565b601a60008282546130a79190614527565b90915550606390506130ba82602161455f565b6130c4919061453f565b601860008282546130d59190614527565b909155506132779050565b6001600160a01b038616600090815260208052604090205460ff16801561310957506000601454115b1561319b5761312860646121656014548861370990919063ffffffff16565b90506014546016548261313b919061455f565b613145919061453f565b601960008282546131569190614527565b909155505060145460175461316b908361455f565b613175919061453f565b601a60008282546131869190614527565b90915550506014546015546130ba908361455f565b6001600160a01b038716600090815260208052604090205460ff1680156131c457506000601054115b15613277576131e360646121656010548861370990919063ffffffff16565b9050601054601254826131f6919061455f565b613200919061453f565b601960008282546132119190614527565b9091555050601054601354613226908361455f565b613230919061453f565b601a60008282546132419190614527565b9091555050601054601154613256908361455f565b613260919061453f565b601860008282546132719190614527565b90915550505b8015613288576132888730836133aa565b613292818661457e565b94505b6132a08787876133aa565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3b151590565b6001600160a01b0382166000818152602080526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b610d208363a9059cbb60e01b8484604051602401613373929190613e88565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613715565b6001600160a01b0383166133d05760405162461bcd60e51b8152600401610cd4906142ca565b6001600160a01b0382166133f65760405162461bcd60e51b8152600401610cd490613f4f565b613401838383610d20565b6001600160a01b0383166000908152602081905260409020548181101561343a5760405162461bcd60e51b8152600401610cd4906140a7565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613471908490614527565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bb91906144be565b60405180910390a36134ce848484610d20565b50505050565b6000610f2a828461453f565b60006134eb3061125a565b90506000601a546018546019546135029190614527565b61350c9190614527565b9050811580613519575080155b156135255750506112be565b600060028260195485613538919061455f565b613542919061453f565b61354c919061453f565b9050600061355a8483611fe3565b905047613566826137a4565b60006135724783611fe3565b9050600061358f866121656018548561370990919063ffffffff16565b905060006135ac87612165601a548661370990919063ffffffff16565b90506000816135bb848661457e565b6135c5919061457e565b600060198190556018819055601a81905560075460405192935090916001600160a01b039091169085906135f890613e71565b60006040518083038185875af1925050503d8060008114613635576040519150601f19603f3d011682016040523d82523d6000602084013e61363a565b606091505b5050905060008811801561364e5750600082115b1561369b5761365d888361398f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561878360195460405161369293929190614503565b60405180910390a15b6008546040516001600160a01b039091169047906136b890613e71565b60006040518083038185875af1925050503d80600081146136f5576040519150601f19603f3d011682016040523d82523d6000602084013e6136fa565b606091505b50505050505050505050505050565b6000610f2a828461455f565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a6e9092919063ffffffff16565b805190915015610d2057808060200190518101906137889190613d6e565b610d205760405162461bcd60e51b8152600401610cd49061442f565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137e757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561386057600080fd5b505afa158015613874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138989190613ba5565b816001815181106138b957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050613904307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611f2f565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906139599085906000908690309042906004016144c7565b600060405180830381600087803b15801561397357600080fd5b505af1158015613987573d6000803e3d6000fd5b505050505050565b6139ba307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611f2f565b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063f305d719908390613a159030908790600090819061dead904290600401613ea1565b6060604051808303818588803b158015613a2e57600080fd5b505af1158015613a42573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613a679190613de5565b5050505050565b6060613a7d8484600085613a85565b949350505050565b606082471015613aa75760405162461bcd60e51b8152600401610cd490614143565b613ab0856132fb565b613acc5760405162461bcd60e51b8152600401610cd49061438a565b600080866001600160a01b03168587604051613ae89190613e55565b60006040518083038185875af1925050503d8060008114613b25576040519150601f19603f3d011682016040523d82523d6000602084013e613b2a565b606091505b5091509150613b3a828286613b45565b979650505050505050565b60608315613b54575081610f2a565b825115613b645782518084602001fd5b8160405162461bcd60e51b8152600401610cd49190613f1c565b803561105081614643565b600060208284031215613b9a578081fd5b8135610f2a81614643565b600060208284031215613bb6578081fd5b8151610f2a81614643565b60008060408385031215613bd3578081fd5b8235613bde81614643565b91506020830135613bee81614643565b809150509250929050565b600080600060608486031215613c0d578081fd5b8335613c1881614643565b92506020840135613c2881614643565b929592945050506040919091013590565b60008060408385031215613c4b578182fd5b8235613c5681614643565b91506020830135613bee81614658565b60008060408385031215613c78578182fd5b8235613c8381614643565b946020939093013593505050565b60006020808385031215613ca3578182fd5b823567ffffffffffffffff80821115613cba578384fd5b818501915085601f830112613ccd578384fd5b813581811115613cdf57613cdf61462d565b83810260405185828201018181108582111715613cfe57613cfe61462d565b604052828152858101935084860182860187018a1015613d1c578788fd5b8795505b83861015613d4557613d3181613b7e565b855260019590950194938601938601613d20565b5098975050505050505050565b600060208284031215613d63578081fd5b8135610f2a81614658565b600060208284031215613d7f578081fd5b8151610f2a81614658565b600060208284031215613d9b578081fd5b5035919050565b600060208284031215613db3578081fd5b5051919050565b600080600060608486031215613dce578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215613df9578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613e4a5781516001600160a01b031687529582019590820190600101613e25565b509495945050505050565b60008251613e67818460208701614595565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b600085825260806020830152613f006080830186613e12565b6001600160a01b03949094166040830152506060015292915050565b6000602082528251806020840152613f3b816040850160208701614595565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601c908201527f436f6e7472616374206e6f7420616c6c6f77656420746f2063616c6c00000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526021908201527f4f6e6c7920636f6e7472616374206164647265737320697320616c6c6f7765646040820152602160f81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600086825285602083015260a060408301526144e660a0830186613e12565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561453a5761453a614617565b500190565b60008261455a57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561457957614579614617565b500290565b60008282101561459057614590614617565b500390565b60005b838110156145b0578181015183820152602001614598565b838111156134ce5750506000910152565b6002810460018216806145d557607f821691505b602082108114156145f657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561461057614610614617565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611c5157600080fd5b8015158114611c5157600080fdfea26469706673582212205ede4ab2815e33d8219c45518b00c583d6325a1967bbdfdd2c8628107988754b64736f6c63430008000033

Deployed Bytecode Sourcemap

44758:21340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6386:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8553:169;;;;;;;;;;-1:-1:-1;8553:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46059:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54085:509::-;;;;;;;;;;-1:-1:-1;54085:509:0;;;;;:::i;:::-;;:::i;:::-;;54606:394;;;;;;;;;;-1:-1:-1;54606:394:0;;;;;:::i;:::-;;:::i;46244:64::-;;;;;;;;;;-1:-1:-1;46244:64:0;;;;;:::i;:::-;;:::i;44901:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51623:148::-;;;;;;;;;;;;;:::i;7506:108::-;;;;;;;;;;;;;:::i;45937:29::-;;;;;;;;;;;;;:::i;46019:33::-;;;;;;;;;;;;;:::i;45123:28::-;;;;;;;;;;;;;:::i;53470:127::-;;;;;;;;;;-1:-1:-1;53470:127:0;;;;;:::i;:::-;;:::i;45979:33::-;;;;;;;;;;;;;:::i;45785:28::-;;;;;;;;;;;;;:::i;9204:492::-;;;;;;;;;;-1:-1:-1;9204:492:0;;;;;:::i;:::-;;:::i;53605:111::-;;;;;;;;;;-1:-1:-1;53605:111:0;;;;;:::i;:::-;;:::i;44994:53::-;;;;;;;;;;;;;:::i;7348:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10105:215::-;;;;;;;;;;-1:-1:-1;10105:215:0;;;;;:::i;:::-;;:::i;52120:142::-;;;;;;;;;;-1:-1:-1;52120:142:0;;;;;:::i;:::-;;:::i;46752:23::-;;;;;;;;;;;;;:::i;44959:28::-;;;;;;;;;;;;;:::i;45279:33::-;;;;;;;;;;;;;:::i;56455:125::-;;;;;;;;;;-1:-1:-1;56455:125:0;;;;;:::i;:::-;;:::i;50614:255::-;;;;;;;;;;-1:-1:-1;50614:255:0;;;;;:::i;:::-;;:::i;52274:226::-;;;;;;;;;;-1:-1:-1;52274:226:0;;;;;:::i;:::-;;:::i;55646:205::-;;;;;;;;;;-1:-1:-1;55646:205:0;;;;;:::i;:::-;;:::i;45826:28::-;;;;;;;;;;;;;:::i;45359:31::-;;;;;;;;;;;;;:::i;7677:127::-;;;;;;;;;;-1:-1:-1;7677:127:0;;;;;:::i;:::-;;:::i;30026:94::-;;;;;;;;;;;;;:::i;53728:144::-;;;;;;;;;;-1:-1:-1;53728:144:0;;;;;:::i;:::-;;:::i;45086:30::-;;;;;;;;;;;;;:::i;45711:::-;;;;;;;;;;;;;:::i;50974:211::-;;;;;;;;;;-1:-1:-1;50974:211:0;;;;;:::i;:::-;;:::i;52508:145::-;;;;;;;;;;-1:-1:-1;52508:145:0;;;;;:::i;:::-;;:::i;50877:89::-;;;;;;;;;;;;;:::i;51435:156::-;;;;;;;;;;;;;:::i;52898:133::-;;;;;;;;;;-1:-1:-1;52898:133:0;;;;;:::i;:::-;;:::i;29375:87::-;;;;;;;;;;;;;:::i;45861:31::-;;;;;;;;;;;;;:::i;53972:101::-;;;;;;;;;;-1:-1:-1;53972:101:0;;;;;:::i;:::-;;:::i;56045:173::-;;;;;;;;;;-1:-1:-1;56045:173:0;;;;;:::i;:::-;;:::i;6605:104::-;;;;;;;;;;;;;:::i;55198:244::-;;;;;;;;;;-1:-1:-1;55198:244:0;;;;;:::i;:::-;;:::i;10823:413::-;;;;;;;;;;-1:-1:-1;10823:413:0;;;;;:::i;:::-;;:::i;55863:170::-;;;;;;;;;;-1:-1:-1;55863:170:0;;;;;:::i;:::-;;:::i;56226:221::-;;;;;;;;;;-1:-1:-1;56226:221:0;;;;;:::i;:::-;;:::i;8017:175::-;;;;;;;;;;-1:-1:-1;8017:175:0;;;;;:::i;:::-;;:::i;53307:151::-;;;;;;;;;;-1:-1:-1;53307:151:0;;;;;:::i;:::-;;:::i;46661:58::-;;;;;;;;;;-1:-1:-1;46661:58:0;;;;;:::i;:::-;;:::i;45319:33::-;;;;;;;;;;;;;:::i;55008:182::-;;;;;;;;;;-1:-1:-1;55008:182:0;;;;;:::i;:::-;;:::i;45629:39::-;;;;;;;;;;;;;:::i;45164:35::-;;;;;;;;;;;;;:::i;52661:229::-;;;;;;;;;;-1:-1:-1;52661:229:0;;;;;:::i;:::-;;:::i;46476:27::-;;;;;;;;;;;;;:::i;45677:::-;;;;;;;;;;;;;:::i;8255:151::-;;;;;;;;;;-1:-1:-1;8255:151:0;;;;;:::i;:::-;;:::i;45206:33::-;;;;;;;;;;;;;:::i;53087:150::-;;;;;;;;;;-1:-1:-1;53087:150:0;;;;;:::i;:::-;;:::i;51837:134::-;;;;;;;;;;;;;:::i;45403:33::-;;;;;;;;;;;;;:::i;45748:30::-;;;;;;;;;;;;;:::i;51979:133::-;;;;;;;;;;;;;:::i;30275:192::-;;;;;;;;;;-1:-1:-1;30275:192:0;;;;;:::i;:::-;;:::i;45899:31::-;;;;;;;;;;;;;:::i;46315:67::-;;;;;;;;;;-1:-1:-1;46315:67:0;;;;;:::i;:::-;;:::i;45246:24::-;;;;;;;;;;;;;:::i;65520:575::-;;;;;;;;;;-1:-1:-1;65520:575:0;;;;;:::i;:::-;;:::i;51193:213::-;;;;;;;;;;-1:-1:-1;51193:213:0;;;;;:::i;:::-;;:::i;6386:100::-;6440:13;6473:5;6466:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6386:100;:::o;8553:169::-;8636:4;8653:39;8662:12;:10;:12::i;:::-;8676:7;8685:6;8653:8;:39::i;:::-;-1:-1:-1;8710:4:0;8553:169;;;;:::o;46059:31::-;;;;:::o;54085:509::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;;;;;;;;;54202:15:::1;:31:::0;;;54244:15:::1;:31:::0;;;54286:13:::1;:27:::0;;;54302:11;54339:33:::1;54262:13:::0;54220;54339:33:::1;:::i;:::-;:49;;;;:::i;:::-;54324:12;:64:::0;54477:11:::1;::::0;::::1;;54473:114;;;54523:2;54549:26;54523:2:::0;54561:13;54549:11:::1;:26::i;:::-;54540:6;:35:::0;-1:-1:-1;54473:114:0::1;54085:509:::0;;;:::o;54606:394::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;54724:16:::1;:32:::0;;;54767:16:::1;:32:::0;;;54810:14:::1;:28:::0;;;54827:11;54865:35:::1;54786:13:::0;54743;54865:35:::1;:::i;:::-;:52;;;;:::i;:::-;54849:13;:68:::0;-1:-1:-1;;;54606:394:0:o;46244:64::-;;;;;;;;;;;;;;;:::o;44901:51::-;;;:::o;51623:148::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;51679:13:::1;:21:::0;;-1:-1:-1;;51711:19:0;;;51695:5:::1;51741:18;:22:::0;51623:148::o;7506:108::-;7594:12;;7506:108;:::o;45937:29::-;;;;:::o;46019:33::-;;;;:::o;45123:28::-;;;-1:-1:-1;;;;;45123:28:0;;:::o;53470:127::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;53572:17:::1;:6:::0;53582::::1;53572:17;:::i;:::-;53549:20;:40:::0;-1:-1:-1;53470:127:0:o;45979:33::-;;;;:::o;45785:28::-;;;;:::o;9204:492::-;9344:4;9361:36;9371:6;9379:9;9390:6;9361:9;:36::i;:::-;-1:-1:-1;;;;;9437:19:0;;9410:24;9437:19;;;:11;:19;;;;;9410:24;9457:12;:10;:12::i;:::-;-1:-1:-1;;;;;9437:33:0;-1:-1:-1;;;;;9437:33:0;;;;;;;;;;;;;9410:60;;9509:6;9489:16;:26;;9481:79;;;;-1:-1:-1;;;9481:79:0;;;;;;;:::i;:::-;9596:57;9605:6;9613:12;:10;:12::i;:::-;9646:6;9627:16;:25;9596:8;:57::i;:::-;9684:4;9677:11;;;9204:492;;;;;;:::o;53605:111::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;53691:17:::1;:6:::0;53701::::1;53691:17;:::i;:::-;53679:9;:29:::0;-1:-1:-1;53605:111:0:o;44994:53::-;45040:6;44994:53;:::o;7348:93::-;7431:2;7348:93;:::o;10105:215::-;10193:4;10210:80;10219:12;:10;:12::i;:::-;10233:7;10279:10;10242:11;:25;10254:12;:10;:12::i;:::-;-1:-1:-1;;;;;10242:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10242:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;10210:8;:80::i;52120:142::-;52188:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52205:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;:27;;-1:-1:-1;;52205:27:0::1;52228:4;52205:27:::0;;::::1;::::0;;;29666:1:::1;52120:142:::0;;;:::o;46752:23::-;;;;;;:::o;44959:28::-;;;-1:-1:-1;;;;;44959:28:0;;:::o;45279:33::-;;;;;;:::o;56455:125::-;-1:-1:-1;;;;;56544:28:0;56520:4;56544:28;;;:19;:28;;;;;;;;;56455:125::o;50614:255::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;50715:11:::1;:18:::0;;-1:-1:-1;;50715:18:0::1;50729:4;50715:18;::::0;;50764:12:::1;50744:17;:32:::0;50787:8:::1;:18:::0;;;;50816:9:::1;:20:::0;50847:6:::1;:14:::0;50614:255::o;52274:226::-;52354:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;52375:9:::1;52371:100;52394:5;:12;52390:1;:16;52371:100;;;52455:4;52428:14;:24;52443:5;52449:1;52443:8;;;;;;-1:-1:-1::0;;;52443:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52428:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52428:24:0;:31;;-1:-1:-1;;52428:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52408:3;::::1;::::0;::::1;:::i;:::-;;;;52371:100;;55646:205:::0;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;55780:15:::1;::::0;55737:59:::1;::::0;-1:-1:-1;;;;;55780:15:0;;::::1;::::0;55737:59;::::1;::::0;::::1;::::0;55780:15:::1;::::0;55737:59:::1;55807:15;:36:::0;;-1:-1:-1;;;;;;55807:36:0::1;-1:-1:-1::0;;;;;55807:36:0;;;::::1;::::0;;;::::1;::::0;;55646:205::o;45826:28::-;;;;:::o;45359:31::-;;;;;;;;;:::o;7677:127::-;-1:-1:-1;;;;;7778:18:0;7751:7;7778:18;;;;;;;;;;;;7677:127::o;30026:94::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;30091:21:::1;30109:1;30091:9;:21::i;:::-;30026:94::o:0;53728:144::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53818:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;53818:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53728:144::o;45086:30::-;;;-1:-1:-1;;;;;45086:30:0;;:::o;45711:::-;;;;:::o;50974:211::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;51064:17:::1;:4;-1:-1:-1::0;;;;;51064:15:0::1;;:17::i;:::-;51056:63;;;;-1:-1:-1::0;;;51056:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51130:40:0::1;;::::0;;;:34:::1;:40;::::0;;;;:47;;-1:-1:-1;;51130:47:0::1;51173:4;51130:47;::::0;;50974:211::o;52508:145::-;52578:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52595:20:0::1;52618:5;52595:20:::0;;;:14:::1;:20;::::0;;;;:28;;-1:-1:-1;;52595:28:0::1;::::0;;-1:-1:-1;;52508:145:0:o;50877:89::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;50939:11:::1;:19:::0;;-1:-1:-1;;50939:19:0::1;::::0;;50877:89::o;51435:156::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;51490:13:::1;:20:::0;;-1:-1:-1;;;;51490:20:0;;::::1;;;51521:18;::::0;::::1;::::0;;51571:12:::1;51550:18;:33:::0;51435:156::o;52898:133::-;52965:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;52982:12:0::1;:19:::0;53019:4:::1;::::0;52898:133::o;29375:87::-;29448:6;;-1:-1:-1;;;;;29448:6:0;29375:87;:::o;45861:31::-;;;;:::o;53972:101::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;54044:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;54044:21:0;;::::1;::::0;;;::::1;::::0;;53972:101::o;56045:173::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;56119:9:::1;56140:4;-1:-1:-1::0;;;;;56132:18:0::1;56159:21;56132:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56118:68;;;56205:4;56197:13;;;::::0;::::1;;29666:1;56045:173:::0;:::o;6605:104::-;6661:13;6694:7;6687:14;;;;;:::i;55198:244::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;55305:13:::1;::::0;-1:-1:-1;;;;;55297:21:0;;::::1;55305:13:::0;::::1;55297:21;;55289:91;;;;-1:-1:-1::0;;;55289:91:0::1;;;;;;;:::i;:::-;55393:41;55422:4;55428:5;55393:28;:41::i;10823:413::-:0;10916:4;10933:24;10960:11;:25;10972:12;:10;:12::i;:::-;-1:-1:-1;;;;;10960:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10960:25:0;;;:34;;;;;;;;;;;-1:-1:-1;11013:35:0;;;;11005:85;;;;-1:-1:-1;;;11005:85:0;;;;;;;:::i;:::-;11126:67;11135:12;:10;:12::i;:::-;11149:7;11177:15;11158:16;:34;11126:8;:67::i;:::-;-1:-1:-1;11224:4:0;;10823:413;-1:-1:-1;;;10823:413:0:o;55863:170::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;55975:13:::1;::::0;55943:46:::1;::::0;-1:-1:-1;;;;;55975:13:0;;::::1;::::0;55943:46;::::1;::::0;::::1;::::0;55975:13:::1;::::0;55943:46:::1;56000:13;:25:::0;;-1:-1:-1;;;;;;56000:25:0::1;-1:-1:-1::0;;;;;56000:25:0;;;::::1;::::0;;;::::1;::::0;;55863:170::o;56226:221::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;56338:45:::1;::::0;-1:-1:-1;;;56338:45:0;;56323:12:::1;::::0;-1:-1:-1;;;;;56338:30:0;::::1;::::0;::::1;::::0;:45:::1;::::0;56377:4:::1;::::0;56338:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56323:60:::0;-1:-1:-1;56394:45:0::1;-1:-1:-1::0;;;;;56394:33:0;::::1;56428:4:::0;56323:60;56394:33:::1;:45::i;8017:175::-:0;8103:4;8120:42;8130:12;:10;:12::i;:::-;8144:9;8155:6;8120:9;:42::i;53307:151::-;53385:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;53400:18:0::1;:30:::0;53447:4:::1;::::0;53307:151::o;46661:58::-;;;;;;;;;;;;;;;:::o;45319:33::-;;;;;;;;;:::o;55008:182::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55093:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;55093:39:0::1;::::0;::::1;;;::::0;;55148:34;::::1;::::0;::::1;::::0;55093:39;;55148:34:::1;:::i;:::-;;;;;;;;55008:182:::0;;:::o;45629:39::-;;;;;;:::o;45164:35::-;;;;:::o;52661:229::-;52743:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;52764:9:::1;52760:101;52783:5;:12;52779:1;:16;52760:101;;;52844:5;52817:14;:24;52832:5;52838:1;52832:8;;;;;;-1:-1:-1::0;;;52832:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52817:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52817:24:0;:32;;-1:-1:-1;;52817:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52797:3;::::1;::::0;::::1;:::i;:::-;;;;52760:101;;46476:27:::0;;;;:::o;45677:::-;;;;:::o;8255:151::-;-1:-1:-1;;;;;8371:18:0;;;8344:7;8371:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8255:151::o;45206:33::-;;;;:::o;53087:150::-;53163:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;53179:14:0::1;:28:::0;;-1:-1:-1;;53179:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;53087:150:0:o;51837:134::-;51897:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;51913:20:0::1;:28:::0;;-1:-1:-1;;51913:28:0::1;::::0;;;51837:134;:::o;45403:33::-;;;;:::o;45748:30::-;;;;:::o;51979:133::-;52038:4;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;52055:20:0::1;:27:::0;;-1:-1:-1;;52055:27:0::1;52078:4;52055:27:::0;;::::1;::::0;;;51979:133;:::o;30275:192::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30364:22:0;::::1;30356:73;;;;-1:-1:-1::0;;;30356:73:0::1;;;;;;;:::i;:::-;30440:19;30450:8;30440:9;:19::i;:::-;30275:192:::0;:::o;45899:31::-;;;;:::o;46315:67::-;;;;;;;;;;;;;;;:::o;45246:24::-;;;;:::o;65520:575::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;65679:16:::1;::::0;;65693:1:::1;65679:16:::0;;;;;::::1;::::0;;65655:21:::1;::::0;65679:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;65679:16:0::1;65655:40;;65716:15;-1:-1:-1::0;;;;;65716:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65706:4;65711:1;65706:7;;;;;;-1:-1:-1::0;;;65706:7:0::1;;;;;;;;;;;;;;:32;-1:-1:-1::0;;;;;65706:32:0::1;;;-1:-1:-1::0;;;;;65706:32:0::1;;;::::0;::::1;65767:4;65749;65754:1;65749:7;;;;;;-1:-1:-1::0;;;65749:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;65749:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;65811:228:::1;::::0;-1:-1:-1;;;65811:228:0;;:15:::1;:66:::0;;::::1;::::0;::::1;::::0;65885:14;;65811:228:::1;::::0;65915:1:::1;::::0;65964:4;;65991:6:::1;::::0;66013:15:::1;::::0;65811:228:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;66055:32;66072:14;66055:32;;;;;;:::i;:::-;;;;;;;;29666:1;65520:575:::0;:::o;51193:213::-;29606:12;:10;:12::i;:::-;-1:-1:-1;;;;;29595:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29595:23:0;;29587:68;;;;-1:-1:-1;;;29587:68:0;;;;;;;:::i;:::-;51284:17:::1;:4;-1:-1:-1::0;;;;;51284:15:0::1;;:17::i;:::-;51276:63;;;;-1:-1:-1::0;;;51276:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51350:40:0::1;51393:5;51350:40:::0;;;:34:::1;:40;::::0;;;;:48;;-1:-1:-1;;51350:48:0::1;::::0;;51193:213::o;4097:98::-;4177:10;4097:98;:::o;14507:380::-;-1:-1:-1;;;;;14643:19:0;;14635:68;;;;-1:-1:-1;;;14635:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14722:21:0;;14714:68;;;;-1:-1:-1;;;14714:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14795:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;14847:32;;;;;14825:6;;14847:32;:::i;:::-;;;;;;;;14507:380;;;:::o;33832:98::-;33890:7;33917:5;33921:1;33917;:5;:::i;56642:6036::-;46991:10;46956:46;;;;:34;:46;;;;;;;;46952:203;;;-1:-1:-1;;;;;56790:18:0;::::1;56782:68;;;;-1:-1:-1::0;;;56782:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56869:16:0;::::1;56861:64;;;;-1:-1:-1::0;;;56861:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56950:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;;::::1;;::::0;:42:::1;;-1:-1:-1::0;;;;;;56974:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;::::1;;56950:42;56946:311;;;57009:17;57053:3;57038:12;;57029:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;57009:47:::0;-1:-1:-1;57071:18:0::1;57092;57009:47:::0;57092:6;:18:::1;:::i;:::-;57071:39;;57125:47;57141:4;57155;57162:9;57125:15;:47::i;:::-;57187:37;57203:4;57209:2;57213:10;57187:15;:37::i;:::-;57239:7;;;;56946:311;57272:11:::0;57269:92:::1;;57300:28;57316:4;57322:2;57326:1;57300:15;:28::i;:::-;57343:7;;57269:92;57377:11;::::0;::::1;;:25:::0;::::1;;;;57401:1;57392:6;;:10;57377:25;:42;;;;;57418:1;57406:9;;:13;57377:42;:58;;;;;57434:1;57423:8;;:12;57377:58;57373:1209;;;57617:9;::::0;57596:17:::1;::::0;57546:12:::1;::::0;57617:9;57577:37:::1;::::0;57546:12;;57577:18:::1;:37::i;:::-;:49;57573:998;;;57647:20;57725:8;;57670:52;57712:9;;57670:37;57689:17;;57670:14;:18;;:37;;;;:::i;:::-;:41:::0;::::1;:52::i;:::-;:63;;;;:::i;:::-;57647:86;;57790:6;;57772:15;;:24;;;;:::i;:::-;57756:12;:40;57752:804;;57821:11;:19:::0;;-1:-1:-1;;57821:19:0::1;::::0;;57881:6:::1;::::0;57863:15:::1;:24:::0;;;-1:-1:-1;57961:13:0;57943:15:::1;::::0;57961:13;;57925:33:::1;::::0;57943:15;57925:33:::1;:::i;:::-;:49;;;;:::i;:::-;57910:12;:64:::0;57752:804:::1;;;58060:6;;58045:12;58027:15;;:30;;;;:::i;:::-;:39;58023:514;;;58131:12;58113:15;;:30;;;;:::i;:::-;58095:15;:48:::0;;;58221:13:::1;::::0;58203:15:::1;::::0;58221:13;;58185:33:::1;::::0;58203:15;58185:33:::1;:::i;:::-;:49;;;;:::i;:::-;58170:12;:64:::0;58261:17:::1;:34:::0;;;58023:514:::1;;;58352:11;:19:::0;;-1:-1:-1;;58352:19:0::1;::::0;;58416:6:::1;::::0;58398:15:::1;:24:::0;;;-1:-1:-1;58500:13:0;58482:15:::1;::::0;58500:13;;58464:33:::1;::::0;58482:15;58464:33:::1;:::i;:::-;:49;;;;:::i;:::-;58449:12;:64:::0;58023:514:::1;57573:998;;57373:1209;;58605:14;::::0;::::1;;58602:1801;;;58665:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;58657:15:0::1;:4;-1:-1:-1::0;;;;;58657:15:0::1;;;:49;;;;;58699:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;58693:13:0::1;:2;-1:-1:-1::0;;;;;58693:13:0::1;;;58657:49;:86;;;;-1:-1:-1::0;;;;;;58727:16:0;::::1;::::0;::::1;58657:86;:128;;;;-1:-1:-1::0;;;;;;58764:21:0;::::1;58778:6;58764:21;;58657:128;:158;;;;-1:-1:-1::0;58807:8:0::1;::::0;-1:-1:-1;;;58807:8:0;::::1;;;58806:9;58657:158;58635:1757;;;58853:13;::::0;::::1;::::0;::::1;;;58849:148;;-1:-1:-1::0;;;;;58898:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;::::0;:52:::1;;-1:-1:-1::0;;;;;;58927:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;58898:52;58890:87;;;;-1:-1:-1::0;;;58890:87:0::1;;;;;;;:::i;:::-;59155:20;::::0;::::1;;59151:423;;;59209:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;59203:13:0::1;:2;-1:-1:-1::0;;;;;59203:13:0::1;;;:47;;;;;59234:15;-1:-1:-1::0;;;;;59220:30:0::1;:2;-1:-1:-1::0;;;;;59220:30:0::1;;;59203:47;:79;;;;-1:-1:-1::0;59268:13:0::1;::::0;-1:-1:-1;;;;;59254:28:0;;::::1;59268:13:::0;::::1;59254:28;;59203:79;59199:356;;;59347:9;59318:39;::::0;;;:28:::1;:39;::::0;;;;;59360:12:::1;-1:-1:-1::0;59310:140:0::1;;;;-1:-1:-1::0;;;59310:140:0::1;;;;;;;:::i;:::-;59506:9;59477:39;::::0;;;:28:::1;:39;::::0;;;;59519:12:::1;59477:54:::0;;59199:356:::1;-1:-1:-1::0;;;;;59643:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;:71:::0;::::1;;;-1:-1:-1::0;;;;;;59679:35:0;::::1;;::::0;;;:31:::1;:35;::::0;;;;;::::1;;59678:36;59643:71;59639:738;;;59761:20;;59751:6;:30;;59743:96;;;;-1:-1:-1::0;;;59743:96:0::1;;;;;;;:::i;:::-;59900:9;;59883:13;59893:2;59883:9;:13::i;:::-;59874:22;::::0;:6;:22:::1;:::i;:::-;:35;;59866:67;;;;-1:-1:-1::0;;;59866:67:0::1;;;;;;;:::i;:::-;59639:738;;;-1:-1:-1::0;;;;;60027:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;:71:::0;::::1;;;-1:-1:-1::0;;;;;;60061:37:0;::::1;;::::0;;;:31:::1;:37;::::0;;;;;::::1;;60060:38;60027:71;60023:354;;;60145:20;;60135:6;:30;;60127:97;;;;-1:-1:-1::0;;;60127:97:0::1;;;;;;;:::i;60023:354::-;60324:9;;60307:13;60317:2;60307:9;:13::i;:::-;60298:22;::::0;:6;:22:::1;:::i;:::-;:35;;60290:67;;;;-1:-1:-1::0;;;60290:67:0::1;;;;;;;:::i;:::-;60437:28;60468:24;60486:4;60468:9;:24::i;:::-;60552:18;::::0;60437:55;;-1:-1:-1;60528:42:0;::::1;::::0;::::1;::::0;;;60601:35:::1;;-1:-1:-1::0;60625:11:0::1;::::0;;;::::1;;;60601:35;:61;;;;-1:-1:-1::0;60654:8:0::1;::::0;-1:-1:-1;;;60654:8:0;::::1;;;60653:9;60601:61;:110;;;;-1:-1:-1::0;;;;;;60680:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;60679:32;60601:110;:153;;;;-1:-1:-1::0;;;;;;60729:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;60728:26;60601:153;:194;;;;-1:-1:-1::0;;;;;;60772:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;60771:24;60601:194;60583:338;;;60822:8;:15:::0;;-1:-1:-1;;;;60822:15:0::1;-1:-1:-1::0;;;60822:15:0::1;::::0;;60866:10:::1;:8;:10::i;:::-;60893:8;:16:::0;;-1:-1:-1;;;;60893:16:0::1;::::0;;60583:338:::1;60957:8;::::0;-1:-1:-1;;;;;61066:25:0;::::1;60941:12;61066:25:::0;;;:19:::1;:25;::::0;;;;;60957:8:::1;-1:-1:-1::0;;;60957:8:0;;::::1;::::0;::::1;60956:9;::::0;61066:25:::1;::::0;:52:::1;;-1:-1:-1::0;;;;;;61095:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;61066:52;61063:99;;;-1:-1:-1::0;61145:5:0::1;61063:99;61182:12;61286:7;61283:1342;;;61338:12;61312:18;;61333:1;61312:22;;;;:::i;:::-;:38;;:108;;;;-1:-1:-1::0;;;;;;61355:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;::::0;:64:::1;;-1:-1:-1::0;;;;;;61388:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;61355:64;61309:1147;;;61447:23;61466:3;61447:14;:6:::0;61458:2:::1;61447:10;:14::i;:23::-;61440:30:::0;-1:-1:-1;61523:2:0::1;61511:9;61440:30:::0;61518:2:::1;61511:9;:::i;:::-;:14;;;;:::i;:::-;61489:18;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61576:2:0::1;::::0;-1:-1:-1;61564:9:0::1;:4:::0;61571:2:::1;61564:9;:::i;:::-;:14;;;;:::i;:::-;61544:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61631:2:0::1;::::0;-1:-1:-1;61619:9:0::1;:4:::0;61626:2:::1;61619:9;:::i;:::-;:14;;;;:::i;:::-;61597:18;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61309:1147:0::1;::::0;-1:-1:-1;61309:1147:0::1;;-1:-1:-1::0;;;;;61696:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;:50:::0;::::1;;;;61745:1;61729:13;;:17;61696:50;61692:764;;;61773:34;61803:3;61773:25;61784:13;;61773:6;:10;;:25;;;;:::i;:34::-;61766:41;;61874:13;;61855:16;;61848:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;61826:18;;:61;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;61950:13:0::1;::::0;61933:14:::1;::::0;61926:21:::1;::::0;:4;:21:::1;:::i;:::-;:37;;;;:::i;:::-;61906:16;;:57;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62030:13:0::1;::::0;62011:16:::1;::::0;62004:23:::1;::::0;:4;:23:::1;:::i;61692:764::-;-1:-1:-1::0;;;;;62104:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;:51:::0;::::1;;;;62154:1;62139:12;;:16;62104:51;62101:355;;;62180:33;62209:3;62180:24;62191:12;;62180:6;:10;;:24;;;;:::i;:33::-;62173:40;;62276:12;;62258:15;;62251:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;62229:18;;:59;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62350:12:0::1;::::0;62334:13:::1;::::0;62327:20:::1;::::0;:4;:20:::1;:::i;:::-;:35;;;;:::i;:::-;62307:16;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62428:12:0::1;::::0;62410:15:::1;::::0;62403:22:::1;::::0;:4;:22:::1;:::i;:::-;:37;;;;:::i;:::-;62381:18;;:59;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62101:355:0::1;62487:8:::0;;62484:93:::1;;62519:42;62535:4;62549;62556;62519:15;:42::i;:::-;62599:14;62609:4:::0;62599:14;::::1;:::i;:::-;;;61283:1342;62637:33;62653:4;62659:2;62663:6;62637:15;:33::i;:::-;47019:1;;;;;46952:203:::0;;;47062:32;47070:10;47062:30;:32::i;:::-;47061:33;47053:74;;;;-1:-1:-1;;;47053:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56790:18:0;::::1;56782:68;;;;-1:-1:-1::0;;;56782:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56869:16:0;::::1;56861:64;;;;-1:-1:-1::0;;;56861:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56950:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;;::::1;;::::0;:42:::1;;-1:-1:-1::0;;;;;;56974:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;::::1;;56950:42;56946:311;;;57009:17;57053:3;57038:12;;57029:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;57009:47:::0;-1:-1:-1;57071:18:0::1;57092;57009:47:::0;57092:6;:18:::1;:::i;:::-;57071:39;;57125:47;57141:4;57155;57162:9;57125:15;:47::i;:::-;57187:37;57203:4;57209:2;57213:10;57187:15;:37::i;:::-;57239:7;;;;56946:311;57272:11:::0;57269:92:::1;;57300:28;57316:4;57322:2;57326:1;57300:15;:28::i;57269:92::-;57377:11;::::0;::::1;;:25:::0;::::1;;;;57401:1;57392:6;;:10;57377:25;:42;;;;;57418:1;57406:9;;:13;57377:42;:58;;;;;57434:1;57423:8;;:12;57377:58;57373:1209;;;57617:9;::::0;57596:17:::1;::::0;57546:12:::1;::::0;57617:9;57577:37:::1;::::0;57546:12;;57577:18:::1;:37::i;:::-;:49;57573:998;;;57647:20;57725:8;;57670:52;57712:9;;57670:37;57689:17;;57670:14;:18;;:37;;;;:::i;:52::-;:63;;;;:::i;:::-;57647:86;;57790:6;;57772:15;;:24;;;;:::i;:::-;57756:12;:40;57752:804;;57821:11;:19:::0;;-1:-1:-1;;57821:19:0::1;::::0;;57881:6:::1;::::0;57863:15:::1;:24:::0;;;-1:-1:-1;57961:13:0;57943:15:::1;::::0;57961:13;;57925:33:::1;::::0;57943:15;57925:33:::1;:::i;:::-;:49;;;;:::i;:::-;57910:12;:64:::0;57752:804:::1;;;58060:6;;58045:12;58027:15;;:30;;;;:::i;:::-;:39;58023:514;;;58131:12;58113:15;;:30;;;;:::i;:::-;58095:15;:48:::0;;;58221:13:::1;::::0;58203:15:::1;::::0;58221:13;;58185:33:::1;::::0;58203:15;58185:33:::1;:::i;:::-;:49;;;;:::i;:::-;58170:12;:64:::0;58261:17:::1;:34:::0;;;58023:514:::1;;;58352:11;:19:::0;;-1:-1:-1;;58352:19:0::1;::::0;;58416:6:::1;::::0;58398:15:::1;:24:::0;;;-1:-1:-1;58500:13:0;58482:15:::1;::::0;58500:13;;58464:33:::1;::::0;58482:15;58464:33:::1;:::i;:::-;:49;;;;:::i;:::-;58449:12;:64:::0;58023:514:::1;57573:998;;57373:1209;;58605:14;::::0;::::1;;58602:1801;;;58665:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;58657:15:0::1;:4;-1:-1:-1::0;;;;;58657:15:0::1;;;:49;;;;;58699:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;58693:13:0::1;:2;-1:-1:-1::0;;;;;58693:13:0::1;;;58657:49;:86;;;;-1:-1:-1::0;;;;;;58727:16:0;::::1;::::0;::::1;58657:86;:128;;;;-1:-1:-1::0;;;;;;58764:21:0;::::1;58778:6;58764:21;;58657:128;:158;;;;-1:-1:-1::0;58807:8:0::1;::::0;-1:-1:-1;;;58807:8:0;::::1;;;58806:9;58657:158;58635:1757;;;58853:13;::::0;::::1;::::0;::::1;;;58849:148;;-1:-1:-1::0;;;;;58898:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;::::0;:52:::1;;-1:-1:-1::0;;;;;;58927:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;58898:52;58890:87;;;;-1:-1:-1::0;;;58890:87:0::1;;;;;;;:::i;:::-;59155:20;::::0;::::1;;59151:423;;;59209:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;59203:13:0::1;:2;-1:-1:-1::0;;;;;59203:13:0::1;;;:47;;;;;59234:15;-1:-1:-1::0;;;;;59220:30:0::1;:2;-1:-1:-1::0;;;;;59220:30:0::1;;;59203:47;:79;;;;-1:-1:-1::0;59268:13:0::1;::::0;-1:-1:-1;;;;;59254:28:0;;::::1;59268:13:::0;::::1;59254:28;;59203:79;59199:356;;;59347:9;59318:39;::::0;;;:28:::1;:39;::::0;;;;;59360:12:::1;-1:-1:-1::0;59310:140:0::1;;;;-1:-1:-1::0;;;59310:140:0::1;;;;;;;:::i;:::-;59506:9;59477:39;::::0;;;:28:::1;:39;::::0;;;;59519:12:::1;59477:54:::0;;59199:356:::1;-1:-1:-1::0;;;;;59643:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;:71:::0;::::1;;;-1:-1:-1::0;;;;;;59679:35:0;::::1;;::::0;;;:31:::1;:35;::::0;;;;;::::1;;59678:36;59643:71;59639:738;;;59761:20;;59751:6;:30;;59743:96;;;;-1:-1:-1::0;;;59743:96:0::1;;;;;;;:::i;:::-;59900:9;;59883:13;59893:2;59883:9;:13::i;:::-;59874:22;::::0;:6;:22:::1;:::i;:::-;:35;;59866:67;;;;-1:-1:-1::0;;;59866:67:0::1;;;;;;;:::i;:::-;59639:738;;;-1:-1:-1::0;;;;;60027:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;:71:::0;::::1;;;-1:-1:-1::0;;;;;;60061:37:0;::::1;;::::0;;;:31:::1;:37;::::0;;;;;::::1;;60060:38;60027:71;60023:354;;;60145:20;;60135:6;:30;;60127:97;;;;-1:-1:-1::0;;;60127:97:0::1;;;;;;;:::i;60023:354::-;60324:9;;60307:13;60317:2;60307:9;:13::i;:::-;60298:22;::::0;:6;:22:::1;:::i;:::-;:35;;60290:67;;;;-1:-1:-1::0;;;60290:67:0::1;;;;;;;:::i;:::-;60437:28;60468:24;60486:4;60468:9;:24::i;:::-;60552:18;::::0;60437:55;;-1:-1:-1;60528:42:0;::::1;::::0;::::1;::::0;;;60601:35:::1;;-1:-1:-1::0;60625:11:0::1;::::0;;;::::1;;;60601:35;:61;;;;-1:-1:-1::0;60654:8:0::1;::::0;-1:-1:-1;;;60654:8:0;::::1;;;60653:9;60601:61;:110;;;;-1:-1:-1::0;;;;;;60680:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;60679:32;60601:110;:153;;;;-1:-1:-1::0;;;;;;60729:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;60728:26;60601:153;:194;;;;-1:-1:-1::0;;;;;;60772:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;60771:24;60601:194;60583:338;;;60822:8;:15:::0;;-1:-1:-1;;;;60822:15:0::1;-1:-1:-1::0;;;60822:15:0::1;::::0;;60866:10:::1;:8;:10::i;:::-;60893:8;:16:::0;;-1:-1:-1;;;;60893:16:0::1;::::0;;60583:338:::1;60957:8;::::0;-1:-1:-1;;;;;61066:25:0;::::1;60941:12;61066:25:::0;;;:19:::1;:25;::::0;;;;;60957:8:::1;-1:-1:-1::0;;;60957:8:0;;::::1;::::0;::::1;60956:9;::::0;61066:25:::1;::::0;:52:::1;;-1:-1:-1::0;;;;;;61095:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;61066:52;61063:99;;;-1:-1:-1::0;61145:5:0::1;61063:99;61182:12;61286:7;61283:1342;;;61338:12;61312:18;;61333:1;61312:22;;;;:::i;:::-;:38;;:108;;;;-1:-1:-1::0;;;;;;61355:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;::::0;:64:::1;;-1:-1:-1::0;;;;;;61388:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;61355:64;61309:1147;;;61447:23;61466:3;61447:14;:6:::0;61458:2:::1;61447:10;:14::i;:23::-;61440:30:::0;-1:-1:-1;61523:2:0::1;61511:9;61440:30:::0;61518:2:::1;61511:9;:::i;:::-;:14;;;;:::i;:::-;61489:18;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61576:2:0::1;::::0;-1:-1:-1;61564:9:0::1;:4:::0;61571:2:::1;61564:9;:::i;:::-;:14;;;;:::i;:::-;61544:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61631:2:0::1;::::0;-1:-1:-1;61619:9:0::1;:4:::0;61626:2:::1;61619:9;:::i;:::-;:14;;;;:::i;:::-;61597:18;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61309:1147:0::1;::::0;-1:-1:-1;61309:1147:0::1;;-1:-1:-1::0;;;;;61696:29:0;::::1;;::::0;;;:25:::1;:29:::0;;;;;;::::1;;:50:::0;::::1;;;;61745:1;61729:13;;:17;61696:50;61692:764;;;61773:34;61803:3;61773:25;61784:13;;61773:6;:10;;:25;;;;:::i;:34::-;61766:41;;61874:13;;61855:16;;61848:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;61826:18;;:61;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;61950:13:0::1;::::0;61933:14:::1;::::0;61926:21:::1;::::0;:4;:21:::1;:::i;:::-;:37;;;;:::i;:::-;61906:16;;:57;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62030:13:0::1;::::0;62011:16:::1;::::0;62004:23:::1;::::0;:4;:23:::1;:::i;61692:764::-;-1:-1:-1::0;;;;;62104:31:0;::::1;;::::0;;;:25:::1;:31:::0;;;;;;::::1;;:51:::0;::::1;;;;62154:1;62139:12;;:16;62104:51;62101:355;;;62180:33;62209:3;62180:24;62191:12;;62180:6;:10;;:24;;;;:::i;:33::-;62173:40;;62276:12;;62258:15;;62251:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;62229:18;;:59;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62350:12:0::1;::::0;62334:13:::1;::::0;62327:20:::1;::::0;:4;:20:::1;:::i;:::-;:35;;;;:::i;:::-;62307:16;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62428:12:0::1;::::0;62410:15:::1;::::0;62403:22:::1;::::0;:4;:22:::1;:::i;:::-;:37;;;;:::i;:::-;62381:18;;:59;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62101:355:0::1;62487:8:::0;;62484:93:::1;;62519:42;62535:4;62549;62556;62519:15;:42::i;:::-;62599:14;62609:4:::0;62599:14;::::1;:::i;:::-;;;61283:1342;62637:33;62653:4;62659:2;62663:6;62637:15;:33::i;:::-;47142:1;;;;56642:6036:::0;;;:::o;30475:173::-;30550:6;;;-1:-1:-1;;;;;30567:17:0;;;-1:-1:-1;;;;;;30567:17:0;;;;;;;30600:40;;30550:6;;;30567:17;30550:6;;30600:40;;30531:16;;30600:40;30475:173;;:::o;17117:387::-;17440:20;17488:8;;;17117:387::o;55450:188::-;-1:-1:-1;;;;;55533:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;55533:39:0;;;;;;;;;;55590:40;;55533:39;;:31;55590:40;;;55450:188;;:::o;25079:211::-;25196:86;25216:5;25246:23;;;25271:2;25275:5;25223:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25223:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25223:58:0;-1:-1:-1;;;;;;25223:58:0;;;;;;;;;;25196:19;:86::i;11726:733::-;-1:-1:-1;;;;;11866:20:0;;11858:70;;;;-1:-1:-1;;;11858:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11947:23:0;;11939:71;;;;-1:-1:-1;;;11939:71:0;;;;;;;:::i;:::-;12023:47;12044:6;12052:9;12063:6;12023:20;:47::i;:::-;-1:-1:-1;;;;;12107:17:0;;12083:21;12107:17;;;;;;;;;;;12143:23;;;;12135:74;;;;-1:-1:-1;;;12135:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12245:17:0;;;:9;:17;;;;;;;;;;;12265:22;;;12245:42;;12309:20;;;;;;;;:30;;12281:6;;12245:9;12309:30;;12281:6;;12309:30;:::i;:::-;;;;;;;;12374:9;-1:-1:-1;;;;;12357:35:0;12366:6;-1:-1:-1;;;;;12357:35:0;;12385:6;12357:35;;;;;;:::i;:::-;;;;;;;;12405:46;12425:6;12433:9;12444:6;12405:19;:46::i;:::-;11726:733;;;;:::o;34588:98::-;34646:7;34673:5;34677:1;34673;:5;:::i;63836:1577::-;63875:23;63901:24;63919:4;63901:9;:24::i;:::-;63875:50;;63936:25;64006:16;;63985:18;;63964;;:39;;;;:::i;:::-;:58;;;;:::i;:::-;63936:86;-1:-1:-1;64046:20:0;;;:46;;-1:-1:-1;64070:22:0;;64046:46;64043:60;;;64095:7;;;;64043:60;64172:23;64257:1;64237:17;64216:18;;64198:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;64172:86;-1:-1:-1;64269:26:0;64298:36;:15;64172:86;64298:19;:36::i;:::-;64269:65;-1:-1:-1;64383:21:0;64417:36;64269:65;64417:16;:36::i;:::-;64475:18;64496:44;:21;64522:17;64496:25;:44::i;:::-;64475:65;;64561:23;64587:57;64626:17;64587:34;64602:18;;64587:10;:14;;:34;;;;:::i;:57::-;64561:83;;64655:21;64679:55;64716:17;64679:32;64694:16;;64679:10;:14;;:32;;;;:::i;:55::-;64655:79;-1:-1:-1;64765:23:0;64655:79;64791:28;64804:15;64791:10;:28;:::i;:::-;:44;;;;:::i;:::-;64887:1;64866:18;:22;;;64899:18;:22;;;64932:16;:20;;;64999:15;;64991:57;;64765:70;;-1:-1:-1;64887:1:0;;-1:-1:-1;;;;;64999:15:0;;;;65028;;64991:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64973:75;;;65080:1;65062:15;:19;:42;;;;;65103:1;65085:15;:19;65062:42;65059:210;;;65120:46;65133:15;65150;65120:12;:46::i;:::-;65186:71;65201:18;65221:15;65238:18;;65186:71;;;;;;;;:::i;:::-;;;;;;;;65059:210;65352:13;;65344:61;;-1:-1:-1;;;;;65352:13:0;;;;65379:21;;65344:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;63836:1577:0:o;34189:98::-;34247:7;34274:5;34278:1;34274;:5;:::i;27652:716::-;28076:23;28102:69;28130:4;28102:69;;;;;;;;;;;;;;;;;28110:5;-1:-1:-1;;;;;28102:27:0;;;:69;;;;;:::i;:::-;28186:17;;28076:95;;-1:-1:-1;28186:21:0;28182:179;;28283:10;28272:30;;;;;;;;;;;;:::i;:::-;28264:85;;;;-1:-1:-1;;;28264:85:0;;;;;;;:::i;62686:601::-;62838:16;;;62852:1;62838:16;;;;;;;;62814:21;;62838:16;;;;;;;;;;-1:-1:-1;62838:16:0;62814:40;;62883:4;62865;62870:1;62865:7;;;;;;-1:-1:-1;;;62865:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;62865:23:0;;;-1:-1:-1;;;;;62865:23:0;;;;;62909:15;-1:-1:-1;;;;;62909:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62899:4;62904:1;62899:7;;;;;;-1:-1:-1;;;62899:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;62899:32:0;;;-1:-1:-1;;;;;62899:32:0;;;;;62944:62;62961:4;62976:15;62994:11;62944:8;:62::i;:::-;63045:224;;-1:-1:-1;;;63045:224:0;;-1:-1:-1;;;;;63045:15:0;:66;;;;:224;;63126:11;;63152:1;;63196:4;;63223;;63243:15;;63045:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62686:601;;:::o;63311:517::-;63459:62;63476:4;63491:15;63509:11;63459:8;:62::i;:::-;63564:256;;-1:-1:-1;;;63564:256:0;;-1:-1:-1;;;;;63564:15:0;:31;;;;63603:9;;63564:256;;63636:4;;63656:11;;63682:1;;;;45040:6;;63794:15;;63564:256;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;63311:517;;:::o;19923:229::-;20060:12;20092:52;20114:6;20122:4;20128:1;20131:12;20092:21;:52::i;:::-;20085:59;19923:229;-1:-1:-1;;;;19923:229:0:o;21043:510::-;21213:12;21271:5;21246:21;:30;;21238:81;;;;-1:-1:-1;;;21238:81:0;;;;;;;:::i;:::-;21338:18;21349:6;21338:10;:18::i;:::-;21330:60;;;;-1:-1:-1;;;21330:60:0;;;;;;;:::i;:::-;21404:12;21418:23;21445:6;-1:-1:-1;;;;;21445:11:0;21464:5;21471:4;21445:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21403:73;;;;21494:51;21511:7;21520:10;21532:12;21494:16;:51::i;:::-;21487:58;21043:510;-1:-1:-1;;;;;;;21043:510:0:o;23729:712::-;23879:12;23908:7;23904:530;;;-1:-1:-1;23939:10:0;23932:17;;23904:530;24053:17;;:21;24049:374;;24251:10;24245:17;24312:15;24299:10;24295:2;24291:19;24284:44;24199:148;24394:12;24387:20;;-1:-1:-1;;;24387:20:0;;;;;;;;:::i;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:259::-;;269:2;257:9;248:7;244:23;240:32;237:2;;;290:6;282;275:22;237:2;334:9;321:23;353:33;380:5;353:33;:::i;421:263::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;565:6;557;550:22;512:2;602:9;596:16;621:33;648:5;621:33;:::i;689:402::-;;;818:2;806:9;797:7;793:23;789:32;786:2;;;839:6;831;824:22;786:2;883:9;870:23;902:33;929:5;902:33;:::i;:::-;954:5;-1:-1:-1;1011:2:1;996:18;;983:32;1024:35;983:32;1024:35;:::i;:::-;1078:7;1068:17;;;776:315;;;;;:::o;1096:470::-;;;;1242:2;1230:9;1221:7;1217:23;1213:32;1210:2;;;1263:6;1255;1248:22;1210:2;1307:9;1294:23;1326:33;1353:5;1326:33;:::i;:::-;1378:5;-1:-1:-1;1435:2:1;1420:18;;1407:32;1448:35;1407:32;1448:35;:::i;:::-;1200:366;;1502:7;;-1:-1:-1;;;1556:2:1;1541:18;;;;1528:32;;1200:366::o;1571:396::-;;;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1762:9;1749:23;1781:33;1808:5;1781:33;:::i;:::-;1833:5;-1:-1:-1;1890:2:1;1875:18;;1862:32;1903;1862;1903;:::i;1972:327::-;;;2101:2;2089:9;2080:7;2076:23;2072:32;2069:2;;;2122:6;2114;2107:22;2069:2;2166:9;2153:23;2185:33;2212:5;2185:33;:::i;:::-;2237:5;2289:2;2274:18;;;;2261:32;;-1:-1:-1;;;2059:240:1:o;2304:1166::-;;2419:2;2462;2450:9;2441:7;2437:23;2433:32;2430:2;;;2483:6;2475;2468:22;2430:2;2528:9;2515:23;2557:18;2598:2;2590:6;2587:14;2584:2;;;2619:6;2611;2604:22;2584:2;2662:6;2651:9;2647:22;2637:32;;2707:7;2700:4;2696:2;2692:13;2688:27;2678:2;;2734:6;2726;2719:22;2678:2;2775;2762:16;2797:2;2793;2790:10;2787:2;;;2803:18;;:::i;:::-;2850:2;2846;2842:11;2882:2;2876:9;2933:2;2928;2920:6;2916:15;2912:24;2986:6;2974:10;2971:22;2966:2;2954:10;2951:18;2948:46;2945:2;;;2997:18;;:::i;:::-;3033:2;3026:22;3083:18;;;3117:15;;;;-1:-1:-1;3152:11:1;;;3182;;;3178:20;;3175:33;-1:-1:-1;3172:2:1;;;3226:6;3218;3211:22;3172:2;3253:6;3244:15;;3268:171;3282:2;3279:1;3276:9;3268:171;;;3339:25;3360:3;3339:25;:::i;:::-;3327:38;;3300:1;3293:9;;;;;3385:12;;;;3417;;3268:171;;;-1:-1:-1;3458:6:1;2399:1071;-1:-1:-1;;;;;;;;2399:1071:1:o;3475:253::-;;3584:2;3572:9;3563:7;3559:23;3555:32;3552:2;;;3605:6;3597;3590:22;3552:2;3649:9;3636:23;3668:30;3692:5;3668:30;:::i;3733:257::-;;3853:2;3841:9;3832:7;3828:23;3824:32;3821:2;;;3874:6;3866;3859:22;3821:2;3911:9;3905:16;3930:30;3954:5;3930:30;:::i;3995:190::-;;4107:2;4095:9;4086:7;4082:23;4078:32;4075:2;;;4128:6;4120;4113:22;4075:2;-1:-1:-1;4156:23:1;;4065:120;-1:-1:-1;4065:120:1:o;4190:194::-;;4313:2;4301:9;4292:7;4288:23;4284:32;4281:2;;;4334:6;4326;4319:22;4281:2;-1:-1:-1;4362:16:1;;4271:113;-1:-1:-1;4271:113:1:o;4389:326::-;;;;4535:2;4523:9;4514:7;4510:23;4506:32;4503:2;;;4556:6;4548;4541:22;4503:2;-1:-1:-1;;4584:23:1;;;4654:2;4639:18;;4626:32;;-1:-1:-1;4705:2:1;4690:18;;;4677:32;;4493:222;-1:-1:-1;4493:222:1:o;4720:316::-;;;;4877:2;4865:9;4856:7;4852:23;4848:32;4845:2;;;4898:6;4890;4883:22;4845:2;4932:9;4926:16;4916:26;;4982:2;4971:9;4967:18;4961:25;4951:35;;5026:2;5015:9;5011:18;5005:25;4995:35;;4835:201;;;;;:::o;5041:469::-;;5138:5;5132:12;5165:6;5160:3;5153:19;5191:4;5220:2;5215:3;5211:12;5204:19;;5257:2;5250:5;5246:14;5278:3;5290:195;5304:6;5301:1;5298:13;5290:195;;;5369:13;;-1:-1:-1;;;;;5365:39:1;5353:52;;5425:12;;;;5460:15;;;;5401:1;5319:9;5290:195;;;-1:-1:-1;5501:3:1;;5108:402;-1:-1:-1;;;;;5108:402:1:o;5515:274::-;;5682:6;5676:13;5698:53;5744:6;5739:3;5732:4;5724:6;5720:17;5698:53;:::i;:::-;5767:16;;;;;5652:137;-1:-1:-1;;5652:137:1:o;5794:205::-;5994:3;5985:14::o;6004:203::-;-1:-1:-1;;;;;6168:32:1;;;;6150:51;;6138:2;6123:18;;6105:102::o;6212:274::-;-1:-1:-1;;;;;6404:32:1;;;;6386:51;;6468:2;6453:18;;6446:34;6374:2;6359:18;;6341:145::o;6491:607::-;-1:-1:-1;;;;;6850:15:1;;;6832:34;;6897:2;6882:18;;6875:34;;;;6940:2;6925:18;;6918:34;;;;6983:2;6968:18;;6961:34;;;;7032:15;;;7026:3;7011:19;;7004:44;6812:3;7064:19;;7057:35;;;;6781:3;6766:19;;6748:350::o;7103:187::-;7268:14;;7261:22;7243:41;;7231:2;7216:18;;7198:92::o;7530:516::-;;7801:6;7790:9;7783:25;7844:3;7839:2;7828:9;7824:18;7817:31;7865:63;7923:3;7912:9;7908:19;7900:6;7865:63;:::i;:::-;-1:-1:-1;;;;;7964:32:1;;;;7959:2;7944:18;;7937:60;-1:-1:-1;8028:2:1;8013:18;8006:34;7857:71;7773:273;-1:-1:-1;;7773:273:1:o;8051:383::-;;8200:2;8189:9;8182:21;8232:6;8226:13;8275:6;8270:2;8259:9;8255:18;8248:34;8291:66;8350:6;8345:2;8334:9;8330:18;8325:2;8317:6;8313:15;8291:66;:::i;:::-;8418:2;8397:15;-1:-1:-1;;8393:29:1;8378:45;;;;8425:2;8374:54;;8172:262;-1:-1:-1;;8172:262:1:o;8439:399::-;8641:2;8623:21;;;8680:2;8660:18;;;8653:30;8719:34;8714:2;8699:18;;8692:62;-1:-1:-1;;;8785:2:1;8770:18;;8763:33;8828:3;8813:19;;8613:225::o;8843:346::-;9045:2;9027:21;;;9084:2;9064:18;;;9057:30;-1:-1:-1;;;9118:2:1;9103:18;;9096:52;9180:2;9165:18;;9017:172::o;9194:402::-;9396:2;9378:21;;;9435:2;9415:18;;;9408:30;9474:34;9469:2;9454:18;;9447:62;-1:-1:-1;;;9540:2:1;9525:18;;9518:36;9586:3;9571:19;;9368:228::o;9601:398::-;9803:2;9785:21;;;9842:2;9822:18;;;9815:30;9881:34;9876:2;9861:18;;9854:62;-1:-1:-1;;;9947:2:1;9932:18;;9925:32;9989:3;9974:19;;9775:224::o;10004:421::-;10206:2;10188:21;;;10245:2;10225:18;;;10218:30;10284:34;10279:2;10264:18;;10257:62;10355:27;10350:2;10335:18;;10328:55;10415:3;10400:19;;10178:247::o;10430:402::-;10632:2;10614:21;;;10671:2;10651:18;;;10644:30;10710:34;10705:2;10690:18;;10683:62;-1:-1:-1;;;10776:2:1;10761:18;;10754:36;10822:3;10807:19;;10604:228::o;10837:418::-;11039:2;11021:21;;;11078:2;11058:18;;;11051:30;11117:34;11112:2;11097:18;;11090:62;-1:-1:-1;;;11183:2:1;11168:18;;11161:52;11245:3;11230:19;;11011:244::o;11260:402::-;11462:2;11444:21;;;11501:2;11481:18;;;11474:30;11540:34;11535:2;11520:18;;11513:62;-1:-1:-1;;;11606:2:1;11591:18;;11584:36;11652:3;11637:19;;11434:228::o;11667:417::-;11869:2;11851:21;;;11908:2;11888:18;;;11881:30;11947:34;11942:2;11927:18;;11920:62;-1:-1:-1;;;12013:2:1;11998:18;;11991:51;12074:3;12059:19;;11841:243::o;12089:477::-;12291:2;12273:21;;;12330:2;12310:18;;;12303:30;12369:34;12364:2;12349:18;;12342:62;12440:34;12435:2;12420:18;;12413:62;-1:-1:-1;;;12506:3:1;12491:19;;12484:40;12556:3;12541:19;;12263:303::o;12571:404::-;12773:2;12755:21;;;12812:2;12792:18;;;12785:30;12851:34;12846:2;12831:18;;12824:62;-1:-1:-1;;;12917:2:1;12902:18;;12895:38;12965:3;12950:19;;12745:230::o;12980:356::-;13182:2;13164:21;;;13201:18;;;13194:30;13260:34;13255:2;13240:18;;13233:62;13327:2;13312:18;;13154:182::o;13341:401::-;13543:2;13525:21;;;13582:2;13562:18;;;13555:30;13621:34;13616:2;13601:18;;13594:62;-1:-1:-1;;;13687:2:1;13672:18;;13665:35;13732:3;13717:19;;13515:227::o;13747:352::-;13949:2;13931:21;;;13988:2;13968:18;;;13961:30;14027;14022:2;14007:18;;14000:58;14090:2;14075:18;;13921:178::o;14104:400::-;14306:2;14288:21;;;14345:2;14325:18;;;14318:30;14384:34;14379:2;14364:18;;14357:62;-1:-1:-1;;;14450:2:1;14435:18;;14428:34;14494:3;14479:19;;14278:226::o;14509:353::-;14711:2;14693:21;;;14750:2;14730:18;;;14723:30;14789:31;14784:2;14769:18;;14762:59;14853:2;14838:18;;14683:179::o;14867:343::-;15069:2;15051:21;;;15108:2;15088:18;;;15081:30;-1:-1:-1;;;15142:2:1;15127:18;;15120:49;15201:2;15186:18;;15041:169::o;15215:397::-;15417:2;15399:21;;;15456:2;15436:18;;;15429:30;15495:34;15490:2;15475:18;;15468:62;-1:-1:-1;;;15561:2:1;15546:18;;15539:31;15602:3;15587:19;;15389:223::o;15617:406::-;15819:2;15801:21;;;15858:2;15838:18;;;15831:30;15897:34;15892:2;15877:18;;15870:62;-1:-1:-1;;;15963:2:1;15948:18;;15941:40;16013:3;15998:19;;15791:232::o;16028:401::-;16230:2;16212:21;;;16269:2;16249:18;;;16242:30;16308:34;16303:2;16288:18;;16281:62;-1:-1:-1;;;16374:2:1;16359:18;;16352:35;16419:3;16404:19;;16202:227::o;16434:177::-;16580:25;;;16568:2;16553:18;;16535:76::o;16616:588::-;;16915:6;16904:9;16897:25;16958:6;16953:2;16942:9;16938:18;16931:34;17001:3;16996:2;16985:9;16981:18;16974:31;17022:63;17080:3;17069:9;17065:19;17057:6;17022:63;:::i;:::-;-1:-1:-1;;;;;17121:32:1;;;;17116:2;17101:18;;17094:60;-1:-1:-1;17185:3:1;17170:19;17163:35;17014:71;16887:317;-1:-1:-1;;;16887:317:1:o;17209:319::-;17411:25;;;17467:2;17452:18;;17445:34;;;;17510:2;17495:18;;17488:34;17399:2;17384:18;;17366:162::o;17533:184::-;17705:4;17693:17;;;;17675:36;;17663:2;17648:18;;17630:87::o;17722:128::-;;17793:1;17789:6;17786:1;17783:13;17780:2;;;17799:18;;:::i;:::-;-1:-1:-1;17835:9:1;;17770:80::o;17855:217::-;;17921:1;17911:2;;-1:-1:-1;;;17946:31:1;;18000:4;17997:1;17990:15;18028:4;17953:1;18018:15;17911:2;-1:-1:-1;18057:9:1;;17901:171::o;18077:168::-;;18183:1;18179;18175:6;18171:14;18168:1;18165:21;18160:1;18153:9;18146:17;18142:45;18139:2;;;18190:18;;:::i;:::-;-1:-1:-1;18230:9:1;;18129:116::o;18250:125::-;;18318:1;18315;18312:8;18309:2;;;18323:18;;:::i;:::-;-1:-1:-1;18360:9:1;;18299:76::o;18380:258::-;18452:1;18462:113;18476:6;18473:1;18470:13;18462:113;;;18552:11;;;18546:18;18533:11;;;18526:39;18498:2;18491:10;18462:113;;;18593:6;18590:1;18587:13;18584:2;;;-1:-1:-1;;18628:1:1;18610:16;;18603:27;18433:205::o;18643:380::-;18728:1;18718:12;;18775:1;18765:12;;;18786:2;;18840:4;18832:6;18828:17;18818:27;;18786:2;18893;18885:6;18882:14;18862:18;18859:38;18856:2;;;18939:10;18934:3;18930:20;18927:1;18920:31;18974:4;18971:1;18964:15;19002:4;18999:1;18992:15;18856:2;;18698:325;;;:::o;19028:135::-;;-1:-1:-1;;19088:17:1;;19085:2;;;19108:18;;:::i;:::-;-1:-1:-1;19155:1:1;19144:13;;19075:88::o;19168:127::-;19229:10;19224:3;19220:20;19217:1;19210:31;19260:4;19257:1;19250:15;19284:4;19281:1;19274:15;19300:127;19361:10;19356:3;19352:20;19349:1;19342:31;19392:4;19389:1;19382:15;19416:4;19413:1;19406:15;19432:133;-1:-1:-1;;;;;19509:31:1;;19499:42;;19489:2;;19555:1;19552;19545:12;19570:120;19658:5;19651:13;19644:21;19637:5;19634:32;19624:2;;19680:1;19677;19670:12

Swarm Source

ipfs://5ede4ab2815e33d8219c45518b00c583d6325a1967bbdfdd2c8628107988754b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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