ETH Price: $3,895.97 (+0.29%)

Token

Phil (PHIL)
 

Overview

Max Total Supply

1,000,000,000 PHIL

Holders

11,399 ( 0.044%)

Market

Price

$0.02 @ 0.000006 ETH (+6.85%)

Onchain Market Cap

$23,120,610.00

Circulating Supply Market Cap

$23,074,153.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap: Universal Router
Balance
0 PHIL

Value
$0.00
0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PHIL Token ($PHIL) is a community focused meme coin with a vision to unite meme coins for real world good.

Market

Volume (24H):$6,373,346.00
Market Capitalization:$23,074,153.00
Circulating Supply:1,000,000,000.00 PHIL
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Phil

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-28
*/

// SPDX-License-Identifier: MIT  

/*
Website: https://www.philtoken.com/

Twitter: https://x.com/Philtokeneth

Telegram: https://t.me/Philtokeneth
                                                               
                                                               
                                                               
                                          █                    
                                         █ ██  █ █             
                                        ▓▓█▒▒▓█▓▓▒▒▓           
                                      █▓▓▓▒░░███▓▓██           
                                     ██▓▓▓▓▒░░▒▒▒▒▒▒▓          
                                    ██▓▒▓▓▓▒▒▒▒▒▒▒▒▓▓▓▓▓       
                                    █▓▓▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓       
                                    ▓█▓▒▒▒▒▒▓▓▓▓▒▓▓▓▓▓▓▓       
                                    █▓█▓▒▒▒▒▒▒  █▓▓█           
                                    ██▓▒▒▒▒▒▒                  
                                    █▓▒▒▒▒▒▒▒                  
                                    ███▓▒▒▒▒▒▒                 
                                    ██▓▒▒▒▒▒▒▒                 
          ▓██▓▓▓▓██                 ▓▓▓▒▒▒▒▒▒░▒                
     ▓▓▓▓▓▓▓▓▓▓▓▓▓█████       ██████▓▓▓▒▒▒▒▒▒▒▒                
  ▓▓▓▓█        ▓▓▓▓▓▓██████▓▓▓▓▓▓▓███▓▓▓▒▒▒▒▒▒▒                
   ▓▓▓▓          ▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▒▒▒▒▒▒▒                
                  █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▓▒▒▒▒▓▓ ▒▒             
                   ██▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▒            
                     ██▓▓▓▓▓▓▒▒▒▒▒▓▓▒▒▒▒▒▒▓▓▓▓▓▒ ▓▓            
                      ██▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ █▓▓▓▒             
                      ███▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░ ▓▒▒▒▓              
                       ███▓▓▓▓▒▒▒▒▒▒░░░░░▒                     
                         ███▓▓▒▒▓▒▒░░░▒▓▓                      
                         ██▓▓▓▒▓█▓▓▓▓▓▓                        
                        ███▓▒▓▓  ██▓▓▓                         
                       ███▓▓▓     ██▓▓                         
                       ████▓▓▓▓▓▓▒▒▓███▓▓▓▓░▒▒▒▓               
                       ███████▒▒▒▒▒▒▒▒                         

██████╗░██╗░░██╗██╗██╗░░░░░
██╔══██╗██║░░██║██║██║░░░░░
██████╔╝███████║██║██║░░░░░
██╔═══╝░██╔══██║██║██║░░░░░
██║░░░░░██║░░██║██║███████╗
╚═╝░░░░░╚═╝░░╚═╝╚═╝╚══════╝                                                               
                                                               
                                                                

*/
                                                    
