ETH Price: $3,889.23 (-1.57%)
Gas: 9.26 Gwei

Token

Dejitaru Odin (ODIN)
 

Overview

Max Total Supply

500,000,000 ODIN

Holders

505 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
drewsuruncle.eth
Balance
78,993.58591800575003159 ODIN

Value
$0.00
0xe506cf9defdd82723ce5b3ffe425decdf78a543d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A decentralized MEME token of the god of war ODIN, Paired with Dejitaru TSUKA.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DejitaruOdin

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-05
*/

// SPDX-License-Identifier: Unlicensed
// https://t.me/DejitaruOdin
// https://twitter.com/DejitaruOdin
// https://www.dejitaruodin.com
// https://medium.com/@thorsonofodin_76457/dejitaru-odin-c48e8b0463fc
// https://www.dejitaruodin.com/OdinWhitepaper.html
pragma solidity 0.8.12;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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


    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

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

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract DejitaruOdin is ERC20, Ownable {
    using SafeMath for uint256;

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

    bool private swapping;

    address public devWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyDevFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;

    /******************/

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


    event ExcludeFromFees(address indexed account, bool isExcluded);

    event devWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    constructor() ERC20("Dejitaru Odin", "ODIN") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), TSUKA);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);


        uint256 _buyDevFee = 10;
        uint256 _buyLiquidityFee = 0;

        uint256 _sellDevFee = 10;
        uint256 _sellLiquidityFee = 0;

        uint256 totalSupply = 500_000_000 * 1e18;

        maxTransactionAmount =  totalSupply * 3 / 100; // 3% from total supply maxTransactionAmountTxn
        maxWallet = totalSupply * 3 / 100; // 3% from total supply maxWallet
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        buyDevFee = _buyDevFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTotalFees = buyDevFee + buyLiquidityFee;

        sellDevFee = _sellDevFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTotalFees = sellDevFee + sellLiquidityFee;

        devWallet = address(0xdCf0DAC62a73d4C706d9b9E94d43338007310667); 

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

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

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

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _devFee,
        uint256 _liquidityFee
    ) external onlyOwner {
        buyDevFee = _devFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyDevFee + buyLiquidityFee;
    }

    function updateSellFees(
        uint256 _devFee,
        uint256 _liquidityFee
    ) external onlyOwner {
        sellDevFee = _devFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellDevFee + sellLiquidityFee;
    }

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

    function updateDevWallet(address newDevWallet)
        external
        onlyOwner
    {
        emit devWalletUpdated(newDevWallet, devWallet);
        devWallet = newDevWallet;
    }


    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[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 (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                //when buy
                if (
                    from == uniswapV2Pair &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        uint256 tokensForLiquidity = 0;
        uint256 tokensForDev = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (to == uniswapV2Pair && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity = (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev = (fees * sellDevFee) / sellTotalFees;
            }
            // on buy
            else if (from == uniswapV2Pair && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity = (fees * buyLiquidityFee) / buyTotalFees; 
                tokensForDev = (fees * buyDevFee) / buyTotalFees;
            }

            if (fees> 0) {
                super._transfer(from, address(this), fees);
            }
            if (tokensForLiquidity > 0) {
                super._transfer(address(this), uniswapV2Pair, tokensForLiquidity);
            }

            amount -= fees;
        }

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

    function swapTokensForTSUKA(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = TSUKA;

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

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of TSUKA
            path,
            devWallet,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        swapTokensForTSUKA(contractBalance);
    }

}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"inputs":[],"name":"TSUKA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405273c5fb36dd2fb59d3b98deff88425a3f425ee469ed600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff021916908315150217905550348015620000b757600080fd5b506040518060400160405280600d81526020017f44656a6974617275204f64696e000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f44494e0000000000000000000000000000000000000000000000000000000081525081600390805190602001906200013c929190620009b1565b50806004908051906020019062000155929190620009b1565b505050620001786200016c6200051260201b60201c565b6200051a60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001a4816001620005e060201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024a919062000acb565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401620002a892919062000b0e565b6020604051808303816000875af1158015620002c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ee919062000acb565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200033660a0516001620005e060201b60201c565b6000600a9050600080600a90506000806b019d971e4fe8401e740000009050606460038262000366919062000b74565b62000372919062000c04565b600881905550606460038262000389919062000b74565b62000395919062000c04565b600a81905550612710600582620003ad919062000b74565b620003b9919062000c04565b60098190555084600d8190555083600e81905550600e54600d54620003df919062000c3c565b600c81905550826010819055508160118190555060115460105462000405919062000c3c565b600f8190555073dcf0dac62a73d4c706d9b9e94d43338007310667600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200048262000474620006ca60201b60201c565b6001620006f460201b60201c565b62000495306001620006f460201b60201c565b620004aa61dead6001620006f460201b60201c565b620004cc620004be620006ca60201b60201c565b6001620005e060201b60201c565b620004df306001620005e060201b60201c565b620004f461dead6001620005e060201b60201c565b6200050633826200082e60201b60201c565b50505050505062000e5b565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005f06200051260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000616620006ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200066f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006669062000cfa565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007046200051260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200072a620006ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200077a9062000cfa565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000822919062000d39565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008989062000da6565b60405180910390fd5b620008b560008383620009a760201b60201c565b8060026000828254620008c9919062000c3c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000920919062000c3c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000987919062000dd9565b60405180910390a3620009a360008383620009ac60201b60201c565b5050565b505050565b505050565b828054620009bf9062000e25565b90600052602060002090601f016020900481019282620009e3576000855562000a2f565b82601f10620009fe57805160ff191683800117855562000a2f565b8280016001018555821562000a2f579182015b8281111562000a2e57825182559160200191906001019062000a11565b5b50905062000a3e919062000a42565b5090565b5b8082111562000a5d57600081600090555060010162000a43565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a938262000a66565b9050919050565b62000aa58162000a86565b811462000ab157600080fd5b50565b60008151905062000ac58162000a9a565b92915050565b60006020828403121562000ae45762000ae362000a61565b5b600062000af48482850162000ab4565b91505092915050565b62000b088162000a86565b82525050565b600060408201905062000b25600083018562000afd565b62000b34602083018462000afd565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b818262000b3b565b915062000b8e8362000b3b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bca5762000bc962000b45565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000c118262000b3b565b915062000c1e8362000b3b565b92508262000c315762000c3062000bd5565b5b828204905092915050565b600062000c498262000b3b565b915062000c568362000b3b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c8e5762000c8d62000b45565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000ce260208362000c99565b915062000cef8262000caa565b602082019050919050565b6000602082019050818103600083015262000d158162000cd3565b9050919050565b60008115159050919050565b62000d338162000d1c565b82525050565b600060208201905062000d50600083018462000d28565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000d8e601f8362000c99565b915062000d9b8262000d56565b602082019050919050565b6000602082019050818103600083015262000dc18162000d7f565b9050919050565b62000dd38162000b3b565b82525050565b600060208201905062000df0600083018462000dc8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000e3e57607f821691505b6020821081141562000e555762000e5462000df6565b5b50919050565b60805160a051613b6a62000eb260003960008181610ebb01528181611ee8015281816121310152818161233c0152818161240701526124f1015260008181610b3b01528181612a1f0152612a460152613b6a6000f3fe6080604052600436106102555760003560e01c80638a8c523c11610139578063c0246668116100b6578063dd62ed3e1161007a578063dd62ed3e146108b3578063e2f45605146108f0578063f11a24d31461091b578063f2fde38b14610946578063f63743421461096f578063f8b45b051461099a5761025c565b8063c0246668146107ce578063c18bc195146107f7578063c8c8ebe414610820578063d257b34f1461084b578063d85ba063146108885761025c565b80639c3b4fdc116100fd5780639c3b4fdc146106e5578063a0d82dc514610710578063a9059cbb1461073b578063b73e794614610778578063bbc0c742146107a35761025c565b80638a8c523c146106245780638da5cb5b1461063b5780638ea5220f14610666578063924de9b71461069157806395d89b41146106ba5761025c565b8063313ce567116101d25780636a486a8e116101965780636a486a8e146105265780636ddd17131461055157806370a082311461057c578063715018a6146105b9578063751039fc146105d05780637571336a146105fb5761025c565b8063313ce5671461043f57806349bd5a5e1461046a5780634a62bb65146104955780634fbee193146104c057806366ca9b83146104fd5761025c565b806318160ddd1161021957806318160ddd1461035a5780631816467f14610385578063203e727e146103ae57806323b872dd146103d757806327c8f835146104145761025c565b806302dbd8f81461026157806306fdde031461028a578063095ea7b3146102b557806310d5de53146102f25780631694505e1461032f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612b39565b6109c5565b005b34801561029657600080fd5b5061029f610a69565b6040516102ac9190612c12565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612c92565b610afb565b6040516102e99190612ced565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190612d08565b610b19565b6040516103269190612ced565b60405180910390f35b34801561033b57600080fd5b50610344610b39565b6040516103519190612d94565b60405180910390f35b34801561036657600080fd5b5061036f610b5d565b60405161037c9190612dbe565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d08565b610b67565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612dd9565b610ca3565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612e06565b610db2565b60405161040b9190612ced565b60405180910390f35b34801561042057600080fd5b50610429610eaa565b6040516104369190612e68565b60405180910390f35b34801561044b57600080fd5b50610454610eb0565b6040516104619190612e9f565b60405180910390f35b34801561047657600080fd5b5061047f610eb9565b60405161048c9190612e68565b60405180910390f35b3480156104a157600080fd5b506104aa610edd565b6040516104b79190612ced565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612d08565b610ef0565b6040516104f49190612ced565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f9190612b39565b610f46565b005b34801561053257600080fd5b5061053b610fea565b6040516105489190612dbe565b60405180910390f35b34801561055d57600080fd5b50610566610ff0565b6040516105739190612ced565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190612d08565b611003565b6040516105b09190612dbe565b60405180910390f35b3480156105c557600080fd5b506105ce61104b565b005b3480156105dc57600080fd5b506105e56110d3565b6040516105f29190612ced565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612ee6565b611173565b005b34801561063057600080fd5b5061063961124a565b005b34801561064757600080fd5b506106506112fe565b60405161065d9190612e68565b60405180910390f35b34801561067257600080fd5b5061067b611328565b6040516106889190612e68565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612f26565b61134e565b005b3480156106c657600080fd5b506106cf6113e7565b6040516106dc9190612c12565b60405180910390f35b3480156106f157600080fd5b506106fa611479565b6040516107079190612dbe565b60405180910390f35b34801561071c57600080fd5b5061072561147f565b6040516107329190612dbe565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190612c92565b611485565b60405161076f9190612ced565b60405180910390f35b34801561078457600080fd5b5061078d6114a3565b60405161079a9190612e68565b60405180910390f35b3480156107af57600080fd5b506107b86114c9565b6040516107c59190612ced565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190612ee6565b6114dc565b005b34801561080357600080fd5b5061081e60048036038101906108199190612dd9565b611601565b005b34801561082c57600080fd5b50610835611710565b6040516108429190612dbe565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190612dd9565b611716565b60405161087f9190612ced565b60405180910390f35b34801561089457600080fd5b5061089d61186b565b6040516108aa9190612dbe565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190612f53565b611871565b6040516108e79190612dbe565b60405180910390f35b3480156108fc57600080fd5b506109056118f8565b6040516109129190612dbe565b60405180910390f35b34801561092757600080fd5b506109306118fe565b60405161093d9190612dbe565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190612d08565b611904565b005b34801561097b57600080fd5b506109846119fc565b6040516109919190612dbe565b60405180910390f35b3480156109a657600080fd5b506109af611a02565b6040516109bc9190612dbe565b60405180910390f35b6109cd611a08565b73ffffffffffffffffffffffffffffffffffffffff166109eb6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890612fdf565b60405180910390fd5b8160108190555080601181905550601154601054610a5f919061302e565b600f819055505050565b606060038054610a78906130b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa4906130b3565b8015610af15780601f10610ac657610100808354040283529160200191610af1565b820191906000526020600020905b815481529060010190602001808311610ad457829003601f168201915b5050505050905090565b6000610b0f610b08611a08565b8484611a10565b6001905092915050565b60136020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b610b6f611a08565b73ffffffffffffffffffffffffffffffffffffffff16610b8d6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90612fdf565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cab611a08565b73ffffffffffffffffffffffffffffffffffffffff16610cc96112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690612fdf565b60405180910390fd5b670de0b6b3a76400006103e86001610d35610b5d565b610d3f91906130e5565b610d49919061316e565b610d53919061316e565b811015610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90613211565b60405180910390fd5b670de0b6b3a764000081610da991906130e5565b60088190555050565b6000610dbf848484611bdb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e0a611a08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906132a3565b60405180910390fd5b610e9e85610e96611a08565b858403611a10565b60019150509392505050565b61dead81565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b60009054906101000a900460ff1681565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f4e611a08565b73ffffffffffffffffffffffffffffffffffffffff16610f6c6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990612fdf565b60405180910390fd5b81600d8190555080600e81905550600e54600d54610fe0919061302e565b600c819055505050565b600f5481565b600b60029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611053611a08565b73ffffffffffffffffffffffffffffffffffffffff166110716112fe565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90612fdf565b60405180910390fd5b6110d1600061253d565b565b60006110dd611a08565b73ffffffffffffffffffffffffffffffffffffffff166110fb6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890612fdf565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055506001905090565b61117b611a08565b73ffffffffffffffffffffffffffffffffffffffff166111996112fe565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690612fdf565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611252611a08565b73ffffffffffffffffffffffffffffffffffffffff166112706112fe565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90612fdf565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611356611a08565b73ffffffffffffffffffffffffffffffffffffffff166113746112fe565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190612fdf565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b6060600480546113f6906130b3565b80601f0160208091040260200160405190810160405280929190818152602001828054611422906130b3565b801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b5050505050905090565b600d5481565b60105481565b6000611499611492611a08565b8484611bdb565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900460ff1681565b6114e4611a08565b73ffffffffffffffffffffffffffffffffffffffff166115026112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90612fdf565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516115f59190612ced565b60405180910390a25050565b611609611a08565b73ffffffffffffffffffffffffffffffffffffffff166116276112fe565b73ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612fdf565b60405180910390fd5b670de0b6b3a76400006103e86005611693610b5d565b61169d91906130e5565b6116a7919061316e565b6116b1919061316e565b8110156116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613335565b60405180910390fd5b670de0b6b3a76400008161170791906130e5565b600a8190555050565b60085481565b6000611720611a08565b73ffffffffffffffffffffffffffffffffffffffff1661173e6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90612fdf565b60405180910390fd5b620186a060016117a2610b5d565b6117ac91906130e5565b6117b6919061316e565b8210156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906133c7565b60405180910390fd5b6103e86005611805610b5d565b61180f91906130e5565b611819919061316e565b82111561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290613459565b60405180910390fd5b8160098190555060019050919050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600e5481565b61190c611a08565b73ffffffffffffffffffffffffffffffffffffffff1661192a6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790612fdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e7906134eb565b60405180910390fd5b6119f98161253d565b50565b60115481565b600a5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a779061357d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061360f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611bce9190612dbe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c42906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613733565b60405180910390fd5b6000811415611cd557611cd083836000612603565b612538565b600b60009054906101000a900460ff16156120df57611cf26112fe565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d605750611d306112fe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611d995750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611dd3575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611dec5750600660149054906101000a900460ff16155b156120de57600b60019054906101000a900460ff16611ee657601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611ea65750601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc9061379f565b60405180910390fd5b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f8b5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561203257600854811115611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613831565b60405180910390fd5b600a54611fe183611003565b82611fec919061302e565b111561202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061389d565b60405180910390fd5b6120dd565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120dc57600a5461208f83611003565b8261209a919061302e565b11156120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d29061389d565b60405180910390fd5b5b5b5b5b60006120ea30611003565b90506000600954821015905080801561210f5750600b60029054906101000a900460ff165b80156121285750600660149054906101000a900460ff16155b801561217f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156121d55750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561222b5750601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561226f576001600660146101000a81548160ff021916908315150217905550612253612884565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123255750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561232f57600090505b60008060008315612526577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614801561239757506000600f54115b15612405576123c460646123b6600f548a6128d590919063ffffffff16565b6128eb90919063ffffffff16565b9250600f54601154846123d791906130e5565b6123e1919061316e565b9150600f54601054846123f491906130e5565b6123fe919061316e565b90506124cd565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614801561246257506000600c54115b156124cc5761248f6064612481600c548a6128d590919063ffffffff16565b6128eb90919063ffffffff16565b9250600c54600e54846124a291906130e5565b6124ac919061316e565b9150600c54600d54846124bf91906130e5565b6124c9919061316e565b90505b5b60008311156124e2576124e1893085612603565b5b600082111561251757612516307f000000000000000000000000000000000000000000000000000000000000000084612603565b5b828761252391906138bd565b96505b612531898989612603565b5050505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90613733565b60405180910390fd5b6126ee838383612901565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90613963565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612807919061302e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161286b9190612dbe565b60405180910390a361287e848484612906565b50505050565b600061288f30611003565b905060008114156128a057506128d3565b60146009546128af91906130e5565b8111156128c85760146009546128c591906130e5565b90505b6128d18161290b565b505b565b600081836128e391906130e5565b905092915050565b600081836128f9919061316e565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561292857612927613983565b5b6040519080825280602002602001820160405280156129565781602001602082028036833780820191505090505b509050308160008151811061296e5761296d6139b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106129df576129de6139b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a44307f000000000000000000000000000000000000000000000000000000000000000084611a10565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d79583600084600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612ac8959493929190613ada565b600060405180830381600087803b158015612ae257600080fd5b505af1158015612af6573d6000803e3d6000fd5b505050505050565b600080fd5b6000819050919050565b612b1681612b03565b8114612b2157600080fd5b50565b600081359050612b3381612b0d565b92915050565b60008060408385031215612b5057612b4f612afe565b5b6000612b5e85828601612b24565b9250506020612b6f85828601612b24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bb3578082015181840152602081019050612b98565b83811115612bc2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612be482612b79565b612bee8185612b84565b9350612bfe818560208601612b95565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c5f82612c34565b9050919050565b612c6f81612c54565b8114612c7a57600080fd5b50565b600081359050612c8c81612c66565b92915050565b60008060408385031215612ca957612ca8612afe565b5b6000612cb785828601612c7d565b9250506020612cc885828601612b24565b9150509250929050565b60008115159050919050565b612ce781612cd2565b82525050565b6000602082019050612d026000830184612cde565b92915050565b600060208284031215612d1e57612d1d612afe565b5b6000612d2c84828501612c7d565b91505092915050565b6000819050919050565b6000612d5a612d55612d5084612c34565b612d35565b612c34565b9050919050565b6000612d6c82612d3f565b9050919050565b6000612d7e82612d61565b9050919050565b612d8e81612d73565b82525050565b6000602082019050612da96000830184612d85565b92915050565b612db881612b03565b82525050565b6000602082019050612dd36000830184612daf565b92915050565b600060208284031215612def57612dee612afe565b5b6000612dfd84828501612b24565b91505092915050565b600080600060608486031215612e1f57612e1e612afe565b5b6000612e2d86828701612c7d565b9350506020612e3e86828701612c7d565b9250506040612e4f86828701612b24565b9150509250925092565b612e6281612c54565b82525050565b6000602082019050612e7d6000830184612e59565b92915050565b600060ff82169050919050565b612e9981612e83565b82525050565b6000602082019050612eb46000830184612e90565b92915050565b612ec381612cd2565b8114612ece57600080fd5b50565b600081359050612ee081612eba565b92915050565b60008060408385031215612efd57612efc612afe565b5b6000612f0b85828601612c7d565b9250506020612f1c85828601612ed1565b9150509250929050565b600060208284031215612f3c57612f3b612afe565b5b6000612f4a84828501612ed1565b91505092915050565b60008060408385031215612f6a57612f69612afe565b5b6000612f7885828601612c7d565b9250506020612f8985828601612c7d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fc9602083612b84565b9150612fd482612f93565b602082019050919050565b60006020820190508181036000830152612ff881612fbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061303982612b03565b915061304483612b03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561307957613078612fff565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130cb57607f821691505b602082108114156130df576130de613084565b5b50919050565b60006130f082612b03565b91506130fb83612b03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561313457613133612fff565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061317982612b03565b915061318483612b03565b9250826131945761319361313f565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b60006131fb602f83612b84565b91506132068261319f565b604082019050919050565b6000602082019050818103600083015261322a816131ee565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061328d602883612b84565b915061329882613231565b604082019050919050565b600060208201905081810360008301526132bc81613280565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b600061331f602483612b84565b915061332a826132c3565b604082019050919050565b6000602082019050818103600083015261334e81613312565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006133b1603583612b84565b91506133bc82613355565b604082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613443603483612b84565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134d5602683612b84565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613567602483612b84565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006135f9602283612b84565b91506136048261359d565b604082019050919050565b60006020820190508181036000830152613628816135ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061368b602583612b84565b91506136968261362f565b604082019050919050565b600060208201905081810360008301526136ba8161367e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061371d602383612b84565b9150613728826136c1565b604082019050919050565b6000602082019050818103600083015261374c81613710565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613789601683612b84565b915061379482613753565b602082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061381b603583612b84565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613887601383612b84565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138c882612b03565b91506138d383612b03565b9250828210156138e6576138e5612fff565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061394d602683612b84565b9150613958826138f1565b604082019050919050565b6000602082019050818103600083015261397c81613940565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000613a06613a016139fc846139e1565b612d35565b612b03565b9050919050565b613a16816139eb565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a5181612c54565b82525050565b6000613a638383613a48565b60208301905092915050565b6000602082019050919050565b6000613a8782613a1c565b613a918185613a27565b9350613a9c83613a38565b8060005b83811015613acd578151613ab48882613a57565b9750613abf83613a6f565b925050600181019050613aa0565b5085935050505092915050565b600060a082019050613aef6000830188612daf565b613afc6020830187613a0d565b8181036040830152613b0e8186613a7c565b9050613b1d6060830185612e59565b613b2a6080830184612daf565b969550505050505056fea2646970667358221220ffc639df9ed55280c0bde599010494185bc079504752b2999299251bdac33bbd64736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80638a8c523c11610139578063c0246668116100b6578063dd62ed3e1161007a578063dd62ed3e146108b3578063e2f45605146108f0578063f11a24d31461091b578063f2fde38b14610946578063f63743421461096f578063f8b45b051461099a5761025c565b8063c0246668146107ce578063c18bc195146107f7578063c8c8ebe414610820578063d257b34f1461084b578063d85ba063146108885761025c565b80639c3b4fdc116100fd5780639c3b4fdc146106e5578063a0d82dc514610710578063a9059cbb1461073b578063b73e794614610778578063bbc0c742146107a35761025c565b80638a8c523c146106245780638da5cb5b1461063b5780638ea5220f14610666578063924de9b71461069157806395d89b41146106ba5761025c565b8063313ce567116101d25780636a486a8e116101965780636a486a8e146105265780636ddd17131461055157806370a082311461057c578063715018a6146105b9578063751039fc146105d05780637571336a146105fb5761025c565b8063313ce5671461043f57806349bd5a5e1461046a5780634a62bb65146104955780634fbee193146104c057806366ca9b83146104fd5761025c565b806318160ddd1161021957806318160ddd1461035a5780631816467f14610385578063203e727e146103ae57806323b872dd146103d757806327c8f835146104145761025c565b806302dbd8f81461026157806306fdde031461028a578063095ea7b3146102b557806310d5de53146102f25780631694505e1461032f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612b39565b6109c5565b005b34801561029657600080fd5b5061029f610a69565b6040516102ac9190612c12565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612c92565b610afb565b6040516102e99190612ced565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190612d08565b610b19565b6040516103269190612ced565b60405180910390f35b34801561033b57600080fd5b50610344610b39565b6040516103519190612d94565b60405180910390f35b34801561036657600080fd5b5061036f610b5d565b60405161037c9190612dbe565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d08565b610b67565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612dd9565b610ca3565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612e06565b610db2565b60405161040b9190612ced565b60405180910390f35b34801561042057600080fd5b50610429610eaa565b6040516104369190612e68565b60405180910390f35b34801561044b57600080fd5b50610454610eb0565b6040516104619190612e9f565b60405180910390f35b34801561047657600080fd5b5061047f610eb9565b60405161048c9190612e68565b60405180910390f35b3480156104a157600080fd5b506104aa610edd565b6040516104b79190612ced565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612d08565b610ef0565b6040516104f49190612ced565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f9190612b39565b610f46565b005b34801561053257600080fd5b5061053b610fea565b6040516105489190612dbe565b60405180910390f35b34801561055d57600080fd5b50610566610ff0565b6040516105739190612ced565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190612d08565b611003565b6040516105b09190612dbe565b60405180910390f35b3480156105c557600080fd5b506105ce61104b565b005b3480156105dc57600080fd5b506105e56110d3565b6040516105f29190612ced565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612ee6565b611173565b005b34801561063057600080fd5b5061063961124a565b005b34801561064757600080fd5b506106506112fe565b60405161065d9190612e68565b60405180910390f35b34801561067257600080fd5b5061067b611328565b6040516106889190612e68565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190612f26565b61134e565b005b3480156106c657600080fd5b506106cf6113e7565b6040516106dc9190612c12565b60405180910390f35b3480156106f157600080fd5b506106fa611479565b6040516107079190612dbe565b60405180910390f35b34801561071c57600080fd5b5061072561147f565b6040516107329190612dbe565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190612c92565b611485565b60405161076f9190612ced565b60405180910390f35b34801561078457600080fd5b5061078d6114a3565b60405161079a9190612e68565b60405180910390f35b3480156107af57600080fd5b506107b86114c9565b6040516107c59190612ced565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190612ee6565b6114dc565b005b34801561080357600080fd5b5061081e60048036038101906108199190612dd9565b611601565b005b34801561082c57600080fd5b50610835611710565b6040516108429190612dbe565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190612dd9565b611716565b60405161087f9190612ced565b60405180910390f35b34801561089457600080fd5b5061089d61186b565b6040516108aa9190612dbe565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190612f53565b611871565b6040516108e79190612dbe565b60405180910390f35b3480156108fc57600080fd5b506109056118f8565b6040516109129190612dbe565b60405180910390f35b34801561092757600080fd5b506109306118fe565b60405161093d9190612dbe565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190612d08565b611904565b005b34801561097b57600080fd5b506109846119fc565b6040516109919190612dbe565b60405180910390f35b3480156109a657600080fd5b506109af611a02565b6040516109bc9190612dbe565b60405180910390f35b6109cd611a08565b73ffffffffffffffffffffffffffffffffffffffff166109eb6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890612fdf565b60405180910390fd5b8160108190555080601181905550601154601054610a5f919061302e565b600f819055505050565b606060038054610a78906130b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa4906130b3565b8015610af15780601f10610ac657610100808354040283529160200191610af1565b820191906000526020600020905b815481529060010190602001808311610ad457829003601f168201915b5050505050905090565b6000610b0f610b08611a08565b8484611a10565b6001905092915050565b60136020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b610b6f611a08565b73ffffffffffffffffffffffffffffffffffffffff16610b8d6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90612fdf565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cab611a08565b73ffffffffffffffffffffffffffffffffffffffff16610cc96112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690612fdf565b60405180910390fd5b670de0b6b3a76400006103e86001610d35610b5d565b610d3f91906130e5565b610d49919061316e565b610d53919061316e565b811015610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90613211565b60405180910390fd5b670de0b6b3a764000081610da991906130e5565b60088190555050565b6000610dbf848484611bdb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e0a611a08565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906132a3565b60405180910390fd5b610e9e85610e96611a08565b858403611a10565b60019150509392505050565b61dead81565b60006012905090565b7f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e681565b600b60009054906101000a900460ff1681565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f4e611a08565b73ffffffffffffffffffffffffffffffffffffffff16610f6c6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990612fdf565b60405180910390fd5b81600d8190555080600e81905550600e54600d54610fe0919061302e565b600c819055505050565b600f5481565b600b60029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611053611a08565b73ffffffffffffffffffffffffffffffffffffffff166110716112fe565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90612fdf565b60405180910390fd5b6110d1600061253d565b565b60006110dd611a08565b73ffffffffffffffffffffffffffffffffffffffff166110fb6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890612fdf565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055506001905090565b61117b611a08565b73ffffffffffffffffffffffffffffffffffffffff166111996112fe565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690612fdf565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611252611a08565b73ffffffffffffffffffffffffffffffffffffffff166112706112fe565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90612fdf565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611356611a08565b73ffffffffffffffffffffffffffffffffffffffff166113746112fe565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190612fdf565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b6060600480546113f6906130b3565b80601f0160208091040260200160405190810160405280929190818152602001828054611422906130b3565b801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b5050505050905090565b600d5481565b60105481565b6000611499611492611a08565b8484611bdb565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900460ff1681565b6114e4611a08565b73ffffffffffffffffffffffffffffffffffffffff166115026112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90612fdf565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516115f59190612ced565b60405180910390a25050565b611609611a08565b73ffffffffffffffffffffffffffffffffffffffff166116276112fe565b73ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612fdf565b60405180910390fd5b670de0b6b3a76400006103e86005611693610b5d565b61169d91906130e5565b6116a7919061316e565b6116b1919061316e565b8110156116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613335565b60405180910390fd5b670de0b6b3a76400008161170791906130e5565b600a8190555050565b60085481565b6000611720611a08565b73ffffffffffffffffffffffffffffffffffffffff1661173e6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90612fdf565b60405180910390fd5b620186a060016117a2610b5d565b6117ac91906130e5565b6117b6919061316e565b8210156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906133c7565b60405180910390fd5b6103e86005611805610b5d565b61180f91906130e5565b611819919061316e565b82111561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290613459565b60405180910390fd5b8160098190555060019050919050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600e5481565b61190c611a08565b73ffffffffffffffffffffffffffffffffffffffff1661192a6112fe565b73ffffffffffffffffffffffffffffffffffffffff1614611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790612fdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e7906134eb565b60405180910390fd5b6119f98161253d565b50565b60115481565b600a5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a779061357d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061360f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611bce9190612dbe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c42906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613733565b60405180910390fd5b6000811415611cd557611cd083836000612603565b612538565b600b60009054906101000a900460ff16156120df57611cf26112fe565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d605750611d306112fe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611d995750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611dd3575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611dec5750600660149054906101000a900460ff16155b156120de57600b60019054906101000a900460ff16611ee657601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611ea65750601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc9061379f565b60405180910390fd5b5b7f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f8b5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561203257600854811115611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc90613831565b60405180910390fd5b600a54611fe183611003565b82611fec919061302e565b111561202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061389d565b60405180910390fd5b6120dd565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120dc57600a5461208f83611003565b8261209a919061302e565b11156120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d29061389d565b60405180910390fd5b5b5b5b5b60006120ea30611003565b90506000600954821015905080801561210f5750600b60029054906101000a900460ff165b80156121285750600660149054906101000a900460ff16155b801561217f57507f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156121d55750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561222b5750601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561226f576001600660146101000a81548160ff021916908315150217905550612253612884565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123255750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561232f57600090505b60008060008315612526577f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614801561239757506000600f54115b15612405576123c460646123b6600f548a6128d590919063ffffffff16565b6128eb90919063ffffffff16565b9250600f54601154846123d791906130e5565b6123e1919061316e565b9150600f54601054846123f491906130e5565b6123fe919061316e565b90506124cd565b7f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614801561246257506000600c54115b156124cc5761248f6064612481600c548a6128d590919063ffffffff16565b6128eb90919063ffffffff16565b9250600c54600e54846124a291906130e5565b6124ac919061316e565b9150600c54600d54846124bf91906130e5565b6124c9919061316e565b90505b5b60008311156124e2576124e1893085612603565b5b600082111561251757612516307f000000000000000000000000c0376b0cbc8e92bcc21e6b9a2f1a2351e714c6e684612603565b5b828761252391906138bd565b96505b612531898989612603565b5050505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da90613733565b60405180910390fd5b6126ee838383612901565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b90613963565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612807919061302e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161286b9190612dbe565b60405180910390a361287e848484612906565b50505050565b600061288f30611003565b905060008114156128a057506128d3565b60146009546128af91906130e5565b8111156128c85760146009546128c591906130e5565b90505b6128d18161290b565b505b565b600081836128e391906130e5565b905092915050565b600081836128f9919061316e565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561292857612927613983565b5b6040519080825280602002602001820160405280156129565781602001602082028036833780820191505090505b509050308160008151811061296e5761296d6139b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106129df576129de6139b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a44307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611a10565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff16635c11d79583600084600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612ac8959493929190613ada565b600060405180830381600087803b158015612ae257600080fd5b505af1158015612af6573d6000803e3d6000fd5b505050505050565b600080fd5b6000819050919050565b612b1681612b03565b8114612b2157600080fd5b50565b600081359050612b3381612b0d565b92915050565b60008060408385031215612b5057612b4f612afe565b5b6000612b5e85828601612b24565b9250506020612b6f85828601612b24565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bb3578082015181840152602081019050612b98565b83811115612bc2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612be482612b79565b612bee8185612b84565b9350612bfe818560208601612b95565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c5f82612c34565b9050919050565b612c6f81612c54565b8114612c7a57600080fd5b50565b600081359050612c8c81612c66565b92915050565b60008060408385031215612ca957612ca8612afe565b5b6000612cb785828601612c7d565b9250506020612cc885828601612b24565b9150509250929050565b60008115159050919050565b612ce781612cd2565b82525050565b6000602082019050612d026000830184612cde565b92915050565b600060208284031215612d1e57612d1d612afe565b5b6000612d2c84828501612c7d565b91505092915050565b6000819050919050565b6000612d5a612d55612d5084612c34565b612d35565b612c34565b9050919050565b6000612d6c82612d3f565b9050919050565b6000612d7e82612d61565b9050919050565b612d8e81612d73565b82525050565b6000602082019050612da96000830184612d85565b92915050565b612db881612b03565b82525050565b6000602082019050612dd36000830184612daf565b92915050565b600060208284031215612def57612dee612afe565b5b6000612dfd84828501612b24565b91505092915050565b600080600060608486031215612e1f57612e1e612afe565b5b6000612e2d86828701612c7d565b9350506020612e3e86828701612c7d565b9250506040612e4f86828701612b24565b9150509250925092565b612e6281612c54565b82525050565b6000602082019050612e7d6000830184612e59565b92915050565b600060ff82169050919050565b612e9981612e83565b82525050565b6000602082019050612eb46000830184612e90565b92915050565b612ec381612cd2565b8114612ece57600080fd5b50565b600081359050612ee081612eba565b92915050565b60008060408385031215612efd57612efc612afe565b5b6000612f0b85828601612c7d565b9250506020612f1c85828601612ed1565b9150509250929050565b600060208284031215612f3c57612f3b612afe565b5b6000612f4a84828501612ed1565b91505092915050565b60008060408385031215612f6a57612f69612afe565b5b6000612f7885828601612c7d565b9250506020612f8985828601612c7d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fc9602083612b84565b9150612fd482612f93565b602082019050919050565b60006020820190508181036000830152612ff881612fbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061303982612b03565b915061304483612b03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561307957613078612fff565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130cb57607f821691505b602082108114156130df576130de613084565b5b50919050565b60006130f082612b03565b91506130fb83612b03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561313457613133612fff565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061317982612b03565b915061318483612b03565b9250826131945761319361313f565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b60006131fb602f83612b84565b91506132068261319f565b604082019050919050565b6000602082019050818103600083015261322a816131ee565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061328d602883612b84565b915061329882613231565b604082019050919050565b600060208201905081810360008301526132bc81613280565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b600061331f602483612b84565b915061332a826132c3565b604082019050919050565b6000602082019050818103600083015261334e81613312565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006133b1603583612b84565b91506133bc82613355565b604082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613443603483612b84565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134d5602683612b84565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613567602483612b84565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006135f9602283612b84565b91506136048261359d565b604082019050919050565b60006020820190508181036000830152613628816135ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061368b602583612b84565b91506136968261362f565b604082019050919050565b600060208201905081810360008301526136ba8161367e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061371d602383612b84565b9150613728826136c1565b604082019050919050565b6000602082019050818103600083015261374c81613710565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613789601683612b84565b915061379482613753565b602082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061381b603583612b84565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613887601383612b84565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138c882612b03565b91506138d383612b03565b9250828210156138e6576138e5612fff565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061394d602683612b84565b9150613958826138f1565b604082019050919050565b6000602082019050818103600083015261397c81613940565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000613a06613a016139fc846139e1565b612d35565b612b03565b9050919050565b613a16816139eb565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a5181612c54565b82525050565b6000613a638383613a48565b60208301905092915050565b6000602082019050919050565b6000613a8782613a1c565b613a918185613a27565b9350613a9c83613a38565b8060005b83811015613acd578151613ab48882613a57565b9750613abf83613a6f565b925050600181019050613aa0565b5085935050505092915050565b600060a082019050613aef6000830188612daf565b613afc6020830187613a0d565b8181036040830152613b0e8186613a7c565b9050613b1d6060830185612e59565b613b2a6080830184612daf565b969550505050505056fea2646970667358221220ffc639df9ed55280c0bde599010494185bc079504752b2999299251bdac33bbd64736f6c634300080c0033

Deployed Bytecode Sourcemap

23512:10591:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28710:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8368:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10535:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24479:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23594:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9488:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29154:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27544:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11186:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23697:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9330:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23652:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24009:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29353:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28462:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24232:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24089:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9659:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1603:103;;;;;;;;;;;;;:::i;:::-;;26848:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28091:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26684:112;;;;;;;;;;;;;:::i;:::-;;952:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23861:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28354:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8587:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24162:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24267:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9999:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23757:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24049:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28964:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27827:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23894:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27039:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24128:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10237:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23936:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24193:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1861:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24299:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23976:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28710:246;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28842:7:::1;28829:10;:20;;;;28879:13;28860:16;:32;;;;28932:16;;28919:10;;:29;;;;:::i;:::-;28903:13;:45;;;;28710:246:::0;;:::o;8368:100::-;8422:13;8455:5;8448:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8368:100;:::o;10535:169::-;10618:4;10635:39;10644:12;:10;:12::i;:::-;10658:7;10667:6;10635:8;:39::i;:::-;10692:4;10685:11;;10535:169;;;;:::o;24479:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;23594:51::-;;;:::o;9488:108::-;9549:7;9576:12;;9569:19;;9488:108;:::o;29154:189::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29290:9:::1;;;;;;;;;;;29259:41;;29276:12;29259:41;;;;;;;;;;;;29323:12;29311:9;;:24;;;;;;;;;;;;;;;;;;29154:189:::0;:::o;27544:275::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27681:4:::1;27673;27668:1;27652:13;:11;:13::i;:::-;:17;;;;:::i;:::-;27651:26;;;;:::i;:::-;27650:35;;;;:::i;:::-;27640:6;:45;;27618:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;27804:6;27794;:17;;;;:::i;:::-;27771:20;:40;;;;27544:275:::0;:::o;11186:492::-;11326:4;11343:36;11353:6;11361:9;11372:6;11343:9;:36::i;:::-;11392:24;11419:11;:19;11431:6;11419:19;;;;;;;;;;;;;;;:33;11439:12;:10;:12::i;:::-;11419:33;;;;;;;;;;;;;;;;11392:60;;11491:6;11471:16;:26;;11463:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;11578:57;11587:6;11595:12;:10;:12::i;:::-;11628:6;11609:16;:25;11578:8;:57::i;:::-;11666:4;11659:11;;;11186:492;;;;;:::o;23697:53::-;23743:6;23697:53;:::o;9330:93::-;9388:5;9413:2;9406:9;;9330:93;:::o;23652:38::-;;;:::o;24009:33::-;;;;;;;;;;;;;:::o;29353:126::-;29419:4;29443:19;:28;29463:7;29443:28;;;;;;;;;;;;;;;;;;;;;;;;;29436:35;;29353:126;;;:::o;28462:240::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28592:7:::1;28580:9;:19;;;;28628:13;28610:15;:31;;;;28679:15;;28667:9;;:27;;;;:::i;:::-;28652:12;:42;;;;28462:240:::0;;:::o;24232:28::-;;;;:::o;24089:30::-;;;;;;;;;;;;;:::o;9659:127::-;9733:7;9760:9;:18;9770:7;9760:18;;;;;;;;;;;;;;;;9753:25;;9659:127;;;:::o;1603:103::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1668:30:::1;1695:1;1668:18;:30::i;:::-;1603:103::o:0;26848:121::-;26900:4;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26934:5:::1;26917:14;;:22;;;;;;;;;;;;;;;;;;26957:4;26950:11;;26848:121:::0;:::o;28091:167::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28246:4:::1;28204:31;:39;28236:6;28204:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;28091:167:::0;;:::o;26684:112::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26755:4:::1;26739:13;;:20;;;;;;;;;;;;;;;;;;26784:4;26770:11;;:18;;;;;;;;;;;;;;;;;;26684:112::o:0;952:87::-;998:7;1025:6;;;;;;;;;;;1018:13;;952:87;:::o;23861:24::-;;;;;;;;;;;;;:::o;28354:100::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28439:7:::1;28425:11;;:21;;;;;;;;;;;;;;;;;;28354:100:::0;:::o;8587:104::-;8643:13;8676:7;8669:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8587:104;:::o;24162:24::-;;;;:::o;24267:25::-;;;;:::o;9999:175::-;10085:4;10102:42;10112:12;:10;:12::i;:::-;10126:9;10137:6;10102:9;:42::i;:::-;10162:4;10155:11;;9999:175;;;;:::o;23757:65::-;;;;;;;;;;;;;:::o;24049:33::-;;;;;;;;;;;;;:::o;28964:182::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29080:8:::1;29049:19;:28;29069:7;29049:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;29120:7;29104:34;;;29129:8;29104:34;;;;;;:::i;:::-;;;;;;;;28964:182:::0;;:::o;27827:256::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27967:4:::1;27959;27954:1;27938:13;:11;:13::i;:::-;:17;;;;:::i;:::-;27937:26;;;;:::i;:::-;27936:35;;;;:::i;:::-;27926:6;:45;;27904:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;28068:6;28058;:17;;;;:::i;:::-;28046:9;:29;;;;27827:256:::0;:::o;23894:35::-;;;;:::o;27039:497::-;27147:4;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27226:6:::1;27221:1;27205:13;:11;:13::i;:::-;:17;;;;:::i;:::-;27204:28;;;;:::i;:::-;27191:9;:41;;27169:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;27381:4;27376:1;27360:13;:11;:13::i;:::-;:17;;;;:::i;:::-;27359:26;;;;:::i;:::-;27346:9;:39;;27324:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;27497:9;27476:18;:30;;;;27524:4;27517:11;;27039:497:::0;;;:::o;24128:27::-;;;;:::o;10237:151::-;10326:7;10353:11;:18;10365:5;10353:18;;;;;;;;;;;;;;;:27;10372:7;10353:27;;;;;;;;;;;;;;;;10346:34;;10237:151;;;;:::o;23936:33::-;;;;:::o;24193:30::-;;;;:::o;1861:201::-;1183:12;:10;:12::i;:::-;1172:23;;:7;:5;:7::i;:::-;:23;;;1164:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1970:1:::1;1950:22;;:8;:22;;;;1942:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:28;2045:8;2026:18;:28::i;:::-;1861:201:::0;:::o;24299:31::-;;;;:::o;23976:24::-;;;;:::o;324:98::-;377:7;404:10;397:17;;324:98;:::o;14027:380::-;14180:1;14163:19;;:5;:19;;;;14155:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14261:1;14242:21;;:7;:21;;;;14234:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14345:6;14315:11;:18;14327:5;14315:18;;;;;;;;;;;;;;;:27;14334:7;14315:27;;;;;;;;;;;;;;;:36;;;;14383:7;14367:32;;14376:5;14367:32;;;14392:6;14367:32;;;;;;:::i;:::-;;;;;;;;14027:380;;;:::o;29487:3679::-;29635:1;29619:18;;:4;:18;;;;29611:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29712:1;29698:16;;:2;:16;;;;29690:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;29781:1;29771:6;:11;29767:93;;;29799:28;29815:4;29821:2;29825:1;29799:15;:28::i;:::-;29842:7;;29767:93;29876:14;;;;;;;;;;;29872:1430;;;29937:7;:5;:7::i;:::-;29929:15;;:4;:15;;;;:49;;;;;29971:7;:5;:7::i;:::-;29965:13;;:2;:13;;;;29929:49;:86;;;;;30013:1;29999:16;;:2;:16;;;;29929:86;:128;;;;;30050:6;30036:21;;:2;:21;;;;29929:128;:158;;;;;30079:8;;;;;;;;;;;30078:9;29929:158;29907:1384;;;30127:13;;;;;;;;;;;30122:223;;30199:19;:25;30219:4;30199:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;30228:19;:23;30248:2;30228:23;;;;;;;;;;;;;;;;;;;;;;;;;30199:52;30165:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;30122:223;30559:13;30551:21;;:4;:21;;;:82;;;;;30598:31;:35;30630:2;30598:35;;;;;;;;;;;;;;;;;;;;;;;;;30597:36;30551:82;30525:751;;;30720:20;;30710:6;:30;;30676:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30928:9;;30911:13;30921:2;30911:9;:13::i;:::-;30902:6;:22;;;;:::i;:::-;:35;;30868:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30525:751;;;31056:31;:35;31088:2;31056:35;;;;;;;;;;;;;;;;;;;;;;;;;31051:225;;31176:9;;31159:13;31169:2;31159:9;:13::i;:::-;31150:6;:22;;;;:::i;:::-;:35;;31116:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;31051:225;30525:751;29907:1384;29872:1430;31314:28;31345:24;31363:4;31345:9;:24::i;:::-;31314:55;;31382:12;31421:18;;31397:20;:42;;31382:57;;31470:7;:35;;;;;31494:11;;;;;;;;;;;31470:35;:61;;;;;31523:8;;;;;;;;;;;31522:9;31470:61;:97;;;;;31554:13;31548:19;;:2;:19;;;31470:97;:140;;;;;31585:19;:25;31605:4;31585:25;;;;;;;;;;;;;;;;;;;;;;;;;31584:26;31470:140;:181;;;;;31628:19;:23;31648:2;31628:23;;;;;;;;;;;;;;;;;;;;;;;;;31627:24;31470:181;31452:313;;;31689:4;31678:8;;:15;;;;;;;;;;;;;;;;;;31710:10;:8;:10::i;:::-;31748:5;31737:8;;:16;;;;;;;;;;;;;;;;;;31452:313;31777:12;31793:8;;;;;;;;;;;31792:9;31777:24;;31903:19;:25;31923:4;31903:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;31932:19;:23;31952:2;31932:23;;;;;;;;;;;;;;;;;;;;;;;;;31903:52;31899:100;;;31982:5;31972:15;;31899:100;32011:12;32038:26;32079:20;32192:7;32188:925;;;32250:13;32244:19;;:2;:19;;;:40;;;;;32283:1;32267:13;;:17;32244:40;32240:583;;;32312:34;32342:3;32312:25;32323:13;;32312:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;32305:41;;32414:13;;32394:16;;32387:4;:23;;;;:::i;:::-;32386:41;;;;:::i;:::-;32365:62;;32483:13;;32469:10;;32462:4;:17;;;;:::i;:::-;32461:35;;;;:::i;:::-;32446:50;;32240:583;;;32566:13;32558:21;;:4;:21;;;:41;;;;;32598:1;32583:12;;:16;32558:41;32554:269;;;32627:33;32656:3;32627:24;32638:12;;32627:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;32620:40;;32727:12;;32708:15;;32701:4;:22;;;;:::i;:::-;32700:39;;;;:::i;:::-;32679:60;;32795:12;;32782:9;;32775:4;:16;;;;:::i;:::-;32774:33;;;;:::i;:::-;32759:48;;32554:269;32240:583;32849:1;32843:4;:7;32839:90;;;32871:42;32887:4;32901;32908;32871:15;:42::i;:::-;32839:90;32968:1;32947:18;:22;32943:128;;;32990:65;33014:4;33021:13;33036:18;32990:15;:65::i;:::-;32943:128;33097:4;33087:14;;;;;:::i;:::-;;;32188:925;33125:33;33141:4;33147:2;33151:6;33125:15;:33::i;:::-;29600:3566;;;;;;29487:3679;;;;:::o;2222:191::-;2296:16;2315:6;;;;;;;;;;;2296:25;;2341:8;2332:6;;:17;;;;;;;;;;;;;;;;;;2396:8;2365:40;;2386:8;2365:40;;;;;;;;;;;;2285:128;2222:191;:::o;12168:733::-;12326:1;12308:20;;:6;:20;;;;12300:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12410:1;12389:23;;:9;:23;;;;12381:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12465:47;12486:6;12494:9;12505:6;12465:20;:47::i;:::-;12525:21;12549:9;:17;12559:6;12549:17;;;;;;;;;;;;;;;;12525:41;;12602:6;12585:13;:23;;12577:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12723:6;12707:13;:22;12687:9;:17;12697:6;12687:17;;;;;;;;;;;;;;;:42;;;;12775:6;12751:9;:20;12761:9;12751:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12816:9;12799:35;;12808:6;12799:35;;;12827:6;12799:35;;;;;;:::i;:::-;;;;;;;;12847:46;12867:6;12875:9;12886:6;12847:19;:46::i;:::-;12289:612;12168:733;;;:::o;33757:341::-;33796:23;33822:24;33840:4;33822:9;:24::i;:::-;33796:50;;33880:1;33861:15;:20;33857:59;;;33898:7;;;33857:59;33971:2;33950:18;;:23;;;;:::i;:::-;33932:15;:41;33928:115;;;34029:2;34008:18;;:23;;;;:::i;:::-;33990:41;;33928:115;34055:35;34074:15;34055:18;:35::i;:::-;33785:313;33757:341;:::o;19480:98::-;19538:7;19569:1;19565;:5;;;;:::i;:::-;19558:12;;19480:98;;;;:::o;19879:::-;19937:7;19968:1;19964;:5;;;;:::i;:::-;19957:12;;19879:98;;;;:::o;15007:125::-;;;;:::o;15736:124::-;;;;:::o;33174:575::-;33302:21;33340:1;33326:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33302:40;;33371:4;33353;33358:1;33353:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;33397:5;;;;;;;;;;;33387:4;33392:1;33387:7;;;;;;;;:::i;:::-;;;;;;;:15;;;;;;;;;;;33415:62;33432:4;33447:15;33465:11;33415:8;:62::i;:::-;33516:15;:69;;;33600:11;33626:1;33672:4;33691:9;;;;;;;;;;;33715:15;33516:225;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33231:518;33174:575;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:99::-;1222:6;1256:5;1250:12;1240:22;;1170:99;;;:::o;1275:169::-;1359:11;1393:6;1388:3;1381:19;1433:4;1428:3;1424:14;1409:29;;1275:169;;;;:::o;1450:307::-;1518:1;1528:113;1542:6;1539:1;1536:13;1528:113;;;1627:1;1622:3;1618:11;1612:18;1608:1;1603:3;1599:11;1592:39;1564:2;1561:1;1557:10;1552:15;;1528:113;;;1659:6;1656:1;1653:13;1650:101;;;1739:1;1730:6;1725:3;1721:16;1714:27;1650:101;1499:258;1450:307;;;:::o;1763:102::-;1804:6;1855:2;1851:7;1846:2;1839:5;1835:14;1831:28;1821:38;;1763:102;;;:::o;1871:364::-;1959:3;1987:39;2020:5;1987:39;:::i;:::-;2042:71;2106:6;2101:3;2042:71;:::i;:::-;2035:78;;2122:52;2167:6;2162:3;2155:4;2148:5;2144:16;2122:52;:::i;:::-;2199:29;2221:6;2199:29;:::i;:::-;2194:3;2190:39;2183:46;;1963:272;1871:364;;;;:::o;2241:313::-;2354:4;2392:2;2381:9;2377:18;2369:26;;2441:9;2435:4;2431:20;2427:1;2416:9;2412:17;2405:47;2469:78;2542:4;2533:6;2469:78;:::i;:::-;2461:86;;2241:313;;;;:::o;2560:126::-;2597:7;2637:42;2630:5;2626:54;2615:65;;2560:126;;;:::o;2692:96::-;2729:7;2758:24;2776:5;2758:24;:::i;:::-;2747:35;;2692:96;;;:::o;2794:122::-;2867:24;2885:5;2867:24;:::i;:::-;2860:5;2857:35;2847:63;;2906:1;2903;2896:12;2847:63;2794:122;:::o;2922:139::-;2968:5;3006:6;2993:20;2984:29;;3022:33;3049:5;3022:33;:::i;:::-;2922:139;;;;:::o;3067:474::-;3135:6;3143;3192:2;3180:9;3171:7;3167:23;3163:32;3160:119;;;3198:79;;:::i;:::-;3160:119;3318:1;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3289:117;3445:2;3471:53;3516:7;3507:6;3496:9;3492:22;3471:53;:::i;:::-;3461:63;;3416:118;3067:474;;;;;:::o;3547:90::-;3581:7;3624:5;3617:13;3610:21;3599:32;;3547:90;;;:::o;3643:109::-;3724:21;3739:5;3724:21;:::i;:::-;3719:3;3712:34;3643:109;;:::o;3758:210::-;3845:4;3883:2;3872:9;3868:18;3860:26;;3896:65;3958:1;3947:9;3943:17;3934:6;3896:65;:::i;:::-;3758:210;;;;:::o;3974:329::-;4033:6;4082:2;4070:9;4061:7;4057:23;4053:32;4050:119;;;4088:79;;:::i;:::-;4050:119;4208:1;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4179:117;3974:329;;;;:::o;4309:60::-;4337:3;4358:5;4351:12;;4309:60;;;:::o;4375:142::-;4425:9;4458:53;4476:34;4485:24;4503:5;4485:24;:::i;:::-;4476:34;:::i;:::-;4458:53;:::i;:::-;4445:66;;4375:142;;;:::o;4523:126::-;4573:9;4606:37;4637:5;4606:37;:::i;:::-;4593:50;;4523:126;;;:::o;4655:152::-;4731:9;4764:37;4795:5;4764:37;:::i;:::-;4751:50;;4655:152;;;:::o;4813:183::-;4926:63;4983:5;4926:63;:::i;:::-;4921:3;4914:76;4813:183;;:::o;5002:274::-;5121:4;5159:2;5148:9;5144:18;5136:26;;5172:97;5266:1;5255:9;5251:17;5242:6;5172:97;:::i;:::-;5002:274;;;;:::o;5282:118::-;5369:24;5387:5;5369:24;:::i;:::-;5364:3;5357:37;5282:118;;:::o;5406:222::-;5499:4;5537:2;5526:9;5522:18;5514:26;;5550:71;5618:1;5607:9;5603:17;5594:6;5550:71;:::i;:::-;5406:222;;;;:::o;5634:329::-;5693:6;5742:2;5730:9;5721:7;5717:23;5713:32;5710:119;;;5748:79;;:::i;:::-;5710:119;5868:1;5893:53;5938:7;5929:6;5918:9;5914:22;5893:53;:::i;:::-;5883:63;;5839:117;5634:329;;;;:::o;5969:619::-;6046:6;6054;6062;6111:2;6099:9;6090:7;6086:23;6082:32;6079:119;;;6117:79;;:::i;:::-;6079:119;6237:1;6262:53;6307:7;6298:6;6287:9;6283:22;6262:53;:::i;:::-;6252:63;;6208:117;6364:2;6390:53;6435:7;6426:6;6415:9;6411:22;6390:53;:::i;:::-;6380:63;;6335:118;6492:2;6518:53;6563:7;6554:6;6543:9;6539:22;6518:53;:::i;:::-;6508:63;;6463:118;5969:619;;;;;:::o;6594:118::-;6681:24;6699:5;6681:24;:::i;:::-;6676:3;6669:37;6594:118;;:::o;6718:222::-;6811:4;6849:2;6838:9;6834:18;6826:26;;6862:71;6930:1;6919:9;6915:17;6906:6;6862:71;:::i;:::-;6718:222;;;;:::o;6946:86::-;6981:7;7021:4;7014:5;7010:16;6999:27;;6946:86;;;:::o;7038:112::-;7121:22;7137:5;7121:22;:::i;:::-;7116:3;7109:35;7038:112;;:::o;7156:214::-;7245:4;7283:2;7272:9;7268:18;7260:26;;7296:67;7360:1;7349:9;7345:17;7336:6;7296:67;:::i;:::-;7156:214;;;;:::o;7376:116::-;7446:21;7461:5;7446:21;:::i;:::-;7439:5;7436:32;7426:60;;7482:1;7479;7472:12;7426:60;7376:116;:::o;7498:133::-;7541:5;7579:6;7566:20;7557:29;;7595:30;7619:5;7595:30;:::i;:::-;7498:133;;;;:::o;7637:468::-;7702:6;7710;7759:2;7747:9;7738:7;7734:23;7730:32;7727:119;;;7765:79;;:::i;:::-;7727:119;7885:1;7910:53;7955:7;7946:6;7935:9;7931:22;7910:53;:::i;:::-;7900:63;;7856:117;8012:2;8038:50;8080:7;8071:6;8060:9;8056:22;8038:50;:::i;:::-;8028:60;;7983:115;7637:468;;;;;:::o;8111:323::-;8167:6;8216:2;8204:9;8195:7;8191:23;8187:32;8184:119;;;8222:79;;:::i;:::-;8184:119;8342:1;8367:50;8409:7;8400:6;8389:9;8385:22;8367:50;:::i;:::-;8357:60;;8313:114;8111:323;;;;:::o;8440:474::-;8508:6;8516;8565:2;8553:9;8544:7;8540:23;8536:32;8533:119;;;8571:79;;:::i;:::-;8533:119;8691:1;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8706:63;;8662:117;8818:2;8844:53;8889:7;8880:6;8869:9;8865:22;8844:53;:::i;:::-;8834:63;;8789:118;8440:474;;;;;:::o;8920:182::-;9060:34;9056:1;9048:6;9044:14;9037:58;8920:182;:::o;9108:366::-;9250:3;9271:67;9335:2;9330:3;9271:67;:::i;:::-;9264:74;;9347:93;9436:3;9347:93;:::i;:::-;9465:2;9460:3;9456:12;9449:19;;9108:366;;;:::o;9480:419::-;9646:4;9684:2;9673:9;9669:18;9661:26;;9733:9;9727:4;9723:20;9719:1;9708:9;9704:17;9697:47;9761:131;9887:4;9761:131;:::i;:::-;9753:139;;9480:419;;;:::o;9905:180::-;9953:77;9950:1;9943:88;10050:4;10047:1;10040:15;10074:4;10071:1;10064:15;10091:305;10131:3;10150:20;10168:1;10150:20;:::i;:::-;10145:25;;10184:20;10202:1;10184:20;:::i;:::-;10179:25;;10338:1;10270:66;10266:74;10263:1;10260:81;10257:107;;;10344:18;;:::i;:::-;10257:107;10388:1;10385;10381:9;10374:16;;10091:305;;;;:::o;10402:180::-;10450:77;10447:1;10440:88;10547:4;10544:1;10537:15;10571:4;10568:1;10561:15;10588:320;10632:6;10669:1;10663:4;10659:12;10649:22;;10716:1;10710:4;10706:12;10737:18;10727:81;;10793:4;10785:6;10781:17;10771:27;;10727:81;10855:2;10847:6;10844:14;10824:18;10821:38;10818:84;;;10874:18;;:::i;:::-;10818:84;10639:269;10588:320;;;:::o;10914:348::-;10954:7;10977:20;10995:1;10977:20;:::i;:::-;10972:25;;11011:20;11029:1;11011:20;:::i;:::-;11006:25;;11199:1;11131:66;11127:74;11124:1;11121:81;11116:1;11109:9;11102:17;11098:105;11095:131;;;11206:18;;:::i;:::-;11095:131;11254:1;11251;11247:9;11236:20;;10914:348;;;;:::o;11268:180::-;11316:77;11313:1;11306:88;11413:4;11410:1;11403:15;11437:4;11434:1;11427:15;11454:185;11494:1;11511:20;11529:1;11511:20;:::i;:::-;11506:25;;11545:20;11563:1;11545:20;:::i;:::-;11540:25;;11584:1;11574:35;;11589:18;;:::i;:::-;11574:35;11631:1;11628;11624:9;11619:14;;11454:185;;;;:::o;11645:234::-;11785:34;11781:1;11773:6;11769:14;11762:58;11854:17;11849:2;11841:6;11837:15;11830:42;11645:234;:::o;11885:366::-;12027:3;12048:67;12112:2;12107:3;12048:67;:::i;:::-;12041:74;;12124:93;12213:3;12124:93;:::i;:::-;12242:2;12237:3;12233:12;12226:19;;11885:366;;;:::o;12257:419::-;12423:4;12461:2;12450:9;12446:18;12438:26;;12510:9;12504:4;12500:20;12496:1;12485:9;12481:17;12474:47;12538:131;12664:4;12538:131;:::i;:::-;12530:139;;12257:419;;;:::o;12682:227::-;12822:34;12818:1;12810:6;12806:14;12799:58;12891:10;12886:2;12878:6;12874:15;12867:35;12682:227;:::o;12915:366::-;13057:3;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13154:93;13243:3;13154:93;:::i;:::-;13272:2;13267:3;13263:12;13256:19;;12915:366;;;:::o;13287:419::-;13453:4;13491:2;13480:9;13476:18;13468:26;;13540:9;13534:4;13530:20;13526:1;13515:9;13511:17;13504:47;13568:131;13694:4;13568:131;:::i;:::-;13560:139;;13287:419;;;:::o;13712:223::-;13852:34;13848:1;13840:6;13836:14;13829:58;13921:6;13916:2;13908:6;13904:15;13897:31;13712:223;:::o;13941:366::-;14083:3;14104:67;14168:2;14163:3;14104:67;:::i;:::-;14097:74;;14180:93;14269:3;14180:93;:::i;:::-;14298:2;14293:3;14289:12;14282:19;;13941:366;;;:::o;14313:419::-;14479:4;14517:2;14506:9;14502:18;14494:26;;14566:9;14560:4;14556:20;14552:1;14541:9;14537:17;14530:47;14594:131;14720:4;14594:131;:::i;:::-;14586:139;;14313:419;;;:::o;14738:240::-;14878:34;14874:1;14866:6;14862:14;14855:58;14947:23;14942:2;14934:6;14930:15;14923:48;14738:240;:::o;14984:366::-;15126:3;15147:67;15211:2;15206:3;15147:67;:::i;:::-;15140:74;;15223:93;15312:3;15223:93;:::i;:::-;15341:2;15336:3;15332:12;15325:19;;14984:366;;;:::o;15356:419::-;15522:4;15560:2;15549:9;15545:18;15537:26;;15609:9;15603:4;15599:20;15595:1;15584:9;15580:17;15573:47;15637:131;15763:4;15637:131;:::i;:::-;15629:139;;15356:419;;;:::o;15781:239::-;15921:34;15917:1;15909:6;15905:14;15898:58;15990:22;15985:2;15977:6;15973:15;15966:47;15781:239;:::o;16026:366::-;16168:3;16189:67;16253:2;16248:3;16189:67;:::i;:::-;16182:74;;16265:93;16354:3;16265:93;:::i;:::-;16383:2;16378:3;16374:12;16367:19;;16026:366;;;:::o;16398:419::-;16564:4;16602:2;16591:9;16587:18;16579:26;;16651:9;16645:4;16641:20;16637:1;16626:9;16622:17;16615:47;16679:131;16805:4;16679:131;:::i;:::-;16671:139;;16398:419;;;:::o;16823:225::-;16963:34;16959:1;16951:6;16947:14;16940:58;17032:8;17027:2;17019:6;17015:15;17008:33;16823:225;:::o;17054:366::-;17196:3;17217:67;17281:2;17276:3;17217:67;:::i;:::-;17210:74;;17293:93;17382:3;17293:93;:::i;:::-;17411:2;17406:3;17402:12;17395:19;;17054:366;;;:::o;17426:419::-;17592:4;17630:2;17619:9;17615:18;17607:26;;17679:9;17673:4;17669:20;17665:1;17654:9;17650:17;17643:47;17707:131;17833:4;17707:131;:::i;:::-;17699:139;;17426:419;;;:::o;17851:223::-;17991:34;17987:1;17979:6;17975:14;17968:58;18060:6;18055:2;18047:6;18043:15;18036:31;17851:223;:::o;18080:366::-;18222:3;18243:67;18307:2;18302:3;18243:67;:::i;:::-;18236:74;;18319:93;18408:3;18319:93;:::i;:::-;18437:2;18432:3;18428:12;18421:19;;18080:366;;;:::o;18452:419::-;18618:4;18656:2;18645:9;18641:18;18633:26;;18705:9;18699:4;18695:20;18691:1;18680:9;18676:17;18669:47;18733:131;18859:4;18733:131;:::i;:::-;18725:139;;18452:419;;;:::o;18877:221::-;19017:34;19013:1;19005:6;19001:14;18994:58;19086:4;19081:2;19073:6;19069:15;19062:29;18877:221;:::o;19104:366::-;19246:3;19267:67;19331:2;19326:3;19267:67;:::i;:::-;19260:74;;19343:93;19432:3;19343:93;:::i;:::-;19461:2;19456:3;19452:12;19445:19;;19104:366;;;:::o;19476:419::-;19642:4;19680:2;19669:9;19665:18;19657:26;;19729:9;19723:4;19719:20;19715:1;19704:9;19700:17;19693:47;19757:131;19883:4;19757:131;:::i;:::-;19749:139;;19476:419;;;:::o;19901:224::-;20041:34;20037:1;20029:6;20025:14;20018:58;20110:7;20105:2;20097:6;20093:15;20086:32;19901:224;:::o;20131:366::-;20273:3;20294:67;20358:2;20353:3;20294:67;:::i;:::-;20287:74;;20370:93;20459:3;20370:93;:::i;:::-;20488:2;20483:3;20479:12;20472:19;;20131:366;;;:::o;20503:419::-;20669:4;20707:2;20696:9;20692:18;20684:26;;20756:9;20750:4;20746:20;20742:1;20731:9;20727:17;20720:47;20784:131;20910:4;20784:131;:::i;:::-;20776:139;;20503:419;;;:::o;20928:222::-;21068:34;21064:1;21056:6;21052:14;21045:58;21137:5;21132:2;21124:6;21120:15;21113:30;20928:222;:::o;21156:366::-;21298:3;21319:67;21383:2;21378:3;21319:67;:::i;:::-;21312:74;;21395:93;21484:3;21395:93;:::i;:::-;21513:2;21508:3;21504:12;21497:19;;21156:366;;;:::o;21528:419::-;21694:4;21732:2;21721:9;21717:18;21709:26;;21781:9;21775:4;21771:20;21767:1;21756:9;21752:17;21745:47;21809:131;21935:4;21809:131;:::i;:::-;21801:139;;21528:419;;;:::o;21953:172::-;22093:24;22089:1;22081:6;22077:14;22070:48;21953:172;:::o;22131:366::-;22273:3;22294:67;22358:2;22353:3;22294:67;:::i;:::-;22287:74;;22370:93;22459:3;22370:93;:::i;:::-;22488:2;22483:3;22479:12;22472:19;;22131:366;;;:::o;22503:419::-;22669:4;22707:2;22696:9;22692:18;22684:26;;22756:9;22750:4;22746:20;22742:1;22731:9;22727:17;22720:47;22784:131;22910:4;22784:131;:::i;:::-;22776:139;;22503:419;;;:::o;22928:240::-;23068:34;23064:1;23056:6;23052:14;23045:58;23137:23;23132:2;23124:6;23120:15;23113:48;22928:240;:::o;23174:366::-;23316:3;23337:67;23401:2;23396:3;23337:67;:::i;:::-;23330:74;;23413:93;23502:3;23413:93;:::i;:::-;23531:2;23526:3;23522:12;23515:19;;23174:366;;;:::o;23546:419::-;23712:4;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23546:419;;;:::o;23971:169::-;24111:21;24107:1;24099:6;24095:14;24088:45;23971:169;:::o;24146:366::-;24288:3;24309:67;24373:2;24368:3;24309:67;:::i;:::-;24302:74;;24385:93;24474:3;24385:93;:::i;:::-;24503:2;24498:3;24494:12;24487:19;;24146:366;;;:::o;24518:419::-;24684:4;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24518:419;;;:::o;24943:191::-;24983:4;25003:20;25021:1;25003:20;:::i;:::-;24998:25;;25037:20;25055:1;25037:20;:::i;:::-;25032:25;;25076:1;25073;25070:8;25067:34;;;25081:18;;:::i;:::-;25067:34;25126:1;25123;25119:9;25111:17;;24943:191;;;;:::o;25140:225::-;25280:34;25276:1;25268:6;25264:14;25257:58;25349:8;25344:2;25336:6;25332:15;25325:33;25140:225;:::o;25371:366::-;25513:3;25534:67;25598:2;25593:3;25534:67;:::i;:::-;25527:74;;25610:93;25699:3;25610:93;:::i;:::-;25728:2;25723:3;25719:12;25712:19;;25371:366;;;:::o;25743:419::-;25909:4;25947:2;25936:9;25932:18;25924:26;;25996:9;25990:4;25986:20;25982:1;25971:9;25967:17;25960:47;26024:131;26150:4;26024:131;:::i;:::-;26016:139;;25743:419;;;:::o;26168:180::-;26216:77;26213:1;26206:88;26313:4;26310:1;26303:15;26337:4;26334:1;26327:15;26354:180;26402:77;26399:1;26392:88;26499:4;26496:1;26489:15;26523:4;26520:1;26513:15;26540:85;26585:7;26614:5;26603:16;;26540:85;;;:::o;26631:158::-;26689:9;26722:61;26740:42;26749:32;26775:5;26749:32;:::i;:::-;26740:42;:::i;:::-;26722:61;:::i;:::-;26709:74;;26631:158;;;:::o;26795:147::-;26890:45;26929:5;26890:45;:::i;:::-;26885:3;26878:58;26795:147;;:::o;26948:114::-;27015:6;27049:5;27043:12;27033:22;;26948:114;;;:::o;27068:184::-;27167:11;27201:6;27196:3;27189:19;27241:4;27236:3;27232:14;27217:29;;27068:184;;;;:::o;27258:132::-;27325:4;27348:3;27340:11;;27378:4;27373:3;27369:14;27361:22;;27258:132;;;:::o;27396:108::-;27473:24;27491:5;27473:24;:::i;:::-;27468:3;27461:37;27396:108;;:::o;27510:179::-;27579:10;27600:46;27642:3;27634:6;27600:46;:::i;:::-;27678:4;27673:3;27669:14;27655:28;;27510:179;;;;:::o;27695:113::-;27765:4;27797;27792:3;27788:14;27780:22;;27695:113;;;:::o;27844:732::-;27963:3;27992:54;28040:5;27992:54;:::i;:::-;28062:86;28141:6;28136:3;28062:86;:::i;:::-;28055:93;;28172:56;28222:5;28172:56;:::i;:::-;28251:7;28282:1;28267:284;28292:6;28289:1;28286:13;28267:284;;;28368:6;28362:13;28395:63;28454:3;28439:13;28395:63;:::i;:::-;28388:70;;28481:60;28534:6;28481:60;:::i;:::-;28471:70;;28327:224;28314:1;28311;28307:9;28302:14;;28267:284;;;28271:14;28567:3;28560:10;;27968:608;;;27844:732;;;;:::o;28582:831::-;28845:4;28883:3;28872:9;28868:19;28860:27;;28897:71;28965:1;28954:9;28950:17;28941:6;28897:71;:::i;:::-;28978:80;29054:2;29043:9;29039:18;29030:6;28978:80;:::i;:::-;29105:9;29099:4;29095:20;29090:2;29079:9;29075:18;29068:48;29133:108;29236:4;29227:6;29133:108;:::i;:::-;29125:116;;29251:72;29319:2;29308:9;29304:18;29295:6;29251:72;:::i;:::-;29333:73;29401:3;29390:9;29386:19;29377:6;29333:73;:::i;:::-;28582:831;;;;;;;;:::o

Swarm Source

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