ETH Price: $3,487.50 (+2.14%)
Gas: 2 Gwei

Token

Arctic ai (ARCTIC)
 

Overview

Max Total Supply

100,000,000 ARCTIC

Holders

245

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
98,393.926513360962774064 ARCTIC

Value
$0.00
0xb51feb12da1fdac134dc4befe00a533416ebb9c3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Arctic

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-22
*/

// SPDX-License-Identifier: MIT

/**

Arctic protocol is a groundbreaking lending solution powered by AI, 
facilitating Dex Liquidity lending and NFT backed loans.

* Website -   https://arcticai.pro/
* Twitter/x - https://twitter.com/arctic_protocol
* Telegram -  https://t.me/arcticai
*/

 pragma solidity ^0.8.18;

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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 feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

contract Arctic is ERC20, Ownable {

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    bool private swapping;

    address public immutable revShareWallet;

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

    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => bool) blacklisted;

    uint256 public buyTotalFees;
    uint256 public buyRevShareFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellRevShareFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForRevShare;
    uint256 public tokensForLiquidity;

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

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

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

    constructor() ERC20("Arctic ai", "ARCTIC") { // name, symbol
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //Uniswap V2 Router
        );

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

        // Creates the Uniswap Pair
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyRevShareFee = 5; // kept at 5% after launch
        uint256 _buyLiquidityFee = 0; // not used

        uint256 _sellRevShareFee = 5; // Lowered to 5% after launch
        uint256 _sellLiquidityFee = 0; // not used

        uint256 totalSupply = 100_000_000 * 1e18; // 100 million

        maxTransactionAmount = 2_000_000 * 1e18; // 2%ish
        maxWallet = 2_000_000 * 1e18; // 2% 
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% 

        buyRevShareFee = _buyRevShareFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTotalFees = buyRevShareFee + buyLiquidityFee;

        sellRevShareFee = _sellRevShareFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTotalFees = sellRevShareFee + sellLiquidityFee;

        revShareWallet = address(0x3Ee4bE6769dBB8a642CA37f5FABBa128EB111496); // Set as revShare wallet - Helper Contract
    
        // Exclude from paying fees or having max transaction amount if; is owner, is deployer, is dead address. 
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(revShareWallet, 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 {}

    // Will enable trading, once this is toggeled, it will not be able to be turned off.
    function enableTrading() public onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    // Trigger this post launch once price is more stable. Made to avoid whales and snipers hogging supply.
    // remove, redundant
    // function updateLimitsAndFees() public onlyOwner {
    //     maxTransactionAmount = 2_000_000 * (10**18); // 2%
    //     maxWallet = 2_000_000 * (10**18); // 2%
    
    //     buyRevShareFee = 5; // 2%
    //     buyLiquidityFee = 0; // 0%
    //     buyTotalFees = 5;

    //     sellRevShareFee = 5; // 2%
    //     sellLiquidityFee = 0; // 0%
    //     sellTotalFees = 5;
    // }

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

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

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

    function isBlacklisted(address account) public view returns (bool) {
        return blacklisted[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");
        require(!blacklisted[from],"Sender blacklisted");
        require(!blacklisted[to],"Receiver blacklisted");

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

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

                // Buying
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                // Selling
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } 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 &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        // Only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // Sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForRevShare += (fees * sellRevShareFee) / sellTotalFees;
            }
            // Buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForRevShare += (fees * buyRevShareFee) / buyTotalFees;
            }

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

            amount -= fees;
        }

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

    function swapTokensForEth(uint256 tokenAmount) private {
        // Generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // Make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // Accept any amount of ETH; ignore slippage
            path,
            address(this),
            block.timestamp
        );
    }

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

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForRevShare;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        //prevent swaping more than 1% of supply at ago 
        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForRevShare = (ethBalance * tokensForRevShare) / (totalTokensToSwap - (tokensForLiquidity / 2));
        
        uint256 ethForLiquidity = ethBalance - ethForRevShare;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        tokensForLiquidity = 0;
        tokensForRevShare = 0;

        //transfer to revshare wallet after swapping..
        (success, ) = address(revShareWallet).call{value: address(this).balance}("");
    }
        

    // @Helper - Callable by contract in-case tokens get's stuck in the token contract.
    function withdrawStuckToken(address _token) public {

        address _to = revShareWallet;

        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(_to, _contractBalance);
    }

    // @Helper - Callable by contract in-case ETH get's stuck in the token contract.
    function withdrawStuckEth() public {
        address toAddr = revShareWallet;
        (bool success, ) = toAddr.call{
            value: address(this).balance
        } ("");
        require(success);
    }

}

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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRevShareFee","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revShareWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRevShareFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRevShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040526000600860006101000a81548160ff0219169083151502179055506000600860016101000a81548160ff0219169083151502179055503480156200004857600080fd5b506040518060400160405280600981526020017f41726374696320616900000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f41524354494300000000000000000000000000000000000000000000000000008152508160039081620000c6919062000c98565b508060049081620000d8919062000c98565b505050620000fb620000ef620004df60201b60201c565b620004e760201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905062000127816001620005ad60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001cd919062000de9565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025b919062000de9565b6040518363ffffffff1660e01b81526004016200027a92919062000e2c565b6020604051808303816000875af11580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c0919062000de9565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200030860a0516001620005ad60201b60201c565b6200031d60a05160016200069760201b60201c565b600060059050600080600590506000806a52b7d2dcc80cd2e400000090506a01a784379d99db420000006006819055506a01a784379d99db4200000060078190555061271060058262000371919062000e88565b6200037d919062000f02565b60e0818152505084600b8190555083600c81905550600c54600b54620003a4919062000f3a565b600a8190555082600e8190555081600f81905550600f54600e54620003ca919062000f3a565b600d81905550733ee4be6769dbb8a642ca37f5fabba128eb11149673ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250506200043a6200042c6200073860201b60201c565b60016200076260201b60201c565b6200044d3060016200076260201b60201c565b6200046261dead60016200076260201b60201c565b6200047760c05160016200076260201b60201c565b620004996200048b6200073860201b60201c565b6001620005ad60201b60201c565b620004ac306001620005ad60201b60201c565b620004c161dead6001620005ad60201b60201c565b620004d333826200089c60201b60201c565b505050505050620010d2565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005bd620004df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005e36200073860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200063c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006339062000fd6565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000772620004df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007986200073860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620007f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007e89062000fd6565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000890919062001015565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200090e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009059062001082565b60405180910390fd5b620009226000838362000a1460201b60201c565b806002600082825462000936919062000f3a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200098d919062000f3a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620009f49190620010b5565b60405180910390a362000a106000838362000a1960201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000aa057607f821691505b60208210810362000ab65762000ab562000a58565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ae1565b62000b2c868362000ae1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b7962000b7362000b6d8462000b44565b62000b4e565b62000b44565b9050919050565b6000819050919050565b62000b958362000b58565b62000bad62000ba48262000b80565b84845462000aee565b825550505050565b600090565b62000bc462000bb5565b62000bd181848462000b8a565b505050565b5b8181101562000bf95762000bed60008262000bba565b60018101905062000bd7565b5050565b601f82111562000c485762000c128162000abc565b62000c1d8462000ad1565b8101602085101562000c2d578190505b62000c4562000c3c8562000ad1565b83018262000bd6565b50505b505050565b600082821c905092915050565b600062000c6d6000198460080262000c4d565b1980831691505092915050565b600062000c88838362000c5a565b9150826002028217905092915050565b62000ca38262000a1e565b67ffffffffffffffff81111562000cbf5762000cbe62000a29565b5b62000ccb825462000a87565b62000cd882828562000bfd565b600060209050601f83116001811462000d10576000841562000cfb578287015190505b62000d07858262000c7a565b86555062000d77565b601f19841662000d208662000abc565b60005b8281101562000d4a5784890151825560018201915060208501945060208101905062000d23565b8683101562000d6a578489015162000d66601f89168262000c5a565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000db18262000d84565b9050919050565b62000dc38162000da4565b811462000dcf57600080fd5b50565b60008151905062000de38162000db8565b92915050565b60006020828403121562000e025762000e0162000d7f565b5b600062000e128482850162000dd2565b91505092915050565b62000e268162000da4565b82525050565b600060408201905062000e43600083018562000e1b565b62000e52602083018462000e1b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e958262000b44565b915062000ea28362000b44565b925082820262000eb28162000b44565b9150828204841483151762000ecc5762000ecb62000e59565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000f0f8262000b44565b915062000f1c8362000b44565b92508262000f2f5762000f2e62000ed3565b5b828204905092915050565b600062000f478262000b44565b915062000f548362000b44565b925082820190508082111562000f6f5762000f6e62000e59565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000fbe60208362000f75565b915062000fcb8262000f86565b602082019050919050565b6000602082019050818103600083015262000ff18162000faf565b9050919050565b60008115159050919050565b6200100f8162000ff8565b82525050565b60006020820190506200102c600083018462001004565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200106a601f8362000f75565b9150620010778262001032565b602082019050919050565b600060208201905081810360008301526200109d816200105b565b9050919050565b620010af8162000b44565b82525050565b6000602082019050620010cc6000830184620010a4565b92915050565b60805160a05160c05160e0516140ca6200116060003960008181611657015281816120b0015281816129400152612974015260008181610987015281816110180152818161103e0152612aac015260008181610dde01526112c7015260008181610bf101528181612beb01528181612ccc01528181612cf301528181612d8f0152612db601526140ca6000f3fe60806040526004361061023f5760003560e01c8063782c4e991161012e578063c0246668116100ab578063f11a24d31161006f578063f11a24d31461089c578063f2fde38b146108c7578063f6374342146108f0578063f8b45b051461091b578063fe575a871461094657610246565b8063c0246668146107b5578063c8c8ebe4146107de578063d85ba06314610809578063dd62ed3e14610834578063e2f456051461087157610246565b80639a7a23d6116100f25780639a7a23d6146106aa578063a457c2d7146106d3578063a9059cbb14610710578063b62496f51461074d578063bbc0c7421461078a57610246565b8063782c4e99146105fb5780637fa787ba146106265780638a8c523c1461063d5780638da5cb5b1461065457806395d89b411461067f57610246565b806324b9f3c1116101bc5780636a486a8e116101805780636a486a8e146105285780636ddd17131461055357806370a082311461057e578063715018a6146105bb5780637571336a146105d257610246565b806324b9f3c11461042d578063313ce56714610458578063395093511461048357806349bd5a5e146104c05780634fbee193146104eb57610246565b80631694505e116102035780631694505e1461034457806318160ddd1461036f57806319eab0421461039a5780631a8145bb146103c557806323b872dd146103f057610246565b8063068acf6c1461024b57806306fdde0314610274578063095ea7b31461029f57806310d5de53146102dc578063156c2f351461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612ecd565b610983565b005b34801561028057600080fd5b50610289610b19565b6040516102969190612f8a565b60405180910390f35b3480156102ab57600080fd5b506102c660048036038101906102c19190612fe2565b610bab565b6040516102d3919061303d565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612ecd565b610bc9565b604051610310919061303d565b60405180910390f35b34801561032557600080fd5b5061032e610be9565b60405161033b9190613067565b60405180910390f35b34801561035057600080fd5b50610359610bef565b60405161036691906130e1565b60405180910390f35b34801561037b57600080fd5b50610384610c13565b6040516103919190613067565b60405180910390f35b3480156103a657600080fd5b506103af610c1d565b6040516103bc9190613067565b60405180910390f35b3480156103d157600080fd5b506103da610c23565b6040516103e79190613067565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130fc565b610c29565b604051610424919061303d565b60405180910390f35b34801561043957600080fd5b50610442610d21565b60405161044f9190613067565b60405180910390f35b34801561046457600080fd5b5061046d610d27565b60405161047a919061316b565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612fe2565b610d30565b6040516104b7919061303d565b60405180910390f35b3480156104cc57600080fd5b506104d5610ddc565b6040516104e29190613195565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612ecd565b610e00565b60405161051f919061303d565b60405180910390f35b34801561053457600080fd5b5061053d610e56565b60405161054a9190613067565b60405180910390f35b34801561055f57600080fd5b50610568610e5c565b604051610575919061303d565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612ecd565b610e6f565b6040516105b29190613067565b60405180910390f35b3480156105c757600080fd5b506105d0610eb7565b005b3480156105de57600080fd5b506105f960048036038101906105f491906131dc565b610f3f565b005b34801561060757600080fd5b50610610611016565b60405161061d9190613195565b60405180910390f35b34801561063257600080fd5b5061063b61103a565b005b34801561064957600080fd5b506106526110d9565b005b34801561066057600080fd5b5061066961118d565b6040516106769190613195565b60405180910390f35b34801561068b57600080fd5b506106946111b7565b6040516106a19190612f8a565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc91906131dc565b611249565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190612fe2565b611361565b604051610707919061303d565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190612fe2565b61144c565b604051610744919061303d565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190612ecd565b61146a565b604051610781919061303d565b60405180910390f35b34801561079657600080fd5b5061079f61148a565b6040516107ac919061303d565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906131dc565b61149d565b005b3480156107ea57600080fd5b506107f36115c2565b6040516108009190613067565b60405180910390f35b34801561081557600080fd5b5061081e6115c8565b60405161082b9190613067565b60405180910390f35b34801561084057600080fd5b5061085b6004803603810190610856919061321c565b6115ce565b6040516108689190613067565b60405180910390f35b34801561087d57600080fd5b50610886611655565b6040516108939190613067565b60405180910390f35b3480156108a857600080fd5b506108b1611679565b6040516108be9190613067565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190612ecd565b61167f565b005b3480156108fc57600080fd5b50610905611776565b6040516109129190613067565b60405180910390f35b34801561092757600080fd5b5061093061177c565b60405161093d9190613067565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190612ecd565b611782565b60405161097a919061303d565b60405180910390f35b60007f00000000000000000000000000000000000000000000000000000000000000009050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e906132a8565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a529190613195565b602060405180830381865afa158015610a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9391906132dd565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610ad092919061330a565b6020604051808303816000875af1158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b139190613348565b50505050565b606060038054610b28906133a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906133a4565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000610bbf610bb86117d8565b84846117e0565b6001905092915050565b60136020528060005260406000206000915054906101000a900460ff1681565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b600e5481565b60115481565b6000610c368484846119a9565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c816117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613447565b60405180910390fd5b610d1585610d0d6117d8565b8584036117e0565b60019150509392505050565b60105481565b60006012905090565b6000610dd2610d3d6117d8565b848460016000610d4b6117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dcd9190613496565b6117e0565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b600860019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebf6117d8565b73ffffffffffffffffffffffffffffffffffffffff16610edd61118d565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613516565b60405180910390fd5b610f3d6000612518565b565b610f476117d8565b73ffffffffffffffffffffffffffffffffffffffff16610f6561118d565b73ffffffffffffffffffffffffffffffffffffffff1614610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290613516565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f0000000000000000000000000000000000000000000000000000000000000000905060008173ffffffffffffffffffffffffffffffffffffffff164760405161108590613567565b60006040518083038185875af1925050503d80600081146110c2576040519150601f19603f3d011682016040523d82523d6000602084013e6110c7565b606091505b50509050806110d557600080fd5b5050565b6110e16117d8565b73ffffffffffffffffffffffffffffffffffffffff166110ff61118d565b73ffffffffffffffffffffffffffffffffffffffff1614611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90613516565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506001600860016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111c6906133a4565b80601f01602080910402602001604051908101604052809291908181526020018280546111f2906133a4565b801561123f5780601f106112145761010080835404028352916020019161123f565b820191906000526020600020905b81548152906001019060200180831161122257829003601f168201915b5050505050905090565b6112516117d8565b73ffffffffffffffffffffffffffffffffffffffff1661126f61118d565b73ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90613516565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a906135ee565b60405180910390fd5b61135d82826125de565b5050565b600080600160006113706117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613680565b60405180910390fd5b6114416114386117d8565b858584036117e0565b600191505092915050565b60006114606114596117d8565b84846119a9565b6001905092915050565b60146020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900460ff1681565b6114a56117d8565b73ffffffffffffffffffffffffffffffffffffffff166114c361118d565b73ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090613516565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516115b6919061303d565b60405180910390a25050565b60065481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b6116876117d8565b73ffffffffffffffffffffffffffffffffffffffff166116a561118d565b73ffffffffffffffffffffffffffffffffffffffff16146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613516565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176190613712565b60405180910390fd5b61177381612518565b50565b600f5481565b60075481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611846906137a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613836565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161199c9190613067565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e9061395a565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906139c6565b60405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613a32565b60405180910390fd5b60008103611bba57611bb58383600061267f565b612513565b611bc261118d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c305750611c0061118d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c695750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611ca3575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cbc5750600560149054906101000a900460ff16155b1561209f57600860009054906101000a900460ff16611db657601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d765750601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90613a9e565b60405180910390fd5b5b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611e595750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f0057600654811115611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613b30565b60405180910390fd5b600754611eaf83610e6f565b82611eba9190613496565b1115611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290613b9c565b60405180910390fd5b61209e565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611fa35750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611ff257600654811115611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613c2e565b60405180910390fd5b61209d565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661209c5760075461204f83610e6f565b8261205a9190613496565b111561209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290613b9c565b60405180910390fd5b5b5b5b5b60006120aa30610e6f565b905060007f000000000000000000000000000000000000000000000000000000000000000082101590508080156120ed5750600860019054906101000a900460ff165b80156121065750600560149054906101000a900460ff16155b801561215c5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121b25750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122085750601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561224c576001600560146101000a81548160ff0219169083151502179055506122306128fe565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123025750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561230c57600090505b6000811561250357601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561236f57506000600d54115b156123fb576064600d54866123849190613c4e565b61238e9190613cbf565b9050600d54600f54826123a19190613c4e565b6123ab9190613cbf565b601160008282546123bc9190613496565b92505081905550600d54600e54826123d49190613c4e565b6123de9190613cbf565b601060008282546123ef9190613496565b925050819055506124df565b601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561245657506000600a54115b156124de576064600a548661246b9190613c4e565b6124759190613cbf565b9050600a54600c54826124889190613c4e565b6124929190613cbf565b601160008282546124a39190613496565b92505081905550600a54600b54826124bb9190613c4e565b6124c59190613cbf565b601060008282546124d69190613496565b925050819055505b5b60008111156124f4576124f387308361267f565b5b80856125009190613cf0565b94505b61250e87878761267f565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e5906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361275d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127549061395a565b60405180910390fd5b612768838383612b42565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590613d96565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128819190613496565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e59190613067565b60405180910390a36128f8848484612b47565b50505050565b600061290930610e6f565b9050600060105460115461291d9190613496565b905060008083148061292f5750600082145b1561293c57505050612b40565b60147f00000000000000000000000000000000000000000000000000000000000000006129699190613c4e565b8311156129a05760147f000000000000000000000000000000000000000000000000000000000000000061299d9190613c4e565b92505b6000600283601154866129b39190613c4e565b6129bd9190613cbf565b6129c79190613cbf565b9050600081856129d79190613cf0565b905060004790506129e782612b4c565b600081476129f59190613cf0565b905060006002601154612a089190613cbf565b87612a139190613cf0565b60105483612a219190613c4e565b612a2b9190613cbf565b905060008183612a3b9190613cf0565b9050600086118015612a4d5750600081115b15612a9a57612a5c8682612d89565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618582601154604051612a9193929190613db6565b60405180910390a15b600060118190555060006010819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1647604051612aee90613567565b60006040518083038185875af1925050503d8060008114612b2b576040519150601f19603f3d011682016040523d82523d6000602084013e612b30565b606091505b5050809750505050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff811115612b6957612b68613ded565b5b604051908082528060200260200182016040528015612b975781602001602082028036833780820191505090505b5090503081600081518110612baf57612bae613e1c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c789190613e60565b81600181518110612c8c57612c8b613e1c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cf1307f0000000000000000000000000000000000000000000000000000000000000000846117e0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d53959493929190613f86565b600060405180830381600087803b158015612d6d57600080fd5b505af1158015612d81573d6000803e3d6000fd5b505050505050565b612db4307f0000000000000000000000000000000000000000000000000000000000000000846117e0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612dfe61118d565b426040518863ffffffff1660e01b8152600401612e2096959493929190613fe0565b60606040518083038185885af1158015612e3e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e639190614041565b5050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e9a82612e6f565b9050919050565b612eaa81612e8f565b8114612eb557600080fd5b50565b600081359050612ec781612ea1565b92915050565b600060208284031215612ee357612ee2612e6a565b5b6000612ef184828501612eb8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f34578082015181840152602081019050612f19565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f5c82612efa565b612f668185612f05565b9350612f76818560208601612f16565b612f7f81612f40565b840191505092915050565b60006020820190508181036000830152612fa48184612f51565b905092915050565b6000819050919050565b612fbf81612fac565b8114612fca57600080fd5b50565b600081359050612fdc81612fb6565b92915050565b60008060408385031215612ff957612ff8612e6a565b5b600061300785828601612eb8565b925050602061301885828601612fcd565b9150509250929050565b60008115159050919050565b61303781613022565b82525050565b6000602082019050613052600083018461302e565b92915050565b61306181612fac565b82525050565b600060208201905061307c6000830184613058565b92915050565b6000819050919050565b60006130a76130a261309d84612e6f565b613082565b612e6f565b9050919050565b60006130b98261308c565b9050919050565b60006130cb826130ae565b9050919050565b6130db816130c0565b82525050565b60006020820190506130f660008301846130d2565b92915050565b60008060006060848603121561311557613114612e6a565b5b600061312386828701612eb8565b935050602061313486828701612eb8565b925050604061314586828701612fcd565b9150509250925092565b600060ff82169050919050565b6131658161314f565b82525050565b6000602082019050613180600083018461315c565b92915050565b61318f81612e8f565b82525050565b60006020820190506131aa6000830184613186565b92915050565b6131b981613022565b81146131c457600080fd5b50565b6000813590506131d6816131b0565b92915050565b600080604083850312156131f3576131f2612e6a565b5b600061320185828601612eb8565b9250506020613212858286016131c7565b9150509250929050565b6000806040838503121561323357613232612e6a565b5b600061324185828601612eb8565b925050602061325285828601612eb8565b9150509250929050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000613292601a83612f05565b915061329d8261325c565b602082019050919050565b600060208201905081810360008301526132c181613285565b9050919050565b6000815190506132d781612fb6565b92915050565b6000602082840312156132f3576132f2612e6a565b5b6000613301848285016132c8565b91505092915050565b600060408201905061331f6000830185613186565b61332c6020830184613058565b9392505050565b600081519050613342816131b0565b92915050565b60006020828403121561335e5761335d612e6a565b5b600061336c84828501613333565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133bc57607f821691505b6020821081036133cf576133ce613375565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613431602883612f05565b915061343c826133d5565b604082019050919050565b6000602082019050818103600083015261346081613424565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a182612fac565b91506134ac83612fac565b92508282019050808211156134c4576134c3613467565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613500602083612f05565b915061350b826134ca565b602082019050919050565b6000602082019050818103600083015261352f816134f3565b9050919050565b600081905092915050565b50565b6000613551600083613536565b915061355c82613541565b600082019050919050565b600061357282613544565b9150819050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006135d8603983612f05565b91506135e38261357c565b604082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061366a602583612f05565b91506136758261360e565b604082019050919050565b600060208201905081810360008301526136998161365d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136fc602683612f05565b9150613707826136a0565b604082019050919050565b6000602082019050818103600083015261372b816136ef565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061378e602483612f05565b915061379982613732565b604082019050919050565b600060208201905081810360008301526137bd81613781565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613820602283612f05565b915061382b826137c4565b604082019050919050565b6000602082019050818103600083015261384f81613813565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138b2602583612f05565b91506138bd82613856565b604082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613944602383612f05565b915061394f826138e8565b604082019050919050565b6000602082019050818103600083015261397381613937565b9050919050565b7f53656e64657220626c61636b6c69737465640000000000000000000000000000600082015250565b60006139b0601283612f05565b91506139bb8261397a565b602082019050919050565b600060208201905081810360008301526139df816139a3565b9050919050565b7f526563656976657220626c61636b6c6973746564000000000000000000000000600082015250565b6000613a1c601483612f05565b9150613a27826139e6565b602082019050919050565b60006020820190508181036000830152613a4b81613a0f565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613a88601683612f05565b9150613a9382613a52565b602082019050919050565b60006020820190508181036000830152613ab781613a7b565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000613b1a603583612f05565b9150613b2582613abe565b604082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613b86601383612f05565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000613c18603683612f05565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b6000613c5982612fac565b9150613c6483612fac565b9250828202613c7281612fac565b91508282048414831517613c8957613c88613467565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cca82612fac565b9150613cd583612fac565b925082613ce557613ce4613c90565b5b828204905092915050565b6000613cfb82612fac565b9150613d0683612fac565b9250828203905081811115613d1e57613d1d613467565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613d80602683612f05565b9150613d8b82613d24565b604082019050919050565b60006020820190508181036000830152613daf81613d73565b9050919050565b6000606082019050613dcb6000830186613058565b613dd86020830185613058565b613de56040830184613058565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613e5a81612ea1565b92915050565b600060208284031215613e7657613e75612e6a565b5b6000613e8484828501613e4b565b91505092915050565b6000819050919050565b6000613eb2613ead613ea884613e8d565b613082565b612fac565b9050919050565b613ec281613e97565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613efd81612e8f565b82525050565b6000613f0f8383613ef4565b60208301905092915050565b6000602082019050919050565b6000613f3382613ec8565b613f3d8185613ed3565b9350613f4883613ee4565b8060005b83811015613f79578151613f608882613f03565b9750613f6b83613f1b565b925050600181019050613f4c565b5085935050505092915050565b600060a082019050613f9b6000830188613058565b613fa86020830187613eb9565b8181036040830152613fba8186613f28565b9050613fc96060830185613186565b613fd66080830184613058565b9695505050505050565b600060c082019050613ff56000830189613186565b6140026020830188613058565b61400f6040830187613eb9565b61401c6060830186613eb9565b6140296080830185613186565b61403660a0830184613058565b979650505050505050565b60008060006060848603121561405a57614059612e6a565b5b6000614068868287016132c8565b9350506020614079868287016132c8565b925050604061408a868287016132c8565b915050925092509256fea2646970667358221220ebea33b0c24921b9efd30f72e2574d988a287edbd59b958a8660eacdd63093d164736f6c63430008120033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c8063782c4e991161012e578063c0246668116100ab578063f11a24d31161006f578063f11a24d31461089c578063f2fde38b146108c7578063f6374342146108f0578063f8b45b051461091b578063fe575a871461094657610246565b8063c0246668146107b5578063c8c8ebe4146107de578063d85ba06314610809578063dd62ed3e14610834578063e2f456051461087157610246565b80639a7a23d6116100f25780639a7a23d6146106aa578063a457c2d7146106d3578063a9059cbb14610710578063b62496f51461074d578063bbc0c7421461078a57610246565b8063782c4e99146105fb5780637fa787ba146106265780638a8c523c1461063d5780638da5cb5b1461065457806395d89b411461067f57610246565b806324b9f3c1116101bc5780636a486a8e116101805780636a486a8e146105285780636ddd17131461055357806370a082311461057e578063715018a6146105bb5780637571336a146105d257610246565b806324b9f3c11461042d578063313ce56714610458578063395093511461048357806349bd5a5e146104c05780634fbee193146104eb57610246565b80631694505e116102035780631694505e1461034457806318160ddd1461036f57806319eab0421461039a5780631a8145bb146103c557806323b872dd146103f057610246565b8063068acf6c1461024b57806306fdde0314610274578063095ea7b31461029f57806310d5de53146102dc578063156c2f351461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612ecd565b610983565b005b34801561028057600080fd5b50610289610b19565b6040516102969190612f8a565b60405180910390f35b3480156102ab57600080fd5b506102c660048036038101906102c19190612fe2565b610bab565b6040516102d3919061303d565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612ecd565b610bc9565b604051610310919061303d565b60405180910390f35b34801561032557600080fd5b5061032e610be9565b60405161033b9190613067565b60405180910390f35b34801561035057600080fd5b50610359610bef565b60405161036691906130e1565b60405180910390f35b34801561037b57600080fd5b50610384610c13565b6040516103919190613067565b60405180910390f35b3480156103a657600080fd5b506103af610c1d565b6040516103bc9190613067565b60405180910390f35b3480156103d157600080fd5b506103da610c23565b6040516103e79190613067565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130fc565b610c29565b604051610424919061303d565b60405180910390f35b34801561043957600080fd5b50610442610d21565b60405161044f9190613067565b60405180910390f35b34801561046457600080fd5b5061046d610d27565b60405161047a919061316b565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612fe2565b610d30565b6040516104b7919061303d565b60405180910390f35b3480156104cc57600080fd5b506104d5610ddc565b6040516104e29190613195565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612ecd565b610e00565b60405161051f919061303d565b60405180910390f35b34801561053457600080fd5b5061053d610e56565b60405161054a9190613067565b60405180910390f35b34801561055f57600080fd5b50610568610e5c565b604051610575919061303d565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612ecd565b610e6f565b6040516105b29190613067565b60405180910390f35b3480156105c757600080fd5b506105d0610eb7565b005b3480156105de57600080fd5b506105f960048036038101906105f491906131dc565b610f3f565b005b34801561060757600080fd5b50610610611016565b60405161061d9190613195565b60405180910390f35b34801561063257600080fd5b5061063b61103a565b005b34801561064957600080fd5b506106526110d9565b005b34801561066057600080fd5b5061066961118d565b6040516106769190613195565b60405180910390f35b34801561068b57600080fd5b506106946111b7565b6040516106a19190612f8a565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc91906131dc565b611249565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190612fe2565b611361565b604051610707919061303d565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190612fe2565b61144c565b604051610744919061303d565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190612ecd565b61146a565b604051610781919061303d565b60405180910390f35b34801561079657600080fd5b5061079f61148a565b6040516107ac919061303d565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906131dc565b61149d565b005b3480156107ea57600080fd5b506107f36115c2565b6040516108009190613067565b60405180910390f35b34801561081557600080fd5b5061081e6115c8565b60405161082b9190613067565b60405180910390f35b34801561084057600080fd5b5061085b6004803603810190610856919061321c565b6115ce565b6040516108689190613067565b60405180910390f35b34801561087d57600080fd5b50610886611655565b6040516108939190613067565b60405180910390f35b3480156108a857600080fd5b506108b1611679565b6040516108be9190613067565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190612ecd565b61167f565b005b3480156108fc57600080fd5b50610905611776565b6040516109129190613067565b60405180910390f35b34801561092757600080fd5b5061093061177c565b60405161093d9190613067565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190612ecd565b611782565b60405161097a919061303d565b60405180910390f35b60007f0000000000000000000000003ee4be6769dbb8a642ca37f5fabba128eb1114969050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e906132a8565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a529190613195565b602060405180830381865afa158015610a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9391906132dd565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610ad092919061330a565b6020604051808303816000875af1158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b139190613348565b50505050565b606060038054610b28906133a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906133a4565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000610bbf610bb86117d8565b84846117e0565b6001905092915050565b60136020528060005260406000206000915054906101000a900460ff1681565b600b5481565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b600e5481565b60115481565b6000610c368484846119a9565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c816117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613447565b60405180910390fd5b610d1585610d0d6117d8565b8584036117e0565b60019150509392505050565b60105481565b60006012905090565b6000610dd2610d3d6117d8565b848460016000610d4b6117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dcd9190613496565b6117e0565b6001905092915050565b7f000000000000000000000000c4a32080f22bdb8aae099837b4cd4f9b9ea8275181565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b600860019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebf6117d8565b73ffffffffffffffffffffffffffffffffffffffff16610edd61118d565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613516565b60405180910390fd5b610f3d6000612518565b565b610f476117d8565b73ffffffffffffffffffffffffffffffffffffffff16610f6561118d565b73ffffffffffffffffffffffffffffffffffffffff1614610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290613516565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b7f0000000000000000000000003ee4be6769dbb8a642ca37f5fabba128eb11149681565b60007f0000000000000000000000003ee4be6769dbb8a642ca37f5fabba128eb111496905060008173ffffffffffffffffffffffffffffffffffffffff164760405161108590613567565b60006040518083038185875af1925050503d80600081146110c2576040519150601f19603f3d011682016040523d82523d6000602084013e6110c7565b606091505b50509050806110d557600080fd5b5050565b6110e16117d8565b73ffffffffffffffffffffffffffffffffffffffff166110ff61118d565b73ffffffffffffffffffffffffffffffffffffffff1614611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90613516565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506001600860016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111c6906133a4565b80601f01602080910402602001604051908101604052809291908181526020018280546111f2906133a4565b801561123f5780601f106112145761010080835404028352916020019161123f565b820191906000526020600020905b81548152906001019060200180831161122257829003601f168201915b5050505050905090565b6112516117d8565b73ffffffffffffffffffffffffffffffffffffffff1661126f61118d565b73ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90613516565b60405180910390fd5b7f000000000000000000000000c4a32080f22bdb8aae099837b4cd4f9b9ea8275173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a906135ee565b60405180910390fd5b61135d82826125de565b5050565b600080600160006113706117d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613680565b60405180910390fd5b6114416114386117d8565b858584036117e0565b600191505092915050565b60006114606114596117d8565b84846119a9565b6001905092915050565b60146020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900460ff1681565b6114a56117d8565b73ffffffffffffffffffffffffffffffffffffffff166114c361118d565b73ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090613516565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516115b6919061303d565b60405180910390a25050565b60065481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000a968163f0a57b40000081565b600c5481565b6116876117d8565b73ffffffffffffffffffffffffffffffffffffffff166116a561118d565b73ffffffffffffffffffffffffffffffffffffffff16146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613516565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176190613712565b60405180910390fd5b61177381612518565b50565b600f5481565b60075481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611846906137a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613836565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161199c9190613067565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e9061395a565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906139c6565b60405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613a32565b60405180910390fd5b60008103611bba57611bb58383600061267f565b612513565b611bc261118d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c305750611c0061118d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c695750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611ca3575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cbc5750600560149054906101000a900460ff16155b1561209f57600860009054906101000a900460ff16611db657601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d765750601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90613a9e565b60405180910390fd5b5b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611e595750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f0057600654811115611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613b30565b60405180910390fd5b600754611eaf83610e6f565b82611eba9190613496565b1115611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290613b9c565b60405180910390fd5b61209e565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611fa35750601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611ff257600654811115611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490613c2e565b60405180910390fd5b61209d565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661209c5760075461204f83610e6f565b8261205a9190613496565b111561209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290613b9c565b60405180910390fd5b5b5b5b5b60006120aa30610e6f565b905060007f000000000000000000000000000000000000000000000a968163f0a57b40000082101590508080156120ed5750600860019054906101000a900460ff165b80156121065750600560149054906101000a900460ff16155b801561215c5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121b25750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122085750601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561224c576001600560146101000a81548160ff0219169083151502179055506122306128fe565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123025750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561230c57600090505b6000811561250357601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561236f57506000600d54115b156123fb576064600d54866123849190613c4e565b61238e9190613cbf565b9050600d54600f54826123a19190613c4e565b6123ab9190613cbf565b601160008282546123bc9190613496565b92505081905550600d54600e54826123d49190613c4e565b6123de9190613cbf565b601060008282546123ef9190613496565b925050819055506124df565b601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561245657506000600a54115b156124de576064600a548661246b9190613c4e565b6124759190613cbf565b9050600a54600c54826124889190613c4e565b6124929190613cbf565b601160008282546124a39190613496565b92505081905550600a54600b54826124bb9190613c4e565b6124c59190613cbf565b601060008282546124d69190613496565b925050819055505b5b60008111156124f4576124f387308361267f565b5b80856125009190613cf0565b94505b61250e87878761267f565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e5906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361275d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127549061395a565b60405180910390fd5b612768838383612b42565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590613d96565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128819190613496565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e59190613067565b60405180910390a36128f8848484612b47565b50505050565b600061290930610e6f565b9050600060105460115461291d9190613496565b905060008083148061292f5750600082145b1561293c57505050612b40565b60147f000000000000000000000000000000000000000000000a968163f0a57b4000006129699190613c4e565b8311156129a05760147f000000000000000000000000000000000000000000000a968163f0a57b40000061299d9190613c4e565b92505b6000600283601154866129b39190613c4e565b6129bd9190613cbf565b6129c79190613cbf565b9050600081856129d79190613cf0565b905060004790506129e782612b4c565b600081476129f59190613cf0565b905060006002601154612a089190613cbf565b87612a139190613cf0565b60105483612a219190613c4e565b612a2b9190613cbf565b905060008183612a3b9190613cf0565b9050600086118015612a4d5750600081115b15612a9a57612a5c8682612d89565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618582601154604051612a9193929190613db6565b60405180910390a15b600060118190555060006010819055507f0000000000000000000000003ee4be6769dbb8a642ca37f5fabba128eb11149673ffffffffffffffffffffffffffffffffffffffff1647604051612aee90613567565b60006040518083038185875af1925050503d8060008114612b2b576040519150601f19603f3d011682016040523d82523d6000602084013e612b30565b606091505b5050809750505050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff811115612b6957612b68613ded565b5b604051908082528060200260200182016040528015612b975781602001602082028036833780820191505090505b5090503081600081518110612baf57612bae613e1c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c789190613e60565b81600181518110612c8c57612c8b613e1c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cf1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846117e0565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d53959493929190613f86565b600060405180830381600087803b158015612d6d57600080fd5b505af1158015612d81573d6000803e3d6000fd5b505050505050565b612db4307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846117e0565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612dfe61118d565b426040518863ffffffff1660e01b8152600401612e2096959493929190613fe0565b60606040518083038185885af1158015612e3e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e639190614041565b5050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e9a82612e6f565b9050919050565b612eaa81612e8f565b8114612eb557600080fd5b50565b600081359050612ec781612ea1565b92915050565b600060208284031215612ee357612ee2612e6a565b5b6000612ef184828501612eb8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f34578082015181840152602081019050612f19565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f5c82612efa565b612f668185612f05565b9350612f76818560208601612f16565b612f7f81612f40565b840191505092915050565b60006020820190508181036000830152612fa48184612f51565b905092915050565b6000819050919050565b612fbf81612fac565b8114612fca57600080fd5b50565b600081359050612fdc81612fb6565b92915050565b60008060408385031215612ff957612ff8612e6a565b5b600061300785828601612eb8565b925050602061301885828601612fcd565b9150509250929050565b60008115159050919050565b61303781613022565b82525050565b6000602082019050613052600083018461302e565b92915050565b61306181612fac565b82525050565b600060208201905061307c6000830184613058565b92915050565b6000819050919050565b60006130a76130a261309d84612e6f565b613082565b612e6f565b9050919050565b60006130b98261308c565b9050919050565b60006130cb826130ae565b9050919050565b6130db816130c0565b82525050565b60006020820190506130f660008301846130d2565b92915050565b60008060006060848603121561311557613114612e6a565b5b600061312386828701612eb8565b935050602061313486828701612eb8565b925050604061314586828701612fcd565b9150509250925092565b600060ff82169050919050565b6131658161314f565b82525050565b6000602082019050613180600083018461315c565b92915050565b61318f81612e8f565b82525050565b60006020820190506131aa6000830184613186565b92915050565b6131b981613022565b81146131c457600080fd5b50565b6000813590506131d6816131b0565b92915050565b600080604083850312156131f3576131f2612e6a565b5b600061320185828601612eb8565b9250506020613212858286016131c7565b9150509250929050565b6000806040838503121561323357613232612e6a565b5b600061324185828601612eb8565b925050602061325285828601612eb8565b9150509250929050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000613292601a83612f05565b915061329d8261325c565b602082019050919050565b600060208201905081810360008301526132c181613285565b9050919050565b6000815190506132d781612fb6565b92915050565b6000602082840312156132f3576132f2612e6a565b5b6000613301848285016132c8565b91505092915050565b600060408201905061331f6000830185613186565b61332c6020830184613058565b9392505050565b600081519050613342816131b0565b92915050565b60006020828403121561335e5761335d612e6a565b5b600061336c84828501613333565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133bc57607f821691505b6020821081036133cf576133ce613375565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613431602883612f05565b915061343c826133d5565b604082019050919050565b6000602082019050818103600083015261346081613424565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a182612fac565b91506134ac83612fac565b92508282019050808211156134c4576134c3613467565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613500602083612f05565b915061350b826134ca565b602082019050919050565b6000602082019050818103600083015261352f816134f3565b9050919050565b600081905092915050565b50565b6000613551600083613536565b915061355c82613541565b600082019050919050565b600061357282613544565b9150819050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006135d8603983612f05565b91506135e38261357c565b604082019050919050565b60006020820190508181036000830152613607816135cb565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061366a602583612f05565b91506136758261360e565b604082019050919050565b600060208201905081810360008301526136998161365d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136fc602683612f05565b9150613707826136a0565b604082019050919050565b6000602082019050818103600083015261372b816136ef565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061378e602483612f05565b915061379982613732565b604082019050919050565b600060208201905081810360008301526137bd81613781565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613820602283612f05565b915061382b826137c4565b604082019050919050565b6000602082019050818103600083015261384f81613813565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138b2602583612f05565b91506138bd82613856565b604082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613944602383612f05565b915061394f826138e8565b604082019050919050565b6000602082019050818103600083015261397381613937565b9050919050565b7f53656e64657220626c61636b6c69737465640000000000000000000000000000600082015250565b60006139b0601283612f05565b91506139bb8261397a565b602082019050919050565b600060208201905081810360008301526139df816139a3565b9050919050565b7f526563656976657220626c61636b6c6973746564000000000000000000000000600082015250565b6000613a1c601483612f05565b9150613a27826139e6565b602082019050919050565b60006020820190508181036000830152613a4b81613a0f565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000613a88601683612f05565b9150613a9382613a52565b602082019050919050565b60006020820190508181036000830152613ab781613a7b565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000613b1a603583612f05565b9150613b2582613abe565b604082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613b86601383612f05565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000613c18603683612f05565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b6000613c5982612fac565b9150613c6483612fac565b9250828202613c7281612fac565b91508282048414831517613c8957613c88613467565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cca82612fac565b9150613cd583612fac565b925082613ce557613ce4613c90565b5b828204905092915050565b6000613cfb82612fac565b9150613d0683612fac565b9250828203905081811115613d1e57613d1d613467565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613d80602683612f05565b9150613d8b82613d24565b604082019050919050565b60006020820190508181036000830152613daf81613d73565b9050919050565b6000606082019050613dcb6000830186613058565b613dd86020830185613058565b613de56040830184613058565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613e5a81612ea1565b92915050565b600060208284031215613e7657613e75612e6a565b5b6000613e8484828501613e4b565b91505092915050565b6000819050919050565b6000613eb2613ead613ea884613e8d565b613082565b612fac565b9050919050565b613ec281613e97565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613efd81612e8f565b82525050565b6000613f0f8383613ef4565b60208301905092915050565b6000602082019050919050565b6000613f3382613ec8565b613f3d8185613ed3565b9350613f4883613ee4565b8060005b83811015613f79578151613f608882613f03565b9750613f6b83613f1b565b925050600181019050613f4c565b5085935050505092915050565b600060a082019050613f9b6000830188613058565b613fa86020830187613eb9565b8181036040830152613fba8186613f28565b9050613fc96060830185613186565b613fd66080830184613058565b9695505050505050565b600060c082019050613ff56000830189613186565b6140026020830188613058565b61400f6040830187613eb9565b61401c6060830186613eb9565b6140296080830185613186565b61403660a0830184613058565b979650505050505050565b60008060006060848603121561405a57614059612e6a565b5b6000614068868287016132c8565b9350506020614079868287016132c8565b925050604061408a868287016132c8565b915050925092509256fea2646970667358221220ebea33b0c24921b9efd30f72e2574d988a287edbd59b958a8660eacdd63093d164736f6c63430008120033