pragma solidity ^0.8.9;

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

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

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

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

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

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    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 there is no error in the code. answer to your riddle is: philisagoodfriend
     */

    /**
     * @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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {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].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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 to 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 {}
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

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

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

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

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

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

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


    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint8 private _decimals;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
        
    /******************/

    // exlcude 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 marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event buyBackWalletUpdated(address indexed newWallet, address indexed oldWallet);

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

    event BuyBackTriggered(uint256 amount);
    
    event OwnerForcedSwapBack(uint256 timestamp);

    constructor() ERC20("Phil", "PHIL") {

        address _owner = _msgSender();

        _decimals = 18;

        uint256 totalSupply = 1000000000 * (10**_decimals);
        
        maxTransactionAmount = totalSupply * 1 / 100; // 1% maxTransactionAmountTxn
        maxWallet = totalSupply * 1 / 100; // 1% maxWallet

        address currentRouter;
        
        //Adding Variables for all the routers for easier deployment for our customers.
        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
        } else if (block.chainid == 43114) {
            currentRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; //Avax Mainnet
        } else if (block.chainid == 137) {
            currentRouter = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Polygon Ropsten
        } else if (block.chainid == 250) {
            currentRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; //SpookySwap FTM
        } else if (block.chainid == 3) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Ropsten
        } else if (block.chainid == 1 || block.chainid == 4) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
        } else {
            revert();
        }

        //End of Router Variables.

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(_owner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(_owner, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(_owner, totalSupply);
        transferOwnership(_owner);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
    function updateMaxAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/(10**_decimals), "Cannot set maxTransactionAmount lower than 1%");
        maxTransactionAmount = newNum * (10**_decimals);
    }
    
    function updateMaxWallet(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/(10**_decimals), "Cannot set maxTransactionAmount lower than 1%");
        maxWallet= newNum * (10**_decimals);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

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

    function setAutomatedMarketMakerPair(address pair, bool value) external 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) external view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
        }
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !(_isExcludedFromFees[from] || _isExcludedFromFees[to])
            ){
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }        
        
        super._transfer(from, to, amount);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"buyBackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"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":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600860016101000a81548160ff0219169083151502179055505f600860026101000a81548160ff02191690831515021790555034801562000045575f80fd5b506040518060400160405280600481526020017f5068696c000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5048494c000000000000000000000000000000000000000000000000000000008152508160039081620000c3919062000f16565b508060049081620000d5919062000f16565b5050505f620000e9620005f760201b60201c565b90508060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505f62000197620005f760201b60201c565b9050601260085f6101000a81548160ff021916908360ff1602179055505f60085f9054906101000a900460ff16600a620001d2919062001183565b633b9aca00620001e39190620011d3565b90506064600182620001f69190620011d3565b6200020291906200124a565b6006819055506064600182620002199190620011d3565b6200022591906200124a565b6007819055505f6038460362000252577310ed43c718714eb63d5aa57b78b54704e256024e90506200034e565b60614603620002785773d99d1c33f9fc3444f8101754abc46c52416550d190506200034d565b61a86a46036200029f577360ae616a2155ee3d9a68541ba4544862310933d490506200034c565b60894603620002c55773a5e0829caced8ffdd4de3c43696c57f7d7a678ff90506200034b565b60fa4603620002eb5773f491e7b69e4244ad4002bc14e878a34207e38c2990506200034a565b600346036200031157737a250d5630b4cf539739df2c5dacb4c659f2488d905062000349565b6001461480620003215750600446145b156200034457737a250d5630b4cf539739df2c5dacb4c659f2488d905062000348565b5f80fd5b5b5b5b5b5b5b5f81905062000365816001620005fe60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004099190620012e6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200046f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004959190620012e6565b6040518363ffffffff1660e01b8152600401620004b492919062001327565b6020604051808303815f875af1158015620004d1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004f79190620012e6565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200053f60a0516001620005fe60201b60201c565b6200055460a0516001620006f760201b60201c565b620005678460016200079560201b60201c565b6200057a3060016200079560201b60201c565b6200058f61dead60016200079560201b60201c565b620005a2846001620005fe60201b60201c565b620005b5306001620005fe60201b60201c565b620005ca61dead6001620005fe60201b60201c565b620005dc8484620008de60201b60201c565b620005ed8462000a7b60201b60201c565b50505050620015dd565b5f33905090565b6200060e620005f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200069f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069690620013b0565b60405180910390fd5b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b620007a5620005f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200082d90620013b0565b60405180910390fd5b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620008d29190620013ec565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200094f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009469062001455565b60405180910390fd5b620009625f838362000c4b60201b60201c565b620009798160025462000c5060201b90919060201c565b600281905550620009d0815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205462000c5060201b90919060201c565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a6f919062001486565b60405180910390a35050565b62000a8b620005f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b1390620013b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b849062001515565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b505050565b5f80828462000c60919062001535565b90508381101562000ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c9f90620015bd565b60405180910390fd5b8091505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000d2e57607f821691505b60208210810362000d445762000d4362000ce9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000da87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d6b565b62000db4868362000d6b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000dfe62000df862000df28462000dcc565b62000dd5565b62000dcc565b9050919050565b5f819050919050565b62000e198362000dde565b62000e3162000e288262000e05565b84845462000d77565b825550505050565b5f90565b62000e4762000e39565b62000e5481848462000e0e565b505050565b5b8181101562000e7b5762000e6f5f8262000e3d565b60018101905062000e5a565b5050565b601f82111562000eca5762000e948162000d4a565b62000e9f8462000d5c565b8101602085101562000eaf578190505b62000ec762000ebe8562000d5c565b83018262000e59565b50505b505050565b5f82821c905092915050565b5f62000eec5f198460080262000ecf565b1980831691505092915050565b5f62000f06838362000edb565b9150826002028217905092915050565b62000f218262000cb2565b67ffffffffffffffff81111562000f3d5762000f3c62000cbc565b5b62000f49825462000d16565b62000f5682828562000e7f565b5f60209050601f83116001811462000f8c575f841562000f77578287015190505b62000f83858262000ef9565b86555062000ff2565b601f19841662000f9c8662000d4a565b5f5b8281101562000fc55784890151825560018201915060208501945060208101905062000f9e565b8683101562000fe5578489015162000fe1601f89168262000edb565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562001084578086048111156200105c576200105b62000ffa565b5b60018516156200106c5780820291505b80810290506200107c8562001027565b94506200103c565b94509492505050565b5f826200109e576001905062001170565b81620010ad575f905062001170565b8160018114620010c65760028114620010d15762001107565b600191505062001170565b60ff841115620010e657620010e562000ffa565b5b8360020a9150848211156200110057620010ff62000ffa565b5b5062001170565b5060208310610133831016604e8410600b8410161715620011415782820a9050838111156200113b576200113a62000ffa565b5b62001170565b62001150848484600162001033565b925090508184048111156200116a576200116962000ffa565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200118f8262000dcc565b91506200119c8362001177565b9250620011cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200108d565b905092915050565b5f620011df8262000dcc565b9150620011ec8362000dcc565b9250828202620011fc8162000dcc565b9150828204841483151762001216576200121562000ffa565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620012568262000dcc565b9150620012638362000dcc565b9250826200127657620012756200121d565b5b828204905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620012b08262001285565b9050919050565b620012c281620012a4565b8114620012cd575f80fd5b50565b5f81519050620012e081620012b7565b92915050565b5f60208284031215620012fe57620012fd62001281565b5b5f6200130d84828501620012d0565b91505092915050565b6200132181620012a4565b82525050565b5f6040820190506200133c5f83018562001316565b6200134b602083018462001316565b9392505050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6200139860208362001352565b9150620013a58262001362565b602082019050919050565b5f6020820190508181035f830152620013c9816200138a565b9050919050565b5f8115159050919050565b620013e681620013d0565b82525050565b5f602082019050620014015f830184620013db565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6200143d601f8362001352565b91506200144a8262001407565b602082019050919050565b5f6020820190508181035f8301526200146e816200142f565b9050919050565b620014808162000dcc565b82525050565b5f6020820190506200149b5f83018462001475565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f620014fd60268362001352565b91506200150a82620014a1565b604082019050919050565b5f6020820190508181035f8301526200152e81620014ef565b9050919050565b5f620015418262000dcc565b91506200154e8362000dcc565b925082820190508082111562001569576200156862000ffa565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f620015a5601b8362001352565b9150620015b2826200156f565b602082019050919050565b5f6020820190508181035f830152620015d68162001597565b9050919050565b60805160a0516131c5620016065f395f8181610caa015261127201525f61099401526131c55ff3fe6080604052600436106101db575f3560e01c8063715018a611610101578063a9059cbb11610094578063c8c8ebe411610063578063c8c8ebe4146106c4578063dd62ed3e146106ee578063f2fde38b1461072a578063f8b45b0514610752576101e2565b8063a9059cbb146105fa578063b62496f514610636578063bbc0c74214610672578063c02466681461069c576101e2565b80638da5cb5b116100d05780638da5cb5b1461054257806395d89b411461056c5780639a7a23d614610596578063a457c2d7146105be576101e2565b8063715018a6146104c4578063751039fc146104da5780637571336a146105045780638a8c523c1461052c576101e2565b806323b872dd1161017957806349bd5a5e1161014857806349bd5a5e146103f85780634a62bb65146104225780634fbee1931461044c57806370a0823114610488576101e2565b806323b872dd1461032c57806327c8f83514610368578063313ce5671461039257806339509351146103bc576101e2565b806310d5de53116101b557806310d5de53146102745780631694505e146102b057806318160ddd146102da5780631c499ab014610304576101e2565b806306fdde03146101e6578063095ea7b314610210578063106b5da11461024c576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa61077c565b6040516102079190612411565b60405180910390f35b34801561021b575f80fd5b50610236600480360381019061023191906124c2565b61080c565b604051610243919061251a565b60405180910390f35b348015610257575f80fd5b50610272600480360381019061026d9190612533565b610829565b005b34801561027f575f80fd5b5061029a6004803603810190610295919061255e565b610975565b6040516102a7919061251a565b60405180910390f35b3480156102bb575f80fd5b506102c4610992565b6040516102d191906125e4565b60405180910390f35b3480156102e5575f80fd5b506102ee6109b6565b6040516102fb919061260c565b60405180910390f35b34801561030f575f80fd5b5061032a60048036038101906103259190612533565b6109bf565b005b348015610337575f80fd5b50610352600480360381019061034d9190612625565b610b0b565b60405161035f919061251a565b60405180910390f35b348015610373575f80fd5b5061037c610bdf565b6040516103899190612684565b60405180910390f35b34801561039d575f80fd5b506103a6610be5565b6040516103b391906126b8565b60405180910390f35b3480156103c7575f80fd5b506103e260048036038101906103dd91906124c2565b610bfa565b6040516103ef919061251a565b60405180910390f35b348015610403575f80fd5b5061040c610ca8565b6040516104199190612684565b60405180910390f35b34801561042d575f80fd5b50610436610ccc565b604051610443919061251a565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d919061255e565b610cdf565b60405161047f919061251a565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a9919061255e565b610d31565b6040516104bb919061260c565b60405180910390f35b3480156104cf575f80fd5b506104d8610d76565b005b3480156104e5575f80fd5b506104ee610ec9565b6040516104fb919061251a565b60405180910390f35b34801561050f575f80fd5b5061052a600480360381019061052591906126fb565b610f81565b005b348015610537575f80fd5b5061054061106f565b005b34801561054d575f80fd5b50610556611122565b6040516105639190612684565b60405180910390f35b348015610577575f80fd5b5061058061114a565b60405161058d9190612411565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b791906126fb565b6111da565b005b3480156105c9575f80fd5b506105e460048036038101906105df91906124c2565b61130c565b6040516105f1919061251a565b60405180910390f35b348015610605575f80fd5b50610620600480360381019061061b91906124c2565b6113d4565b60405161062d919061251a565b60405180910390f35b348015610641575f80fd5b5061065c6004803603810190610657919061255e565b6113f1565b604051610669919061251a565b60405180910390f35b34801561067d575f80fd5b5061068661140e565b604051610693919061251a565b60405180910390f35b3480156106a7575f80fd5b506106c260048036038101906106bd91906126fb565b611421565b005b3480156106cf575f80fd5b506106d861155d565b6040516106e5919061260c565b60405180910390f35b3480156106f9575f80fd5b50610714600480360381019061070f9190612739565b611563565b604051610721919061260c565b60405180910390f35b348015610735575f80fd5b50610750600480360381019061074b919061255e565b6115e5565b005b34801561075d575f80fd5b506107666117a7565b604051610773919061260c565b60405180910390f35b60606003805461078b906127a4565b80601f01602080910402602001604051908101604052809291908181526020018280546107b7906127a4565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b5f61081f6108186117ad565b84846117b4565b6001905092915050565b6108316117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b69061281e565b60405180910390fd5b60085f9054906101000a900460ff16600a6108da9190612998565b606460016108e66109b6565b6108f091906129e2565b6108fa9190612a50565b6109049190612a50565b811015610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612af0565b60405180910390fd5b60085f9054906101000a900460ff16600a6109619190612998565b8161096c91906129e2565b60068190555050565b600a602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b6109c76117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c9061281e565b60405180910390fd5b60085f9054906101000a900460ff16600a610a709190612998565b60646001610a7c6109b6565b610a8691906129e2565b610a909190612a50565b610a9a9190612a50565b811015610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390612af0565b60405180910390fd5b60085f9054906101000a900460ff16600a610af79190612998565b81610b0291906129e2565b60078190555050565b5f610b17848484611977565b610bd484610b236117ad565b610bcf856040518060600160405280602881526020016131436028913960015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610b866117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b6117b4565b600190509392505050565b61dead81565b5f60085f9054906101000a900460ff16905090565b5f610c9e610c066117ad565b84610c998560015f610c166117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ffe90919063ffffffff16565b6117b4565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600860019054906101000a900460ff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610d7e6117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e039061281e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f610ed26117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061281e565b60405180910390fd5b5f600860016101000a81548160ff0219169083151502179055506001905090565b610f896117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e9061281e565b60405180910390fd5b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6110776117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061281e565b60405180910390fd5b6001600860026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611159906127a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611185906127a4565b80156111d05780601f106111a7576101008083540402835291602001916111d0565b820191905f5260205f20905b8154815290600101906020018083116111b357829003601f168201915b5050505050905090565b6111e26117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112679061281e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612b7e565b60405180910390fd5b611308828261205b565b5050565b5f6113ca6113186117ad565b846113c58560405180606001604052806025815260200161316b6025913960015f6113416117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b6117b4565b6001905092915050565b5f6113e76113e06117ad565b8484611977565b6001905092915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b600860029054906101000a900460ff1681565b6114296117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae9061281e565b60405180910390fd5b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611551919061251a565b60405180910390a25050565b60065481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6115ed6117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116729061281e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090612c0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990612c9a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790612d28565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161196a919061260c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90612db6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612e44565b60405180910390fd5b600860029054906101000a900460ff16611b425760095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611b02575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890612eac565b60405180910390fd5b5b5f8103611b5957611b5483835f6120f9565b611f97565b600860019054906101000a900460ff1615611f8b57611b76611122565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611be45750611bb4611122565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c1c57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c56575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cfa575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611cf8575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b15611f8a57600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611d9c5750600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611e4357600654811115611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90612f3a565b60405180910390fd5b600754611df283610d31565b82611dfd9190612f58565b1115611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590612fd5565b60405180910390fd5b611f89565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611ee05750600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611f2f57600654811115611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190613063565b60405180910390fd5b611f88565b600754611f3b83610d31565b82611f469190612f58565b1115611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90612fd5565b60405180910390fd5b5b5b5b5b611f968383836120f9565b5b505050565b5f838311158290611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda9190612411565b60405180910390fd5b505f8385611ff19190613081565b9050809150509392505050565b5f80828461200c9190612f58565b905083811015612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906130fe565b60405180910390fd5b8091505092915050565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90612db6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90612e44565b60405180910390fd5b6121e0838383612382565b6122498160405180606001604052806026815260200161311d602691395f808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506122d8815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ffe90919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612375919061260c565b60405180910390a3505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156123be5780820151818401526020810190506123a3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6123e382612387565b6123ed8185612391565b93506123fd8185602086016123a1565b612406816123c9565b840191505092915050565b5f6020820190508181035f83015261242981846123d9565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61245e82612435565b9050919050565b61246e81612454565b8114612478575f80fd5b50565b5f8135905061248981612465565b92915050565b5f819050919050565b6124a18161248f565b81146124ab575f80fd5b50565b5f813590506124bc81612498565b92915050565b5f80604083850312156124d8576124d7612431565b5b5f6124e58582860161247b565b92505060206124f6858286016124ae565b9150509250929050565b5f8115159050919050565b61251481612500565b82525050565b5f60208201905061252d5f83018461250b565b92915050565b5f6020828403121561254857612547612431565b5b5f612555848285016124ae565b91505092915050565b5f6020828403121561257357612572612431565b5b5f6125808482850161247b565b91505092915050565b5f819050919050565b5f6125ac6125a76125a284612435565b612589565b612435565b9050919050565b5f6125bd82612592565b9050919050565b5f6125ce826125b3565b9050919050565b6125de816125c4565b82525050565b5f6020820190506125f75f8301846125d5565b92915050565b6126068161248f565b82525050565b5f60208201905061261f5f8301846125fd565b92915050565b5f805f6060848603121561263c5761263b612431565b5b5f6126498682870161247b565b935050602061265a8682870161247b565b925050604061266b868287016124ae565b9150509250925092565b61267e81612454565b82525050565b5f6020820190506126975f830184612675565b92915050565b5f60ff82169050919050565b6126b28161269d565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b6126da81612500565b81146126e4575f80fd5b50565b5f813590506126f5816126d1565b92915050565b5f806040838503121561271157612710612431565b5b5f61271e8582860161247b565b925050602061272f858286016126e7565b9150509250929050565b5f806040838503121561274f5761274e612431565b5b5f61275c8582860161247b565b925050602061276d8582860161247b565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806127bb57607f821691505b6020821081036127ce576127cd612777565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612808602083612391565b9150612813826127d4565b602082019050919050565b5f6020820190508181035f830152612835816127fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156128be5780860481111561289a5761289961283c565b5b60018516156128a95780820291505b80810290506128b785612869565b945061287e565b94509492505050565b5f826128d65760019050612991565b816128e3575f9050612991565b81600181146128f9576002811461290357612932565b6001915050612991565b60ff8411156129155761291461283c565b5b8360020a91508482111561292c5761292b61283c565b5b50612991565b5060208310610133831016604e8410600b84101617156129675782820a9050838111156129625761296161283c565b5b612991565b6129748484846001612875565b9250905081840481111561298b5761298a61283c565b5b81810290505b9392505050565b5f6129a28261248f565b91506129ad8361269d565b92506129da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846128c7565b905092915050565b5f6129ec8261248f565b91506129f78361248f565b9250828202612a058161248f565b91508282048414831517612a1c57612a1b61283c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612a5a8261248f565b9150612a658361248f565b925082612a7557612a74612a23565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20312500000000000000000000000000000000000000602082015250565b5f612ada602d83612391565b9150612ae582612a80565b604082019050919050565b5f6020820190508181035f830152612b0781612ace565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f612b68603983612391565b9150612b7382612b0e565b604082019050919050565b5f6020820190508181035f830152612b9581612b5c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612bf6602683612391565b9150612c0182612b9c565b604082019050919050565b5f6020820190508181035f830152612c2381612bea565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612c84602483612391565b9150612c8f82612c2a565b604082019050919050565b5f6020820190508181035f830152612cb181612c78565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612d12602283612391565b9150612d1d82612cb8565b604082019050919050565b5f6020820190508181035f830152612d3f81612d06565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612da0602583612391565b9150612dab82612d46565b604082019050919050565b5f6020820190508181035f830152612dcd81612d94565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612e2e602383612391565b9150612e3982612dd4565b604082019050919050565b5f6020820190508181035f830152612e5b81612e22565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f612e96601683612391565b9150612ea182612e62565b602082019050919050565b5f6020820190508181035f830152612ec381612e8a565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f612f24603583612391565b9150612f2f82612eca565b604082019050919050565b5f6020820190508181035f830152612f5181612f18565b9050919050565b5f612f628261248f565b9150612f6d8361248f565b9250828201905080821115612f8557612f8461283c565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f612fbf601383612391565b9150612fca82612f8b565b602082019050919050565b5f6020820190508181035f830152612fec81612fb3565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f61304d603683612391565b915061305882612ff3565b604082019050919050565b5f6020820190508181035f83015261307a81613041565b9050919050565b5f61308b8261248f565b91506130968361248f565b92508282039050818111156130ae576130ad61283c565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6130e8601b83612391565b91506130f3826130b4565b602082019050919050565b5f6020820190508181035f830152613115816130dc565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205359342575d73cecd408eab2f8e59631f0932c289e874c92064f75eaf6b83ec764736f6c63430008140033

