ETH Price: $3,674.94 (+0.96%)

Token

ERC-20: Candy Swap (Candy)
 

Overview

Max Total Supply

1,000,000,000 Candy

Holders

2,070

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
17,846 Candy

Value
$0.00
0x897bbfd0fe4bf947ce64d1ce7b498ab6b375a817
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:
CandyToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-19
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), 'Address: call to non-contract');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


contract ERC20 is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

    /**
     * @dev Returns the token decimals.
     */
    function decimals() public override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
     */
    function symbol() public override view returns (string memory) {
        return _symbol;
    }

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

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

    /**
     * @dev See {ERC20-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 override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {ERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {ERC20-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 override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance')
        );
        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 {ERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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 {ERC20-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 returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(subtractedValue, 'ERC20: decreased allowance below zero')
        );
        return true;
    }

    /**
     * @dev Destroys `amount` tokens from `msg.sender`, decreasing the total supply.
     *
     */
    function burn(uint256 amount) public returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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');

        _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance');
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(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
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), 'ERC20: mint to the zero address');

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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 {
        require(account != address(0), 'ERC20: burn from the zero address');

        _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance');
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 {
        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 Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(
            account,
            _msgSender(),
            _allowances[account][_msgSender()].sub(amount, 'ERC20: burn amount exceeds allowance')
        );
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    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'
        // solhint-disable-next-line max-line-length
        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).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            'SafeERC20: decreased allowance below zero'
        );
        _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
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
        }
    }
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface INonfungiblePositionManager {
    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint amount0Desired;
        uint amount1Desired;
        uint amount0Min;
        uint amount1Min;
        address recipient;
        uint deadline;
    }

    function mint(
        MintParams calldata params
    )
        external
        payable
        returns (uint tokenId, uint128 liquidity, uint amount0, uint amount1);

    struct IncreaseLiquidityParams {
        uint tokenId;
        uint amount0Desired;
        uint amount1Desired;
        uint amount0Min;
        uint amount1Min;
        uint deadline;
    }

    function increaseLiquidity(
        IncreaseLiquidityParams calldata params
    ) external payable returns (uint128 liquidity, uint amount0, uint amount1);

    struct DecreaseLiquidityParams {
        uint tokenId;
        uint128 liquidity;
        uint amount0Min;
        uint amount1Min;
        uint deadline;
    }

    function decreaseLiquidity(
        DecreaseLiquidityParams calldata params
    ) external payable returns (uint amount0, uint amount1);

    struct CollectParams {
        uint tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    function collect(
        CollectParams calldata params
    ) external payable returns (uint amount0, uint amount1);
}

interface ISwapRouter {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint deadline;
        uint amountIn;
        uint amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps amountIn of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as ExactInputSingleParams in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(
        ExactInputSingleParams calldata params
    ) external payable returns (uint amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint deadline;
        uint amountIn;
        uint amountOutMinimum;
    }

    /// @notice Swaps amountIn of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as ExactInputParams in calldata
    /// @return amountOut The amount of the received token
    function exactInput(
        ExactInputParams calldata params
    ) external payable returns (uint amountOut);
}

interface IUniRouterV2 {
    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, uint swapFee) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint swapFee) 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);
    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;
}

interface IWETH is IERC20 {
    function deposit() external payable;

    function withdraw(uint amount) external;
}