Deployed Bytecode Sourcemap

31180:13115:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43678:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9139:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11306:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32123:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31743:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31223:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10259:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31853:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31969:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11957:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31930:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10101:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12858:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31281:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36717:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31818:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31569:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10430:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2656:103;;;;;;;;;;;;;:::i;:::-;;35844:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31356:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44078:212;;;;;;;;;;;;;:::i;:::-;;35181:110;;;;;;;;;;;;;:::i;:::-;;2005:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9358:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36209:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13576:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10770:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32344:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31529:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36019:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31404:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31709:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11008:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31446:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31779:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2914:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31890:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31496:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36851:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43678:306;43742:11;43756:14;43742:28;;43809:1;43791:20;;:6;:20;;;43783:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43853:24;43887:6;43880:24;;;43913:4;43880:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43853:66;;43937:6;43930:23;;;43954:3;43959:16;43930:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43729:255;;43678:306;:::o;9139:100::-;9193:13;9226:5;9219:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9139:100;:::o;11306:169::-;11389:4;11406:39;11415:12;:10;:12::i;:::-;11429:7;11438:6;11406:8;:39::i;:::-;11463:4;11456:11;;11306:169;;;;:::o;32123:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;31743:29::-;;;;:::o;31223:51::-;;;:::o;10259:108::-;10320:7;10347:12;;10340:19;;10259:108;:::o;31853:30::-;;;;:::o;31969:33::-;;;;:::o;11957:492::-;12097:4;12114:36;12124:6;12132:9;12143:6;12114:9;:36::i;:::-;12163:24;12190:11;:19;12202:6;12190:19;;;;;;;;;;;;;;;:33;12210:12;:10;:12::i;:::-;12190:33;;;;;;;;;;;;;;;;12163:60;;12262:6;12242:16;:26;;12234:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;12349:57;12358:6;12366:12;:10;:12::i;:::-;12399:6;12380:16;:25;12349:8;:57::i;:::-;12437:4;12430:11;;;11957:492;;;;;:::o;31930:32::-;;;;:::o;10101:93::-;10159:5;10184:2;10177:9;;10101:93;:::o;12858:215::-;12946:4;12963:80;12972:12;:10;:12::i;:::-;12986:7;13032:10;12995:11;:25;13007:12;:10;:12::i;:::-;12995:25;;;;;;;;;;;;;;;:34;13021:7;12995:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12963:8;:80::i;:::-;13061:4;13054:11;;12858:215;;;;:::o;31281:38::-;;;:::o;36717:126::-;36783:4;36807:19;:28;36827:7;36807:28;;;;;;;;;;;;;;;;;;;;;;;;;36800:35;;36717:126;;;:::o;31818:28::-;;;;:::o;31569:31::-;;;;;;;;;;;;;:::o;10430:127::-;10504:7;10531:9;:18;10541:7;10531:18;;;;;;;;;;;;;;;;10524:25;;10430:127;;;:::o;2656:103::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2721:30:::1;2748:1;2721:18;:30::i;:::-;2656:103::o:0;35844:167::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35999:4:::1;35957:31;:39;35989:6;35957:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35844:167:::0;;:::o;31356:39::-;;;:::o;44078:212::-;44124:14;44141;44124:31;;44167:12;44185:6;:11;;44218:21;44185:70;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44166:89;;;44274:7;44266:16;;;;;;44113:177;;44078:212::o;35181:110::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35250:4:::1;35234:13;;:20;;;;;;;;;;;;;;;;;;35279:4;35265:11;;:18;;;;;;;;;;;;;;;;;;35181:110::o:0;2005:87::-;2051:7;2078:6;;;;;;;;;;;2071:13;;2005:87;:::o;9358:104::-;9414:13;9447:7;9440:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9358:104;:::o;36209:304::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36353:13:::1;36345:21;;:4;:21;;::::0;36323:128:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36464:41;36493:4;36499:5;36464:28;:41::i;:::-;36209:304:::0;;:::o;13576:413::-;13669:4;13686:24;13713:11;:25;13725:12;:10;:12::i;:::-;13713:25;;;;;;;;;;;;;;;:34;13739:7;13713:34;;;;;;;;;;;;;;;;13686:61;;13786:15;13766:16;:35;;13758:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13879:67;13888:12;:10;:12::i;:::-;13902:7;13930:15;13911:16;:34;13879:8;:67::i;:::-;13977:4;13970:11;;;13576:413;;;;:::o;10770:175::-;10856:4;10873:42;10883:12;:10;:12::i;:::-;10897:9;10908:6;10873:9;:42::i;:::-;10933:4;10926:11;;10770:175;;;;:::o;32344:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;31529:33::-;;;;;;;;;;;;;:::o;36019:182::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36135:8:::1;36104:19;:28;36124:7;36104:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36175:7;36159:34;;;36184:8;36159:34;;;;;;:::i;:::-;;;;;;;;36019:182:::0;;:::o;31404:35::-;;;;:::o;31709:27::-;;;;:::o;11008:151::-;11097:7;11124:11;:18;11136:5;11124:18;;;;;;;;;;;;;;;:27;11143:7;11124:27;;;;;;;;;;;;;;;;11117:34;;11008:151;;;;:::o;31446:43::-;;;:::o;31779:30::-;;;;:::o;2914:201::-;2236:12;:10;:12::i;:::-;2225:23;;:7;:5;:7::i;:::-;:23;;;2217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3023:1:::1;3003:22;;:8;:22;;::::0;2995:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3079:28;3098:8;3079:18;:28::i;:::-;2914:201:::0;:::o;31890:31::-;;;;:::o;31496:24::-;;;;:::o;36851:113::-;36912:4;36936:11;:20;36948:7;36936:20;;;;;;;;;;;;;;;;;;;;;;;;;36929:27;;36851:113;;;:::o;872:98::-;925:7;952:10;945:17;;872:98;:::o;17260:380::-;17413:1;17396:19;;:5;:19;;;17388:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17494:1;17475:21;;:7;:21;;;17467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17578:6;17548:11;:18;17560:5;17548:18;;;;;;;;;;;;;;;:27;17567:7;17548:27;;;;;;;;;;;;;;;:36;;;;17616:7;17600:32;;17609:5;17600:32;;;17625:6;17600:32;;;;;;:::i;:::-;;;;;;;;17260:380;;;:::o;36972:3834::-;37120:1;37104:18;;:4;:18;;;37096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37197:1;37183:16;;:2;:16;;;37175:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37259:11;:17;37271:4;37259:17;;;;;;;;;;;;;;;;;;;;;;;;;37258:18;37250:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;37318:11;:15;37330:2;37318:15;;;;;;;;;;;;;;;;;;;;;;;;;37317:16;37309:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;37384:1;37374:6;:11;37370:93;;37402:28;37418:4;37424:2;37428:1;37402:15;:28::i;:::-;37445:7;;37370:93;37505:7;:5;:7::i;:::-;37497:15;;:4;:15;;;;:49;;;;;37539:7;:5;:7::i;:::-;37533:13;;:2;:13;;;;37497:49;:86;;;;;37581:1;37567:16;;:2;:16;;;;37497:86;:128;;;;;37618:6;37604:21;;:2;:21;;;;37497:128;:158;;;;;37647:8;;;;;;;;;;;37646:9;37497:158;37475:1642;;;37695:13;;;;;;;;;;;37690:223;;37767:19;:25;37787:4;37767:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;37796:19;:23;37816:2;37796:23;;;;;;;;;;;;;;;;;;;;;;;;;37767:52;37733:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;37690:223;37986:25;:31;38012:4;37986:31;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;38043:31;:35;38075:2;38043:35;;;;;;;;;;;;;;;;;;;;;;;;;38042:36;37986:92;37960:1146;;;38165:20;;38155:6;:30;;38121:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;38373:9;;38356:13;38366:2;38356:9;:13::i;:::-;38347:6;:22;;;;:::i;:::-;:35;;38313:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;37960:1146;;;38550:25;:29;38576:2;38550:29;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;38605:31;:37;38637:4;38605:37;;;;;;;;;;;;;;;;;;;;;;;;;38604:38;38550:92;38524:582;;;38729:20;;38719:6;:30;;38685:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;38524:582;;;38886:31;:35;38918:2;38886:35;;;;;;;;;;;;;;;;;;;;;;;;;38881:225;;39006:9;;38989:13;38999:2;38989:9;:13::i;:::-;38980:6;:22;;;;:::i;:::-;:35;;38946:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;38881:225;38524:582;37960:1146;37475:1642;39129:28;39160:24;39178:4;39160:9;:24::i;:::-;39129:55;;39197:12;39236:18;39212:20;:42;;39197:57;;39285:7;:35;;;;;39309:11;;;;;;;;;;;39285:35;:61;;;;;39338:8;;;;;;;;;;;39337:9;39285:61;:110;;;;;39364:25;:31;39390:4;39364:31;;;;;;;;;;;;;;;;;;;;;;;;;39363:32;39285:110;:153;;;;;39413:19;:25;39433:4;39413:25;;;;;;;;;;;;;;;;;;;;;;;;;39412:26;39285:153;:194;;;;;39456:19;:23;39476:2;39456:23;;;;;;;;;;;;;;;;;;;;;;;;;39455:24;39285:194;39267:326;;;39517:4;39506:8;;:15;;;;;;;;;;;;;;;;;;39538:10;:8;:10::i;:::-;39576:5;39565:8;;:16;;;;;;;;;;;;;;;;;;39267:326;39605:12;39621:8;;;;;;;;;;;39620:9;39605:24;;39731:19;:25;39751:4;39731:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;39760:19;:23;39780:2;39760:23;;;;;;;;;;;;;;;;;;;;;;;;;39731:52;39727:100;;;39810:5;39800:15;;39727:100;39839:12;39944:7;39940:813;;;39993:25;:29;40019:2;39993:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;40042:1;40026:13;;:17;39993:50;39989:615;;;40098:3;40081:13;;40072:6;:22;;;;:::i;:::-;40071:30;;;;:::i;:::-;40064:37;;40170:13;;40150:16;;40143:4;:23;;;;:::i;:::-;40142:41;;;;:::i;:::-;40120:18;;:63;;;;;;;:::i;:::-;;;;;;;;40250:13;;40231:15;;40224:4;:22;;;;:::i;:::-;40223:40;;;;:::i;:::-;40202:17;;:61;;;;;;;:::i;:::-;;;;;;;;39989:615;;;40322:25;:31;40348:4;40322:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;40372:1;40357:12;;:16;40322:51;40318:286;;;40427:3;40411:12;;40402:6;:21;;;;:::i;:::-;40401:29;;;;:::i;:::-;40394:36;;40498:12;;40479:15;;40472:4;:22;;;;:::i;:::-;40471:39;;;;:::i;:::-;40449:18;;:61;;;;;;;:::i;:::-;;;;;;;;40576:12;;40558:14;;40551:4;:21;;;;:::i;:::-;40550:38;;;;:::i;:::-;40529:17;;:59;;;;;;;:::i;:::-;;;;;;;;40318:286;39989:615;40631:1;40624:4;:8;40620:91;;;40653:42;40669:4;40683;40690;40653:15;:42::i;:::-;40620:91;40737:4;40727:14;;;;;:::i;:::-;;;39940:813;40765:33;40781:4;40787:2;40791:6;40765:15;:33::i;:::-;37085:3721;;;;36972:3834;;;;:::o;3275:191::-;3349:16;3368:6;;;;;;;;;;;3349:25;;3394:8;3385:6;;:17;;;;;;;;;;;;;;;;;;3449:8;3418:40;;3439:8;3418:40;;;;;;;;;;;;3338:128;3275:191;:::o;36521:188::-;36638:5;36604:25;:31;36630:4;36604:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36695:5;36661:40;;36689:4;36661:40;;;;;;;;;;;;36521:188;;:::o;14479:733::-;14637:1;14619:20;;:6;:20;;;14611:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14721:1;14700:23;;:9;:23;;;14692:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14776:47;14797:6;14805:9;14816:6;14776:20;:47::i;:::-;14836:21;14860:9;:17;14870:6;14860:17;;;;;;;;;;;;;;;;14836:41;;14913:6;14896:13;:23;;14888:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;15034:6;15018:13;:22;14998:9;:17;15008:6;14998:17;;;;;;;;;;;;;;;:42;;;;15086:6;15062:9;:20;15072:9;15062:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;15127:9;15110:35;;15119:6;15110:35;;;15138:6;15110:35;;;;;;:::i;:::-;;;;;;;;15158:46;15178:6;15186:9;15197:6;15158:19;:46::i;:::-;14600:612;14479:733;;;:::o;41949:1622::-;41988:23;42014:24;42032:4;42014:9;:24::i;:::-;41988:50;;42049:25;42111:17;;42077:18;;:51;;;;:::i;:::-;42049:79;;42139:12;42187:1;42168:15;:20;:46;;;;42213:1;42192:17;:22;42168:46;42164:85;;;42231:7;;;;;42164:85;42362:2;42341:18;:23;;;;:::i;:::-;42323:15;:41;42319:115;;;42420:2;42399:18;:23;;;;:::i;:::-;42381:41;;42319:115;42495:23;42608:1;42575:17;42540:18;;42522:15;:36;;;;:::i;:::-;42521:71;;;;:::i;:::-;:88;;;;:::i;:::-;42495:114;;42620:26;42667:15;42649;:33;;;;:::i;:::-;42620:62;;42695:25;42723:21;42695:49;;42757:36;42774:18;42757:16;:36::i;:::-;42806:18;42851:17;42827:21;:41;;;;:::i;:::-;42806:62;;42881:22;42984:1;42963:18;;:22;;;;:::i;:::-;42942:17;:44;;;;:::i;:::-;42920:17;;42907:10;:30;;;;:::i;:::-;42906:81;;;;:::i;:::-;42881:106;;43008:23;43047:14;43034:10;:27;;;;:::i;:::-;43008:53;;43096:1;43078:15;:19;:42;;;;;43119:1;43101:15;:19;43078:42;43074:278;;;43137:46;43150:15;43167;43137:12;:46::i;:::-;43203:137;43236:18;43273:15;43307:18;;43203:137;;;;;;;;:::i;:::-;;;;;;;;43074:278;43385:1;43364:18;:22;;;;43417:1;43397:17;:21;;;;43509:14;43501:28;;43537:21;43501:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43487:76;;;;;41977:1594;;;;;;;;;41949:1622;:::o;18240:125::-;;;;:::o;18969:124::-;;;;:::o;40814:606::-;40940:21;40978:1;40964:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40940:40;;41009:4;40991;40996:1;40991:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;41035:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41025:4;41030:1;41025:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;41070:62;41087:4;41102:15;41120:11;41070:8;:62::i;:::-;41171:15;:66;;;41252:11;41278:1;41339:4;41366;41386:15;41171:241;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40869:551;40814:606;:::o;41428:513::-;41576:62;41593:4;41608:15;41626:11;41576:8;:62::i;:::-;41681:15;:31;;;41720:9;41753:4;41773:11;41799:1;41842;41885:7;:5;:7::i;:::-;41907:15;41681:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;41428:513;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:99::-;1228:6;1262:5;1256:12;1246:22;;1176:99;;;:::o;1281:169::-;1365:11;1399:6;1394:3;1387:19;1439:4;1434:3;1430:14;1415:29;;1281:169;;;;:::o;1456:246::-;1537:1;1547:113;1561:6;1558:1;1555:13;1547:113;;;1646:1;1641:3;1637:11;1631:18;1627:1;1622:3;1618:11;1611:39;1583:2;1580:1;1576:10;1571:15;;1547:113;;;1694:1;1685:6;1680:3;1676:16;1669:27;1518:184;1456:246;;;:::o;1708:102::-;1749:6;1800:2;1796:7;1791:2;1784:5;1780:14;1776:28;1766:38;;1708:102;;;:::o;1816:377::-;1904:3;1932:39;1965:5;1932:39;:::i;:::-;1987:71;2051:6;2046:3;1987:71;:::i;:::-;1980:78;;2067:65;2125:6;2120:3;2113:4;2106:5;2102:16;2067:65;:::i;:::-;2157:29;2179:6;2157:29;:::i;:::-;2152:3;2148:39;2141:46;;1908:285;1816:377;;;;:::o;2199:313::-;2312:4;2350:2;2339:9;2335:18;2327:26;;2399:9;2393:4;2389:20;2385:1;2374:9;2370:17;2363:47;2427:78;2500:4;2491:6;2427:78;:::i;:::-;2419:86;;2199:313;;;;:::o;2518:77::-;2555:7;2584:5;2573:16;;2518:77;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:60::-;4161:3;4182:5;4175:12;;4133:60;;;:::o;4199:142::-;4249:9;4282:53;4300:34;4309:24;4327:5;4309:24;:::i;:::-;4300:34;:::i;:::-;4282:53;:::i;:::-;4269:66;;4199:142;;;:::o;4347:126::-;4397:9;4430:37;4461:5;4430:37;:::i;:::-;4417:50;;4347:126;;;:::o;4479:153::-;4556:9;4589:37;4620:5;4589:37;:::i;:::-;4576:50;;4479:153;;;:::o;4638:185::-;4752:64;4810:5;4752:64;:::i;:::-;4747:3;4740:77;4638:185;;:::o;4829:276::-;4949:4;4987:2;4976:9;4972:18;4964:26;;5000:98;5095:1;5084:9;5080:17;5071:6;5000:98;:::i;:::-;4829:276;;;;:::o;5111:619::-;5188:6;5196;5204;5253:2;5241:9;5232:7;5228:23;5224:32;5221:119;;;5259:79;;:::i;:::-;5221:119;5379:1;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5350:117;5506:2;5532:53;5577:7;5568:6;5557:9;5553:22;5532:53;:::i;:::-;5522:63;;5477:118;5634:2;5660:53;5705:7;5696:6;5685:9;5681:22;5660:53;:::i;:::-;5650:63;;5605:118;5111:619;;;;;:::o;5736:86::-;5771:7;5811:4;5804:5;5800:16;5789:27;;5736:86;;;:::o;5828:112::-;5911:22;5927:5;5911:22;:::i;:::-;5906:3;5899:35;5828:112;;:::o;5946:214::-;6035:4;6073:2;6062:9;6058:18;6050:26;;6086:67;6150:1;6139:9;6135:17;6126:6;6086:67;:::i;:::-;5946:214;;;;:::o;6166:118::-;6253:24;6271:5;6253:24;:::i;:::-;6248:3;6241:37;6166:118;;:::o;6290:222::-;6383:4;6421:2;6410:9;6406:18;6398:26;;6434:71;6502:1;6491:9;6487:17;6478:6;6434:71;:::i;:::-;6290:222;;;;:::o;6518:116::-;6588:21;6603:5;6588:21;:::i;:::-;6581:5;6578:32;6568:60;;6624:1;6621;6614:12;6568:60;6518:116;:::o;6640:133::-;6683:5;6721:6;6708:20;6699:29;;6737:30;6761:5;6737:30;:::i;:::-;6640:133;;;;:::o;6779:468::-;6844:6;6852;6901:2;6889:9;6880:7;6876:23;6872:32;6869:119;;;6907:79;;:::i;:::-;6869:119;7027:1;7052:53;7097:7;7088:6;7077:9;7073:22;7052:53;:::i;:::-;7042:63;;6998:117;7154:2;7180:50;7222:7;7213:6;7202:9;7198:22;7180:50;:::i;:::-;7170:60;;7125:115;6779:468;;;;;:::o;7253:474::-;7321:6;7329;7378:2;7366:9;7357:7;7353:23;7349:32;7346:119;;;7384:79;;:::i;:::-;7346:119;7504:1;7529:53;7574:7;7565:6;7554:9;7550:22;7529:53;:::i;:::-;7519:63;;7475:117;7631:2;7657:53;7702:7;7693:6;7682:9;7678:22;7657:53;:::i;:::-;7647:63;;7602:118;7253:474;;;;;:::o;7733:176::-;7873:28;7869:1;7861:6;7857:14;7850:52;7733:176;:::o;7915:366::-;8057:3;8078:67;8142:2;8137:3;8078:67;:::i;:::-;8071:74;;8154:93;8243:3;8154:93;:::i;:::-;8272:2;8267:3;8263:12;8256:19;;7915:366;;;:::o;8287:419::-;8453:4;8491:2;8480:9;8476:18;8468:26;;8540:9;8534:4;8530:20;8526:1;8515:9;8511:17;8504:47;8568:131;8694:4;8568:131;:::i;:::-;8560:139;;8287:419;;;:::o;8712:143::-;8769:5;8800:6;8794:13;8785:22;;8816:33;8843:5;8816:33;:::i;:::-;8712:143;;;;:::o;8861:351::-;8931:6;8980:2;8968:9;8959:7;8955:23;8951:32;8948:119;;;8986:79;;:::i;:::-;8948:119;9106:1;9131:64;9187:7;9178:6;9167:9;9163:22;9131:64;:::i;:::-;9121:74;;9077:128;8861:351;;;;:::o;9218:332::-;9339:4;9377:2;9366:9;9362:18;9354:26;;9390:71;9458:1;9447:9;9443:17;9434:6;9390:71;:::i;:::-;9471:72;9539:2;9528:9;9524:18;9515:6;9471:72;:::i;:::-;9218:332;;;;;:::o;9556:137::-;9610:5;9641:6;9635:13;9626:22;;9657:30;9681:5;9657:30;:::i;:::-;9556:137;;;;:::o;9699:345::-;9766:6;9815:2;9803:9;9794:7;9790:23;9786:32;9783:119;;;9821:79;;:::i;:::-;9783:119;9941:1;9966:61;10019:7;10010:6;9999:9;9995:22;9966:61;:::i;:::-;9956:71;;9912:125;9699:345;;;;:::o;10050:180::-;10098:77;10095:1;10088:88;10195:4;10192:1;10185:15;10219:4;10216:1;10209:15;10236:320;10280:6;10317:1;10311:4;10307:12;10297:22;;10364:1;10358:4;10354:12;10385:18;10375:81;;10441:4;10433:6;10429:17;10419:27;;10375:81;10503:2;10495:6;10492:14;10472:18;10469:38;10466:84;;10522:18;;:::i;:::-;10466:84;10287:269;10236:320;;;:::o;10562:227::-;10702:34;10698:1;10690:6;10686:14;10679:58;10771:10;10766:2;10758:6;10754:15;10747:35;10562:227;:::o;10795:366::-;10937:3;10958:67;11022:2;11017:3;10958:67;:::i;:::-;10951:74;;11034:93;11123:3;11034:93;:::i;:::-;11152:2;11147:3;11143:12;11136:19;;10795:366;;;:::o;11167:419::-;11333:4;11371:2;11360:9;11356:18;11348:26;;11420:9;11414:4;11410:20;11406:1;11395:9;11391:17;11384:47;11448:131;11574:4;11448:131;:::i;:::-;11440:139;;11167:419;;;:::o;11592:180::-;11640:77;11637:1;11630:88;11737:4;11734:1;11727:15;11761:4;11758:1;11751:15;11778:191;11818:3;11837:20;11855:1;11837:20;:::i;:::-;11832:25;;11871:20;11889:1;11871:20;:::i;:::-;11866:25;;11914:1;11911;11907:9;11900:16;;11935:3;11932:1;11929:10;11926:36;;;11942:18;;:::i;:::-;11926:36;11778:191;;;;:::o;11975:182::-;12115:34;12111:1;12103:6;12099:14;12092:58;11975:182;:::o;12163:366::-;12305:3;12326:67;12390:2;12385:3;12326:67;:::i;:::-;12319:74;;12402:93;12491:3;12402:93;:::i;:::-;12520:2;12515:3;12511:12;12504:19;;12163:366;;;:::o;12535:419::-;12701:4;12739:2;12728:9;12724:18;12716:26;;12788:9;12782:4;12778:20;12774:1;12763:9;12759:17;12752:47;12816:131;12942:4;12816:131;:::i;:::-;12808:139;;12535:419;;;:::o;12960:147::-;13061:11;13098:3;13083:18;;12960:147;;;;:::o;13113:114::-;;:::o;13233:398::-;13392:3;13413:83;13494:1;13489:3;13413:83;:::i;:::-;13406:90;;13505:93;13594:3;13505:93;:::i;:::-;13623:1;13618:3;13614:11;13607:18;;13233:398;;;:::o;13637:379::-;13821:3;13843:147;13986:3;13843:147;:::i;:::-;13836:154;;14007:3;14000:10;;13637:379;;;:::o;14022:244::-;14162:34;14158:1;14150:6;14146:14;14139:58;14231:27;14226:2;14218:6;14214:15;14207:52;14022:244;:::o;14272:366::-;14414:3;14435:67;14499:2;14494:3;14435:67;:::i;:::-;14428:74;;14511:93;14600:3;14511:93;:::i;:::-;14629:2;14624:3;14620:12;14613:19;;14272:366;;;:::o;14644:419::-;14810:4;14848:2;14837:9;14833:18;14825:26;;14897:9;14891:4;14887:20;14883:1;14872:9;14868:17;14861:47;14925:131;15051:4;14925:131;:::i;:::-;14917:139;;14644:419;;;:::o;15069:224::-;15209:34;15205:1;15197:6;15193:14;15186:58;15278:7;15273:2;15265:6;15261:15;15254:32;15069:224;:::o;15299:366::-;15441:3;15462:67;15526:2;15521:3;15462:67;:::i;:::-;15455:74;;15538:93;15627:3;15538:93;:::i;:::-;15656:2;15651:3;15647:12;15640:19;;15299:366;;;:::o;15671:419::-;15837:4;15875:2;15864:9;15860:18;15852:26;;15924:9;15918:4;15914:20;15910:1;15899:9;15895:17;15888:47;15952:131;16078:4;15952:131;:::i;:::-;15944:139;;15671:419;;;:::o;16096:225::-;16236:34;16232:1;16224:6;16220:14;16213:58;16305:8;16300:2;16292:6;16288:15;16281:33;16096:225;:::o;16327:366::-;16469:3;16490:67;16554:2;16549:3;16490:67;:::i;:::-;16483:74;;16566:93;16655:3;16566:93;:::i;:::-;16684:2;16679:3;16675:12;16668:19;;16327:366;;;:::o;16699:419::-;16865:4;16903:2;16892:9;16888:18;16880:26;;16952:9;16946:4;16942:20;16938:1;16927:9;16923:17;16916:47;16980:131;17106:4;16980:131;:::i;:::-;16972:139;;16699:419;;;:::o;17124:223::-;17264:34;17260:1;17252:6;17248:14;17241:58;17333:6;17328:2;17320:6;17316:15;17309:31;17124:223;:::o;17353:366::-;17495:3;17516:67;17580:2;17575:3;17516:67;:::i;:::-;17509:74;;17592:93;17681:3;17592:93;:::i;:::-;17710:2;17705:3;17701:12;17694:19;;17353:366;;;:::o;17725:419::-;17891:4;17929:2;17918:9;17914:18;17906:26;;17978:9;17972:4;17968:20;17964:1;17953:9;17949:17;17942:47;18006:131;18132:4;18006:131;:::i;:::-;17998:139;;17725:419;;;:::o;18150:221::-;18290:34;18286:1;18278:6;18274:14;18267:58;18359:4;18354:2;18346:6;18342:15;18335:29;18150:221;:::o;18377:366::-;18519:3;18540:67;18604:2;18599:3;18540:67;:::i;:::-;18533:74;;18616:93;18705:3;18616:93;:::i;:::-;18734:2;18729:3;18725:12;18718:19;;18377:366;;;:::o;18749:419::-;18915:4;18953:2;18942:9;18938:18;18930:26;;19002:9;18996:4;18992:20;18988:1;18977:9;18973:17;18966:47;19030:131;19156:4;19030:131;:::i;:::-;19022:139;;18749:419;;;:::o;19174:224::-;19314:34;19310:1;19302:6;19298:14;19291:58;19383:7;19378:2;19370:6;19366:15;19359:32;19174:224;:::o;19404:366::-;19546:3;19567:67;19631:2;19626:3;19567:67;:::i;:::-;19560:74;;19643:93;19732:3;19643:93;:::i;:::-;19761:2;19756:3;19752:12;19745:19;;19404:366;;;:::o;19776:419::-;19942:4;19980:2;19969:9;19965:18;19957:26;;20029:9;20023:4;20019:20;20015:1;20004:9;20000:17;19993:47;20057:131;20183:4;20057:131;:::i;:::-;20049:139;;19776:419;;;:::o;20201:222::-;20341:34;20337:1;20329:6;20325:14;20318:58;20410:5;20405:2;20397:6;20393:15;20386:30;20201:222;:::o;20429:366::-;20571:3;20592:67;20656:2;20651:3;20592:67;:::i;:::-;20585:74;;20668:93;20757:3;20668:93;:::i;:::-;20786:2;20781:3;20777:12;20770:19;;20429:366;;;:::o;20801:419::-;20967:4;21005:2;20994:9;20990:18;20982:26;;21054:9;21048:4;21044:20;21040:1;21029:9;21025:17;21018:47;21082:131;21208:4;21082:131;:::i;:::-;21074:139;;20801:419;;;:::o;21226:168::-;21366:20;21362:1;21354:6;21350:14;21343:44;21226:168;:::o;21400:366::-;21542:3;21563:67;21627:2;21622:3;21563:67;:::i;:::-;21556:74;;21639:93;21728:3;21639:93;:::i;:::-;21757:2;21752:3;21748:12;21741:19;;21400:366;;;:::o;21772:419::-;21938:4;21976:2;21965:9;21961:18;21953:26;;22025:9;22019:4;22015:20;22011:1;22000:9;21996:17;21989:47;22053:131;22179:4;22053:131;:::i;:::-;22045:139;;21772:419;;;:::o;22197:170::-;22337:22;22333:1;22325:6;22321:14;22314:46;22197:170;:::o;22373:366::-;22515:3;22536:67;22600:2;22595:3;22536:67;:::i;:::-;22529:74;;22612:93;22701:3;22612:93;:::i;:::-;22730:2;22725:3;22721:12;22714:19;;22373:366;;;:::o;22745:419::-;22911:4;22949:2;22938:9;22934:18;22926:26;;22998:9;22992:4;22988:20;22984:1;22973:9;22969:17;22962:47;23026:131;23152:4;23026:131;:::i;:::-;23018:139;;22745:419;;;:::o;23170:172::-;23310:24;23306:1;23298:6;23294:14;23287:48;23170:172;:::o;23348:366::-;23490:3;23511:67;23575:2;23570:3;23511:67;:::i;:::-;23504:74;;23587:93;23676:3;23587:93;:::i;:::-;23705:2;23700:3;23696:12;23689:19;;23348:366;;;:::o;23720:419::-;23886:4;23924:2;23913:9;23909:18;23901:26;;23973:9;23967:4;23963:20;23959:1;23948:9;23944:17;23937:47;24001:131;24127:4;24001:131;:::i;:::-;23993:139;;23720:419;;;:::o;24145:240::-;24285:34;24281:1;24273:6;24269:14;24262:58;24354:23;24349:2;24341:6;24337:15;24330:48;24145:240;:::o;24391:366::-;24533:3;24554:67;24618:2;24613:3;24554:67;:::i;:::-;24547:74;;24630:93;24719:3;24630:93;:::i;:::-;24748:2;24743:3;24739:12;24732:19;;24391:366;;;:::o;24763:419::-;24929:4;24967:2;24956:9;24952:18;24944:26;;25016:9;25010:4;25006:20;25002:1;24991:9;24987:17;24980:47;25044:131;25170:4;25044:131;:::i;:::-;25036:139;;24763:419;;;:::o;25188:169::-;25328:21;25324:1;25316:6;25312:14;25305:45;25188:169;:::o;25363:366::-;25505:3;25526:67;25590:2;25585:3;25526:67;:::i;:::-;25519:74;;25602:93;25691:3;25602:93;:::i;:::-;25720:2;25715:3;25711:12;25704:19;;25363:366;;;:::o;25735:419::-;25901:4;25939:2;25928:9;25924:18;25916:26;;25988:9;25982:4;25978:20;25974:1;25963:9;25959:17;25952:47;26016:131;26142:4;26016:131;:::i;:::-;26008:139;;25735:419;;;:::o;26160:241::-;26300:34;26296:1;26288:6;26284:14;26277:58;26369:24;26364:2;26356:6;26352:15;26345:49;26160:241;:::o;26407:366::-;26549:3;26570:67;26634:2;26629:3;26570:67;:::i;:::-;26563:74;;26646:93;26735:3;26646:93;:::i;:::-;26764:2;26759:3;26755:12;26748:19;;26407:366;;;:::o;26779:419::-;26945:4;26983:2;26972:9;26968:18;26960:26;;27032:9;27026:4;27022:20;27018:1;27007:9;27003:17;26996:47;27060:131;27186:4;27060:131;:::i;:::-;27052:139;;26779:419;;;:::o;27204:410::-;27244:7;27267:20;27285:1;27267:20;:::i;:::-;27262:25;;27301:20;27319:1;27301:20;:::i;:::-;27296:25;;27356:1;27353;27349:9;27378:30;27396:11;27378:30;:::i;:::-;27367:41;;27557:1;27548:7;27544:15;27541:1;27538:22;27518:1;27511:9;27491:83;27468:139;;27587:18;;:::i;:::-;27468:139;27252:362;27204:410;;;;:::o;27620:180::-;27668:77;27665:1;27658:88;27765:4;27762:1;27755:15;27789:4;27786:1;27779:15;27806:185;27846:1;27863:20;27881:1;27863:20;:::i;:::-;27858:25;;27897:20;27915:1;27897:20;:::i;:::-;27892:25;;27936:1;27926:35;;27941:18;;:::i;:::-;27926:35;27983:1;27980;27976:9;27971:14;;27806:185;;;;:::o;27997:194::-;28037:4;28057:20;28075:1;28057:20;:::i;:::-;28052:25;;28091:20;28109:1;28091:20;:::i;:::-;28086:25;;28135:1;28132;28128:9;28120:17;;28159:1;28153:4;28150:11;28147:37;;;28164:18;;:::i;:::-;28147:37;27997:194;;;;:::o;28197:225::-;28337:34;28333:1;28325:6;28321:14;28314:58;28406:8;28401:2;28393:6;28389:15;28382:33;28197:225;:::o;28428:366::-;28570:3;28591:67;28655:2;28650:3;28591:67;:::i;:::-;28584:74;;28667:93;28756:3;28667:93;:::i;:::-;28785:2;28780:3;28776:12;28769:19;;28428:366;;;:::o;28800:419::-;28966:4;29004:2;28993:9;28989:18;28981:26;;29053:9;29047:4;29043:20;29039:1;29028:9;29024:17;29017:47;29081:131;29207:4;29081:131;:::i;:::-;29073:139;;28800:419;;;:::o;29225:442::-;29374:4;29412:2;29401:9;29397:18;29389:26;;29425:71;29493:1;29482:9;29478:17;29469:6;29425:71;:::i;:::-;29506:72;29574:2;29563:9;29559:18;29550:6;29506:72;:::i;:::-;29588;29656:2;29645:9;29641:18;29632:6;29588:72;:::i;:::-;29225:442;;;;;;:::o;29673:180::-;29721:77;29718:1;29711:88;29818:4;29815:1;29808:15;29842:4;29839:1;29832:15;29859:180;29907:77;29904:1;29897:88;30004:4;30001:1;29994:15;30028:4;30025:1;30018:15;30045:143;30102:5;30133:6;30127:13;30118:22;;30149:33;30176:5;30149:33;:::i;:::-;30045:143;;;;:::o;30194:351::-;30264:6;30313:2;30301:9;30292:7;30288:23;30284:32;30281:119;;;30319:79;;:::i;:::-;30281:119;30439:1;30464:64;30520:7;30511:6;30500:9;30496:22;30464:64;:::i;:::-;30454:74;;30410:128;30194:351;;;;:::o;30551:85::-;30596:7;30625:5;30614:16;;30551:85;;;:::o;30642:158::-;30700:9;30733:61;30751:42;30760:32;30786:5;30760:32;:::i;:::-;30751:42;:::i;:::-;30733:61;:::i;:::-;30720:74;;30642:158;;;:::o;30806:147::-;30901:45;30940:5;30901:45;:::i;:::-;30896:3;30889:58;30806:147;;:::o;30959:114::-;31026:6;31060:5;31054:12;31044:22;;30959:114;;;:::o;31079:184::-;31178:11;31212:6;31207:3;31200:19;31252:4;31247:3;31243:14;31228:29;;31079:184;;;;:::o;31269:132::-;31336:4;31359:3;31351:11;;31389:4;31384:3;31380:14;31372:22;;31269:132;;;:::o;31407:108::-;31484:24;31502:5;31484:24;:::i;:::-;31479:3;31472:37;31407:108;;:::o;31521:179::-;31590:10;31611:46;31653:3;31645:6;31611:46;:::i;:::-;31689:4;31684:3;31680:14;31666:28;;31521:179;;;;:::o;31706:113::-;31776:4;31808;31803:3;31799:14;31791:22;;31706:113;;;:::o;31855:732::-;31974:3;32003:54;32051:5;32003:54;:::i;:::-;32073:86;32152:6;32147:3;32073:86;:::i;:::-;32066:93;;32183:56;32233:5;32183:56;:::i;:::-;32262:7;32293:1;32278:284;32303:6;32300:1;32297:13;32278:284;;;32379:6;32373:13;32406:63;32465:3;32450:13;32406:63;:::i;:::-;32399:70;;32492:60;32545:6;32492:60;:::i;:::-;32482:70;;32338:224;32325:1;32322;32318:9;32313:14;;32278:284;;;32282:14;32578:3;32571:10;;31979:608;;;31855:732;;;;:::o;32593:831::-;32856:4;32894:3;32883:9;32879:19;32871:27;;32908:71;32976:1;32965:9;32961:17;32952:6;32908:71;:::i;:::-;32989:80;33065:2;33054:9;33050:18;33041:6;32989:80;:::i;:::-;33116:9;33110:4;33106:20;33101:2;33090:9;33086:18;33079:48;33144:108;33247:4;33238:6;33144:108;:::i;:::-;33136:116;;33262:72;33330:2;33319:9;33315:18;33306:6;33262:72;:::i;:::-;33344:73;33412:3;33401:9;33397:19;33388:6;33344:73;:::i;:::-;32593:831;;;;;;;;:::o;33430:807::-;33679:4;33717:3;33706:9;33702:19;33694:27;;33731:71;33799:1;33788:9;33784:17;33775:6;33731:71;:::i;:::-;33812:72;33880:2;33869:9;33865:18;33856:6;33812:72;:::i;:::-;33894:80;33970:2;33959:9;33955:18;33946:6;33894:80;:::i;:::-;33984;34060:2;34049:9;34045:18;34036:6;33984:80;:::i;:::-;34074:73;34142:3;34131:9;34127:19;34118:6;34074:73;:::i;:::-;34157;34225:3;34214:9;34210:19;34201:6;34157:73;:::i;:::-;33430:807;;;;;;;;;:::o;34243:663::-;34331:6;34339;34347;34396:2;34384:9;34375:7;34371:23;34367:32;34364:119;;;34402:79;;:::i;:::-;34364:119;34522:1;34547:64;34603:7;34594:6;34583:9;34579:22;34547:64;:::i;:::-;34537:74;;34493:128;34660:2;34686:64;34742:7;34733:6;34722:9;34718:22;34686:64;:::i;:::-;34676:74;;34631:129;34799:2;34825:64;34881:7;34872:6;34861:9;34857:22;34825:64;:::i;:::-;34815:74;;34770:129;34243:663;;;;;:::o

Swarm Source

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