Deployed Bytecode

0x6080604052600436106101db575f3560e01c8063715018a611610101578063a9059cbb11610094578063c8c8ebe411610063578063c8c8ebe4146106c4578063dd62ed3e146106ee578063f2fde38b1461072a578063f8b45b0514610752576101e2565b8063a9059cbb146105fa578063b62496f514610636578063bbc0c74214610672578063c02466681461069c576101e2565b80638da5cb5b116100d05780638da5cb5b1461054257806395d89b411461056c5780639a7a23d614610596578063a457c2d7146105be576101e2565b8063715018a6146104c4578063751039fc146104da5780637571336a146105045780638a8c523c1461052c576101e2565b806323b872dd1161017957806349bd5a5e1161014857806349bd5a5e146103f85780634a62bb65146104225780634fbee1931461044c57806370a0823114610488576101e2565b806323b872dd1461032c57806327c8f83514610368578063313ce5671461039257806339509351146103bc576101e2565b806310d5de53116101b557806310d5de53146102745780631694505e146102b057806318160ddd146102da5780631c499ab014610304576101e2565b806306fdde03146101e6578063095ea7b314610210578063106b5da11461024c576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa61077c565b6040516102079190612411565b60405180910390f35b34801561021b575f80fd5b50610236600480360381019061023191906124c2565b61080c565b604051610243919061251a565b60405180910390f35b348015610257575f80fd5b50610272600480360381019061026d9190612533565b610829565b005b34801561027f575f80fd5b5061029a6004803603810190610295919061255e565b610975565b6040516102a7919061251a565b60405180910390f35b3480156102bb575f80fd5b506102c4610992565b6040516102d191906125e4565b60405180910390f35b3480156102e5575f80fd5b506102ee6109b6565b6040516102fb919061260c565b60405180910390f35b34801561030f575f80fd5b5061032a60048036038101906103259190612533565b6109bf565b005b348015610337575f80fd5b50610352600480360381019061034d9190612625565b610b0b565b60405161035f919061251a565b60405180910390f35b348015610373575f80fd5b5061037c610bdf565b6040516103899190612684565b60405180910390f35b34801561039d575f80fd5b506103a6610be5565b6040516103b391906126b8565b60405180910390f35b3480156103c7575f80fd5b506103e260048036038101906103dd91906124c2565b610bfa565b6040516103ef919061251a565b60405180910390f35b348015610403575f80fd5b5061040c610ca8565b6040516104199190612684565b60405180910390f35b34801561042d575f80fd5b50610436610ccc565b604051610443919061251a565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d919061255e565b610cdf565b60405161047f919061251a565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a9919061255e565b610d31565b6040516104bb919061260c565b60405180910390f35b3480156104cf575f80fd5b506104d8610d76565b005b3480156104e5575f80fd5b506104ee610ec9565b6040516104fb919061251a565b60405180910390f35b34801561050f575f80fd5b5061052a600480360381019061052591906126fb565b610f81565b005b348015610537575f80fd5b5061054061106f565b005b34801561054d575f80fd5b50610556611122565b6040516105639190612684565b60405180910390f35b348015610577575f80fd5b5061058061114a565b60405161058d9190612411565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b791906126fb565b6111da565b005b3480156105c9575f80fd5b506105e460048036038101906105df91906124c2565b61130c565b6040516105f1919061251a565b60405180910390f35b348015610605575f80fd5b50610620600480360381019061061b91906124c2565b6113d4565b60405161062d919061251a565b60405180910390f35b348015610641575f80fd5b5061065c6004803603810190610657919061255e565b6113f1565b604051610669919061251a565b60405180910390f35b34801561067d575f80fd5b5061068661140e565b604051610693919061251a565b60405180910390f35b3480156106a7575f80fd5b506106c260048036038101906106bd91906126fb565b611421565b005b3480156106cf575f80fd5b506106d861155d565b6040516106e5919061260c565b60405180910390f35b3480156106f9575f80fd5b50610714600480360381019061070f9190612739565b611563565b604051610721919061260c565b60405180910390f35b348015610735575f80fd5b50610750600480360381019061074b919061255e565b6115e5565b005b34801561075d575f80fd5b506107666117a7565b604051610773919061260c565b60405180910390f35b60606003805461078b906127a4565b80601f01602080910402602001604051908101604052809291908181526020018280546107b7906127a4565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b5f61081f6108186117ad565b84846117b4565b6001905092915050565b6108316117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b69061281e565b60405180910390fd5b60085f9054906101000a900460ff16600a6108da9190612998565b606460016108e66109b6565b6108f091906129e2565b6108fa9190612a50565b6109049190612a50565b811015610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612af0565b60405180910390fd5b60085f9054906101000a900460ff16600a6109619190612998565b8161096c91906129e2565b60068190555050565b600a602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b6109c76117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c9061281e565b60405180910390fd5b60085f9054906101000a900460ff16600a610a709190612998565b60646001610a7c6109b6565b610a8691906129e2565b610a909190612a50565b610a9a9190612a50565b811015610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390612af0565b60405180910390fd5b60085f9054906101000a900460ff16600a610af79190612998565b81610b0291906129e2565b60078190555050565b5f610b17848484611977565b610bd484610b236117ad565b610bcf856040518060600160405280602881526020016131436028913960015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610b866117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b6117b4565b600190509392505050565b61dead81565b5f60085f9054906101000a900460ff16905090565b5f610c9e610c066117ad565b84610c998560015f610c166117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ffe90919063ffffffff16565b6117b4565b6001905092915050565b7f000000000000000000000000c3576f38c32e95e36bbd8d91e6cbe646a372311081565b600860019054906101000a900460ff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610d7e6117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e039061281e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f610ed26117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061281e565b60405180910390fd5b5f600860016101000a81548160ff0219169083151502179055506001905090565b610f896117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e9061281e565b60405180910390fd5b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6110776117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061281e565b60405180910390fd5b6001600860026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611159906127a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611185906127a4565b80156111d05780601f106111a7576101008083540402835291602001916111d0565b820191905f5260205f20905b8154815290600101906020018083116111b357829003601f168201915b5050505050905090565b6111e26117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112679061281e565b60405180910390fd5b7f000000000000000000000000c3576f38c32e95e36bbd8d91e6cbe646a372311073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612b7e565b60405180910390fd5b611308828261205b565b5050565b5f6113ca6113186117ad565b846113c58560405180606001604052806025815260200161316b6025913960015f6113416117ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b6117b4565b6001905092915050565b5f6113e76113e06117ad565b8484611977565b6001905092915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b600860029054906101000a900460ff1681565b6114296117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae9061281e565b60405180910390fd5b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611551919061251a565b60405180910390a25050565b60065481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6115ed6117ad565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116729061281e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090612c0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990612c9a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790612d28565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161196a919061260c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90612db6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612e44565b60405180910390fd5b600860029054906101000a900460ff16611b425760095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611b02575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890612eac565b60405180910390fd5b5b5f8103611b5957611b5483835f6120f9565b611f97565b600860019054906101000a900460ff1615611f8b57611b76611122565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611be45750611bb4611122565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c1c57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c56575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cfa575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611cf8575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b15611f8a57600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611d9c5750600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611e4357600654811115611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90612f3a565b60405180910390fd5b600754611df283610d31565b82611dfd9190612f58565b1115611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590612fd5565b60405180910390fd5b611f89565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611ee05750600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611f2f57600654811115611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2190613063565b60405180910390fd5b611f88565b600754611f3b83610d31565b82611f469190612f58565b1115611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90612fd5565b60405180910390fd5b5b5b5b5b611f968383836120f9565b5b505050565b5f838311158290611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda9190612411565b60405180910390fd5b505f8385611ff19190613081565b9050809150509392505050565b5f80828461200c9190612f58565b905083811015612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906130fe565b60405180910390fd5b8091505092915050565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90612db6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90612e44565b60405180910390fd5b6121e0838383612382565b6122498160405180606001604052806026815260200161311d602691395f808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f9c9092919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506122d8815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611ffe90919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612375919061260c565b60405180910390a3505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156123be5780820151818401526020810190506123a3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6123e382612387565b6123ed8185612391565b93506123fd8185602086016123a1565b612406816123c9565b840191505092915050565b5f6020820190508181035f83015261242981846123d9565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61245e82612435565b9050919050565b61246e81612454565b8114612478575f80fd5b50565b5f8135905061248981612465565b92915050565b5f819050919050565b6124a18161248f565b81146124ab575f80fd5b50565b5f813590506124bc81612498565b92915050565b5f80604083850312156124d8576124d7612431565b5b5f6124e58582860161247b565b92505060206124f6858286016124ae565b9150509250929050565b5f8115159050919050565b61251481612500565b82525050565b5f60208201905061252d5f83018461250b565b92915050565b5f6020828403121561254857612547612431565b5b5f612555848285016124ae565b91505092915050565b5f6020828403121561257357612572612431565b5b5f6125808482850161247b565b91505092915050565b5f819050919050565b5f6125ac6125a76125a284612435565b612589565b612435565b9050919050565b5f6125bd82612592565b9050919050565b5f6125ce826125b3565b9050919050565b6125de816125c4565b82525050565b5f6020820190506125f75f8301846125d5565b92915050565b6126068161248f565b82525050565b5f60208201905061261f5f8301846125fd565b92915050565b5f805f6060848603121561263c5761263b612431565b5b5f6126498682870161247b565b935050602061265a8682870161247b565b925050604061266b868287016124ae565b9150509250925092565b61267e81612454565b82525050565b5f6020820190506126975f830184612675565b92915050565b5f60ff82169050919050565b6126b28161269d565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b6126da81612500565b81146126e4575f80fd5b50565b5f813590506126f5816126d1565b92915050565b5f806040838503121561271157612710612431565b5b5f61271e8582860161247b565b925050602061272f858286016126e7565b9150509250929050565b5f806040838503121561274f5761274e612431565b5b5f61275c8582860161247b565b925050602061276d8582860161247b565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806127bb57607f821691505b6020821081036127ce576127cd612777565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612808602083612391565b9150612813826127d4565b602082019050919050565b5f6020820190508181035f830152612835816127fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156128be5780860481111561289a5761289961283c565b5b60018516156128a95780820291505b80810290506128b785612869565b945061287e565b94509492505050565b5f826128d65760019050612991565b816128e3575f9050612991565b81600181146128f9576002811461290357612932565b6001915050612991565b60ff8411156129155761291461283c565b5b8360020a91508482111561292c5761292b61283c565b5b50612991565b5060208310610133831016604e8410600b84101617156129675782820a9050838111156129625761296161283c565b5b612991565b6129748484846001612875565b9250905081840481111561298b5761298a61283c565b5b81810290505b9392505050565b5f6129a28261248f565b91506129ad8361269d565b92506129da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846128c7565b905092915050565b5f6129ec8261248f565b91506129f78361248f565b9250828202612a058161248f565b91508282048414831517612a1c57612a1b61283c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612a5a8261248f565b9150612a658361248f565b925082612a7557612a74612a23565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20312500000000000000000000000000000000000000602082015250565b5f612ada602d83612391565b9150612ae582612a80565b604082019050919050565b5f6020820190508181035f830152612b0781612ace565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f612b68603983612391565b9150612b7382612b0e565b604082019050919050565b5f6020820190508181035f830152612b9581612b5c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612bf6602683612391565b9150612c0182612b9c565b604082019050919050565b5f6020820190508181035f830152612c2381612bea565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612c84602483612391565b9150612c8f82612c2a565b604082019050919050565b5f6020820190508181035f830152612cb181612c78565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612d12602283612391565b9150612d1d82612cb8565b604082019050919050565b5f6020820190508181035f830152612d3f81612d06565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612da0602583612391565b9150612dab82612d46565b604082019050919050565b5f6020820190508181035f830152612dcd81612d94565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612e2e602383612391565b9150612e3982612dd4565b604082019050919050565b5f6020820190508181035f830152612e5b81612e22565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f612e96601683612391565b9150612ea182612e62565b602082019050919050565b5f6020820190508181035f830152612ec381612e8a565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f612f24603583612391565b9150612f2f82612eca565b604082019050919050565b5f6020820190508181035f830152612f5181612f18565b9050919050565b5f612f628261248f565b9150612f6d8361248f565b9250828201905080821115612f8557612f8461283c565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f612fbf601383612391565b9150612fca82612f8b565b602082019050919050565b5f6020820190508181035f830152612fec81612fb3565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f61304d603683612391565b915061305882612ff3565b604082019050919050565b5f6020820190508181035f83015261307a81613041565b9050919050565b5f61308b8261248f565b91506130968361248f565b92508282039050818111156130ae576130ad61283c565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6130e8601b83612391565b91506130f3826130b4565b602082019050919050565b5f6020820190508181035f830152613115816130dc565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205359342575d73cecd408eab2f8e59631f0932c289e874c92064f75eaf6b83ec764736f6c63430008140033