contract CandyToken is ERC20, IERC721Receiver {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IWETH weth = IWETH(WETH);
    int24 private constant MIN_TICK = -887272;
    int24 private constant MAX_TICK = -MIN_TICK;
    int24 private constant TICK_SPACING = 60;

    INonfungiblePositionManager public candySwapPositionManager;
    ISwapRouter public candySwapRouter;
    IUniRouterV2 public swapRouterV2;
    bool public v2Active = false;
    address public candySwapPool;

    bool private swapping;

    address payable public devmarketingWallet =
        payable(0x399Db7F59a79563a1dd4a687a0dEa41BbEaA2254);
    address payable public liquidityWallet =
        payable(0x92D41D83e9EAc685863645A4F05e8FdDE684c74f);

    uint256 public contractAmountToSwap = 100 ether;

    uint256 public devmarketingFeeOnBuy = 4;
    uint256 public liquidityFeeOnBuy = 1;
    uint256 public totalFeesOnBuy = 5;
    uint256 public devmarketingFeeOnSell = 4;
    uint256 public liquidityFeeOnSell = 1;
    uint256 public totalFeesOnSell = 5;
    uint256 public burnTaxOnSell = 0;
    uint256 public burnTaxOnBuy = 0;

    uint256 public devmarketingShare = 6;
    uint256 public liquidityShare = 4;
    uint256 public totalShare = devmarketingShare.add(liquidityShare);


    bool public SwapAndLiquifyEnabled = false;
    uint256 public maxTxAmount = 1000000000 * (10**18); // Initial Max Tx Amount
    uint256 public maxWalletAmount = 1000000000 * (10**18); // Initial Max Wallet Amount

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

    // getting fee addresses
    mapping(address => bool) public _isGetFees;

    // store addresses that are automated market maker pools. Any transfer to these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPools;

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    // Contract Events
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeFromMaxAmounts(address indexed account, bool isExcluded);
    event GetFee(address indexed account, bool isGetFee);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPool(address indexed pool, bool indexed value);
    event DevMarketingWalletUpdated(
        address indexed newDevMarketingWallet,
        address indexed oldDevMarketingWallet
    );
    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event UpdateCandySwapRouter(
        address indexed newAddress,
        address indexed oldAddress
    );
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 nativeReceived,
        uint256 tokensIntoLiqudity
    );
    event UpdateSwapAndLiquify(bool value);
    event SetDevMarketingFee(uint256 onBuy, uint256 onSell);
    event SetLiquidityFee(uint256 onBuy, uint256 onSell);
    event SetContractAmountToSwap(uint256 contractAmountToSwap);
    event UpdateMaxTxAmount(uint256 txAmount);
    event UpdateMaxWalletAmount(uint256 walletAmount);

    constructor() public ERC20("Candy Swap", "Candy", 18) {
        _mint(owner(), 1000000000 * (10**18));

        excludeFromFees(devmarketingWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(owner(), true);

        excludeFromMaxAmounts(devmarketingWallet, true);
        excludeFromMaxAmounts(address(this), true);
        excludeFromMaxAmounts(owner(), true);

        _status = _NOT_ENTERED;
    }

    receive() external payable {}

    function updatePositionManager(address _manager) external onlyOwner {
        candySwapPositionManager = INonfungiblePositionManager(_manager);
    }

    function updateSwapRouter(address _router) external onlyOwner {
        candySwapRouter = ISwapRouter(_router);
    }

    function updateSwapRouterV2(address _routerV2) external onlyOwner {
        swapRouterV2 = IUniRouterV2(_routerV2);
    }

    function updateV2Active(bool _active) external onlyOwner {
        v2Active = _active;
    }

    function onERC721Received(
        address operator,
        address from,
        uint tokenId,
        bytes calldata
    ) external override returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    function updateSwapAndLiquifiy(bool value) public onlyOwner {
        SwapAndLiquifyEnabled = value;
        emit UpdateSwapAndLiquify(value);
    }

    function setDevMarketingFee(uint256 _onBuy, uint256 _onSell)
        external
        onlyOwner
    {
        devmarketingFeeOnBuy = _onBuy;
        devmarketingFeeOnSell = _onSell;
        totalFeesOnBuy = devmarketingFeeOnBuy.add(liquidityFeeOnBuy);
        totalFeesOnSell = devmarketingFeeOnSell.add(liquidityFeeOnSell);

        uint256 maxFeeSell = 10 - burnTaxOnSell;
        uint256 maxFeeBuy = 10 - burnTaxOnBuy;

        require(totalFeesOnBuy <= maxFeeBuy, "Over-max-Fee");
        require(totalFeesOnSell <= maxFeeSell, "Over-max-Fee");
        emit SetDevMarketingFee(_onBuy, _onSell);
    }

    function setLiquidityFee(uint256 _onBuy, uint256 _onSell)
        external
        onlyOwner
    {
        liquidityFeeOnBuy = _onBuy;
        liquidityFeeOnSell = _onSell;
        totalFeesOnBuy = devmarketingFeeOnBuy.add(liquidityFeeOnBuy);
        totalFeesOnSell = devmarketingFeeOnSell.add(liquidityFeeOnSell);

        uint256 maxFeeSell = 10 - burnTaxOnSell;
        uint256 maxFeeBuy = 10 - burnTaxOnBuy;

        require(totalFeesOnBuy <= maxFeeBuy, "Over-max-Fee");
        require(totalFeesOnSell <= maxFeeSell, "Over-max-Fee");

        emit SetLiquidityFee(_onBuy, _onSell);
    }

    function setBurnTax(uint256 _onBuy, uint256 _onSell)
        external
        onlyOwner
    {
        burnTaxOnBuy = _onBuy;
        burnTaxOnSell = _onSell;

        uint256 maxFeeSell = 10 - burnTaxOnSell;
        uint256 maxFeeBuy = 10 - burnTaxOnBuy;

        require(totalFeesOnBuy <= maxFeeBuy, "Over-max-Fee");
        require(totalFeesOnSell <= maxFeeSell, "Over-max-Fee");
    }

    function updateShares(uint256 _devmarketing, uint256 _liquidity) external onlyOwner {
        devmarketingShare = _devmarketing;
        liquidityShare = _liquidity;

        totalShare = devmarketingShare.add(liquidityShare);
    }

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

        emit ExcludeFromFees(account, excluded);
    }

    function excludeFromMaxAmounts(address account, bool excluded) public onlyOwner {
        _isExcludedFromMaxAmounts[account] = excluded;

        emit ExcludeFromMaxAmounts(account, excluded);
    }

    function setFeeAccount(address account, bool isGetFee) public onlyOwner {
        _isGetFees[account] = isGetFee;

        emit GetFee(account, isGetFee);
    }

    function excludeMultipleAccountsFromFees(
        address[] calldata accounts,
        bool excluded
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPool(address pool, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPool(pool, value);
    }

    function _setAutomatedMarketMakerPool(address pool, bool value) private {
        automatedMarketMakerPools[pool] = value;

        emit SetAutomatedMarketMakerPool(pool, value);
    }

    function setContractAmountToSwap(uint256 _amount) public onlyOwner {
        contractAmountToSwap = _amount;
        emit SetContractAmountToSwap(contractAmountToSwap);
    }

    function updateDevMarketingWallet(address newDevMarketingWallet)
        public
        onlyOwner
    {
        excludeFromFees(newDevMarketingWallet, true);
        excludeFromFees(devmarketingWallet, false);
        emit DevMarketingWalletUpdated(
            newDevMarketingWallet,
            devmarketingWallet
        );
        devmarketingWallet = payable(newDevMarketingWallet);
    }

    function updateLiquidityWallet(address newLiquidityWallet)
        public
        onlyOwner
    {
        excludeFromFees(newLiquidityWallet, true);
        excludeFromFees(liquidityWallet, false);
        emit LiquidityWalletUpdated(
            newLiquidityWallet,
            liquidityWallet
        );
        liquidityWallet = payable(newLiquidityWallet);
    }

    function updateMaxTxAmount(uint256 _amount) public onlyOwner {
        maxTxAmount = _amount;
        emit UpdateMaxTxAmount(_amount);
    }

    function updateMaxWalletAmount(uint256 _amount) public onlyOwner {
        maxWalletAmount = _amount;
        emit UpdateMaxWalletAmount(_amount);
    }

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

    function isExcludedFromMaxAmounts(address account) public view returns (bool) {
        return _isExcludedFromMaxAmounts[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (!_isExcludedFromMaxAmounts[from]) {
            require(amount <= maxTxAmount, "max-tx-amount-overflow");
        }

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

        if (SwapAndLiquifyEnabled) {
            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= contractAmountToSwap;

            if (canSwap && !swapping && !automatedMarketMakerPools[from] && (!automatedMarketMakerPools[to] || v2Active)) {
                swapping = true;
                // Set number of tokens to sell to contractAmountToSwap
                contractTokenBalance = contractAmountToSwap;
                swapTokens(contractTokenBalance);
                swapping = false;
            }
        }

        // indicates if fee should be deducted from transfer
        bool takeFee = true;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees;
            if (_isGetFees[from] || _isGetFees[to]) {
                if (_isGetFees[from]) {
                    fees = amount.mul(totalFeesOnBuy).div(10**2);
                    if (burnTaxOnBuy > 0) {
                        uint256 burnAmount = amount.mul(burnTaxOnBuy).div(10**2);
                        super._transfer(from, address(this), fees.add(burnAmount));
                        amount = amount.sub(burnAmount);
                        _burn(address(this), burnAmount);
                    } else {
                        super._transfer(from, address(this), fees);
                    }
                } else {
                    fees = amount.mul(totalFeesOnSell).div(10**2);
                    if (burnTaxOnSell > 0) {
                        uint256 burnAmount = amount.mul(burnTaxOnSell).div(10**2);
                        super._transfer(from, address(this), fees.add(burnAmount));
                        amount = amount.sub(burnAmount);
                        _burn(address(this), burnAmount);
                    } else {
                        super._transfer(from, address(this), fees);
                    }
                }
                amount = amount.sub(fees);
            }
        }

        if (!_isExcludedFromMaxAmounts[to]) {
            require(balanceOf(to).add(amount) <= maxWalletAmount, "over-max-wallet-amount");
        }

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

    function swapTokens(uint256 tokenAmount) private {
        uint256 tokensForLiquidity = tokenAmount.mul(liquidityShare).div(totalShare);
        uint256 swapTokenAmount = tokenAmount.sub(tokensForLiquidity);
        swapTokensForNative(swapTokenAmount);
        uint256 swappedNative = address(this).balance;
        
        if (!v2Active) {
            swappedNative = weth.balanceOf(address(this));
        }

        uint256 nativeForLiquidity = swappedNative.mul(liquidityShare).div(totalShare);
        uint256 nativeForMarketing = swappedNative.sub(nativeForLiquidity);

        if (nativeForMarketing > 0) {
            transferNativeToDevMarketingWallet(nativeForMarketing);
        }

        if (nativeForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, nativeForLiquidity);
        }
    }

    // Swap tokens
    function swapTokensForNative(uint256 tokenAmount) private {
        if (v2Active) {
            // generate the sphynxswap pair path of token -> WETH
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = swapRouterV2.WETH();

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

            // make the swap
            swapRouterV2.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of Native
                path,
                address(this),
                block.timestamp
            );
        } else {
            swapTokensForNativeV3(tokenAmount);
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        if (v2Active) {
            // approve token transfer to cover all possible scenarios
            _approve(address(this), address(swapRouterV2), tokenAmount);

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

    // Swap tokens
    function swapTokensForNativeV3(uint256 tokenAmount) private {
        _approve(address(this), address(candySwapRouter), tokenAmount);

        // make the swap
        ISwapRouter.ExactInputSingleParams memory params = ISwapRouter
            .ExactInputSingleParams({
                tokenIn: address(this),
                tokenOut: WETH,
                fee: 3000,
                recipient: address(this),
                deadline: block.timestamp,
                amountIn: tokenAmount,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            });

        candySwapRouter.exactInputSingle(params);
    }

    function addLiquidityV3(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(candySwapPositionManager), tokenAmount);
        weth.approve(address(candySwapPositionManager), ethAmount);

        // add the liquidity
        INonfungiblePositionManager.MintParams
            memory params = INonfungiblePositionManager.MintParams({
                token0: address(this),
                token1: WETH,
                fee: 3000,
                tickLower: (MIN_TICK / TICK_SPACING) * TICK_SPACING,
                tickUpper: (MAX_TICK / TICK_SPACING) * TICK_SPACING,
                amount0Desired: tokenAmount,
                amount1Desired: ethAmount,
                amount0Min: 0,
                amount1Min: 0,
                recipient: liquidityWallet,
                deadline: block.timestamp
            });

        candySwapPositionManager.mint(params);
    }

    function transferNativeToDevMarketingWallet(uint256 amount) private {
        if (!v2Active) {
            weth.withdraw(amount);
        }
        devmarketingWallet.transfer(amount);
    }

    function withdrawNative() external payable onlyOwner {
        address payable msgSender = payable(msg.sender);
        msgSender.transfer(address(this).balance);
    }


    function withdrawToken(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).safeTransfer(msg.sender, _amount);
    }
}

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":"newDevMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldDevMarketingWallet","type":"address"}],"name":"DevMarketingWalletUpdated","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"GetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":"pool","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"contractAmountToSwap","type":"uint256"}],"name":"SetContractAmountToSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetDevMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"onBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"onSell","type":"uint256"}],"name":"SetLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","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":"UpdateCandySwapRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"txAmount","type":"uint256"}],"name":"UpdateMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"walletAmount","type":"uint256"}],"name":"UpdateMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"UpdateSwapAndLiquify","type":"event"},{"inputs":[],"name":"SwapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isGetFees","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":"automatedMarketMakerPools","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnTaxOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTaxOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candySwapPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candySwapPositionManager","outputs":[{"internalType":"contract INonfungiblePositionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candySwapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devmarketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devmarketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxAmounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setBurnTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setContractAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setDevMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isGetFee","type":"bool"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_onBuy","type":"uint256"},{"internalType":"uint256","name":"_onSell","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapRouterV2","outputs":[{"internalType":"contract IUniRouterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":[{"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":"newDevMarketingWallet","type":"address"}],"name":"updateDevMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"updatePositionManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devmarketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"updateShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateSwapAndLiquifiy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerV2","type":"address"}],"name":"updateSwapRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"updateV2Active","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"v2Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260068054610100600160a81b03191674c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2001781556009805460ff60a01b19169055600b805473399db7f59a79563a1dd4a687a0dea41bbeaa22546001600160a01b031991821617909155600c80547392d41d83e9eac685863645a4f05e8fdde684c74f921691909117905568056bc75e2d63100000600d556004600e8190556001600f8190556005601081905560118390556012919091556013556000601481905560155560168290556017819055620000df919062000295602090811b62001a7a17901c565b6018556019805460ff191690556b033b2e3c9fd0803ce8000000601a819055601b553480156200010e57600080fd5b506040518060400160405280600a815260200169043616e647920537761760b41b8152506040518060400160405280600581526020016443616e647960d81b8152506012600062000164620002cd60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508251620001c3906004906020860190620004e3565b508151620001d9906005906020850190620004e3565b506006805460ff191660ff9290921691909117905550620002129050620001ff620002d1565b6b033b2e3c9fd0803ce8000000620002e0565b600b546200022b906001600160a01b03166001620003b7565b62000238306001620003b7565b6200024e62000246620002d1565b6001620003b7565b600b5462000267906001600160a01b0316600162000453565b6200027430600162000453565b6200028a62000282620002d1565b600162000453565b600160205562000636565b600082820183811015620002c65760405162461bcd60e51b8152600401620002bd906200058a565b60405180910390fd5b9392505050565b3390565b6000546001600160a01b031690565b6001600160a01b038216620003095760405162461bcd60e51b8152600401620002bd90620005f6565b62000325816003546200029560201b62001a7a1790919060201c565b6003556001600160a01b0382166000908152600160209081526040909120546200035a91839062001a7a62000295821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003ab9085906200062d565b60405180910390a35050565b620003c1620002cd565b6000546001600160a01b03908116911614620003f15760405162461bcd60e51b8152600401620002bd90620005c1565b6001600160a01b0382166000818152601c602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790620004479084906200057f565b60405180910390a25050565b6200045d620002cd565b6000546001600160a01b039081169116146200048d5760405162461bcd60e51b8152600401620002bd90620005c1565b6001600160a01b0382166000818152601d602052604090819020805460ff1916841515179055517f31777a35b05891a4cc9c1ce4ca85baa6ab67dc77401c14c40d2ccf809729fa0890620004479084906200057f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052657805160ff191683800117855562000556565b8280016001018555821562000556579182015b828111156200055657825182559160200191906001019062000539565b506200056492915062000568565b5090565b5b8082111562000564576000815560010162000569565b901515815260200190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6136a680620006466000396000f3fe6080604052600436106103c75760003560e01c8063715018a6116101f2578063a9059cbb1161010d578063c492f046116100a0578063dd62ed3e1161006f578063dd62ed3e14610a60578063e37ba8f914610a80578063f2fde38b14610aa0578063ff35a9d514610ac0576103ce565b8063c492f046146109eb578063cdd3581d14610a0b578063d469801614610a2b578063da21bcbc14610a40576103ce565b8063bd979e0c116100dc578063bd979e0c1461096b578063c02466681461098b578063c13b3def146109ab578063c18bc195146109cb576103ce565b8063a9059cbb14610901578063aa4bde2814610921578063b24db8f814610936578063b98b677f1461094b576103ce565b80638d6ff9091161018557806395d89b411161015457806395d89b411461088c5780639e281a98146108a1578063a457c2d7146108c1578063a4de3c19146108e1576103ce565b80638d6ff909146108385780638da5cb5b1461084d5780638ec3144f146108625780639372881b14610877576103ce565b80637b3c83b1116101c15780637b3c83b1146107d95780638768a9cd146107ee578063893d20e81461080e5780638c0b5e2214610823576103ce565b8063715018a61461078557806373ec5fd51461079a578063744fbc7a146107af578063766ea415146107c4576103ce565b8063313ce567116102e25780635ddd44f41161027557806367b0affe1161024457806367b0affe146107055780636881d8cb1461072557806368b4cac91461074557806370a0823114610765576103ce565b80635ddd44f414610690578063615e8a2e146106a55780636256d181146106c557806364790208146106e5576103ce565b806342966c68116102b157806342966c68146106335780634aedf7ea146106535780634fbee1931461066857806350431ce414610688576103ce565b8063313ce567146105c757806339509351146105e9578063423ce9cc1461060957806342659d971461061e576103ce565b806314a388491161035a57806318f8a4e71161032957806318f8a4e71461055257806323b872dd14610572578063282f7fbc146105925780632ce86fbf146105b2576103ce565b806314a38849146104db578063150b7a02146104fb57806315291cd41461052857806318160ddd1461053d576103ce565b8063095ea7b311610396578063095ea7b3146104575780630c105679146104845780630d9dd4dc146104a45780630fb87930146104c6576103ce565b8063026c4207146103d35780630664fd92146103fe57806306fdde0314610420578063087ed97214610442576103ce565b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610ad5565b6040516103f591906134f7565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004612efc565b610adb565b005b34801561042c57600080fd5b50610435610bda565b6040516103f59190613064565b34801561044e57600080fd5b506103e8610c70565b34801561046357600080fd5b50610477610472366004612d98565b610c76565b6040516103f59190613044565b34801561049057600080fd5b5061041e61049f366004612c21565b610c94565b3480156104b057600080fd5b506104b9610ceb565b6040516103f59190612f83565b3480156104d257600080fd5b506103e8610cfa565b3480156104e757600080fd5b5061041e6104f6366004612efc565b610d00565b34801561050757600080fd5b5061051b610516366004612cd1565b610d94565b6040516103f5919061304f565b34801561053457600080fd5b506103e8610da5565b34801561054957600080fd5b506103e8610dab565b34801561055e57600080fd5b5061041e61056d366004612d6b565b610db1565b34801561057e57600080fd5b5061047761058d366004612c91565b610e46565b34801561059e57600080fd5b5061041e6105ad366004612e43565b610ecd565b3480156105be57600080fd5b506103e8610f20565b3480156105d357600080fd5b506105dc610f26565b6040516103f5919061357e565b3480156105f557600080fd5b50610477610604366004612d98565b610f2f565b34801561061557600080fd5b50610477610f7d565b34801561062a57600080fd5b506103e8610f86565b34801561063f57600080fd5b5061047761064e366004612e7b565b610f8c565b34801561065f57600080fd5b50610477610fa7565b34801561067457600080fd5b50610477610683366004612c21565b610fb7565b61041e610fd5565b34801561069c57600080fd5b506103e861103c565b3480156106b157600080fd5b506104776106c0366004612c21565b611042565b3480156106d157600080fd5b5061041e6106e0366004612e7b565b611057565b3480156106f157600080fd5b5061041e610700366004612efc565b6110cc565b34801561071157600080fd5b5061041e610720366004612e7b565b61111c565b34801561073157600080fd5b5061041e610740366004612c21565b611186565b34801561075157600080fd5b5061041e610760366004612e43565b6111dd565b34801561077157600080fd5b506103e8610780366004612c21565b611250565b34801561079157600080fd5b5061041e61126b565b3480156107a657600080fd5b506104b96112ea565b3480156107bb57600080fd5b506104b96112f9565b3480156107d057600080fd5b506103e8611308565b3480156107e557600080fd5b506103e861130e565b3480156107fa57600080fd5b50610477610809366004612c21565b611314565b34801561081a57600080fd5b506104b9611329565b34801561082f57600080fd5b506103e8611338565b34801561084457600080fd5b506104b961133e565b34801561085957600080fd5b506104b961134d565b34801561086e57600080fd5b506104b961135c565b34801561088357600080fd5b506103e861136b565b34801561089857600080fd5b50610435611371565b3480156108ad57600080fd5b5061041e6108bc366004612d98565b6113d2565b3480156108cd57600080fd5b506104776108dc366004612d98565b61141b565b3480156108ed57600080fd5b5061041e6108fc366004612d6b565b611483565b34801561090d57600080fd5b5061047761091c366004612d98565b61150c565b34801561092d57600080fd5b506103e8611520565b34801561094257600080fd5b506103e8611526565b34801561095757600080fd5b5061041e610966366004612c21565b61152c565b34801561097757600080fd5b5061041e610986366004612d6b565b611583565b34801561099757600080fd5b5061041e6109a6366004612d6b565b6115c2565b3480156109b757600080fd5b5061041e6109c6366004612c21565b61164b565b3480156109d757600080fd5b5061041e6109e6366004612e7b565b6116ff565b3480156109f757600080fd5b5061041e610a06366004612dc3565b611769565b348015610a1757600080fd5b50610477610a26366004612c21565b611840565b348015610a3757600080fd5b506104b961185e565b348015610a4c57600080fd5b5061041e610a5b366004612efc565b61186d565b348015610a6c57600080fd5b506103e8610a7b366004612c59565b611954565b348015610a8c57600080fd5b5061041e610a9b366004612c21565b61197f565b348015610aac57600080fd5b5061041e610abb366004612c21565b611a33565b348015610acc57600080fd5b506103e8611a74565b60185481565b610ae3611aa6565b6000546001600160a01b03908116911614610b195760405162461bcd60e51b8152600401610b1090613230565b60405180910390fd5b600e8290556011819055600f54610b31908390611a7a565b601055601254601154610b4391611a7a565b601355601454601554601054600a928303929190910390811015610b795760405162461bcd60e51b8152600401610b10906131c9565b816013541115610b9b5760405162461bcd60e51b8152600401610b10906131c9565b7fcd545670799e0a627eebb91afce3bbbb9a91b706c87df4806f881feedd6a251d8484604051610bcc929190613570565b60405180910390a150505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b5050505050905090565b60135481565b6000610c8a610c83611aa6565b8484611aaa565b5060015b92915050565b610c9c611aa6565b6000546001600160a01b03908116911614610cc95760405162461bcd60e51b8152600401610b1090613230565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031681565b60145481565b610d08611aa6565b6000546001600160a01b03908116911614610d355760405162461bcd60e51b8152600401610b1090613230565b60158290556014819055601054600a828103919084900390811015610d6c5760405162461bcd60e51b8152600401610b10906131c9565b816013541115610d8e5760405162461bcd60e51b8152600401610b10906131c9565b50505050565b630a85bd0160e11b95945050505050565b60175481565b60035490565b610db9611aa6565b6000546001600160a01b03908116911614610de65760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601d602052604090819020805460ff1916841515179055517f31777a35b05891a4cc9c1ce4ca85baa6ab67dc77401c14c40d2ccf809729fa0890610e3a908490613044565b60405180910390a25050565b6000610e53848484611b5e565b610ec384610e5f611aa6565b610ebe85604051806060016040528060288152602001613624602891396001600160a01b038a16600090815260026020526040812090610e9d611aa6565b6001600160a01b031681526020810191909152604001600020549190611ef8565b611aaa565b5060019392505050565b610ed5611aa6565b6000546001600160a01b03908116911614610f025760405162461bcd60e51b8152600401610b1090613230565b60098054911515600160a01b0260ff60a01b19909216919091179055565b60125481565b60065460ff1690565b6000610c8a610f3c611aa6565b84610ebe8560026000610f4d611aa6565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611a7a565b60195460ff1681565b600e5481565b6000610f9f610f99611aa6565b83611f24565b506001919050565b600954600160a01b900460ff1681565b6001600160a01b03166000908152601c602052604090205460ff1690565b610fdd611aa6565b6000546001600160a01b0390811691161461100a5760405162461bcd60e51b8152600401610b1090613230565b604051339081904780156108fc02916000818181858888f19350505050158015611038573d6000803e3d6000fd5b5050565b60155481565b601f6020526000908152604090205460ff1681565b61105f611aa6565b6000546001600160a01b0390811691161461108c5760405162461bcd60e51b8152600401610b1090613230565b601a8190556040517faa3699eefc959af0349072633ce13d21ce9c6fe475e5818b99da990ee39645a1906110c19083906134f7565b60405180910390a150565b6110d4611aa6565b6000546001600160a01b039081169116146111015760405162461bcd60e51b8152600401610b1090613230565b601682905560178190556111158282611a7a565b6018555050565b611124611aa6565b6000546001600160a01b039081169116146111515760405162461bcd60e51b8152600401610b1090613230565b600d8190556040517f033c605743ae13166330d85c96e7d3f46fd57a29da9befbc14eb9d64552adfc5906110c19083906134f7565b61118e611aa6565b6000546001600160a01b039081169116146111bb5760405162461bcd60e51b8152600401610b1090613230565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6111e5611aa6565b6000546001600160a01b039081169116146112125760405162461bcd60e51b8152600401610b1090613230565b6019805460ff19168215151790556040517f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef069906110c1908390613044565b6001600160a01b031660009081526001602052604090205490565b611273611aa6565b6000546001600160a01b039081169116146112a05760405162461bcd60e51b8152600401610b1090613230565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6008546001600160a01b031681565b6009546001600160a01b031681565b60105481565b600f5481565b601e6020526000908152604090205460ff1681565b600061133361134d565b905090565b601a5481565b600a546001600160a01b031681565b6000546001600160a01b031690565b6007546001600160a01b031681565b60115481565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b6113da611aa6565b6000546001600160a01b039081169116146114075760405162461bcd60e51b8152600401610b1090613230565b6110386001600160a01b0383163383611ffa565b6000610c8a611428611aa6565b84610ebe8560405180606001604052806025815260200161364c6025913960026000611452611aa6565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611ef8565b61148b611aa6565b6000546001600160a01b039081169116146114b85760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601e602052604090819020805460ff1916841515179055517fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f2490610e3a908490613044565b6000610c8a611519611aa6565b8484611b5e565b601b5481565b60165481565b611534611aa6565b6000546001600160a01b039081169116146115615760405162461bcd60e51b8152600401610b1090613230565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61158b611aa6565b6000546001600160a01b039081169116146115b85760405162461bcd60e51b8152600401610b1090613230565b6110388282612050565b6115ca611aa6565b6000546001600160a01b039081169116146115f75760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601c602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610e3a908490613044565b611653611aa6565b6000546001600160a01b039081169116146116805760405162461bcd60e51b8152600401610b1090613230565b61168b8160016115c2565b600b546116a2906001600160a01b031660006115c2565b600b546040516001600160a01b03918216918316907fbff926882094c380d5379f3e72d6d8391654afd5bc68e2a3c4a12f38ad379ac390600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611707611aa6565b6000546001600160a01b039081169116146117345760405162461bcd60e51b8152600401610b1090613230565b601b8190556040517fca869b80d9857b4e591dfb87f841df783ee2d02361537f912d1db7c825ed50ee906110c19083906134f7565b611771611aa6565b6000546001600160a01b0390811691161461179e5760405162461bcd60e51b8152600401610b1090613230565b60005b828110156117ff5781601c60008686858181106117ba57fe5b90506020020160208101906117cf9190612c21565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016117a1565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161183393929190612feb565b60405180910390a1505050565b6001600160a01b03166000908152601d602052604090205460ff1690565b600c546001600160a01b031681565b611875611aa6565b6000546001600160a01b039081169116146118a25760405162461bcd60e51b8152600401610b1090613230565b600f8290556012819055600e546118b99083611a7a565b6010556012546011546118cb91611a7a565b601355601454601554601054600a9283039291909103908110156119015760405162461bcd60e51b8152600401610b10906131c9565b8160135411156119235760405162461bcd60e51b8152600401610b10906131c9565b7fdcabb673b8004b29667370cf7e48059178985da4fa97105c1532cdfb5bbc5c0d8484604051610bcc929190613570565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b611987611aa6565b6000546001600160a01b039081169116146119b45760405162461bcd60e51b8152600401610b1090613230565b6119bf8160016115c2565b600c546119d6906001600160a01b031660006115c2565b600c546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611a3b611aa6565b6000546001600160a01b03908116911614611a685760405162461bcd60e51b8152600401610b1090613230565b611a71816120a4565b50565b600d5481565b600082820183811015611a9f5760405162461bcd60e51b8152600401610b1090613192565b9392505050565b3390565b6001600160a01b038316611ad05760405162461bcd60e51b8152600401610b10906132eb565b6001600160a01b038216611af65760405162461bcd60e51b8152600401610b1090613150565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611b519085906134f7565b60405180910390a3505050565b6001600160a01b038316611b845760405162461bcd60e51b8152600401610b10906132a6565b6001600160a01b038216611baa5760405162461bcd60e51b8152600401610b1090613097565b6001600160a01b0383166000908152601d602052604090205460ff16611bec57601a54811115611bec5760405162461bcd60e51b8152600401610b10906133b0565b80611c0257611bfd83836000612125565b611ef3565b60195460ff1615611ccd576000611c1830611250565b600d5490915081108015908190611c395750600a54600160a01b900460ff16155b8015611c5e57506001600160a01b0385166000908152601f602052604090205460ff16155b8015611c9657506001600160a01b0384166000908152601f602052604090205460ff161580611c965750600954600160a01b900460ff165b15611cca57600a805460ff60a01b1916600160a01b179055600d549150611cbc8261222f565b600a805460ff60a01b191690555b50505b6001600160a01b0383166000908152601c602052604090205460019060ff1680611d0f57506001600160a01b0383166000908152601c602052604090205460ff165b15611d18575060005b8015611e94576001600160a01b0384166000908152601e602052604081205460ff1680611d5d57506001600160a01b0384166000908152601e602052604090205460ff165b15611e92576001600160a01b0385166000908152601e602052604090205460ff1615611e0c57611da36064611d9d6010548661235390919063ffffffff16565b9061238d565b60155490915015611dfc576000611dca6064611d9d6015548761235390919063ffffffff16565b9050611de08630611ddb8585611a7a565b612125565b611dea84826123cf565b9350611df63082611f24565b50611e07565b611e07853083612125565b611e85565b611e266064611d9d6013548661235390919063ffffffff16565b60145490915015611e7a576000611e4d6064611d9d6014548761235390919063ffffffff16565b9050611e5e8630611ddb8585611a7a565b611e6884826123cf565b9350611e743082611f24565b50611e85565b611e85853083612125565b611e8f83826123cf565b92505b505b6001600160a01b0383166000908152601d602052604090205460ff16611ee857601b54611eca83611ec486611250565b90611a7a565b1115611ee85760405162461bcd60e51b8152600401610b10906130da565b610d8e848484612125565b505050565b60008184841115611f1c5760405162461bcd60e51b8152600401610b109190613064565b505050900390565b6001600160a01b038216611f4a5760405162461bcd60e51b8152600401610b1090613265565b611f87816040518060600160405280602281526020016135dc602291396001600160a01b0385166000908152600160205260409020549190611ef8565b6001600160a01b038316600090815260016020526040902055600354611fad90826123cf565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fee9085906134f7565b60405180910390a35050565b611ef38363a9059cbb60e01b8484604051602401612019929190612fd2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612411565b6001600160a01b0382166000818152601f6020526040808220805460ff191685151590811790915590519092917fa2a0859ee2849a3cac449e2dcd9256caf5da00f302a66c38f39f68881348345491a35050565b6001600160a01b0381166120ca5760405162461bcd60e51b8152600401610b109061310a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661214b5760405162461bcd60e51b8152600401610b10906132a6565b6001600160a01b0382166121715760405162461bcd60e51b8152600401610b1090613097565b6121ae816040518060600160405280602681526020016135fe602691396001600160a01b0386166000908152600160205260409020549190611ef8565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546121dd9082611a7a565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b519085906134f7565b600061224c601854611d9d6017548561235390919063ffffffff16565b9050600061225a83836123cf565b9050612265816124a0565b6009544790600160a01b900460ff166122ff576006546040516370a0823160e01b81526101009091046001600160a01b0316906370a08231906122ac903090600401612f83565b60206040518083038186803b1580156122c457600080fd5b505afa1580156122d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fc9190612e93565b90505b600061231c601854611d9d6017548561235390919063ffffffff16565b9050600061232a83836123cf565b9050801561233b5761233b81612619565b811561234b5761234b85836126cb565b505050505050565b60008261236257506000610c8e565b8282028284828161236f57fe5b0414611a9f5760405162461bcd60e51b8152600401610b10906131ef565b6000611a9f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612799565b6000611a9f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ef8565b6060612466826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127d09092919063ffffffff16565b805190915015611ef357808060200190518101906124849190612e5f565b611ef35760405162461bcd60e51b8152600401610b1090613366565b600954600160a01b900460ff161561261057604080516002808252606080830184529260208301908036833701905050905030816000815181106124e057fe5b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190612c3d565b8160018151811061257957fe5b6001600160a01b03928316602091820292909201015260095461259f9130911684611aaa565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906125d8908590600090869030904290600401613500565b600060405180830381600087803b1580156125f257600080fd5b505af1158015612606573d6000803e3d6000fd5b5050505050611a71565b611a71816127e7565b600954600160a01b900460ff1661269157600654604051632e1a7d4d60e01b81526101009091046001600160a01b031690632e1a7d4d9061265e9084906004016134f7565b600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050505b600b546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611038573d6000803e3d6000fd5b600954600160a01b900460ff161561278f576009546126f59030906001600160a01b031684611aaa565b600954600c5460405163f305d71960e01b81526001600160a01b039283169263f305d7199285926127359230928992600092839216904290600401612f97565b6060604051808303818588803b15801561274e57600080fd5b505af1158015612762573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127879190612f1d565b505050611038565b61103882826128d9565b600081836127ba5760405162461bcd60e51b8152600401610b109190613064565b5060008385816127c657fe5b0495945050505050565b60606127df8484600085612a84565b949350505050565b6008546127ff9030906001600160a01b031683611aaa565b612807612b81565b5060408051610100810182523080825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020830152610bb882840152606082015242608082015260a08101839052600060c0820181905260e0820152600854915163414bf38960e01b815290916001600160a01b03169063414bf389906128879084906004016133e0565b602060405180830381600087803b1580156128a157600080fd5b505af11580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef39190612e93565b6007546128f19030906001600160a01b031684611aaa565b60065460075460405163095ea7b360e01b81526001600160a01b0361010090930483169263095ea7b39261292c929116908590600401612fd2565b602060405180830381600087803b15801561294657600080fd5b505af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190612e5f565b50612987612bc5565b50604080516101608101825230815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152610bb881830152620d89b3196060820152620d89b4608082015260a0810184905260c08101839052600060e08201819052610100820152600c546001600160a01b03908116610120830152426101408301526007549251634418b22b60e11b815291921690638831645690612a29908490600401613449565b608060405180830381600087803b158015612a4357600080fd5b505af1158015612a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7b9190612eab565b50505050505050565b6060612a8f85612b48565b612aab5760405162461bcd60e51b8152600401610b109061332f565b60006060866001600160a01b03168587604051612ac89190612f67565b60006040518083038185875af1925050503d8060008114612b05576040519150601f19603f3d011682016040523d82523d6000602084013e612b0a565b606091505b50915091508115612b1e5791506127df9050565b805115612b2e5780518082602001fd5b8360405162461bcd60e51b8152600401610b109190613064565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906127df575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b600060208284031215612c32578081fd5b8135611a9f816135b8565b600060208284031215612c4e578081fd5b8151611a9f816135b8565b60008060408385031215612c6b578081fd5b8235612c76816135b8565b91506020830135612c86816135b8565b809150509250929050565b600080600060608486031215612ca5578081fd5b8335612cb0816135b8565b92506020840135612cc0816135b8565b929592945050506040919091013590565b600080600080600060808688031215612ce8578081fd5b8535612cf3816135b8565b94506020860135612d03816135b8565b935060408601359250606086013567ffffffffffffffff80821115612d26578283fd5b818801915088601f830112612d39578283fd5b813581811115612d47578384fd5b896020828501011115612d58578384fd5b9699959850939650602001949392505050565b60008060408385031215612d7d578182fd5b8235612d88816135b8565b91506020830135612c86816135cd565b60008060408385031215612daa578182fd5b8235612db5816135b8565b946020939093013593505050565b600080600060408486031215612dd7578283fd5b833567ffffffffffffffff80821115612dee578485fd5b818601915086601f830112612e01578485fd5b813581811115612e0f578586fd5b8760208083028501011115612e22578586fd5b60209283019550935050840135612e38816135cd565b809150509250925092565b600060208284031215612e54578081fd5b8135611a9f816135cd565b600060208284031215612e70578081fd5b8151611a9f816135cd565b600060208284031215612e8c578081fd5b5035919050565b600060208284031215612ea4578081fd5b5051919050565b60008060008060808587031215612ec0578384fd5b8451935060208501516fffffffffffffffffffffffffffffffff81168114612ee6578384fd5b6040860151606090960151949790965092505050565b60008060408385031215612f0e578182fd5b50508035926020909101359150565b600080600060608486031215612f31578081fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b60008251612f7981846020870161358c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b03929092168252602082015260400190565b6040808252810183905260008460608301825b8681101561302e5760208335613013816135b8565b6001600160a01b031683529283019290910190600101612ffe565b5080925050508215156020830152949350505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252825180602084015261308381604085016020870161358c565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601690820152751bdd995c8b5b585e0b5dd85b1b195d0b585b5bdd5b9d60521b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b4f7665722d6d61782d46656560a01b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601690820152756d61782d74782d616d6f756e742d6f766572666c6f7760501b604082015260600190565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b60006101608201905061345d828451612f4a565b602083015161346f6020840182612f4a565b5060408301516134826040840182612f5e565b5060608301516134956060840182612f57565b5060808301516134a86080840182612f57565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401516134e682850182612f4a565b505061014092830151919092015290565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561354f5784516001600160a01b03168352938301939183019160010161352a565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b60005b838110156135a757818101518382015260200161358f565b83811115610d8e5750506000910152565b6001600160a01b0381168114611a7157600080fd5b8015158114611a7157600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220019bff146aba2b217029e3aac67059fc91c85cf9736a04a5cbd50539d58d21aa64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c8063715018a6116101f2578063a9059cbb1161010d578063c492f046116100a0578063dd62ed3e1161006f578063dd62ed3e14610a60578063e37ba8f914610a80578063f2fde38b14610aa0578063ff35a9d514610ac0576103ce565b8063c492f046146109eb578063cdd3581d14610a0b578063d469801614610a2b578063da21bcbc14610a40576103ce565b8063bd979e0c116100dc578063bd979e0c1461096b578063c02466681461098b578063c13b3def146109ab578063c18bc195146109cb576103ce565b8063a9059cbb14610901578063aa4bde2814610921578063b24db8f814610936578063b98b677f1461094b576103ce565b80638d6ff9091161018557806395d89b411161015457806395d89b411461088c5780639e281a98146108a1578063a457c2d7146108c1578063a4de3c19146108e1576103ce565b80638d6ff909146108385780638da5cb5b1461084d5780638ec3144f146108625780639372881b14610877576103ce565b80637b3c83b1116101c15780637b3c83b1146107d95780638768a9cd146107ee578063893d20e81461080e5780638c0b5e2214610823576103ce565b8063715018a61461078557806373ec5fd51461079a578063744fbc7a146107af578063766ea415146107c4576103ce565b8063313ce567116102e25780635ddd44f41161027557806367b0affe1161024457806367b0affe146107055780636881d8cb1461072557806368b4cac91461074557806370a0823114610765576103ce565b80635ddd44f414610690578063615e8a2e146106a55780636256d181146106c557806364790208146106e5576103ce565b806342966c68116102b157806342966c68146106335780634aedf7ea146106535780634fbee1931461066857806350431ce414610688576103ce565b8063313ce567146105c757806339509351146105e9578063423ce9cc1461060957806342659d971461061e576103ce565b806314a388491161035a57806318f8a4e71161032957806318f8a4e71461055257806323b872dd14610572578063282f7fbc146105925780632ce86fbf146105b2576103ce565b806314a38849146104db578063150b7a02146104fb57806315291cd41461052857806318160ddd1461053d576103ce565b8063095ea7b311610396578063095ea7b3146104575780630c105679146104845780630d9dd4dc146104a45780630fb87930146104c6576103ce565b8063026c4207146103d35780630664fd92146103fe57806306fdde0314610420578063087ed97214610442576103ce565b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610ad5565b6040516103f591906134f7565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004612efc565b610adb565b005b34801561042c57600080fd5b50610435610bda565b6040516103f59190613064565b34801561044e57600080fd5b506103e8610c70565b34801561046357600080fd5b50610477610472366004612d98565b610c76565b6040516103f59190613044565b34801561049057600080fd5b5061041e61049f366004612c21565b610c94565b3480156104b057600080fd5b506104b9610ceb565b6040516103f59190612f83565b3480156104d257600080fd5b506103e8610cfa565b3480156104e757600080fd5b5061041e6104f6366004612efc565b610d00565b34801561050757600080fd5b5061051b610516366004612cd1565b610d94565b6040516103f5919061304f565b34801561053457600080fd5b506103e8610da5565b34801561054957600080fd5b506103e8610dab565b34801561055e57600080fd5b5061041e61056d366004612d6b565b610db1565b34801561057e57600080fd5b5061047761058d366004612c91565b610e46565b34801561059e57600080fd5b5061041e6105ad366004612e43565b610ecd565b3480156105be57600080fd5b506103e8610f20565b3480156105d357600080fd5b506105dc610f26565b6040516103f5919061357e565b3480156105f557600080fd5b50610477610604366004612d98565b610f2f565b34801561061557600080fd5b50610477610f7d565b34801561062a57600080fd5b506103e8610f86565b34801561063f57600080fd5b5061047761064e366004612e7b565b610f8c565b34801561065f57600080fd5b50610477610fa7565b34801561067457600080fd5b50610477610683366004612c21565b610fb7565b61041e610fd5565b34801561069c57600080fd5b506103e861103c565b3480156106b157600080fd5b506104776106c0366004612c21565b611042565b3480156106d157600080fd5b5061041e6106e0366004612e7b565b611057565b3480156106f157600080fd5b5061041e610700366004612efc565b6110cc565b34801561071157600080fd5b5061041e610720366004612e7b565b61111c565b34801561073157600080fd5b5061041e610740366004612c21565b611186565b34801561075157600080fd5b5061041e610760366004612e43565b6111dd565b34801561077157600080fd5b506103e8610780366004612c21565b611250565b34801561079157600080fd5b5061041e61126b565b3480156107a657600080fd5b506104b96112ea565b3480156107bb57600080fd5b506104b96112f9565b3480156107d057600080fd5b506103e8611308565b3480156107e557600080fd5b506103e861130e565b3480156107fa57600080fd5b50610477610809366004612c21565b611314565b34801561081a57600080fd5b506104b9611329565b34801561082f57600080fd5b506103e8611338565b34801561084457600080fd5b506104b961133e565b34801561085957600080fd5b506104b961134d565b34801561086e57600080fd5b506104b961135c565b34801561088357600080fd5b506103e861136b565b34801561089857600080fd5b50610435611371565b3480156108ad57600080fd5b5061041e6108bc366004612d98565b6113d2565b3480156108cd57600080fd5b506104776108dc366004612d98565b61141b565b3480156108ed57600080fd5b5061041e6108fc366004612d6b565b611483565b34801561090d57600080fd5b5061047761091c366004612d98565b61150c565b34801561092d57600080fd5b506103e8611520565b34801561094257600080fd5b506103e8611526565b34801561095757600080fd5b5061041e610966366004612c21565b61152c565b34801561097757600080fd5b5061041e610986366004612d6b565b611583565b34801561099757600080fd5b5061041e6109a6366004612d6b565b6115c2565b3480156109b757600080fd5b5061041e6109c6366004612c21565b61164b565b3480156109d757600080fd5b5061041e6109e6366004612e7b565b6116ff565b3480156109f757600080fd5b5061041e610a06366004612dc3565b611769565b348015610a1757600080fd5b50610477610a26366004612c21565b611840565b348015610a3757600080fd5b506104b961185e565b348015610a4c57600080fd5b5061041e610a5b366004612efc565b61186d565b348015610a6c57600080fd5b506103e8610a7b366004612c59565b611954565b348015610a8c57600080fd5b5061041e610a9b366004612c21565b61197f565b348015610aac57600080fd5b5061041e610abb366004612c21565b611a33565b348015610acc57600080fd5b506103e8611a74565b60185481565b610ae3611aa6565b6000546001600160a01b03908116911614610b195760405162461bcd60e51b8152600401610b1090613230565b60405180910390fd5b600e8290556011819055600f54610b31908390611a7a565b601055601254601154610b4391611a7a565b601355601454601554601054600a928303929190910390811015610b795760405162461bcd60e51b8152600401610b10906131c9565b816013541115610b9b5760405162461bcd60e51b8152600401610b10906131c9565b7fcd545670799e0a627eebb91afce3bbbb9a91b706c87df4806f881feedd6a251d8484604051610bcc929190613570565b60405180910390a150505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b5050505050905090565b60135481565b6000610c8a610c83611aa6565b8484611aaa565b5060015b92915050565b610c9c611aa6565b6000546001600160a01b03908116911614610cc95760405162461bcd60e51b8152600401610b1090613230565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031681565b60145481565b610d08611aa6565b6000546001600160a01b03908116911614610d355760405162461bcd60e51b8152600401610b1090613230565b60158290556014819055601054600a828103919084900390811015610d6c5760405162461bcd60e51b8152600401610b10906131c9565b816013541115610d8e5760405162461bcd60e51b8152600401610b10906131c9565b50505050565b630a85bd0160e11b95945050505050565b60175481565b60035490565b610db9611aa6565b6000546001600160a01b03908116911614610de65760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601d602052604090819020805460ff1916841515179055517f31777a35b05891a4cc9c1ce4ca85baa6ab67dc77401c14c40d2ccf809729fa0890610e3a908490613044565b60405180910390a25050565b6000610e53848484611b5e565b610ec384610e5f611aa6565b610ebe85604051806060016040528060288152602001613624602891396001600160a01b038a16600090815260026020526040812090610e9d611aa6565b6001600160a01b031681526020810191909152604001600020549190611ef8565b611aaa565b5060019392505050565b610ed5611aa6565b6000546001600160a01b03908116911614610f025760405162461bcd60e51b8152600401610b1090613230565b60098054911515600160a01b0260ff60a01b19909216919091179055565b60125481565b60065460ff1690565b6000610c8a610f3c611aa6565b84610ebe8560026000610f4d611aa6565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611a7a565b60195460ff1681565b600e5481565b6000610f9f610f99611aa6565b83611f24565b506001919050565b600954600160a01b900460ff1681565b6001600160a01b03166000908152601c602052604090205460ff1690565b610fdd611aa6565b6000546001600160a01b0390811691161461100a5760405162461bcd60e51b8152600401610b1090613230565b604051339081904780156108fc02916000818181858888f19350505050158015611038573d6000803e3d6000fd5b5050565b60155481565b601f6020526000908152604090205460ff1681565b61105f611aa6565b6000546001600160a01b0390811691161461108c5760405162461bcd60e51b8152600401610b1090613230565b601a8190556040517faa3699eefc959af0349072633ce13d21ce9c6fe475e5818b99da990ee39645a1906110c19083906134f7565b60405180910390a150565b6110d4611aa6565b6000546001600160a01b039081169116146111015760405162461bcd60e51b8152600401610b1090613230565b601682905560178190556111158282611a7a565b6018555050565b611124611aa6565b6000546001600160a01b039081169116146111515760405162461bcd60e51b8152600401610b1090613230565b600d8190556040517f033c605743ae13166330d85c96e7d3f46fd57a29da9befbc14eb9d64552adfc5906110c19083906134f7565b61118e611aa6565b6000546001600160a01b039081169116146111bb5760405162461bcd60e51b8152600401610b1090613230565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6111e5611aa6565b6000546001600160a01b039081169116146112125760405162461bcd60e51b8152600401610b1090613230565b6019805460ff19168215151790556040517f701507a13d5701687328d70ea5a717a33a062f46c229a785b315fb4517fef069906110c1908390613044565b6001600160a01b031660009081526001602052604090205490565b611273611aa6565b6000546001600160a01b039081169116146112a05760405162461bcd60e51b8152600401610b1090613230565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6008546001600160a01b031681565b6009546001600160a01b031681565b60105481565b600f5481565b601e6020526000908152604090205460ff1681565b600061133361134d565b905090565b601a5481565b600a546001600160a01b031681565b6000546001600160a01b031690565b6007546001600160a01b031681565b60115481565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b6113da611aa6565b6000546001600160a01b039081169116146114075760405162461bcd60e51b8152600401610b1090613230565b6110386001600160a01b0383163383611ffa565b6000610c8a611428611aa6565b84610ebe8560405180606001604052806025815260200161364c6025913960026000611452611aa6565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611ef8565b61148b611aa6565b6000546001600160a01b039081169116146114b85760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601e602052604090819020805460ff1916841515179055517fd3d1fab5db42ae85293059c69e12bf01ffffb1dd5ff4caa5e5568f99fc387f2490610e3a908490613044565b6000610c8a611519611aa6565b8484611b5e565b601b5481565b60165481565b611534611aa6565b6000546001600160a01b039081169116146115615760405162461bcd60e51b8152600401610b1090613230565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61158b611aa6565b6000546001600160a01b039081169116146115b85760405162461bcd60e51b8152600401610b1090613230565b6110388282612050565b6115ca611aa6565b6000546001600160a01b039081169116146115f75760405162461bcd60e51b8152600401610b1090613230565b6001600160a01b0382166000818152601c602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610e3a908490613044565b611653611aa6565b6000546001600160a01b039081169116146116805760405162461bcd60e51b8152600401610b1090613230565b61168b8160016115c2565b600b546116a2906001600160a01b031660006115c2565b600b546040516001600160a01b03918216918316907fbff926882094c380d5379f3e72d6d8391654afd5bc68e2a3c4a12f38ad379ac390600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611707611aa6565b6000546001600160a01b039081169116146117345760405162461bcd60e51b8152600401610b1090613230565b601b8190556040517fca869b80d9857b4e591dfb87f841df783ee2d02361537f912d1db7c825ed50ee906110c19083906134f7565b611771611aa6565b6000546001600160a01b0390811691161461179e5760405162461bcd60e51b8152600401610b1090613230565b60005b828110156117ff5781601c60008686858181106117ba57fe5b90506020020160208101906117cf9190612c21565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016117a1565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161183393929190612feb565b60405180910390a1505050565b6001600160a01b03166000908152601d602052604090205460ff1690565b600c546001600160a01b031681565b611875611aa6565b6000546001600160a01b039081169116146118a25760405162461bcd60e51b8152600401610b1090613230565b600f8290556012819055600e546118b99083611a7a565b6010556012546011546118cb91611a7a565b601355601454601554601054600a9283039291909103908110156119015760405162461bcd60e51b8152600401610b10906131c9565b8160135411156119235760405162461bcd60e51b8152600401610b10906131c9565b7fdcabb673b8004b29667370cf7e48059178985da4fa97105c1532cdfb5bbc5c0d8484604051610bcc929190613570565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b611987611aa6565b6000546001600160a01b039081169116146119b45760405162461bcd60e51b8152600401610b1090613230565b6119bf8160016115c2565b600c546119d6906001600160a01b031660006115c2565b600c546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611a3b611aa6565b6000546001600160a01b03908116911614611a685760405162461bcd60e51b8152600401610b1090613230565b611a71816120a4565b50565b600d5481565b600082820183811015611a9f5760405162461bcd60e51b8152600401610b1090613192565b9392505050565b3390565b6001600160a01b038316611ad05760405162461bcd60e51b8152600401610b10906132eb565b6001600160a01b038216611af65760405162461bcd60e51b8152600401610b1090613150565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611b519085906134f7565b60405180910390a3505050565b6001600160a01b038316611b845760405162461bcd60e51b8152600401610b10906132a6565b6001600160a01b038216611baa5760405162461bcd60e51b8152600401610b1090613097565b6001600160a01b0383166000908152601d602052604090205460ff16611bec57601a54811115611bec5760405162461bcd60e51b8152600401610b10906133b0565b80611c0257611bfd83836000612125565b611ef3565b60195460ff1615611ccd576000611c1830611250565b600d5490915081108015908190611c395750600a54600160a01b900460ff16155b8015611c5e57506001600160a01b0385166000908152601f602052604090205460ff16155b8015611c9657506001600160a01b0384166000908152601f602052604090205460ff161580611c965750600954600160a01b900460ff165b15611cca57600a805460ff60a01b1916600160a01b179055600d549150611cbc8261222f565b600a805460ff60a01b191690555b50505b6001600160a01b0383166000908152601c602052604090205460019060ff1680611d0f57506001600160a01b0383166000908152601c602052604090205460ff165b15611d18575060005b8015611e94576001600160a01b0384166000908152601e602052604081205460ff1680611d5d57506001600160a01b0384166000908152601e602052604090205460ff165b15611e92576001600160a01b0385166000908152601e602052604090205460ff1615611e0c57611da36064611d9d6010548661235390919063ffffffff16565b9061238d565b60155490915015611dfc576000611dca6064611d9d6015548761235390919063ffffffff16565b9050611de08630611ddb8585611a7a565b612125565b611dea84826123cf565b9350611df63082611f24565b50611e07565b611e07853083612125565b611e85565b611e266064611d9d6013548661235390919063ffffffff16565b60145490915015611e7a576000611e4d6064611d9d6014548761235390919063ffffffff16565b9050611e5e8630611ddb8585611a7a565b611e6884826123cf565b9350611e743082611f24565b50611e85565b611e85853083612125565b611e8f83826123cf565b92505b505b6001600160a01b0383166000908152601d602052604090205460ff16611ee857601b54611eca83611ec486611250565b90611a7a565b1115611ee85760405162461bcd60e51b8152600401610b10906130da565b610d8e848484612125565b505050565b60008184841115611f1c5760405162461bcd60e51b8152600401610b109190613064565b505050900390565b6001600160a01b038216611f4a5760405162461bcd60e51b8152600401610b1090613265565b611f87816040518060600160405280602281526020016135dc602291396001600160a01b0385166000908152600160205260409020549190611ef8565b6001600160a01b038316600090815260016020526040902055600354611fad90826123cf565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fee9085906134f7565b60405180910390a35050565b611ef38363a9059cbb60e01b8484604051602401612019929190612fd2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612411565b6001600160a01b0382166000818152601f6020526040808220805460ff191685151590811790915590519092917fa2a0859ee2849a3cac449e2dcd9256caf5da00f302a66c38f39f68881348345491a35050565b6001600160a01b0381166120ca5760405162461bcd60e51b8152600401610b109061310a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661214b5760405162461bcd60e51b8152600401610b10906132a6565b6001600160a01b0382166121715760405162461bcd60e51b8152600401610b1090613097565b6121ae816040518060600160405280602681526020016135fe602691396001600160a01b0386166000908152600160205260409020549190611ef8565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546121dd9082611a7a565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b519085906134f7565b600061224c601854611d9d6017548561235390919063ffffffff16565b9050600061225a83836123cf565b9050612265816124a0565b6009544790600160a01b900460ff166122ff576006546040516370a0823160e01b81526101009091046001600160a01b0316906370a08231906122ac903090600401612f83565b60206040518083038186803b1580156122c457600080fd5b505afa1580156122d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fc9190612e93565b90505b600061231c601854611d9d6017548561235390919063ffffffff16565b9050600061232a83836123cf565b9050801561233b5761233b81612619565b811561234b5761234b85836126cb565b505050505050565b60008261236257506000610c8e565b8282028284828161236f57fe5b0414611a9f5760405162461bcd60e51b8152600401610b10906131ef565b6000611a9f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612799565b6000611a9f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ef8565b6060612466826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127d09092919063ffffffff16565b805190915015611ef357808060200190518101906124849190612e5f565b611ef35760405162461bcd60e51b8152600401610b1090613366565b600954600160a01b900460ff161561261057604080516002808252606080830184529260208301908036833701905050905030816000815181106124e057fe5b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190612c3d565b8160018151811061257957fe5b6001600160a01b03928316602091820292909201015260095461259f9130911684611aaa565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906125d8908590600090869030904290600401613500565b600060405180830381600087803b1580156125f257600080fd5b505af1158015612606573d6000803e3d6000fd5b5050505050611a71565b611a71816127e7565b600954600160a01b900460ff1661269157600654604051632e1a7d4d60e01b81526101009091046001600160a01b031690632e1a7d4d9061265e9084906004016134f7565b600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050505b600b546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611038573d6000803e3d6000fd5b600954600160a01b900460ff161561278f576009546126f59030906001600160a01b031684611aaa565b600954600c5460405163f305d71960e01b81526001600160a01b039283169263f305d7199285926127359230928992600092839216904290600401612f97565b6060604051808303818588803b15801561274e57600080fd5b505af1158015612762573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127879190612f1d565b505050611038565b61103882826128d9565b600081836127ba5760405162461bcd60e51b8152600401610b109190613064565b5060008385816127c657fe5b0495945050505050565b60606127df8484600085612a84565b949350505050565b6008546127ff9030906001600160a01b031683611aaa565b612807612b81565b5060408051610100810182523080825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020830152610bb882840152606082015242608082015260a08101839052600060c0820181905260e0820152600854915163414bf38960e01b815290916001600160a01b03169063414bf389906128879084906004016133e0565b602060405180830381600087803b1580156128a157600080fd5b505af11580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef39190612e93565b6007546128f19030906001600160a01b031684611aaa565b60065460075460405163095ea7b360e01b81526001600160a01b0361010090930483169263095ea7b39261292c929116908590600401612fd2565b602060405180830381600087803b15801561294657600080fd5b505af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190612e5f565b50612987612bc5565b50604080516101608101825230815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152610bb881830152620d89b3196060820152620d89b4608082015260a0810184905260c08101839052600060e08201819052610100820152600c546001600160a01b03908116610120830152426101408301526007549251634418b22b60e11b815291921690638831645690612a29908490600401613449565b608060405180830381600087803b158015612a4357600080fd5b505af1158015612a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7b9190612eab565b50505050505050565b6060612a8f85612b48565b612aab5760405162461bcd60e51b8152600401610b109061332f565b60006060866001600160a01b03168587604051612ac89190612f67565b60006040518083038185875af1925050503d8060008114612b05576040519150601f19603f3d011682016040523d82523d6000602084013e612b0a565b606091505b50915091508115612b1e5791506127df9050565b805115612b2e5780518082602001fd5b8360405162461bcd60e51b8152600401610b109190613064565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906127df575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b600060208284031215612c32578081fd5b8135611a9f816135b8565b600060208284031215612c4e578081fd5b8151611a9f816135b8565b60008060408385031215612c6b578081fd5b8235612c76816135b8565b91506020830135612c86816135b8565b809150509250929050565b600080600060608486031215612ca5578081fd5b8335612cb0816135b8565b92506020840135612cc0816135b8565b929592945050506040919091013590565b600080600080600060808688031215612ce8578081fd5b8535612cf3816135b8565b94506020860135612d03816135b8565b935060408601359250606086013567ffffffffffffffff80821115612d26578283fd5b818801915088601f830112612d39578283fd5b813581811115612d47578384fd5b896020828501011115612d58578384fd5b9699959850939650602001949392505050565b60008060408385031215612d7d578182fd5b8235612d88816135b8565b91506020830135612c86816135cd565b60008060408385031215612daa578182fd5b8235612db5816135b8565b946020939093013593505050565b600080600060408486031215612dd7578283fd5b833567ffffffffffffffff80821115612dee578485fd5b818601915086601f830112612e01578485fd5b813581811115612e0f578586fd5b8760208083028501011115612e22578586fd5b60209283019550935050840135612e38816135cd565b809150509250925092565b600060208284031215612e54578081fd5b8135611a9f816135cd565b600060208284031215612e70578081fd5b8151611a9f816135cd565b600060208284031215612e8c578081fd5b5035919050565b600060208284031215612ea4578081fd5b5051919050565b60008060008060808587031215612ec0578384fd5b8451935060208501516fffffffffffffffffffffffffffffffff81168114612ee6578384fd5b6040860151606090960151949790965092505050565b60008060408385031215612f0e578182fd5b50508035926020909101359150565b600080600060608486031215612f31578081fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b60008251612f7981846020870161358c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b03929092168252602082015260400190565b6040808252810183905260008460608301825b8681101561302e5760208335613013816135b8565b6001600160a01b031683529283019290910190600101612ffe565b5080925050508215156020830152949350505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252825180602084015261308381604085016020870161358c565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601690820152751bdd995c8b5b585e0b5dd85b1b195d0b585b5bdd5b9d60521b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b4f7665722d6d61782d46656560a01b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601690820152756d61782d74782d616d6f756e742d6f766572666c6f7760501b604082015260600190565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b60006101608201905061345d828451612f4a565b602083015161346f6020840182612f4a565b5060408301516134826040840182612f5e565b5060608301516134956060840182612f57565b5060808301516134a86080840182612f57565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401516134e682850182612f4a565b505061014092830151919092015290565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561354f5784516001600160a01b03168352938301939183019160010161352a565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b60005b838110156135a757818101518382015260200161358f565b83811115610d8e5750506000910152565b6001600160a01b0381168114611a7157600080fd5b8015158114611a7157600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220019bff146aba2b217029e3aac67059fc91c85cf9736a04a5cbd50539d58d21aa64736f6c634300060c0033

Deployed Bytecode Sourcemap

37461:17517:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38781:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42812:619;;;;;;;;;;-1:-1:-1;42812:619:0;;;;;:::i;:::-;;:::i;:::-;;18405:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38578:34::-;;;;;;;;;;;;;:::i;19892:161::-;;;;;;;;;;-1:-1:-1;19892:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42179:123::-;;;;;;;;;;-1:-1:-1;42179:123:0;;;;;:::i;:::-;;:::i;38081:104::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38619:32::-;;;;;;;;;;;;;:::i;44056:399::-;;;;;;;;;;-1:-1:-1;44056:399:0;;;;;:::i;:::-;;:::i;42412:233::-;;;;;;;;;;-1:-1:-1;42412:233:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38741:33::-;;;;;;;;;;;;;:::i;18881:100::-;;;;;;;;;;;;;:::i;44900:202::-;;;;;;;;;;-1:-1:-1;44900:202:0;;;;;:::i;:::-;;:::i;20524:397::-;;;;;;;;;;-1:-1:-1;20524:397:0;;;;;:::i;:::-;;:::i;42310:94::-;;;;;;;;;;-1:-1:-1;42310:94:0;;;;;:::i;:::-;;:::i;38534:37::-;;;;;;;;;;;;;:::i;18564:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21329:210::-;;;;;;;;;;-1:-1:-1;21329:210:0;;;;;:::i;:::-;;:::i;38857:41::-;;;;;;;;;;;;;:::i;38358:39::-;;;;;;;;;;;;;:::i;22472:120::-;;;;;;;;;;-1:-1:-1;22472:120:0;;;;;:::i;:::-;;:::i;37979:28::-;;;;;;;;;;;;;:::i;47283:126::-;;;;;;;;;;-1:-1:-1;47283:126:0;;;;;:::i;:::-;;:::i;54652:171::-;;;:::i;38658:31::-;;;;;;;;;;;;;:::i;39488:57::-;;;;;;;;;;-1:-1:-1;39488:57:0;;;;;:::i;:::-;;:::i;46969:143::-;;;;;;;;;;-1:-1:-1;46969:143:0;;;;;:::i;:::-;;:::i;44463:237::-;;;;;;;;;;-1:-1:-1;44463:237:0;;;;;:::i;:::-;;:::i;45987:177::-;;;;;;;;;;-1:-1:-1;45987:177:0;;;;;:::i;:::-;;:::i;41893:151::-;;;;;;;;;;-1:-1:-1;41893:151:0;;;;;:::i;:::-;;:::i;42653:::-;;;;;;;;;;-1:-1:-1;42653:151:0;;;;;:::i;:::-;;:::i;19043:119::-;;;;;;;;;;-1:-1:-1;19043:119:0;;;;;:::i;:::-;;:::i;1790:140::-;;;;;;;;;;;;;:::i;37899:34::-;;;;;;;;;;;;;:::i;37940:32::-;;;;;;;;;;;;;:::i;38447:33::-;;;;;;;;;;;;;:::i;38404:36::-;;;;;;;;;;;;;:::i;39288:42::-;;;;;;;;;;-1:-1:-1;39288:42:0;;;;;:::i;:::-;;:::i;18248:94::-;;;;;;;;;;;;;:::i;38905:50::-;;;;;;;;;;;;;:::i;38014:28::-;;;;;;;;;;;;;:::i;1148:79::-;;;;;;;;;;;;;:::i;37833:59::-;;;;;;;;;;;;;:::i;38487:40::-;;;;;;;;;;;;;:::i;18721:96::-;;;;;;;;;;;;;:::i;54833:142::-;;;;;;;;;;-1:-1:-1;54833:142:0;;;;;:::i;:::-;;:::i;22041:311::-;;;;;;;;;;-1:-1:-1;22041:311:0;;;;;:::i;:::-;;:::i;45110:164::-;;;;;;;;;;-1:-1:-1;45110:164:0;;;;;:::i;:::-;;:::i;19374:167::-;;;;;;;;;;-1:-1:-1;19374:167:0;;;;;:::i;:::-;;:::i;38987:54::-;;;;;;;;;;;;;:::i;38698:36::-;;;;;;;;;;;;;:::i;42052:119::-;;;;;;;;;;-1:-1:-1;42052:119:0;;;;;:::i;:::-;;:::i;45620:163::-;;;;;;;;;;-1:-1:-1;45620:163:0;;;;;:::i;:::-;;:::i;44708:184::-;;;;;;;;;;-1:-1:-1;44708:184:0;;;;;:::i;:::-;;:::i;46172:404::-;;;;;;;;;;-1:-1:-1;46172:404:0;;;;;:::i;:::-;;:::i;47120:155::-;;;;;;;;;;-1:-1:-1;47120:155:0;;;;;:::i;:::-;;:::i;45282:330::-;;;;;;;;;;-1:-1:-1;45282:330:0;;;;;:::i;:::-;;:::i;47417:138::-;;;;;;;;;;-1:-1:-1;47417:138:0;;;;;:::i;:::-;;:::i;38192:101::-;;;;;;;;;;;;;:::i;43439:609::-;;;;;;;;;;-1:-1:-1;43439:609:0;;;;;:::i;:::-;;:::i;19603:143::-;;;;;;;;;;-1:-1:-1;19603:143:0;;;;;:::i;:::-;;:::i;46584:377::-;;;;;;;;;;-1:-1:-1;46584:377:0;;;;;:::i;:::-;;:::i;2085:109::-;;;;;;;;;;-1:-1:-1;2085:109:0;;;;;:::i;:::-;;:::i;38302:47::-;;;;;;;;;;;;;:::i;38781:65::-;;;;:::o;42812:619::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;;;;;;;;;42926:20:::1;:29:::0;;;42966:21:::1;:31:::0;;;43050:17:::1;::::0;43025:43:::1;::::0;42949:6;;43025:24:::1;:43::i;:::-;43008:14;:60:::0;43123:18:::1;::::0;43097:21:::1;::::0;:45:::1;::::0;:25:::1;:45::i;:::-;43079:15;:63:::0;43181:13:::1;::::0;43230:12:::1;::::0;43263:14:::1;::::0;43176:2:::1;:18:::0;;::::1;::::0;43225:17;;;::::1;::::0;43263:27;-1:-1:-1;43263:27:0::1;43255:52;;;;-1:-1:-1::0;;;43255:52:0::1;;;;;;;:::i;:::-;43345:10;43326:15;;:29;;43318:54;;;;-1:-1:-1::0;;;43318:54:0::1;;;;;;;:::i;:::-;43388:35;43407:6;43415:7;43388:35;;;;;;;:::i;:::-;;;;;;;;1430:1;;42812:619:::0;;:::o;18405:92::-;18484:5;18477:12;;;;;;;;-1:-1:-1;;18477:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:13;;18477:12;;18484:5;;18477:12;;18484:5;18477:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18405:92;:::o;38578:34::-;;;;:::o;19892:161::-;19967:4;19984:39;19993:12;:10;:12::i;:::-;20007:7;20016:6;19984:8;:39::i;:::-;-1:-1:-1;20041:4:0;19892:161;;;;;:::o;42179:123::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;42256:12:::1;:38:::0;;-1:-1:-1;;;;;;42256:38:0::1;-1:-1:-1::0;;;;;42256:38:0;;;::::1;::::0;;;::::1;::::0;;42179:123::o;38081:104::-;;;-1:-1:-1;;;;;38081:104:0;;:::o;38619:32::-;;;;:::o;44056:399::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;44162:12:::1;:21:::0;;;44194:13:::1;:23:::0;;;44338:14:::1;::::0;44251:2:::1;:18:::0;;::::1;::::0;44300:17;;;::::1;::::0;44338:27;-1:-1:-1;44338:27:0::1;44330:52;;;;-1:-1:-1::0;;;44330:52:0::1;;;;;;;:::i;:::-;44420:10;44401:15;;:29;;44393:54;;;;-1:-1:-1::0;;;44393:54:0::1;;;;;;;:::i;:::-;1430:1;;44056:399:::0;;:::o;42412:233::-;-1:-1:-1;;;42412:233:0;;;;;;;:::o;38741:33::-;;;;:::o;18881:100::-;18961:12;;18881:100;:::o;44900:202::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44991:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;:45;;-1:-1:-1;;44991:45:0::1;::::0;::::1;;;::::0;;45054:40;::::1;::::0;::::1;::::0;44991:45;;45054:40:::1;:::i;:::-;;;;;;;;44900:202:::0;;:::o;20524:397::-;20656:4;20673:36;20683:6;20691:9;20702:6;20673:9;:36::i;:::-;20720:171;20743:6;20764:12;:10;:12::i;:::-;20791:89;20829:6;20791:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20791:19:0;;;;;;:11;:19;;;;;;20811:12;:10;:12::i;:::-;-1:-1:-1;;;;;20791:33:0;;;;;;;;;;;;-1:-1:-1;20791:33:0;;;:89;:37;:89::i;:::-;20720:8;:171::i;:::-;-1:-1:-1;20909:4:0;20524:397;;;;;:::o;42310:94::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;42378:8:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;42378:18:0::1;-1:-1:-1::0;;;;42378:18:0;;::::1;::::0;;;::::1;::::0;;42310:94::o;38534:37::-;;;;:::o;18564:92::-;18639:9;;;;18564:92;:::o;21329:210::-;21409:4;21426:83;21435:12;:10;:12::i;:::-;21449:7;21458:50;21497:10;21458:11;:25;21470:12;:10;:12::i;:::-;-1:-1:-1;;;;;21458:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21458:25:0;;;:34;;;;;;;;;;;:38;:50::i;38857:41::-;;;;;;:::o;38358:39::-;;;;:::o;22472:120::-;22518:4;22535:27;22541:12;:10;:12::i;:::-;22555:6;22535:5;:27::i;:::-;-1:-1:-1;22580:4:0;22472:120;;;:::o;37979:28::-;;;-1:-1:-1;;;37979:28:0;;;;;:::o;47283:126::-;-1:-1:-1;;;;;47373:28:0;47349:4;47373:28;;;:19;:28;;;;;;;;;47283:126::o;54652:171::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;54774:41:::1;::::0;54752:10:::1;::::0;;;54793:21:::1;54774:41:::0;::::1;;;::::0;54716:25:::1;54774:41:::0;54716:25;54774:41;54793:21;54752:10;54774:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1430:1;54652:171::o:0;38658:31::-;;;;:::o;39488:57::-;;;;;;;;;;;;;;;:::o;46969:143::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;47041:11:::1;:21:::0;;;47078:26:::1;::::0;::::1;::::0;::::1;::::0;47055:7;;47078:26:::1;:::i;:::-;;;;;;;;46969:143:::0;:::o;44463:237::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;44558:17:::1;:33:::0;;;44602:14:::1;:27:::0;;;44655:37:::1;44578:13:::0;44619:10;44655:21:::1;:37::i;:::-;44642:10;:50:::0;-1:-1:-1;;44463:237:0:o;45987:177::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;46065:20:::1;:30:::0;;;46111:45:::1;::::0;::::1;::::0;::::1;::::0;46088:7;;46111:45:::1;:::i;41893:151::-:0;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;41972:24:::1;:64:::0;;-1:-1:-1;;;;;;41972:64:0::1;-1:-1:-1::0;;;;;41972:64:0;;;::::1;::::0;;;::::1;::::0;;41893:151::o;42653:::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;42724:21:::1;:29:::0;;-1:-1:-1;;42724:29:0::1;::::0;::::1;;;::::0;;42769:27:::1;::::0;::::1;::::0;::::1;::::0;42724:29;;42769:27:::1;:::i;19043:119::-:0;-1:-1:-1;;;;;19136:18:0;19109:7;19136:18;;;:9;:18;;;;;;;19043:119::o;1790:140::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;1889:1:::1;1873:6:::0;;1852:40:::1;::::0;-1:-1:-1;;;;;1873:6:0;;::::1;::::0;1852:40:::1;::::0;1889:1;;1852:40:::1;1920:1;1903:19:::0;;-1:-1:-1;;;;;;1903:19:0::1;::::0;;1790:140::o;37899:34::-;;;-1:-1:-1;;;;;37899:34:0;;:::o;37940:32::-;;;-1:-1:-1;;;;;37940:32:0;;:::o;38447:33::-;;;;:::o;38404:36::-;;;;:::o;39288:42::-;;;;;;;;;;;;;;;:::o;18248:94::-;18300:7;18327;:5;:7::i;:::-;18320:14;;18248:94;:::o;38905:50::-;;;;:::o;38014:28::-;;;-1:-1:-1;;;;;38014:28:0;;:::o;1148:79::-;1186:7;1213:6;-1:-1:-1;;;;;1213:6:0;1148:79;:::o;37833:59::-;;;-1:-1:-1;;;;;37833:59:0;;:::o;38487:40::-;;;;:::o;18721:96::-;18802:7;18795:14;;;;;;;;-1:-1:-1;;18795:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18769:13;;18795:14;;18802:7;;18795:14;;18802:7;18795:14;;;;;;;;;;;;;;;;;;;;;;;;54833:142;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;54919:48:::1;-1:-1:-1::0;;;;;54919:27:0;::::1;54947:10;54959:7:::0;54919:27:::1;:48::i;22041:311::-:0;22126:4;22143:179;22166:12;:10;:12::i;:::-;22193:7;22215:96;22254:15;22215:96;;;;;;;;;;;;;;;;;:11;:25;22227:12;:10;:12::i;:::-;-1:-1:-1;;;;;22215:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;22215:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;45110:164::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45193:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;;:30;;-1:-1:-1;;45193:30:0::1;::::0;::::1;;;::::0;;45241:25;::::1;::::0;::::1;::::0;45193:30;;45241:25:::1;:::i;19374:167::-:0;19452:4;19469:42;19479:12;:10;:12::i;:::-;19493:9;19504:6;19469:9;:42::i;38987:54::-;;;;:::o;38698:36::-;;;;:::o;42052:119::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;42125:15:::1;:38:::0;;-1:-1:-1;;;;;;42125:38:0::1;-1:-1:-1::0;;;;;42125:38:0;;;::::1;::::0;;;::::1;::::0;;42052:119::o;45620:163::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;45734:41:::1;45763:4;45769:5;45734:28;:41::i;44708:184::-:0;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44793:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;44793:39:0::1;::::0;::::1;;;::::0;;44850:34;::::1;::::0;::::1;::::0;44793:39;;44850:34:::1;:::i;46172:404::-:0;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;46288:44:::1;46304:21;46327:4;46288:15;:44::i;:::-;46359:18;::::0;46343:42:::1;::::0;-1:-1:-1;;;;;46359:18:0::1;;46343:15;:42::i;:::-;46477:18;::::0;46401:105:::1;::::0;-1:-1:-1;;;;;46477:18:0;;::::1;::::0;46401:105;::::1;::::0;::::1;::::0;46477:18:::1;::::0;46401:105:::1;46517:18;:51:::0;;-1:-1:-1;;;;;;46517:51:0::1;-1:-1:-1::0;;;;;46517:51:0;;;::::1;::::0;;;::::1;::::0;;46172:404::o;47120:155::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;47196:15:::1;:25:::0;;;47237:30:::1;::::0;::::1;::::0;::::1;::::0;47214:7;;47237:30:::1;:::i;45282:330::-:0;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;45425:9:::1;45420:116;45440:19:::0;;::::1;45420:116;;;45516:8;45481:19;:32;45501:8;;45510:1;45501:11;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45481:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45481:32:0;:43;;-1:-1:-1;;45481:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;45461:3:0::1;45420:116;;;;45553:51;45585:8;;45595;45553:51;;;;;;;;:::i;:::-;;;;;;;;45282:330:::0;;;:::o;47417:138::-;-1:-1:-1;;;;;47513:34:0;47489:4;47513:34;;;:25;:34;;;;;;;;;47417:138::o;38192:101::-;;;-1:-1:-1;;;;;38192:101:0;;:::o;43439:609::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;43550:17:::1;:26:::0;;;43587:18:::1;:28:::0;;;43643:20:::1;::::0;:43:::1;::::0;43570:6;43643:24:::1;:43::i;:::-;43626:14;:60:::0;43741:18:::1;::::0;43715:21:::1;::::0;:45:::1;::::0;:25:::1;:45::i;:::-;43697:15;:63:::0;43799:13:::1;::::0;43848:12:::1;::::0;43881:14:::1;::::0;43794:2:::1;:18:::0;;::::1;::::0;43843:17;;;::::1;::::0;43881:27;-1:-1:-1;43881:27:0::1;43873:52;;;;-1:-1:-1::0;;;43873:52:0::1;;;;;;;:::i;:::-;43963:10;43944:15;;:29;;43936:54;;;;-1:-1:-1::0;;;43936:54:0::1;;;;;;;:::i;:::-;44008:32;44024:6;44032:7;44008:32;;;;;;;:::i;19603:143::-:0;-1:-1:-1;;;;;19711:18:0;;;19684:7;19711:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19603:143::o;46584:377::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;46694:41:::1;46710:18;46730:4;46694:15;:41::i;:::-;46762:15;::::0;46746:39:::1;::::0;-1:-1:-1;;;;;46762:15:0::1;;46746;:39::i;:::-;46871:15;::::0;46801:96:::1;::::0;-1:-1:-1;;;;;46871:15:0;;::::1;::::0;46801:96;::::1;::::0;::::1;::::0;46871:15:::1;::::0;46801:96:::1;46908:15;:45:::0;;-1:-1:-1;;;;;;46908:45:0::1;-1:-1:-1::0;;;;;46908:45:0;;;::::1;::::0;;;::::1;::::0;;46584:377::o;2085:109::-;1370:12;:10;:12::i;:::-;1360:6;;-1:-1:-1;;;;;1360:6:0;;;:22;;;1352:67;;;;-1:-1:-1;;;1352:67:0;;;;;;;:::i;:::-;2158:28:::1;2177:8;2158:18;:28::i;:::-;2085:109:::0;:::o;38302:47::-;;;;:::o;5948:181::-;6006:7;6038:5;;;6062:6;;;;6054:46;;;;-1:-1:-1;;;6054:46:0;;;;;;;:::i;:::-;6120:1;5948:181;-1:-1:-1;;;5948:181:0:o;310:98::-;390:10;310:98;:::o;25304:372::-;-1:-1:-1;;;;;25432:19:0;;25424:68;;;;-1:-1:-1;;;25424:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25511:21:0;;25503:68;;;;-1:-1:-1;;;25503:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25584:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;25636:32;;;;;25614:6;;25636:32;:::i;:::-;;;;;;;;25304:372;;;:::o;47563:2903::-;-1:-1:-1;;;;;47695:18:0;;47687:68;;;;-1:-1:-1;;;47687:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47774:16:0;;47766:64;;;;-1:-1:-1;;;47766:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47848:31:0;;;;;;:25;:31;;;;;;;;47843:121;;47914:11;;47904:6;:21;;47896:56;;;;-1:-1:-1;;;47896:56:0;;;;;;;:::i;:::-;47980:11;47976:93;;48008:28;48024:4;48030:2;48034:1;48008:15;:28::i;:::-;48051:7;;47976:93;48085:21;;;;48081:582;;;48123:28;48154:24;48172:4;48154:9;:24::i;:::-;48234:20;;48123:55;;-1:-1:-1;48210:44:0;;;;;;;48275:20;;-1:-1:-1;48287:8:0;;-1:-1:-1;;;48287:8:0;;;;48286:9;48275:20;:56;;;;-1:-1:-1;;;;;;48300:31:0;;;;;;:25;:31;;;;;;;;48299:32;48275:56;:104;;;;-1:-1:-1;;;;;;48337:29:0;;;;;;:25;:29;;;;;;;;48336:30;;:42;;-1:-1:-1;48370:8:0;;-1:-1:-1;;;48370:8:0;;;;48336:42;48271:381;;;48400:8;:15;;-1:-1:-1;;;;48400:15:0;-1:-1:-1;;;48400:15:0;;;48530:20;;;-1:-1:-1;48569:32:0;48530:20;48569:10;:32::i;:::-;48620:8;:16;;-1:-1:-1;;;;48620:16:0;;;48271:381;48081:582;;;-1:-1:-1;;;;;48858:25:0;;48737:12;48858:25;;;:19;:25;;;;;;48752:4;;48858:25;;;:52;;-1:-1:-1;;;;;;48887:23:0;;;;;;:19;:23;;;;;;;;48858:52;48854:100;;;-1:-1:-1;48937:5:0;48854:100;48970:7;48966:1293;;;-1:-1:-1;;;;;49025:16:0;;48994:12;49025:16;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;49045:14:0;;;;;;:10;:14;;;;;;;;49025:34;49021:1227;;;-1:-1:-1;;;;;49084:16:0;;;;;;:10;:16;;;;;;;;49080:1109;;;49132:37;49163:5;49132:26;49143:14;;49132:6;:10;;:26;;;;:::i;:::-;:30;;:37::i;:::-;49196:12;;49125:44;;-1:-1:-1;49196:16:0;49192:430;;49241:18;49262:35;49291:5;49262:24;49273:12;;49262:6;:10;;:24;;;;:::i;:35::-;49241:56;-1:-1:-1;49324:58:0;49340:4;49354;49361:20;:4;49241:56;49361:8;:20::i;:::-;49324:15;:58::i;:::-;49418:22;:6;49429:10;49418;:22::i;:::-;49409:31;;49467:32;49481:4;49488:10;49467:5;:32::i;:::-;49192:430;;;;49556:42;49572:4;49586;49593;49556:15;:42::i;:::-;49080:1109;;;49677:38;49709:5;49677:27;49688:15;;49677:6;:10;;:27;;;;:::i;:38::-;49742:13;;49670:45;;-1:-1:-1;49742:17:0;49738:432;;49788:18;49809:36;49839:5;49809:25;49820:13;;49809:6;:10;;:25;;;;:::i;:36::-;49788:57;-1:-1:-1;49872:58:0;49888:4;49902;49909:20;:4;49788:57;49909:8;:20::i;49872:58::-;49966:22;:6;49977:10;49966;:22::i;:::-;49957:31;;50015:32;50029:4;50036:10;50015:5;:32::i;:::-;49738:432;;;;50104:42;50120:4;50134;50141;50104:15;:42::i;:::-;50216:16;:6;50227:4;50216:10;:16::i;:::-;50207:25;;49021:1227;48966:1293;;-1:-1:-1;;;;;50276:29:0;;;;;;:25;:29;;;;;;;;50271:142;;50359:15;;50330:25;50348:6;50330:13;50340:2;50330:9;:13::i;:::-;:17;;:25::i;:::-;:44;;50322:79;;;;-1:-1:-1;;;50322:79:0;;;;;;;:::i;:::-;50425:33;50441:4;50447:2;50451:6;50425:15;:33::i;47563:2903::-;;;;:::o;6851:226::-;6971:7;7007:12;6999:6;;;;6991:29;;;;-1:-1:-1;;;6991:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;7043:5:0;;;6851:226::o;24516:348::-;-1:-1:-1;;;;;24592:21:0;;24584:67;;;;-1:-1:-1;;;24584:67:0;;;;;;;:::i;:::-;24685:68;24708:6;24685:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24685:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;24664:18:0;;;;;;:9;:18;;;;;:89;24779:12;;:24;;24796:6;24779:16;:24::i;:::-;24764:12;:39;24819:37;;24845:1;;-1:-1:-1;;;;;24819:37:0;;;;;;;24849:6;;24819:37;:::i;:::-;;;;;;;;24516:348;;:::o;26243:211::-;26360:86;26380:5;26410:23;;;26435:2;26439:5;26387:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26387:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26387:58:0;-1:-1:-1;;;;;;26387:58:0;;;;;;;;;;26360:19;:86::i;45791:188::-;-1:-1:-1;;;;;45874:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;45874:39:0;;;;;;;;;;45931:40;;45874:39;;:31;45931:40;;;45791:188;;:::o;2300:229::-;-1:-1:-1;;;;;2374:22:0;;2366:73;;;;-1:-1:-1;;;2366:73:0;;;;;;;:::i;:::-;2476:6;;;2455:38;;-1:-1:-1;;;;;2455:38:0;;;;2476:6;;;2455:38;;;2504:6;:17;;-1:-1:-1;;;;;;2504:17:0;-1:-1:-1;;;;;2504:17:0;;;;;;;;;;2300:229::o;23082:513::-;-1:-1:-1;;;;;23222:20:0;;23214:70;;;;-1:-1:-1;;;23214:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23303:23:0;;23295:71;;;;-1:-1:-1;;;23295:71:0;;;;;;;:::i;:::-;23399;23421:6;23399:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23399:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;23379:17:0;;;;;;;:9;:17;;;;;;:91;;;;23504:20;;;;;;;:32;;23529:6;23504:24;:32::i;:::-;-1:-1:-1;;;;;23481:20:0;;;;;;;:9;:20;;;;;;;:55;;;;23552:35;;;;;;;;;;23580:6;;23552:35;:::i;50474:834::-;50534:26;50563:47;50599:10;;50563:31;50579:14;;50563:11;:15;;:31;;;;:::i;:47::-;50534:76;-1:-1:-1;50621:23:0;50647:35;:11;50534:76;50647:15;:35::i;:::-;50621:61;;50693:36;50713:15;50693:19;:36::i;:::-;50811:8;;50764:21;;-1:-1:-1;;;50811:8:0;;;;50806:87;;50852:4;;:29;;-1:-1:-1;;;50852:29:0;;:4;;;;-1:-1:-1;;;;;50852:4:0;;:14;;:29;;50875:4;;50852:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50836:45;;50806:87;50905:26;50934:49;50972:10;;50934:33;50952:14;;50934:13;:17;;:33;;;;:::i;:49::-;50905:78;-1:-1:-1;50994:26:0;51023:37;:13;50905:78;51023:17;:37::i;:::-;50994:66;-1:-1:-1;51077:22:0;;51073:109;;51116:54;51151:18;51116:34;:54::i;:::-;51198:22;;51194:107;;51237:52;51250:18;51270;51237:12;:52::i;:::-;50474:834;;;;;;:::o;7336:471::-;7394:7;7639:6;7635:47;;-1:-1:-1;7669:1:0;7662:8;;7635:47;7706:5;;;7710:1;7706;:5;:1;7730:5;;;;;:10;7722:56;;;;-1:-1:-1;;;7722:56:0;;;;;;;:::i;8283:132::-;8341:7;8368:39;8372:1;8375;8368:39;;;;;;;;;;;;;;;;;:3;:39::i;6412:136::-;6470:7;6497:43;6501:1;6504;6497:43;;;;;;;;;;;;;;;;;:3;:43::i;28778:774::-;29202:23;29228:69;29256:4;29228:69;;;;;;;;;;;;;;;;;29236:5;-1:-1:-1;;;;;29228:27:0;;;:69;;;;;:::i;:::-;29312:17;;29202:95;;-1:-1:-1;29312:21:0;29308:237;;29467:10;29456:30;;;;;;;;;;;;:::i;:::-;29448:85;;;;-1:-1:-1;;;29448:85:0;;;;;;;:::i;51336:744::-;51409:8;;-1:-1:-1;;;51409:8:0;;;;51405:668;;;51525:16;;;51539:1;51525:16;;;51501:21;51525:16;;;;;51501:21;51525:16;;;;;;;;;;-1:-1:-1;51525:16:0;51501:40;;51574:4;51556;51561:1;51556:7;;;;;;;;-1:-1:-1;;;;;51556:23:0;;;:7;;;;;;;;;;:23;;;;51604:12;;:19;;;-1:-1:-1;;;51604:19:0;;;;:12;;;;;:17;;:19;;;;;51556:7;;51604:19;;;;;:12;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51594:4;51599:1;51594:7;;;;;;;;-1:-1:-1;;;;;51594:29:0;;;:7;;;;;;;;;:29;51672:12;;51640:59;;51657:4;;51672:12;51687:11;51640:8;:59::i;:::-;51746:12;;:248;;-1:-1:-1;;;51746:248:0;;-1:-1:-1;;;;;51746:12:0;;;;:63;;:248;;51828:11;;51746:12;;51909:4;;51940;;51964:15;;51746:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51405:668;;;;52027:34;52049:11;52027:21;:34::i;54449:195::-;54533:8;;-1:-1:-1;;;54533:8:0;;;;54528:63;;54558:4;;:21;;-1:-1:-1;;;54558:21:0;;:4;;;;-1:-1:-1;;;;;54558:4:0;;:13;;:21;;54572:6;;54558:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54528:63;54601:18;;:35;;-1:-1:-1;;;;;54601:18:0;;;;:35;;;;;54629:6;;54601:18;:35;:18;:35;54629:6;54601:18;:35;;;;;;;;;;;;;;;;;;;52088:666;52173:8;;-1:-1:-1;;;52173:8:0;;;;52169:578;;;52301:12;;52269:59;;52286:4;;-1:-1:-1;;;;;52301:12:0;52316:11;52269:8;:59::i;:::-;52379:12;;52600:15;;52379:285;;-1:-1:-1;;;52379:285:0;;-1:-1:-1;;;;;52379:12:0;;;;:28;;52415:9;;52379:285;;52452:4;;52476:11;;52379:12;;;;52600:15;;52634;;52379:285;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52169:578;;;52697:38;52712:11;52725:9;52697:14;:38::i;8911:312::-;9031:7;9066:12;9059:5;9051:28;;;;-1:-1:-1;;;9051:28:0;;;;;;;;:::i;:::-;;9090:9;9106:1;9102;:5;;;;;;;8911:312;-1:-1:-1;;;;;8911:312:0:o;14800:230::-;14937:12;14969:53;14992:6;15000:4;15006:1;15009:12;14969:22;:53::i;:::-;14962:60;14800:230;-1:-1:-1;;;;14800:230:0:o;52782:655::-;52885:15;;52853:62;;52870:4;;-1:-1:-1;;;;;52885:15:0;52903:11;52853:8;:62::i;:::-;52954:48;;:::i;:::-;-1:-1:-1;53005:371:0;;;;;;;;53090:4;53005:371;;;37606:42;53005:371;;;;53152:4;53005:371;;;;;;;;53228:15;53005:371;;;;;;;;;;-1:-1:-1;53005:371:0;;;;;;;;;;53389:15;;:40;;-1:-1:-1;;;53389:40:0;;53005:371;;-1:-1:-1;;;;;53389:15:0;;:32;;:40;;53005:371;;53389:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53445:996::-;53627:24;;53595:71;;53612:4;;-1:-1:-1;;;;;53627:24:0;53654:11;53595:8;:71::i;:::-;53677:4;;53698:24;;53677:58;;-1:-1:-1;;;53677:58:0;;-1:-1:-1;;;;;53677:4:0;;;;;;;:12;;:58;;53698:24;;;53725:9;;53677:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53778:65;;:::i;:::-;-1:-1:-1;53846:537:0;;;;;;;;53920:4;53846:537;;37606:42;53846:537;;;;53980:4;53846:537;;;;-1:-1:-1;;53846:537:0;;;;54084:40;53846:537;;;;;;;;;;;;;;;;-1:-1:-1;53846:537:0;;;;;;;;;;54308:15;;-1:-1:-1;;;;;54308:15:0;;;53846:537;;;;54352:15;53846:537;;;;54396:24;;:37;;-1:-1:-1;;;54396:37:0;;53846:537;;54396:24;;:29;;:37;;53846:537;;54396:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;53445:996;;;:::o;16288:1020::-;16461:12;16494:18;16505:6;16494:10;:18::i;:::-;16486:60;;;;-1:-1:-1;;;16486:60:0;;;;;;;:::i;:::-;16620:12;16634:23;16661:6;-1:-1:-1;;;;;16661:11:0;16680:8;16690:4;16661:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16619:76;;;;16710:7;16706:595;;;16741:10;-1:-1:-1;16734:17:0;;-1:-1:-1;16734:17:0;16706:595;16855:17;;:21;16851:439;;17118:10;17112:17;17179:15;17166:10;17162:2;17158:19;17151:44;17066:148;17261:12;17254:20;;-1:-1:-1;;;17254:20:0;;;;;;;;:::i;11663:641::-;11723:4;12204:20;;12034:66;12253:23;;;;;;:42;;-1:-1:-1;;12280:15:0;;;12245:51;-1:-1:-1;;11663:641:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1704:241::-;;1808:2;1796:9;1787:7;1783:23;1779:32;1776:2;;;-1:-1;;1814:12;1776:2;85:6;72:20;97:33;124:5;97:33;:::i;1952:263::-;;2067:2;2055:9;2046:7;2042:23;2038:32;2035:2;;;-1:-1;;2073:12;2035:2;226:6;220:13;238:33;265:5;238:33;:::i;2222:366::-;;;2343:2;2331:9;2322:7;2318:23;2314:32;2311:2;;;-1:-1;;2349:12;2311:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2401:63;-1:-1;2501:2;2540:22;;72:20;97:33;72:20;97:33;:::i;:::-;2509:63;;;;2305:283;;;;;:::o;2595:491::-;;;;2733:2;2721:9;2712:7;2708:23;2704:32;2701:2;;;-1:-1;;2739:12;2701:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2791:63;-1:-1;2891:2;2930:22;;72:20;97:33;72:20;97:33;:::i;:::-;2695:391;;2899:63;;-1:-1;;;2999:2;3038:22;;;;1493:20;;2695:391::o;3093:741::-;;;;;;3267:3;3255:9;3246:7;3242:23;3238:33;3235:2;;;-1:-1;;3274:12;3235:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3326:63;-1:-1;3426:2;3465:22;;72:20;97:33;72:20;97:33;:::i;:::-;3434:63;-1:-1;3534:2;3573:22;;1493:20;;-1:-1;3670:2;3655:18;;3642:32;3694:18;3683:30;;;3680:2;;;-1:-1;;3716:12;3680:2;3801:6;3790:9;3786:22;;;1055:3;1048:4;1040:6;1036:17;1032:27;1022:2;;-1:-1;;1063:12;1022:2;1106:6;1093:20;3694:18;1125:6;1122:30;1119:2;;;-1:-1;;1155:12;1119:2;1250:3;3426:2;1230:17;1191:6;1216:32;;1213:41;1210:2;;;-1:-1;;1257:12;1210:2;3229:605;;;;-1:-1;3229:605;;-1:-1;3426:2;1187:17;;3736:82;3229:605;-1:-1;;;3229:605::o;3841:360::-;;;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;-1:-1;;3965:12;3927:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4017:63;-1:-1;4117:2;4153:22;;725:20;750:30;725:20;750:30;:::i;4208:366::-;;;4329:2;4317:9;4308:7;4304:23;4300:32;4297:2;;;-1:-1;;4335:12;4297:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4387:63;4487:2;4526:22;;;;1493:20;;-1:-1;;;4291:283::o;4581:516::-;;;;4734:2;4722:9;4713:7;4709:23;4705:32;4702:2;;;-1:-1;;4740:12;4702:2;4798:17;4785:31;4836:18;;4828:6;4825:30;4822:2;;;-1:-1;;4858:12;4822:2;4959:6;4948:9;4944:22;;;431:3;424:4;416:6;412:17;408:27;398:2;;-1:-1;;439:12;398:2;482:6;469:20;4836:18;501:6;498:30;495:2;;;-1:-1;;531:12;495:2;626:3;575:4;;610:6;606:17;567:6;592:32;;589:41;586:2;;;-1:-1;;633:12;586:2;575:4;563:17;;;;-1:-1;4878:98;-1:-1;;5049:22;;725:20;750:30;725:20;750:30;:::i;:::-;5021:60;;;;4696:401;;;;;:::o;5104:235::-;;5205:2;5193:9;5184:7;5180:23;5176:32;5173:2;;;-1:-1;;5211:12;5173:2;738:6;725:20;750:30;774:5;750:30;:::i;5346:257::-;;5458:2;5446:9;5437:7;5433:23;5429:32;5426:2;;;-1:-1;;5464:12;5426:2;873:6;867:13;885:30;909:5;885:30;:::i;5610:241::-;;5714:2;5702:9;5693:7;5689:23;5685:32;5682:2;;;-1:-1;;5720:12;5682:2;-1:-1;1493:20;;5676:175;-1:-1;5676:175::o;5858:263::-;;5973:2;5961:9;5952:7;5948:23;5944:32;5941:2;;;-1:-1;;5979:12;5941:2;-1:-1;1641:13;;5935:186;-1:-1;5935:186::o;6128:672::-;;;;;6294:3;6282:9;6273:7;6269:23;6265:33;6262:2;;;-1:-1;;6301:12;6262:2;1647:6;1641:13;6353:74;;6464:2;6518:9;6514:22;1363:13;35601:34;38209:5;35590:46;38184:5;38181:35;38171:2;;-1:-1;;38220:12;38171:2;6583;6633:22;;1641:13;6702:2;6752:22;;;1641:13;6256:544;;6472:74;;-1:-1;6256:544;-1:-1;;;6256:544::o;6807:366::-;;;6928:2;6916:9;6907:7;6903:23;6899:32;6896:2;;;-1:-1;;6934:12;6896:2;-1:-1;;1493:20;;;7086:2;7125:22;;;1493:20;;-1:-1;6890:283::o;7180:535::-;;;;7329:2;7317:9;7308:7;7304:23;7300:32;7297:2;;;-1:-1;;7335:12;7297:2;1647:6;1641:13;7387:74;;7498:2;7552:9;7548:22;1641:13;7506:74;;7617:2;7671:9;7667:22;1641:13;7625:74;;7291:424;;;;;:::o;7904:142::-;-1:-1;;;;;35710:54;7983:58;;7977:69::o;11004:97::-;35507:1;35496:20;11061:35;;11055:46::o;20383:100::-;35848:8;35837:20;20442:36;;20436:47::o;20834:271::-;;10248:5;33819:12;10359:52;10404:6;10399:3;10392:4;10385:5;10381:16;10359:52;:::i;:::-;10423:16;;;;;20968:137;-1:-1;;20968:137::o;21112:222::-;-1:-1;;;;;35710:54;;;;8140:45;;21239:2;21224:18;;21210:124::o;21847:844::-;-1:-1;;;;;35710:54;;;7983:58;;22319:2;22304:18;;20551:37;;;;22410:2;22395:18;;11187:58;;;;22501:2;22486:18;;11187:58;;;;35710:54;;;22592:3;22577:19;;7983:58;35721:42;22661:19;;20551:37;;;;22146:3;22131:19;;22117:574::o;22698:333::-;-1:-1;;;;;35710:54;;;;8140:45;;23017:2;23002:18;;20551:37;22853:2;22838:18;;22824:207::o;23038:489::-;23247:2;23261:47;;;23232:18;;34468:19;;;23038:489;8783:21;34508:14;;;23038:489;8810:291;8835:6;8832:1;8829:13;8810:291;;;34517:4;85:6;72:20;97:33;124:5;97:33;:::i;:::-;-1:-1;;;;;35710:54;8140:45;;34962:12;;;;7876:14;;;;3694:18;8850:9;8810:291;;;8814:14;23314:126;;;;;9952:5;35259:13;35252:21;34517:4;23502:9;23498:18;9925:34;23218:309;;;;;;:::o;23534:210::-;35259:13;;35252:21;9925:34;;23655:2;23640:18;;23626:118::o;23751:218::-;-1:-1;;;;;;35346:78;;;;10040:36;;23876:2;23861:18;;23847:122::o;24817:310::-;;24964:2;24985:17;24978:47;11402:5;33819:12;34480:6;24964:2;24953:9;24949:18;34468:19;11496:52;11541:6;34508:14;24953:9;34508:14;24964:2;11522:5;11518:16;11496:52;:::i;:::-;37859:7;37843:14;-1:-1;;37839:28;11560:39;;;;34508:14;11560:39;;24935:192;-1:-1;;24935:192::o;25134:416::-;25334:2;25348:47;;;11836:2;25319:18;;;34468:19;11872:34;34508:14;;;11852:55;-1:-1;;;11927:12;;;11920:27;11966:12;;;25305:245::o;25557:416::-;25757:2;25771:47;;;12217:2;25742:18;;;34468:19;-1:-1;;;34508:14;;;12233:45;12297:12;;;25728:245::o;25980:416::-;26180:2;26194:47;;;12548:2;26165:18;;;34468:19;12584:34;34508:14;;;12564:55;-1:-1;;;12639:12;;;12632:30;12681:12;;;26151:245::o;26403:416::-;26603:2;26617:47;;;12932:2;26588:18;;;34468:19;12968:34;34508:14;;;12948:55;-1:-1;;;13023:12;;;13016:26;13061:12;;;26574:245::o;26826:416::-;27026:2;27040:47;;;13312:2;27011:18;;;34468:19;13348:29;34508:14;;;13328:50;13397:12;;;26997:245::o;27249:416::-;27449:2;27463:47;;;13648:2;27434:18;;;34468:19;-1:-1;;;34508:14;;;13664:35;13718:12;;;27420:245::o;27672:416::-;27872:2;27886:47;;;13969:2;27857:18;;;34468:19;14005:34;34508:14;;;13985:55;-1:-1;;;14060:12;;;14053:25;14097:12;;;27843:245::o;28095:416::-;28295:2;28309:47;;;28280:18;;;34468:19;14384:34;34508:14;;;14364:55;14438:12;;;28266:245::o;28518:416::-;28718:2;28732:47;;;14689:2;28703:18;;;34468:19;14725:34;34508:14;;;14705:55;-1:-1;;;14780:12;;;14773:25;14817:12;;;28689:245::o;28941:416::-;29141:2;29155:47;;;15068:2;29126:18;;;34468:19;15104:34;34508:14;;;15084:55;-1:-1;;;15159:12;;;15152:29;15200:12;;;29112:245::o;29364:416::-;29564:2;29578:47;;;15451:2;29549:18;;;34468:19;15487:34;34508:14;;;15467:55;-1:-1;;;15542:12;;;15535:28;15582:12;;;29535:245::o;29787:416::-;29987:2;30001:47;;;15833:2;29972:18;;;34468:19;15869:31;34508:14;;;15849:52;15920:12;;;29958:245::o;30210:416::-;30410:2;30424:47;;;16171:2;30395:18;;;34468:19;16207:34;34508:14;;;16187:55;-1:-1;;;16262:12;;;16255:34;16308:12;;;30381:245::o;30633:416::-;30833:2;30847:47;;;16559:2;30818:18;;;34468:19;-1:-1;;;34508:14;;;16575:45;16639:12;;;30804:245::o;31056:383::-;17002:23;;-1:-1;;;;;35710:54;;;7983:58;;17177:4;17166:16;;;17160:23;35710:54;;17237:14;;;7983:58;17330:4;17319:16;;;17313:23;35848:8;35837:20;17388:14;;;20442:36;17487:4;17476:16;;;17470:23;35710:54;;17547:14;;;7983:58;17645:4;17634:16;;;17628:23;17705:14;;;20551:37;35721:42;17792:16;;;17786:23;17863:14;;;20551:37;17969:4;17958:16;;;17952:23;18029:14;;;20551:37;18136:4;18125:16;;;18119:23;35710:54;18196:14;;;7983:58;;;;31263:3;31248:19;;31234:205::o;31446:335::-;;31629:3;31618:9;31614:19;31606:27;;18588:63;18636:14;18565:16;18559:23;18588:63;:::i;:::-;18732:4;18725:5;18721:16;18715:23;18744:63;18732:4;18796:3;18792:14;18778:12;18744:63;:::i;:::-;;18885:4;18878:5;18874:16;18868:23;18897:61;18885:4;18947:3;18943:14;18929:12;18897:61;:::i;:::-;;19042:4;19035:5;19031:16;19025:23;19054:59;19042:4;19102:3;19098:14;19084:12;19054:59;:::i;:::-;;19197:4;19190:5;19186:16;19180:23;19209:59;19197:4;19257:3;19253:14;19239:12;19209:59;:::i;:::-;;19357:4;19350:5;19346:16;19340:23;19357:4;19421:3;19417:14;20551:37;19521:4;19514:5;19510:16;19504:23;19521:4;19585:3;19581:14;20551:37;19681:4;19674:5;19670:16;19664:23;19681:4;19745:3;19741:14;20551:37;19841:6;;19834:5;19830:18;19824:25;19841:6;19907:3;19903:16;20551:37;;20004:6;;19997:5;19993:18;19987:25;20018:65;20004:6;20070:3;20066:16;20052:12;20018:65;:::i;:::-;-1:-1;;20166:6;20155:18;;;20149:25;20228:16;;;;20551:37;31600:181;:::o;31788:222::-;20551:37;;;31915:2;31900:18;;31886:124::o;32017:848::-;;32322:3;32311:9;32307:19;20581:5;20558:3;20551:37;32495:2;37219:24;32495:2;32484:9;32480:18;11187:58;32322:3;32532:2;32521:9;32517:18;32510:48;32572:108;9355:5;33819:12;34480:6;34475:3;34468:19;34508:14;32311:9;34508:14;9367:93;;32495:2;9531:5;33673:14;9543:21;;-1:-1;9570:260;9595:6;9592:1;9589:13;9570:260;;;9656:13;;-1:-1;;;;;35710:54;7983:58;;34208:14;;;;7876;;;;3694:18;9610:9;9570:260;;;-1:-1;;;;;;;35710:54;;;;32767:2;32752:18;;7983:58;-1:-1;;;32850:3;32835:19;20551:37;32564:116;32293:572;-1:-1;;;32293:572::o;32872:333::-;20551:37;;;33191:2;33176:18;;20551:37;33027:2;33012:18;;32998:207::o;33212:214::-;36019:4;36008:16;;;;20787:35;;33335:2;33320:18;;33306:120::o;37499:268::-;37564:1;37571:101;37585:6;37582:1;37579:13;37571:101;;;37652:11;;;37646:18;37633:11;;;37626:39;37607:2;37600:10;37571:101;;;37687:6;37684:1;37681:13;37678:2;;;-1:-1;;37564:1;37734:16;;37727:27;37548:219::o;37880:117::-;-1:-1;;;;;35710:54;;37939:35;;37929:2;;37988:1;;37978:12;38004:111;38085:5;35259:13;35252:21;38063:5;38060:32;38050:2;;38106:1;;38096:12

Swarm Source

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