Deployed Bytecode Sourcemap

33450:7821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11498:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13773:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38021:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34033:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33524:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12618:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38279:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14424:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33627:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38677:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15188:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33582:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33802:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39421:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12789;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26071:148;;;;;;;;;;;;;:::i;:::-;;37889:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38525:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37750:83;;;;;;;;;;;;;:::i;:::-;;25429:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11717:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38967:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15909:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13237:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34255:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33842:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38777:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33697:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13475:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26374:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33739:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11498:100;11552:13;11585:5;11578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11498:100;:::o;13773:169::-;13856:4;13873:39;13882:12;:10;:12::i;:::-;13896:7;13905:6;13873:8;:39::i;:::-;13930:4;13923:11;;13773:169;;;;:::o;38021:246::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38141:9:::1;;;;;;;;;;;38137:2;:13;;;;:::i;:::-;38131:3;38127:1;38111:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:23;;;;:::i;:::-;38110:41;;;;:::i;:::-;38100:6;:51;;38092:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;38249:9;;;;;;;;;;;38245:2;:13;;;;:::i;:::-;38235:6;:24;;;;:::i;:::-;38212:20;:47;;;;38021:246:::0;:::o;34033:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;33524:51::-;;;:::o;12618:108::-;12679:7;12706:12;;12699:19;;12618:108;:::o;38279:234::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38399:9:::1;;;;;;;;;;;38395:2;:13;;;;:::i;:::-;38389:3;38385:1;38369:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:23;;;;:::i;:::-;38368:41;;;;:::i;:::-;38358:6;:51;;38350:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;38495:9;;;;;;;;;;;38491:2;:13;;;;:::i;:::-;38481:6;:24;;;;:::i;:::-;38470:9;:35;;;;38279:234:::0;:::o;14424:355::-;14564:4;14581:36;14591:6;14599:9;14610:6;14581:9;:36::i;:::-;14628:121;14637:6;14645:12;:10;:12::i;:::-;14659:89;14697:6;14659:89;;;;;;;;;;;;;;;;;:11;:19;14671:6;14659:19;;;;;;;;;;;;;;;:33;14679:12;:10;:12::i;:::-;14659:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;14628:8;:121::i;:::-;14767:4;14760:11;;14424:355;;;;;:::o;33627:53::-;33673:6;33627:53;:::o;38677:92::-;38727:5;38752:9;;;;;;;;;;;38745:16;;38677:92;:::o;15188:218::-;15276:4;15293:83;15302:12;:10;:12::i;:::-;15316:7;15325:50;15364:10;15325:11;:25;15337:12;:10;:12::i;:::-;15325:25;;;;;;;;;;;;;;;:34;15351:7;15325:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;15293:8;:83::i;:::-;15394:4;15387:11;;15188:218;;;;:::o;33582:38::-;;;:::o;33802:33::-;;;;;;;;;;;;;:::o;39421:127::-;39488:4;39512:19;:28;39532:7;39512:28;;;;;;;;;;;;;;;;;;;;;;;;;39505:35;;39421:127;;;:::o;12789:::-;12863:7;12890:9;:18;12900:7;12890:18;;;;;;;;;;;;;;;;12883:25;;12789:127;;;:::o;26071:148::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26178:1:::1;26141:40;;26162:6;;;;;;;;;;;26141:40;;;;;;;;;;;;26209:1;26192:6;;:19;;;;;;;;;;;;;;;;;;26071:148::o:0;37889:120::-;37941:4;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37974:5:::1;37957:14;;:22;;;;;;;;;;;;;;;;;;37997:4;37990:11;;37889:120:::0;:::o;38525:144::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38657:4:::1;38615:31;:39;38647:6;38615:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38525:144:::0;;:::o;37750:83::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37821:4:::1;37805:13;;:20;;;;;;;;;;;;;;;;;;37750:83::o:0;25429:79::-;25467:7;25494:6;;;;;;;;;;;25487:13;;25429:79;:::o;11717:104::-;11773:13;11806:7;11799:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11717:104;:::o;38967:246::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39076:13:::1;39068:21;;:4;:21;;::::0;39060:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39164:41;39193:4;39199:5;39164:28;:41::i;:::-;38967:246:::0;;:::o;15909:269::-;16002:4;16019:129;16028:12;:10;:12::i;:::-;16042:7;16051:96;16090:15;16051:96;;;;;;;;;;;;;;;;;:11;:25;16063:12;:10;:12::i;:::-;16051:25;;;;;;;;;;;;;;;:34;16077:7;16051:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;16019:8;:129::i;:::-;16166:4;16159:11;;15909:269;;;;:::o;13237:175::-;13323:4;13340:42;13350:12;:10;:12::i;:::-;13364:9;13375:6;13340:9;:42::i;:::-;13400:4;13393:11;;13237:175;;;;:::o;34255:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;33842:33::-;;;;;;;;;;;;;:::o;38777:182::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38893:8:::1;38862:19;:28;38882:7;38862:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;38933:7;38917:34;;;38942:8;38917:34;;;;;;:::i;:::-;;;;;;;;38777:182:::0;;:::o;33697:35::-;;;;:::o;13475:151::-;13564:7;13591:11;:18;13603:5;13591:18;;;;;;;;;;;;;;;:27;13610:7;13591:27;;;;;;;;;;;;;;;;13584:34;;13475:151;;;;:::o;26374:244::-;25651:12;:10;:12::i;:::-;25641:22;;:6;;;;;;;;;;;:22;;;25633:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26483:1:::1;26463:22;;:8;:22;;::::0;26455:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26573:8;26544:38;;26565:6;;;;;;;;;;;26544:38;;;;;;;;;;;;26602:8;26593:6;;:17;;;;;;;;;;;;;;;;;;26374:244:::0;:::o;33739:24::-;;;;:::o;4134:98::-;4187:7;4214:10;4207:17;;4134:98;:::o;19095:380::-;19248:1;19231:19;;:5;:19;;;19223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19329:1;19310:21;;:7;:21;;;19302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19413:6;19383:11;:18;19395:5;19383:18;;;;;;;;;;;;;;;:27;19402:7;19383:27;;;;;;;;;;;;;;;:36;;;;19451:7;19435:32;;19444:5;19435:32;;;19460:6;19435:32;;;;;;:::i;:::-;;;;;;;;19095:380;;;:::o;39560:1706::-;39708:1;39692:18;;:4;:18;;;39684:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39785:1;39771:16;;:2;:16;;;39763:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39842:13;;;;;;;;;;;39838:132;;39879:19;:25;39899:4;39879:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;39908:19;:23;39928:2;39908:23;;;;;;;;;;;;;;;;;;;;;;;;;39879:52;39871:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39838:132;39994:1;39984:6;:11;39981:92;;40012:28;40028:4;40034:2;40038:1;40012:15;:28::i;:::-;40055:7;;39981:92;40096:14;;;;;;;;;;;40093:1104;;;40156:7;:5;:7::i;:::-;40148:15;;:4;:15;;;;:49;;;;;40190:7;:5;:7::i;:::-;40184:13;;:2;:13;;;;40148:49;:86;;;;;40232:1;40218:16;;:2;:16;;;;40148:86;:128;;;;;40269:6;40255:21;;:2;:21;;;;40148:128;:204;;;;;40299:19;:25;40319:4;40299:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;40328:19;:23;40348:2;40328:23;;;;;;;;;;;;;;;;;;;;;;;;;40299:52;40297:55;40148:204;40126:1060;;;40437:25;:31;40463:4;40437:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;40473:31;:35;40505:2;40473:35;;;;;;;;;;;;;;;;;;;;;;;;;40472:36;40437:71;40433:738;;;40555:20;;40545:6;:30;;40537:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;40694:9;;40677:13;40687:2;40677:9;:13::i;:::-;40668:6;:22;;;;:::i;:::-;:35;;40660:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;40433:738;;;40821:25;:29;40847:2;40821:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;40855:31;:37;40887:4;40855:37;;;;;;;;;;;;;;;;;;;;;;;;;40854:38;40821:71;40817:354;;;40939:20;;40929:6;:30;;40921:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;40817:354;;;41118:9;;41101:13;41111:2;41101:9;:13::i;:::-;41092:6;:22;;;;:::i;:::-;:35;;41084:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;40817:354;40433:738;40126:1060;40093:1104;41225:33;41241:4;41247:2;41251:6;41225:15;:33::i;:::-;39560:1706;;;;:::o;21376:192::-;21462:7;21495:1;21490;:6;;21498:12;21482:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21522:9;21538:1;21534;:5;;;;:::i;:::-;21522:17;;21559:1;21552:8;;;21376:192;;;;;:::o;20473:181::-;20531:7;20551:9;20567:1;20563;:5;;;;:::i;:::-;20551:17;;20592:1;20587;:6;;20579:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;20645:1;20638:8;;;20473:181;;;;:::o;39225:188::-;39342:5;39308:25;:31;39334:4;39308:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;39399:5;39365:40;;39393:4;39365:40;;;;;;;;;;;;39225:188;;:::o;16668:573::-;16826:1;16808:20;;:6;:20;;;16800:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;16910:1;16889:23;;:9;:23;;;16881:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16965:47;16986:6;16994:9;17005:6;16965:20;:47::i;:::-;17045:71;17067:6;17045:71;;;;;;;;;;;;;;;;;:9;:17;17055:6;17045:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;17025:9;:17;17035:6;17025:17;;;;;;;;;;;;;;;:91;;;;17150:32;17175:6;17150:9;:20;17160:9;17150:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;17127:9;:20;17137:9;17127:20;;;;;;;;;;;;;;;:55;;;;17215:9;17198:35;;17207:6;17198:35;;;17226:6;17198:35;;;;;;:::i;:::-;;;;;;;;16668:573;;;:::o;20078:125::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:::-;3840:6;3889:2;3877:9;3868:7;3864:23;3860:32;3857:119;;;3895:79;;:::i;:::-;3857:119;4015:1;4040:53;4085:7;4076:6;4065:9;4061:22;4040:53;:::i;:::-;4030:63;;3986:117;3781:329;;;;:::o;4116:60::-;4144:3;4165:5;4158:12;;4116:60;;;:::o;4182:142::-;4232:9;4265:53;4283:34;4292:24;4310:5;4292:24;:::i;:::-;4283:34;:::i;:::-;4265:53;:::i;:::-;4252:66;;4182:142;;;:::o;4330:126::-;4380:9;4413:37;4444:5;4413:37;:::i;:::-;4400:50;;4330:126;;;:::o;4462:153::-;4539:9;4572:37;4603:5;4572:37;:::i;:::-;4559:50;;4462:153;;;:::o;4621:185::-;4735:64;4793:5;4735:64;:::i;:::-;4730:3;4723:77;4621:185;;:::o;4812:276::-;4932:4;4970:2;4959:9;4955:18;4947:26;;4983:98;5078:1;5067:9;5063:17;5054:6;4983:98;:::i;:::-;4812:276;;;;:::o;5094:118::-;5181:24;5199:5;5181:24;:::i;:::-;5176:3;5169:37;5094:118;;:::o;5218:222::-;5311:4;5349:2;5338:9;5334:18;5326:26;;5362:71;5430:1;5419:9;5415:17;5406:6;5362:71;:::i;:::-;5218:222;;;;:::o;5446:619::-;5523:6;5531;5539;5588:2;5576:9;5567:7;5563:23;5559:32;5556:119;;;5594:79;;:::i;:::-;5556:119;5714:1;5739:53;5784:7;5775:6;5764:9;5760:22;5739:53;:::i;:::-;5729:63;;5685:117;5841:2;5867:53;5912:7;5903:6;5892:9;5888:22;5867:53;:::i;:::-;5857:63;;5812:118;5969:2;5995:53;6040:7;6031:6;6020:9;6016:22;5995:53;:::i;:::-;5985:63;;5940:118;5446:619;;;;;:::o;6071:118::-;6158:24;6176:5;6158:24;:::i;:::-;6153:3;6146:37;6071:118;;:::o;6195:222::-;6288:4;6326:2;6315:9;6311:18;6303:26;;6339:71;6407:1;6396:9;6392:17;6383:6;6339:71;:::i;:::-;6195:222;;;;:::o;6423:86::-;6458:7;6498:4;6491:5;6487:16;6476:27;;6423:86;;;:::o;6515:112::-;6598:22;6614:5;6598:22;:::i;:::-;6593:3;6586:35;6515:112;;:::o;6633:214::-;6722:4;6760:2;6749:9;6745:18;6737:26;;6773:67;6837:1;6826:9;6822:17;6813:6;6773:67;:::i;:::-;6633:214;;;;:::o;6853:116::-;6923:21;6938:5;6923:21;:::i;:::-;6916:5;6913:32;6903:60;;6959:1;6956;6949:12;6903:60;6853:116;:::o;6975:133::-;7018:5;7056:6;7043:20;7034:29;;7072:30;7096:5;7072:30;:::i;:::-;6975:133;;;;:::o;7114:468::-;7179:6;7187;7236:2;7224:9;7215:7;7211:23;7207:32;7204:119;;;7242:79;;:::i;:::-;7204:119;7362:1;7387:53;7432:7;7423:6;7412:9;7408:22;7387:53;:::i;:::-;7377:63;;7333:117;7489:2;7515:50;7557:7;7548:6;7537:9;7533:22;7515:50;:::i;:::-;7505:60;;7460:115;7114:468;;;;;:::o;7588:474::-;7656:6;7664;7713:2;7701:9;7692:7;7688:23;7684:32;7681:119;;;7719:79;;:::i;:::-;7681:119;7839:1;7864:53;7909:7;7900:6;7889:9;7885:22;7864:53;:::i;:::-;7854:63;;7810:117;7966:2;7992:53;8037:7;8028:6;8017:9;8013:22;7992:53;:::i;:::-;7982:63;;7937:118;7588:474;;;;;:::o;8068:180::-;8116:77;8113:1;8106:88;8213:4;8210:1;8203:15;8237:4;8234:1;8227:15;8254:320;8298:6;8335:1;8329:4;8325:12;8315:22;;8382:1;8376:4;8372:12;8403:18;8393:81;;8459:4;8451:6;8447:17;8437:27;;8393:81;8521:2;8513:6;8510:14;8490:18;8487:38;8484:84;;8540:18;;:::i;:::-;8484:84;8305:269;8254:320;;;:::o;8580:182::-;8720:34;8716:1;8708:6;8704:14;8697:58;8580:182;:::o;8768:366::-;8910:3;8931:67;8995:2;8990:3;8931:67;:::i;:::-;8924:74;;9007:93;9096:3;9007:93;:::i;:::-;9125:2;9120:3;9116:12;9109:19;;8768:366;;;:::o;9140:419::-;9306:4;9344:2;9333:9;9329:18;9321:26;;9393:9;9387:4;9383:20;9379:1;9368:9;9364:17;9357:47;9421:131;9547:4;9421:131;:::i;:::-;9413:139;;9140:419;;;:::o;9565:180::-;9613:77;9610:1;9603:88;9710:4;9707:1;9700:15;9734:4;9731:1;9724:15;9751:102;9793:8;9840:5;9837:1;9833:13;9812:34;;9751:102;;;:::o;9859:848::-;9920:5;9927:4;9951:6;9942:15;;9975:5;9966:14;;9989:712;10010:1;10000:8;9997:15;9989:712;;;10105:4;10100:3;10096:14;10090:4;10087:24;10084:50;;;10114:18;;:::i;:::-;10084:50;10164:1;10154:8;10150:16;10147:451;;;10579:4;10572:5;10568:16;10559:25;;10147:451;10629:4;10623;10619:15;10611:23;;10659:32;10682:8;10659:32;:::i;:::-;10647:44;;9989:712;;;9859:848;;;;;;;:::o;10713:1073::-;10767:5;10958:8;10948:40;;10979:1;10970:10;;10981:5;;10948:40;11007:4;10997:36;;11024:1;11015:10;;11026:5;;10997:36;11093:4;11141:1;11136:27;;;;11177:1;11172:191;;;;11086:277;;11136:27;11154:1;11145:10;;11156:5;;;11172:191;11217:3;11207:8;11204:17;11201:43;;;11224:18;;:::i;:::-;11201:43;11273:8;11270:1;11266:16;11257:25;;11308:3;11301:5;11298:14;11295:40;;;11315:18;;:::i;:::-;11295:40;11348:5;;;11086:277;;11472:2;11462:8;11459:16;11453:3;11447:4;11444:13;11440:36;11422:2;11412:8;11409:16;11404:2;11398:4;11395:12;11391:35;11375:111;11372:246;;;11528:8;11522:4;11518:19;11509:28;;11563:3;11556:5;11553:14;11550:40;;;11570:18;;:::i;:::-;11550:40;11603:5;;11372:246;11643:42;11681:3;11671:8;11665:4;11662:1;11643:42;:::i;:::-;11628:57;;;;11717:4;11712:3;11708:14;11701:5;11698:25;11695:51;;;11726:18;;:::i;:::-;11695:51;11775:4;11768:5;11764:16;11755:25;;10713:1073;;;;;;:::o;11792:281::-;11850:5;11874:23;11892:4;11874:23;:::i;:::-;11866:31;;11918:25;11934:8;11918:25;:::i;:::-;11906:37;;11962:104;11999:66;11989:8;11983:4;11962:104;:::i;:::-;11953:113;;11792:281;;;;:::o;12079:410::-;12119:7;12142:20;12160:1;12142:20;:::i;:::-;12137:25;;12176:20;12194:1;12176:20;:::i;:::-;12171:25;;12231:1;12228;12224:9;12253:30;12271:11;12253:30;:::i;:::-;12242:41;;12432:1;12423:7;12419:15;12416:1;12413:22;12393:1;12386:9;12366:83;12343:139;;12462:18;;:::i;:::-;12343:139;12127:362;12079:410;;;;:::o;12495:180::-;12543:77;12540:1;12533:88;12640:4;12637:1;12630:15;12664:4;12661:1;12654:15;12681:185;12721:1;12738:20;12756:1;12738:20;:::i;:::-;12733:25;;12772:20;12790:1;12772:20;:::i;:::-;12767:25;;12811:1;12801:35;;12816:18;;:::i;:::-;12801:35;12858:1;12855;12851:9;12846:14;;12681:185;;;;:::o;12872:232::-;13012:34;13008:1;13000:6;12996:14;12989:58;13081:15;13076:2;13068:6;13064:15;13057:40;12872:232;:::o;13110:366::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:419::-;13648:4;13686:2;13675:9;13671:18;13663:26;;13735:9;13729:4;13725:20;13721:1;13710:9;13706:17;13699:47;13763:131;13889:4;13763:131;:::i;:::-;13755:139;;13482:419;;;:::o;13907:244::-;14047:34;14043:1;14035:6;14031:14;14024:58;14116:27;14111:2;14103:6;14099:15;14092:52;13907:244;:::o;14157:366::-;14299:3;14320:67;14384:2;14379:3;14320:67;:::i;:::-;14313:74;;14396:93;14485:3;14396:93;:::i;:::-;14514:2;14509:3;14505:12;14498:19;;14157:366;;;:::o;14529:419::-;14695:4;14733:2;14722:9;14718:18;14710:26;;14782:9;14776:4;14772:20;14768:1;14757:9;14753:17;14746:47;14810:131;14936:4;14810:131;:::i;:::-;14802:139;;14529:419;;;:::o;14954:225::-;15094:34;15090:1;15082:6;15078:14;15071:58;15163:8;15158:2;15150:6;15146:15;15139:33;14954:225;:::o;15185:366::-;15327:3;15348:67;15412:2;15407:3;15348:67;:::i;:::-;15341:74;;15424:93;15513:3;15424:93;:::i;:::-;15542:2;15537:3;15533:12;15526:19;;15185:366;;;:::o;15557:419::-;15723:4;15761:2;15750:9;15746:18;15738:26;;15810:9;15804:4;15800:20;15796:1;15785:9;15781:17;15774:47;15838:131;15964:4;15838:131;:::i;:::-;15830:139;;15557:419;;;:::o;15982:223::-;16122:34;16118:1;16110:6;16106:14;16099:58;16191:6;16186:2;16178:6;16174:15;16167:31;15982:223;:::o;16211:366::-;16353:3;16374:67;16438:2;16433:3;16374:67;:::i;:::-;16367:74;;16450:93;16539:3;16450:93;:::i;:::-;16568:2;16563:3;16559:12;16552:19;;16211:366;;;:::o;16583:419::-;16749:4;16787:2;16776:9;16772:18;16764:26;;16836:9;16830:4;16826:20;16822:1;16811:9;16807:17;16800:47;16864:131;16990:4;16864:131;:::i;:::-;16856:139;;16583:419;;;:::o;17008:221::-;17148:34;17144:1;17136:6;17132:14;17125:58;17217:4;17212:2;17204:6;17200:15;17193:29;17008:221;:::o;17235:366::-;17377:3;17398:67;17462:2;17457:3;17398:67;:::i;:::-;17391:74;;17474:93;17563:3;17474:93;:::i;:::-;17592:2;17587:3;17583:12;17576:19;;17235:366;;;:::o;17607:419::-;17773:4;17811:2;17800:9;17796:18;17788:26;;17860:9;17854:4;17850:20;17846:1;17835:9;17831:17;17824:47;17888:131;18014:4;17888:131;:::i;:::-;17880:139;;17607:419;;;:::o;18032:224::-;18172:34;18168:1;18160:6;18156:14;18149:58;18241:7;18236:2;18228:6;18224:15;18217:32;18032:224;:::o;18262:366::-;18404:3;18425:67;18489:2;18484:3;18425:67;:::i;:::-;18418:74;;18501:93;18590:3;18501:93;:::i;:::-;18619:2;18614:3;18610:12;18603:19;;18262:366;;;:::o;18634:419::-;18800:4;18838:2;18827:9;18823:18;18815:26;;18887:9;18881:4;18877:20;18873:1;18862:9;18858:17;18851:47;18915:131;19041:4;18915:131;:::i;:::-;18907:139;;18634:419;;;:::o;19059:222::-;19199:34;19195:1;19187:6;19183:14;19176:58;19268:5;19263:2;19255:6;19251:15;19244:30;19059:222;:::o;19287:366::-;19429:3;19450:67;19514:2;19509:3;19450:67;:::i;:::-;19443:74;;19526:93;19615:3;19526:93;:::i;:::-;19644:2;19639:3;19635:12;19628:19;;19287:366;;;:::o;19659:419::-;19825:4;19863:2;19852:9;19848:18;19840:26;;19912:9;19906:4;19902:20;19898:1;19887:9;19883:17;19876:47;19940:131;20066:4;19940:131;:::i;:::-;19932:139;;19659:419;;;:::o;20084:172::-;20224:24;20220:1;20212:6;20208:14;20201:48;20084:172;:::o;20262:366::-;20404:3;20425:67;20489:2;20484:3;20425:67;:::i;:::-;20418:74;;20501:93;20590:3;20501:93;:::i;:::-;20619:2;20614:3;20610:12;20603:19;;20262:366;;;:::o;20634:419::-;20800:4;20838:2;20827:9;20823:18;20815:26;;20887:9;20881:4;20877:20;20873:1;20862:9;20858:17;20851:47;20915:131;21041:4;20915:131;:::i;:::-;20907:139;;20634:419;;;:::o;21059:240::-;21199:34;21195:1;21187:6;21183:14;21176:58;21268:23;21263:2;21255:6;21251:15;21244:48;21059:240;:::o;21305:366::-;21447:3;21468:67;21532:2;21527:3;21468:67;:::i;:::-;21461:74;;21544:93;21633:3;21544:93;:::i;:::-;21662:2;21657:3;21653:12;21646:19;;21305:366;;;:::o;21677:419::-;21843:4;21881:2;21870:9;21866:18;21858:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21958:131;22084:4;21958:131;:::i;:::-;21950:139;;21677:419;;;:::o;22102:191::-;22142:3;22161:20;22179:1;22161:20;:::i;:::-;22156:25;;22195:20;22213:1;22195:20;:::i;:::-;22190:25;;22238:1;22235;22231:9;22224:16;;22259:3;22256:1;22253:10;22250:36;;;22266:18;;:::i;:::-;22250:36;22102:191;;;;:::o;22299:169::-;22439:21;22435:1;22427:6;22423:14;22416:45;22299:169;:::o;22474:366::-;22616:3;22637:67;22701:2;22696:3;22637:67;:::i;:::-;22630:74;;22713:93;22802:3;22713:93;:::i;:::-;22831:2;22826:3;22822:12;22815:19;;22474:366;;;:::o;22846:419::-;23012:4;23050:2;23039:9;23035:18;23027:26;;23099:9;23093:4;23089:20;23085:1;23074:9;23070:17;23063:47;23127:131;23253:4;23127:131;:::i;:::-;23119:139;;22846:419;;;:::o;23271:241::-;23411:34;23407:1;23399:6;23395:14;23388:58;23480:24;23475:2;23467:6;23463:15;23456:49;23271:241;:::o;23518:366::-;23660:3;23681:67;23745:2;23740:3;23681:67;:::i;:::-;23674:74;;23757:93;23846:3;23757:93;:::i;:::-;23875:2;23870:3;23866:12;23859:19;;23518:366;;;:::o;23890:419::-;24056:4;24094:2;24083:9;24079:18;24071:26;;24143:9;24137:4;24133:20;24129:1;24118:9;24114:17;24107:47;24171:131;24297:4;24171:131;:::i;:::-;24163:139;;23890:419;;;:::o;24315:194::-;24355:4;24375:20;24393:1;24375:20;:::i;:::-;24370:25;;24409:20;24427:1;24409:20;:::i;:::-;24404:25;;24453:1;24450;24446:9;24438:17;;24477:1;24471:4;24468:11;24465:37;;;24482:18;;:::i;:::-;24465:37;24315:194;;;;:::o;24515:177::-;24655:29;24651:1;24643:6;24639:14;24632:53;24515:177;:::o;24698:366::-;24840:3;24861:67;24925:2;24920:3;24861:67;:::i;:::-;24854:74;;24937:93;25026:3;24937:93;:::i;:::-;25055:2;25050:3;25046:12;25039:19;;24698:366;;;:::o;25070:419::-;25236:4;25274:2;25263:9;25259:18;25251:26;;25323:9;25317:4;25313:20;25309:1;25298:9;25294:17;25287:47;25351:131;25477:4;25351:131;:::i;:::-;25343:139;;25070:419;;;:::o

Swarm Source

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