ETH Price: $3,424.09 (+5.18%)
Gas: 6 Gwei

Token

Arcoin (COIN)
 

Overview

Max Total Supply

100,000,000 COIN

Holders

149

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.46309500467061624 COIN

Value
$0.00
0x2E9b3e22c2fc20D1911Aff1d868eB70b5fe0a2E2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Arcoin

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 2023-12-06
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**           
 

  ____  ____      __   ____  ___      ___ 
 /    ||    \    /  ] /    ||   \    /  _]
|  o  ||  D  )  /  / |  o  ||    \  /  [_ 
|     ||    /  /  /  |     ||  D  ||    _]
|  _  ||    \ /   \_ |  _  ||     ||   [_ 
|  |  ||  .  \\     ||  |  ||     ||     |
|__|__||__|\_| \____||__|__||_____||_____|
                                        
 Website: https://arcade.money/
 Docs: https://docs.arcade.money/
 Twitter: https://twitter.com/ArcadeERC20/
 Telegram: https://t.me/ArcadePortal

      _=====_                               _=====_
     / _____ \                             / _____ \
   +.-'_____'-.---------------------------.-'_____'-.+
  /   |     |  '.                       .'  |  _  |   \
 / ___| /|\ |___ \                     / ___| /_\ |___ \
/ |      |      | ;  __           _   ; | _         _ | ;
| | <---   ---> | | |__|         |_:> | ||_|       (_)| |
| |___   |   ___| ;SELECT       START ; |___       ___| ;
|\    | \|/ |    /  _     ___      _   \    | (X) |    /|
| \   |_____|  .','" "', |___|  ,'" "', '.  |_____|  .' |
|  '-.______.-' /       \ANALOG/       \  '-._____.-'   |
|               |       |------|       |                |
|              /\       /      \       /\               |
|             /  '.___.'        '.___.'  \              |
|            /                            \             |
 \          /                              \           /
  \________/                                \_________/            
*/
pragma solidity >=0.6.2;
pragma solidity >=0.6.2;

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;
}
pragma solidity >=0.5.0;

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

pragma solidity >=0.5.0;

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

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

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

contract ArcadeProtocol is Ownable {
    address public prizePoolContract;
    address public revenueShareWallet;
    uint256 public swapAmount;
    uint256 public prizePoolShare;

    constructor(address _prizePoolContract, address _revenueShareWallet) Ownable(msg.sender) {
        prizePoolContract = _prizePoolContract;
        revenueShareWallet = _revenueShareWallet;
        prizePoolShare = 35; // 35%
    }

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    /**
     * @notice Sets the prize pool contract
     */
    function setPrizePoolContract(address _prizePoolContract) external onlyOwner {
        prizePoolContract = _prizePoolContract;
    }

    /**
     * @notice Sets the revenue share wallet
     */
    function setRevenueWallet(address _revenueShareWallet) external onlyOwner {
        revenueShareWallet = _revenueShareWallet;
    }

    /**
     * @notice Sets the prize pool share 
     */
    function setPrizePoolShare(uint256 share) external onlyOwner {
        prizePoolShare = share;
    }

    /**
     * @notice Sets the swap threshold for the Arcoin ERC-20 contract, controlled outside so we can renounce ownership of the coin itself
     */
    function setSwapAmount(uint256 amount) external onlyOwner {
        swapAmount = amount;
    }

    /**
     * @notice Distributes ETH to the revenue share pool and the prize pool
     */
    function distributeFunds() external {
        uint256 prizePoolAmount = address(this).balance * prizePoolShare / 100;
        uint256 revenueShareAmount = address(this).balance - prizePoolShare;

        // Send 35% to the prize pool contract
        (bool sentPrize, ) = prizePoolContract.call{value: prizePoolAmount}("");
        require(sentPrize, "Failed to send Ether to prize pool");

        // Send 65% to the revenue share wallet
        (bool sentRevenue, ) = revenueShareWallet.call{value: revenueShareAmount}("");
        require(sentRevenue, "Failed to send Ether to revenue share wallet");
    }
}

pragma solidity >=0.5.0;

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view 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);
}

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

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

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


/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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(IERC20, IERC20Metadata)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(IERC20, IERC20Metadata)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 default value returned by this function, unless
     * it's 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(IERC20, IERC20Metadata)returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

/**
 * @title The COIN ERC-20 Token Implementation
 * @author 
 * @notice Play and earn
 */
contract Arcoin is ERC20, Ownable {
    using Address for address payable;

    /// @notice The V2 router to use for swapping 
    IUniswapV2Router02 public router;

    /// @notice The V2 pair to use for swapping
    address public pair;

    /// @notice A mapping showing whether or not a wallet is excluded from fees
    mapping (address => bool) public isExcludedFromFees;

    /// @notice The trading fee
    /// @dev Done in basis points (500 = 5%)
    /// @dev Cannot be set to more than 20%.
    uint16 public tradingFee;

    /// @notice The wallet used to receive fees used for development
    address payable public developmentWallet;

    /// @notice The address for the protocol contract
    address payable public protocolAddress;

    /// @notice Whether or not we have swapping enabled
    bool public swapEnabled;

    /// @notice Whether or not the contract is currently swapping
    bool private swapping;

    /// @notice The maximum amount that a user is allowed to buy or sell in one go
    uint256 public maxAmountPerTx;

    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    bool    public maxWalletLimitEnabled;
    uint256 public maxWalletAmount;

    bool public tradingEnabled;
    uint256 public tradingBlock;
    uint256 public tradingTime;

    constructor(
        uint256 _startingSupply, 
        address _routerAddress, 
        address _developmentAddress,
        address _protocolAddress
    ) 
        ERC20("Arcoin", "COIN")
        Ownable(msg.sender) 
    {   
        // Initialize the router and create a pair (the router should be the Uniswap V2 router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)
        router = IUniswapV2Router02(_routerAddress);
        pair = IUniswapV2Factory(router.factory())
            .createPair(address(this), router.WETH());

        // Approve the router to spend the contracts balance so that we can execute automatic swaps
        _approve(address(this), address(router), type(uint256).max);

        // Initialize the trading fee (the trading fee setter is hardcoded to only allow values between 0 and 2000 inclusive - this is 0% to 20%) q
        tradingFee = 500;

        // Set wallets
        developmentWallet = payable(_developmentAddress);
        protocolAddress = payable(_protocolAddress);

        // Exclude the necessary wallets from fees
        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[developmentWallet] = true;
        isExcludedFromFees[address(this)] = true;

        // Mint the starting supply to the owner of the contract
        _mint(msg.sender, _startingSupply);

        // Initialize the auto-swap settings
        swapEnabled = true;

        maxWalletLimitEnabled = true;

        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[address(0xdead)] = true;
        _isExcludedFromMaxWalletLimit[developmentWallet] = true;

        maxWalletAmount = totalSupply() * 2 / 100; // 2% per wallet
        maxAmountPerTx = totalSupply() * 75 / 10000; // 0.75% per tx

        tradingEnabled = false;
    }

    /**
     * @notice Allows the contract to receive ETH from the auto-swapping protocol
     */
    receive() external payable { }

    /**
     * @notice Sets an account to be excluded or not from the selling fees
     * @param account The account address
     * @param excluded The boolean flag
     */
    function setExcludeFromFees(address account, bool excluded) external onlyOwner {
        isExcludedFromFees[account] = excluded;
    }

    /**
     * @notice Enables trading, recording the time and block when trading was enabled to allow for the variable sell fee on launch
     */
    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "TRADING_ALREADY_ENABLED");
        tradingEnabled = true;
        swapEnabled = true;
        tradingBlock = block.number;
        tradingTime = block.timestamp;
    }

    /**
     * @notice Sets the maximum amount per t
     */
    function setMaxAmountPerTx(uint256 amount) external onlyOwner {
        maxAmountPerTx = amount;
    }
    
    /**
     * @notice Sets whether swapping should be enabled or not
     * @param swap The boolean flag
     */
    function setSwapping(bool swap) external onlyOwner {
        require(swapEnabled != swap, "SWAP_ALREADY_ENABLED");
        swapEnabled = swap;
    }

    function setEnableMaxWalletLimit(bool enable) external onlyOwner {
        require(enable != maxWalletLimitEnabled,"Max wallet limit is already set to that state");
        maxWalletLimitEnabled = enable;
    }

    function excludeFromMaxWallet(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxWalletLimit[account] != exclude,"Account is already set to that state");
        require(account != address(this), "Can't set this address.");

        _isExcludedFromMaxWalletLimit[account] = exclude;
    }

    /**
     * @notice The transfer logic.
     * @dev For any transfers to and from the liquidity pool, we incur a fee
     * @param from The address that is sending tokens
     * @param to The address that is receiving tokens
     * @param amount The amount to send 
     */
    function _update(address from, address to, uint256 amount) internal override {
        require(amount > 0, "TRANSFER_ZERO");

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= ArcadeProtocol(protocolAddress).swapAmount();

        if (canSwap &&
            !swapping &&
            from != pair && 
            to == pair &&
            swapEnabled
        ) {
            swapping = true;
            _swapAndSendETH(contractTokenBalance);
            swapping = false;
        }

        // We use this special block to ensure a smooth launch experience
        //  1. For the first 5 minutes of trading, we use a 30% tax.
        //  2. Every 5 minutes after, the tax will drop by a further 5%
        //  3. After 25 minutes of trading, we return fees to the normal 5% sell tax.
        uint256 fee;
        if (block.number > tradingBlock + 4){
            fee = tradingFee;
        } else if (block.number > tradingBlock + 3){
            fee = 1000;
        } else if (block.number > tradingBlock + 2){
            fee = 1500;
        } else if (block.number > tradingBlock + 1){
            fee = 2000;
        } else if (block.number > tradingBlock) {
            fee = 2500;
        } else {
            fee = 3000;
        }

        // Only apply the tax if we are dealing with a trade against the LP
        uint256 tax = 0;
        if (!isExcludedFromFees[from] && !isExcludedFromFees[to] && !swapping && (from == pair || to == pair)) {
            require(tradingEnabled, "TRADING_DISABLED");
            require(amount <= maxAmountPerTx, "EXCEEDED_MAX_AMOUNT_PER_TX");
            tax = fee;
        }

        // The taxed amount is sent to the contract, and the resulting amount is transfered to the receipient. 
        uint256 taxAmount = (amount * tax) / 1e4;
        uint256 transferAmount = amount - taxAmount;
        super._update(from, to, transferAmount);
        if (taxAmount > 0) {
            super._update(from, address(this), taxAmount);
        }

        if (maxWalletLimitEnabled) {
            if (!_isExcludedFromMaxWalletLimit[from] && 
                !_isExcludedFromMaxWalletLimit[to] &&
                to != pair
            ) {
                uint256 balance  = balanceOf(to);
                require(
                    balance + amount <= maxWalletAmount, 
                    "EXCEEDED_MAX_WALLET_AMOUNT"
                );
            }
        }
    }

    function _swapAndSendETH(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);

        if (address(this).balance > 0) {
            uint256 developmentAmount = address(this).balance / 2;
            uint256 protocolAmount = address(this).balance - developmentAmount;
            developmentWallet.sendValue(developmentAmount);
            protocolAddress.sendValue(protocolAmount);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_startingSupply","type":"uint256"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address","name":"_developmentAddress","type":"address"},{"internalType":"address","name":"_protocolAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"swap","type":"bool"}],"name":"setSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"},{"stateMutability":"payable","type":"receive"}]

608060405234801562000010575f80fd5b5060405162004f7438038062004f74833981810160405281019062000036919062001901565b336040518060400160405280600681526020017f4172636f696e00000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f434f494e000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062001bcb565b508060049081620000c6919062001bcb565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000133919062001cc0565b60405180910390fd5b6200014d81620007d760201b60201c565b508260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021f919062001cdb565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002cc919062001cdb565b6040518363ffffffff1660e01b8152600401620002eb92919062001d0b565b6020604051808303815f875af115801562000308573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200032e919062001cdb565b60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003c13060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200089a60201b60201c565b6101f460095f6101000a81548161ffff021916908361ffff16021790555081600960026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620005933385620008b460201b60201c565b6001600a60146101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff0219169083151502179055506001600c5f620005dd6200093e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600c5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600c5f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600c5f600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060646002620007636200096660201b60201c565b6200076f919062001d63565b6200077b919062001dda565b600e81905550612710604b620007966200096660201b60201c565b620007a2919062001d63565b620007ae919062001dda565b600b819055505f600f5f6101000a81548160ff02191690831515021790555050505050620022c2565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620008af83838360016200096f60201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000927575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200091e919062001cc0565b60405180910390fd5b6200093a5f838362000b4760201b60201c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600254905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620009e2575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620009d9919062001cc0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000a55575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162000a4c919062001cc0565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562000b41578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000b38919062001e22565b60405180910390a35b50505050565b5f811162000b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b839062001e9b565b60405180910390fd5b5f62000b9e306200122760201b60201c565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e8fa8216040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c0c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000c32919062001ebb565b821015905080801562000c525750600a60159054906101000a900460ff16155b801562000cac575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801562000d05575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b801562000d1e5750600a60149054906101000a900460ff165b1562000d6b576001600a60156101000a81548160ff02191690831515021790555062000d50826200126c60201b60201c565b5f600a60156101000a81548160ff0219169083151502179055505b5f600460105462000d7d919062001eeb565b43111562000da15760095f9054906101000a900461ffff1661ffff16905062000e2d565b600360105462000db2919062001eeb565b43111562000dc5576103e8905062000e2c565b600260105462000dd6919062001eeb565b43111562000de9576105dc905062000e2b565b600160105462000dfa919062001eeb565b43111562000e0d576107d0905062000e2a565b60105443111562000e23576109c4905062000e29565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801562000ecd575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000ee75750600a60159054906101000a900460ff16155b801562000f98575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16148062000f97575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b156200103b57600f5f9054906101000a900460ff1662000fef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fe69062001f73565b60405180910390fd5b600b5485111562001037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200102e9062001fe1565b60405180910390fd5b8190505b5f61271082876200104d919062001d63565b62001059919062001dda565b90505f81876200106a919062002001565b90506200107f8989836200154f60201b60201c565b5f8211156200109c576200109b8930846200154f60201b60201c565b5b600d5f9054906101000a900460ff16156200121c57600c5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015620011505750600c5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015620011aa575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b156200121b575f620011c2896200122760201b60201c565b9050600e548882620011d5919062001eeb565b111562001219576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012109062002089565b60405180910390fd5b505b5b505050505050505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600267ffffffffffffffff8111156200128b576200128a6200197a565b5b604051908082528060200260200182016040528015620012ba5781602001602082028036833780820191505090505b50905030815f81518110620012d457620012d3620020a9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001379573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200139f919062001cdb565b81600181518110620013b657620013b5620020a9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040162001454959493929190620021de565b5f604051808303815f87803b1580156200146c575f80fd5b505af11580156200147f573d5f803e3d5ffd5b505050505f4711156200154b575f6002476200149c919062001dda565b90505f8147620014ad919062002001565b9050620014fc82600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200177360201b90919060201c565b6200154881600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200177360201b90919060201c565b50505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620015a3578060025f82825462001596919062001eeb565b9250508190555062001674565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156200162f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620016269392919062002240565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620016bd578060025f828254039250508190555062001707565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001766919062001e22565b60405180910390a3505050565b80471015620017bb57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401620017b2919062001cc0565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051620017e290620022ac565b5f6040518083038185875af1925050503d805f81146200181e576040519150601f19603f3d011682016040523d82523d5f602084013e62001823565b606091505b50509050806200185f576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f80fd5b5f819050919050565b6200187c8162001868565b811462001887575f80fd5b50565b5f815190506200189a8162001871565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620018cb82620018a0565b9050919050565b620018dd81620018bf565b8114620018e8575f80fd5b50565b5f81519050620018fb81620018d2565b92915050565b5f805f80608085870312156200191c576200191b62001864565b5b5f6200192b878288016200188a565b94505060206200193e87828801620018eb565b93505060406200195187828801620018eb565b92505060606200196487828801620018eb565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620019ec57607f821691505b60208210810362001a025762001a01620019a7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262001a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001a29565b62001a72868362001a29565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62001ab362001aad62001aa78462001868565b62001a8a565b62001868565b9050919050565b5f819050919050565b62001ace8362001a93565b62001ae662001add8262001aba565b84845462001a35565b825550505050565b5f90565b62001afc62001aee565b62001b0981848462001ac3565b505050565b5b8181101562001b305762001b245f8262001af2565b60018101905062001b0f565b5050565b601f82111562001b7f5762001b498162001a08565b62001b548462001a1a565b8101602085101562001b64578190505b62001b7c62001b738562001a1a565b83018262001b0e565b50505b505050565b5f82821c905092915050565b5f62001ba15f198460080262001b84565b1980831691505092915050565b5f62001bbb838362001b90565b9150826002028217905092915050565b62001bd68262001970565b67ffffffffffffffff81111562001bf25762001bf16200197a565b5b62001bfe8254620019d4565b62001c0b82828562001b34565b5f60209050601f83116001811462001c41575f841562001c2c578287015190505b62001c38858262001bae565b86555062001ca7565b601f19841662001c518662001a08565b5f5b8281101562001c7a5784890151825560018201915060208501945060208101905062001c53565b8683101562001c9a578489015162001c96601f89168262001b90565b8355505b6001600288020188555050505b505050505050565b62001cba81620018bf565b82525050565b5f60208201905062001cd55f83018462001caf565b92915050565b5f6020828403121562001cf35762001cf262001864565b5b5f62001d0284828501620018eb565b91505092915050565b5f60408201905062001d205f83018562001caf565b62001d2f602083018462001caf565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62001d6f8262001868565b915062001d7c8362001868565b925082820262001d8c8162001868565b9150828204841483151762001da65762001da562001d36565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62001de68262001868565b915062001df38362001868565b92508262001e065762001e0562001dad565b5b828204905092915050565b62001e1c8162001868565b82525050565b5f60208201905062001e375f83018462001e11565b92915050565b5f82825260208201905092915050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f62001e83600d8362001e3d565b915062001e908262001e4d565b602082019050919050565b5f6020820190508181035f83015262001eb48162001e75565b9050919050565b5f6020828403121562001ed35762001ed262001864565b5b5f62001ee2848285016200188a565b91505092915050565b5f62001ef78262001868565b915062001f048362001868565b925082820190508082111562001f1f5762001f1e62001d36565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f62001f5b60108362001e3d565b915062001f688262001f25565b602082019050919050565b5f6020820190508181035f83015262001f8c8162001f4d565b9050919050565b7f45584345454445445f4d41585f414d4f554e545f5045525f54580000000000005f82015250565b5f62001fc9601a8362001e3d565b915062001fd68262001f93565b602082019050919050565b5f6020820190508181035f83015262001ffa8162001fbb565b9050919050565b5f6200200d8262001868565b91506200201a8362001868565b925082820390508181111562002035576200203462001d36565b5b92915050565b7f45584345454445445f4d41585f57414c4c45545f414d4f554e540000000000005f82015250565b5f62002071601a8362001e3d565b91506200207e826200203b565b602082019050919050565b5f6020820190508181035f830152620020a28162002063565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f620020ff620020f9620020f384620020d6565b62001a8a565b62001868565b9050919050565b6200211181620020df565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6200214b81620018bf565b82525050565b5f6200215e838362002140565b60208301905092915050565b5f602082019050919050565b5f620021828262002117565b6200218e818562002121565b93506200219b8362002131565b805f5b83811015620021d1578151620021b5888262002151565b9750620021c2836200216a565b9250506001810190506200219e565b5085935050505092915050565b5f60a082019050620021f35f83018862001e11565b62002202602083018762002106565b818103604083015262002216818662002176565b905062002227606083018562001caf565b62002236608083018462001e11565b9695505050505050565b5f606082019050620022555f83018662001caf565b62002264602083018562001e11565b62002273604083018462001e11565b949350505050565b5f81905092915050565b50565b5f620022955f836200227b565b9150620022a28262002285565b5f82019050919050565b5f620022b88262002288565b9150819050919050565b612ca480620022d05f395ff3fe6080604052600436106101db575f3560e01c80638a8c523c11610101578063cd51e6d411610094578063dd62ed3e11610063578063dd62ed3e1461067e578063f26a9816146106ba578063f2fde38b146106e2578063f887ea401461070a576101e2565b8063cd51e6d4146105dc578063cfdb597f14610606578063d2fcc0011461062e578063d63cad2214610656576101e2565b8063a9059cbb116100d0578063a9059cbb14610522578063aa4bde281461055e578063b8158d6014610588578063c04a5414146105b2576101e2565b80638a8c523c1461048e5780638da5cb5b146104a457806395d89b41146104ce578063a8aa1b31146104f8576101e2565b8063313ce567116101795780636ddd1713116101485780636ddd1713146103e857806370a0823114610412578063715018a61461044e57806385b27c8514610464576101e2565b8063313ce5671461032e5780634ada218b146103585780634fbee1931461038257806356f43352146103be576101e2565b806318160ddd116101b557806318160ddd1461027657806321a9d82a146102a057806323b872dd146102ca5780632a6c7dba14610306576101e2565b80630676c1b7146101e657806306fdde0314610210578063095ea7b31461023a576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa610734565b604051610207919061200c565b60405180910390f35b34801561021b575f80fd5b50610224610759565b60405161023191906120af565b60405180910390f35b348015610245575f80fd5b50610260600480360381019061025b9190612141565b6107e9565b60405161026d9190612199565b60405180910390f35b348015610281575f80fd5b5061028a61080b565b60405161029791906121c1565b60405180910390f35b3480156102ab575f80fd5b506102b4610814565b6040516102c19190612199565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb91906121da565b610826565b6040516102fd9190612199565b60405180910390f35b348015610311575f80fd5b5061032c60048036038101906103279190612254565b610854565b005b348015610339575f80fd5b506103426108cc565b60405161034f919061229a565b60405180910390f35b348015610363575f80fd5b5061036c6108d4565b6040516103799190612199565b60405180910390f35b34801561038d575f80fd5b506103a860048036038101906103a391906122b3565b6108e6565b6040516103b59190612199565b60405180910390f35b3480156103c9575f80fd5b506103d2610903565b6040516103df91906122fa565b60405180910390f35b3480156103f3575f80fd5b506103fc610916565b6040516104099190612199565b60405180910390f35b34801561041d575f80fd5b50610438600480360381019061043391906122b3565b610929565b60405161044591906121c1565b60405180910390f35b348015610459575f80fd5b5061046261096e565b005b34801561046f575f80fd5b50610478610981565b60405161048591906121c1565b60405180910390f35b348015610499575f80fd5b506104a2610987565b005b3480156104af575f80fd5b506104b8610a23565b6040516104c59190612322565b60405180910390f35b3480156104d9575f80fd5b506104e2610a4b565b6040516104ef91906120af565b60405180910390f35b348015610503575f80fd5b5061050c610adb565b6040516105199190612322565b60405180910390f35b34801561052d575f80fd5b5061054860048036038101906105439190612141565b610b00565b6040516105559190612199565b60405180910390f35b348015610569575f80fd5b50610572610b22565b60405161057f91906121c1565b60405180910390f35b348015610593575f80fd5b5061059c610b28565b6040516105a991906121c1565b60405180910390f35b3480156105bd575f80fd5b506105c6610b2e565b6040516105d3919061200c565b60405180910390f35b3480156105e7575f80fd5b506105f0610b54565b6040516105fd91906121c1565b60405180910390f35b348015610611575f80fd5b5061062c60048036038101906106279190612254565b610b5a565b005b348015610639575f80fd5b50610654600480360381019061064f919061233b565b610bd4565b005b348015610661575f80fd5b5061067c6004803603810190610677919061233b565b610d31565b005b348015610689575f80fd5b506106a4600480360381019061069f9190612379565b610d91565b6040516106b191906121c1565b60405180910390f35b3480156106c5575f80fd5b506106e060048036038101906106db91906123b7565b610e13565b005b3480156106ed575f80fd5b50610708600480360381019061070391906122b3565b610e25565b005b348015610715575f80fd5b5061071e610ea9565b60405161072b919061243d565b60405180910390f35b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461076890612483565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612483565b80156107df5780601f106107b6576101008083540402835291602001916107df565b820191905f5260205f20905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b5f806107f3610ece565b9050610800818585610ed5565b600191505092915050565b5f600254905090565b600d5f9054906101000a900460ff1681565b5f80610830610ece565b905061083d858285610ee7565b610848858585610f79565b60019150509392505050565b61085c611069565b600d5f9054906101000a900460ff161515811515036108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790612523565b60405180910390fd5b80600d5f6101000a81548160ff02191690831515021790555050565b5f6012905090565b600f5f9054906101000a900460ff1681565b6008602052805f5260405f205f915054906101000a900460ff1681565b60095f9054906101000a900461ffff1681565b600a60149054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610976611069565b61097f5f6110f0565b565b600b5481565b61098f611069565b600f5f9054906101000a900460ff16156109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d59061258b565b60405180910390fd5b6001600f5f6101000a81548160ff0219169083151502179055506001600a60146101000a81548160ff0219169083151502179055504360108190555042601181905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5a90612483565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690612483565b8015610ad15780601f10610aa857610100808354040283529160200191610ad1565b820191905f5260205f20905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610b0a610ece565b9050610b17818585610f79565b600191505092915050565b600e5481565b60115481565b600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b610b62611069565b801515600a60149054906101000a900460ff16151503610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906125f3565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610bdc611069565b801515600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612681565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd0906126e9565b60405180910390fd5b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610d39611069565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610e1b611069565b80600b8190555050565b610e2d611069565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e949190612322565b60405180910390fd5b610ea6816110f0565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b610ee283838360016111b3565b505050565b5f610ef28484610d91565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f735781811015610f64578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610f5b93929190612707565b60405180910390fd5b610f7284848484035f6111b3565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fe9575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610fe09190612322565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611059575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016110509190612322565b60405180910390fd5b611064838383611382565b505050565b611071610ece565b73ffffffffffffffffffffffffffffffffffffffff1661108f610a23565b73ffffffffffffffffffffffffffffffffffffffff16146110ee576110b2610ece565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016110e59190612322565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611223575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161121a9190612322565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611293575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161128a9190612322565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561137c578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161137391906121c1565b60405180910390a35b50505050565b5f81116113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612786565b60405180910390fd5b5f6113ce30610929565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e8fa8216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145f91906127b8565b821015905080801561147e5750600a60159054906101000a900460ff16155b80156114d7575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561152f575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156115475750600a60149054906101000a900460ff165b1561158b576001600a60156101000a81548160ff02191690831515021790555061157082611a02565b5f600a60156101000a81548160ff0219169083151502179055505b5f600460105461159b9190612810565b4311156115bd5760095f9054906101000a900461ffff1661ffff16905061163b565b60036010546115cc9190612810565b4311156115dd576103e8905061163a565b60026010546115ec9190612810565b4311156115fd576105dc9050611639565b600160105461160c9190612810565b43111561161d576107d09050611638565b601054431115611631576109c49050611637565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156116da575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156116f35750600a60159054906101000a900460ff16155b80156117a2575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614806117a1575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b1561183e57600f5f9054906101000a900460ff166117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec9061288d565b60405180910390fd5b600b5485111561183a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611831906128f5565b60405180910390fd5b8190505b5f612710828761184e9190612913565b6118589190612981565b90505f818761186791906129b1565b9050611874898983611ccb565b5f82111561188857611887893084611ccb565b5b600d5f9054906101000a900460ff16156119f757600c5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561193a5750600c5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611993575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b156119f6575f6119a289610929565b9050600e5488826119b39190612810565b11156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90612a2e565b60405180910390fd5b505b5b505050505050505050565b5f600267ffffffffffffffff811115611a1e57611a1d612a4c565b5b604051908082528060200260200182016040528015611a4c5781602001602082028036833780820191505090505b50905030815f81518110611a6357611a62612a79565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612aba565b81600181518110611b3f57611b3e612a79565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611bdb959493929190612bd5565b5f604051808303815f87803b158015611bf2575f80fd5b505af1158015611c04573d5f803e3d5ffd5b505050505f471115611cc7575f600247611c1e9190612981565b90505f8147611c2d91906129b1565b9050611c7a82600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ee490919063ffffffff16565b611cc481600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ee490919063ffffffff16565b50505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d1b578060025f828254611d0f9190612810565b92505081905550611de9565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611da4578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611d9b93929190612707565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e30578060025f8282540392505081905550611e7a565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ed791906121c1565b60405180910390a3505050565b80471015611f2957306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611f209190612322565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611f4e90612c5a565b5f6040518083038185875af1925050503d805f8114611f88576040519150601f19603f3d011682016040523d82523d5f602084013e611f8d565b606091505b5050905080611fc8576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ff682611fcd565b9050919050565b61200681611fec565b82525050565b5f60208201905061201f5f830184611ffd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561205c578082015181840152602081019050612041565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61208182612025565b61208b818561202f565b935061209b81856020860161203f565b6120a481612067565b840191505092915050565b5f6020820190508181035f8301526120c78184612077565b905092915050565b5f80fd5b5f6120dd82611fcd565b9050919050565b6120ed816120d3565b81146120f7575f80fd5b50565b5f81359050612108816120e4565b92915050565b5f819050919050565b6121208161210e565b811461212a575f80fd5b50565b5f8135905061213b81612117565b92915050565b5f8060408385031215612157576121566120cf565b5b5f612164858286016120fa565b92505060206121758582860161212d565b9150509250929050565b5f8115159050919050565b6121938161217f565b82525050565b5f6020820190506121ac5f83018461218a565b92915050565b6121bb8161210e565b82525050565b5f6020820190506121d45f8301846121b2565b92915050565b5f805f606084860312156121f1576121f06120cf565b5b5f6121fe868287016120fa565b935050602061220f868287016120fa565b92505060406122208682870161212d565b9150509250925092565b6122338161217f565b811461223d575f80fd5b50565b5f8135905061224e8161222a565b92915050565b5f60208284031215612269576122686120cf565b5b5f61227684828501612240565b91505092915050565b5f60ff82169050919050565b6122948161227f565b82525050565b5f6020820190506122ad5f83018461228b565b92915050565b5f602082840312156122c8576122c76120cf565b5b5f6122d5848285016120fa565b91505092915050565b5f61ffff82169050919050565b6122f4816122de565b82525050565b5f60208201905061230d5f8301846122eb565b92915050565b61231c816120d3565b82525050565b5f6020820190506123355f830184612313565b92915050565b5f8060408385031215612351576123506120cf565b5b5f61235e858286016120fa565b925050602061236f85828601612240565b9150509250929050565b5f806040838503121561238f5761238e6120cf565b5b5f61239c858286016120fa565b92505060206123ad858286016120fa565b9150509250929050565b5f602082840312156123cc576123cb6120cf565b5b5f6123d98482850161212d565b91505092915050565b5f819050919050565b5f6124056124006123fb84611fcd565b6123e2565b611fcd565b9050919050565b5f612416826123eb565b9050919050565b5f6124278261240c565b9050919050565b6124378161241d565b82525050565b5f6020820190506124505f83018461242e565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061249a57607f821691505b6020821081036124ad576124ac612456565b5b50919050565b7f4d61782077616c6c6574206c696d697420697320616c726561647920736574205f8201527f746f207468617420737461746500000000000000000000000000000000000000602082015250565b5f61250d602d8361202f565b9150612518826124b3565b604082019050919050565b5f6020820190508181035f83015261253a81612501565b9050919050565b7f54524144494e475f414c52454144595f454e41424c45440000000000000000005f82015250565b5f61257560178361202f565b915061258082612541565b602082019050919050565b5f6020820190508181035f8301526125a281612569565b9050919050565b7f535741505f414c52454144595f454e41424c45440000000000000000000000005f82015250565b5f6125dd60148361202f565b91506125e8826125a9565b602082019050919050565b5f6020820190508181035f83015261260a816125d1565b9050919050565b7f4163636f756e7420697320616c72656164792073657420746f207468617420735f8201527f7461746500000000000000000000000000000000000000000000000000000000602082015250565b5f61266b60248361202f565b915061267682612611565b604082019050919050565b5f6020820190508181035f8301526126988161265f565b9050919050565b7f43616e277420736574207468697320616464726573732e0000000000000000005f82015250565b5f6126d360178361202f565b91506126de8261269f565b602082019050919050565b5f6020820190508181035f830152612700816126c7565b9050919050565b5f60608201905061271a5f830186612313565b61272760208301856121b2565b61273460408301846121b2565b949350505050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f612770600d8361202f565b915061277b8261273c565b602082019050919050565b5f6020820190508181035f83015261279d81612764565b9050919050565b5f815190506127b281612117565b92915050565b5f602082840312156127cd576127cc6120cf565b5b5f6127da848285016127a4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61281a8261210e565b91506128258361210e565b925082820190508082111561283d5761283c6127e3565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f61287760108361202f565b915061288282612843565b602082019050919050565b5f6020820190508181035f8301526128a48161286b565b9050919050565b7f45584345454445445f4d41585f414d4f554e545f5045525f54580000000000005f82015250565b5f6128df601a8361202f565b91506128ea826128ab565b602082019050919050565b5f6020820190508181035f83015261290c816128d3565b9050919050565b5f61291d8261210e565b91506129288361210e565b92508282026129368161210e565b9150828204841483151761294d5761294c6127e3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61298b8261210e565b91506129968361210e565b9250826129a6576129a5612954565b5b828204905092915050565b5f6129bb8261210e565b91506129c68361210e565b92508282039050818111156129de576129dd6127e3565b5b92915050565b7f45584345454445445f4d41585f57414c4c45545f414d4f554e540000000000005f82015250565b5f612a18601a8361202f565b9150612a23826129e4565b602082019050919050565b5f6020820190508181035f830152612a4581612a0c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612ab4816120e4565b92915050565b5f60208284031215612acf57612ace6120cf565b5b5f612adc84828501612aa6565b91505092915050565b5f819050919050565b5f612b08612b03612afe84612ae5565b6123e2565b61210e565b9050919050565b612b1881612aee565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612b50816120d3565b82525050565b5f612b618383612b47565b60208301905092915050565b5f602082019050919050565b5f612b8382612b1e565b612b8d8185612b28565b9350612b9883612b38565b805f5b83811015612bc8578151612baf8882612b56565b9750612bba83612b6d565b925050600181019050612b9b565b5085935050505092915050565b5f60a082019050612be85f8301886121b2565b612bf56020830187612b0f565b8181036040830152612c078186612b79565b9050612c166060830185612313565b612c2360808301846121b2565b9695505050505050565b5f81905092915050565b50565b5f612c455f83612c2d565b9150612c5082612c37565b5f82019050919050565b5f612c6482612c3a565b915081905091905056fea2646970667358221220a5587772b448f8fdb167420ccc483811b4709d88ed0d915dd82431a701eb365264736f6c6343000814003300000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13000000000000000000000000271446f748128a00d96d611581eb427fe4e08c14

Deployed Bytecode

0x6080604052600436106101db575f3560e01c80638a8c523c11610101578063cd51e6d411610094578063dd62ed3e11610063578063dd62ed3e1461067e578063f26a9816146106ba578063f2fde38b146106e2578063f887ea401461070a576101e2565b8063cd51e6d4146105dc578063cfdb597f14610606578063d2fcc0011461062e578063d63cad2214610656576101e2565b8063a9059cbb116100d0578063a9059cbb14610522578063aa4bde281461055e578063b8158d6014610588578063c04a5414146105b2576101e2565b80638a8c523c1461048e5780638da5cb5b146104a457806395d89b41146104ce578063a8aa1b31146104f8576101e2565b8063313ce567116101795780636ddd1713116101485780636ddd1713146103e857806370a0823114610412578063715018a61461044e57806385b27c8514610464576101e2565b8063313ce5671461032e5780634ada218b146103585780634fbee1931461038257806356f43352146103be576101e2565b806318160ddd116101b557806318160ddd1461027657806321a9d82a146102a057806323b872dd146102ca5780632a6c7dba14610306576101e2565b80630676c1b7146101e657806306fdde0314610210578063095ea7b31461023a576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa610734565b604051610207919061200c565b60405180910390f35b34801561021b575f80fd5b50610224610759565b60405161023191906120af565b60405180910390f35b348015610245575f80fd5b50610260600480360381019061025b9190612141565b6107e9565b60405161026d9190612199565b60405180910390f35b348015610281575f80fd5b5061028a61080b565b60405161029791906121c1565b60405180910390f35b3480156102ab575f80fd5b506102b4610814565b6040516102c19190612199565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb91906121da565b610826565b6040516102fd9190612199565b60405180910390f35b348015610311575f80fd5b5061032c60048036038101906103279190612254565b610854565b005b348015610339575f80fd5b506103426108cc565b60405161034f919061229a565b60405180910390f35b348015610363575f80fd5b5061036c6108d4565b6040516103799190612199565b60405180910390f35b34801561038d575f80fd5b506103a860048036038101906103a391906122b3565b6108e6565b6040516103b59190612199565b60405180910390f35b3480156103c9575f80fd5b506103d2610903565b6040516103df91906122fa565b60405180910390f35b3480156103f3575f80fd5b506103fc610916565b6040516104099190612199565b60405180910390f35b34801561041d575f80fd5b50610438600480360381019061043391906122b3565b610929565b60405161044591906121c1565b60405180910390f35b348015610459575f80fd5b5061046261096e565b005b34801561046f575f80fd5b50610478610981565b60405161048591906121c1565b60405180910390f35b348015610499575f80fd5b506104a2610987565b005b3480156104af575f80fd5b506104b8610a23565b6040516104c59190612322565b60405180910390f35b3480156104d9575f80fd5b506104e2610a4b565b6040516104ef91906120af565b60405180910390f35b348015610503575f80fd5b5061050c610adb565b6040516105199190612322565b60405180910390f35b34801561052d575f80fd5b5061054860048036038101906105439190612141565b610b00565b6040516105559190612199565b60405180910390f35b348015610569575f80fd5b50610572610b22565b60405161057f91906121c1565b60405180910390f35b348015610593575f80fd5b5061059c610b28565b6040516105a991906121c1565b60405180910390f35b3480156105bd575f80fd5b506105c6610b2e565b6040516105d3919061200c565b60405180910390f35b3480156105e7575f80fd5b506105f0610b54565b6040516105fd91906121c1565b60405180910390f35b348015610611575f80fd5b5061062c60048036038101906106279190612254565b610b5a565b005b348015610639575f80fd5b50610654600480360381019061064f919061233b565b610bd4565b005b348015610661575f80fd5b5061067c6004803603810190610677919061233b565b610d31565b005b348015610689575f80fd5b506106a4600480360381019061069f9190612379565b610d91565b6040516106b191906121c1565b60405180910390f35b3480156106c5575f80fd5b506106e060048036038101906106db91906123b7565b610e13565b005b3480156106ed575f80fd5b50610708600480360381019061070391906122b3565b610e25565b005b348015610715575f80fd5b5061071e610ea9565b60405161072b919061243d565b60405180910390f35b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461076890612483565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612483565b80156107df5780601f106107b6576101008083540402835291602001916107df565b820191905f5260205f20905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b5f806107f3610ece565b9050610800818585610ed5565b600191505092915050565b5f600254905090565b600d5f9054906101000a900460ff1681565b5f80610830610ece565b905061083d858285610ee7565b610848858585610f79565b60019150509392505050565b61085c611069565b600d5f9054906101000a900460ff161515811515036108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790612523565b60405180910390fd5b80600d5f6101000a81548160ff02191690831515021790555050565b5f6012905090565b600f5f9054906101000a900460ff1681565b6008602052805f5260405f205f915054906101000a900460ff1681565b60095f9054906101000a900461ffff1681565b600a60149054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610976611069565b61097f5f6110f0565b565b600b5481565b61098f611069565b600f5f9054906101000a900460ff16156109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d59061258b565b60405180910390fd5b6001600f5f6101000a81548160ff0219169083151502179055506001600a60146101000a81548160ff0219169083151502179055504360108190555042601181905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a5a90612483565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690612483565b8015610ad15780601f10610aa857610100808354040283529160200191610ad1565b820191905f5260205f20905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610b0a610ece565b9050610b17818585610f79565b600191505092915050565b600e5481565b60115481565b600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b610b62611069565b801515600a60149054906101000a900460ff16151503610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906125f3565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b610bdc611069565b801515600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612681565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd0906126e9565b60405180910390fd5b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610d39611069565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610e1b611069565b80600b8190555050565b610e2d611069565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e949190612322565b60405180910390fd5b610ea6816110f0565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b610ee283838360016111b3565b505050565b5f610ef28484610d91565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f735781811015610f64578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610f5b93929190612707565b60405180910390fd5b610f7284848484035f6111b3565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fe9575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610fe09190612322565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611059575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016110509190612322565b60405180910390fd5b611064838383611382565b505050565b611071610ece565b73ffffffffffffffffffffffffffffffffffffffff1661108f610a23565b73ffffffffffffffffffffffffffffffffffffffff16146110ee576110b2610ece565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016110e59190612322565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611223575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161121a9190612322565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611293575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161128a9190612322565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561137c578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161137391906121c1565b60405180910390a35b50505050565b5f81116113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612786565b60405180910390fd5b5f6113ce30610929565b90505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e8fa8216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145f91906127b8565b821015905080801561147e5750600a60159054906101000a900460ff16155b80156114d7575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561152f575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156115475750600a60149054906101000a900460ff165b1561158b576001600a60156101000a81548160ff02191690831515021790555061157082611a02565b5f600a60156101000a81548160ff0219169083151502179055505b5f600460105461159b9190612810565b4311156115bd5760095f9054906101000a900461ffff1661ffff16905061163b565b60036010546115cc9190612810565b4311156115dd576103e8905061163a565b60026010546115ec9190612810565b4311156115fd576105dc9050611639565b600160105461160c9190612810565b43111561161d576107d09050611638565b601054431115611631576109c49050611637565b610bb890505b5b5b5b5b5f60085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156116da575060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156116f35750600a60159054906101000a900460ff16155b80156117a2575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614806117a1575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b5b1561183e57600f5f9054906101000a900460ff166117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec9061288d565b60405180910390fd5b600b5485111561183a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611831906128f5565b60405180910390fd5b8190505b5f612710828761184e9190612913565b6118589190612981565b90505f818761186791906129b1565b9050611874898983611ccb565b5f82111561188857611887893084611ccb565b5b600d5f9054906101000a900460ff16156119f757600c5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561193a5750600c5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611993575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b156119f6575f6119a289610929565b9050600e5488826119b39190612810565b11156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90612a2e565b60405180910390fd5b505b5b505050505050505050565b5f600267ffffffffffffffff811115611a1e57611a1d612a4c565b5b604051908082528060200260200182016040528015611a4c5781602001602082028036833780820191505090505b50905030815f81518110611a6357611a62612a79565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612aba565b81600181518110611b3f57611b3e612a79565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611bdb959493929190612bd5565b5f604051808303815f87803b158015611bf2575f80fd5b505af1158015611c04573d5f803e3d5ffd5b505050505f471115611cc7575f600247611c1e9190612981565b90505f8147611c2d91906129b1565b9050611c7a82600960029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ee490919063ffffffff16565b611cc481600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ee490919063ffffffff16565b50505b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d1b578060025f828254611d0f9190612810565b92505081905550611de9565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611da4578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611d9b93929190612707565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e30578060025f8282540392505081905550611e7a565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ed791906121c1565b60405180910390a3505050565b80471015611f2957306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611f209190612322565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611f4e90612c5a565b5f6040518083038185875af1925050503d805f8114611f88576040519150601f19603f3d011682016040523d82523d5f602084013e611f8d565b606091505b5050905080611fc8576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ff682611fcd565b9050919050565b61200681611fec565b82525050565b5f60208201905061201f5f830184611ffd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561205c578082015181840152602081019050612041565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61208182612025565b61208b818561202f565b935061209b81856020860161203f565b6120a481612067565b840191505092915050565b5f6020820190508181035f8301526120c78184612077565b905092915050565b5f80fd5b5f6120dd82611fcd565b9050919050565b6120ed816120d3565b81146120f7575f80fd5b50565b5f81359050612108816120e4565b92915050565b5f819050919050565b6121208161210e565b811461212a575f80fd5b50565b5f8135905061213b81612117565b92915050565b5f8060408385031215612157576121566120cf565b5b5f612164858286016120fa565b92505060206121758582860161212d565b9150509250929050565b5f8115159050919050565b6121938161217f565b82525050565b5f6020820190506121ac5f83018461218a565b92915050565b6121bb8161210e565b82525050565b5f6020820190506121d45f8301846121b2565b92915050565b5f805f606084860312156121f1576121f06120cf565b5b5f6121fe868287016120fa565b935050602061220f868287016120fa565b92505060406122208682870161212d565b9150509250925092565b6122338161217f565b811461223d575f80fd5b50565b5f8135905061224e8161222a565b92915050565b5f60208284031215612269576122686120cf565b5b5f61227684828501612240565b91505092915050565b5f60ff82169050919050565b6122948161227f565b82525050565b5f6020820190506122ad5f83018461228b565b92915050565b5f602082840312156122c8576122c76120cf565b5b5f6122d5848285016120fa565b91505092915050565b5f61ffff82169050919050565b6122f4816122de565b82525050565b5f60208201905061230d5f8301846122eb565b92915050565b61231c816120d3565b82525050565b5f6020820190506123355f830184612313565b92915050565b5f8060408385031215612351576123506120cf565b5b5f61235e858286016120fa565b925050602061236f85828601612240565b9150509250929050565b5f806040838503121561238f5761238e6120cf565b5b5f61239c858286016120fa565b92505060206123ad858286016120fa565b9150509250929050565b5f602082840312156123cc576123cb6120cf565b5b5f6123d98482850161212d565b91505092915050565b5f819050919050565b5f6124056124006123fb84611fcd565b6123e2565b611fcd565b9050919050565b5f612416826123eb565b9050919050565b5f6124278261240c565b9050919050565b6124378161241d565b82525050565b5f6020820190506124505f83018461242e565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061249a57607f821691505b6020821081036124ad576124ac612456565b5b50919050565b7f4d61782077616c6c6574206c696d697420697320616c726561647920736574205f8201527f746f207468617420737461746500000000000000000000000000000000000000602082015250565b5f61250d602d8361202f565b9150612518826124b3565b604082019050919050565b5f6020820190508181035f83015261253a81612501565b9050919050565b7f54524144494e475f414c52454144595f454e41424c45440000000000000000005f82015250565b5f61257560178361202f565b915061258082612541565b602082019050919050565b5f6020820190508181035f8301526125a281612569565b9050919050565b7f535741505f414c52454144595f454e41424c45440000000000000000000000005f82015250565b5f6125dd60148361202f565b91506125e8826125a9565b602082019050919050565b5f6020820190508181035f83015261260a816125d1565b9050919050565b7f4163636f756e7420697320616c72656164792073657420746f207468617420735f8201527f7461746500000000000000000000000000000000000000000000000000000000602082015250565b5f61266b60248361202f565b915061267682612611565b604082019050919050565b5f6020820190508181035f8301526126988161265f565b9050919050565b7f43616e277420736574207468697320616464726573732e0000000000000000005f82015250565b5f6126d360178361202f565b91506126de8261269f565b602082019050919050565b5f6020820190508181035f830152612700816126c7565b9050919050565b5f60608201905061271a5f830186612313565b61272760208301856121b2565b61273460408301846121b2565b949350505050565b7f5452414e534645525f5a45524f000000000000000000000000000000000000005f82015250565b5f612770600d8361202f565b915061277b8261273c565b602082019050919050565b5f6020820190508181035f83015261279d81612764565b9050919050565b5f815190506127b281612117565b92915050565b5f602082840312156127cd576127cc6120cf565b5b5f6127da848285016127a4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61281a8261210e565b91506128258361210e565b925082820190508082111561283d5761283c6127e3565b5b92915050565b7f54524144494e475f44495341424c4544000000000000000000000000000000005f82015250565b5f61287760108361202f565b915061288282612843565b602082019050919050565b5f6020820190508181035f8301526128a48161286b565b9050919050565b7f45584345454445445f4d41585f414d4f554e545f5045525f54580000000000005f82015250565b5f6128df601a8361202f565b91506128ea826128ab565b602082019050919050565b5f6020820190508181035f83015261290c816128d3565b9050919050565b5f61291d8261210e565b91506129288361210e565b92508282026129368161210e565b9150828204841483151761294d5761294c6127e3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61298b8261210e565b91506129968361210e565b9250826129a6576129a5612954565b5b828204905092915050565b5f6129bb8261210e565b91506129c68361210e565b92508282039050818111156129de576129dd6127e3565b5b92915050565b7f45584345454445445f4d41585f57414c4c45545f414d4f554e540000000000005f82015250565b5f612a18601a8361202f565b9150612a23826129e4565b602082019050919050565b5f6020820190508181035f830152612a4581612a0c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612ab4816120e4565b92915050565b5f60208284031215612acf57612ace6120cf565b5b5f612adc84828501612aa6565b91505092915050565b5f819050919050565b5f612b08612b03612afe84612ae5565b6123e2565b61210e565b9050919050565b612b1881612aee565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612b50816120d3565b82525050565b5f612b618383612b47565b60208301905092915050565b5f602082019050919050565b5f612b8382612b1e565b612b8d8185612b28565b9350612b9883612b38565b805f5b83811015612bc8578151612baf8882612b56565b9750612bba83612b6d565b925050600181019050612b9b565b5085935050505092915050565b5f60a082019050612be85f8301886121b2565b612bf56020830187612b0f565b8181036040830152612c078186612b79565b9050612c166060830185612313565b612c2360808301846121b2565b9695505050505050565b5f81905092915050565b50565b5f612c455f83612c2d565b9150612c5082612c37565b5f82019050919050565b5f612c6482612c3a565b915081905091905056fea2646970667358221220a5587772b448f8fdb167420ccc483811b4709d88ed0d915dd82431a701eb365264736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13000000000000000000000000271446f748128a00d96d611581eb427fe4e08c14

-----Decoded View---------------
Arg [0] : _startingSupply (uint256): 100000000000000000000000000
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _developmentAddress (address): 0x2f16f69fffEd4DA2dd06EFdE3388DDA5701cCb13
Arg [3] : _protocolAddress (address): 0x271446f748128A00D96D611581Eb427Fe4e08c14

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 0000000000000000000000002f16f69fffed4da2dd06efde3388dda5701ccb13
Arg [3] : 000000000000000000000000271446f748128a00d96d611581eb427fe4e08c14


Deployed Bytecode Sourcemap

36447:8641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37173:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26924:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29313:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28122:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37597:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30081:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41016:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27941:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37679:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36781:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36966:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37277:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28284:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12622:103;;;;;;;;;;;;;:::i;:::-;;37490:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40298:253;;;;;;;;;;;;;:::i;:::-;;11947:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27166:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36672:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28607:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37640:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37746:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37069:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37712:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40857:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41237:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40004:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28852:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40623:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12880:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36582:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37173:38;;;;;;;;;;;;;:::o;26924:123::-;27001:13;27034:5;27027:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26924:123;:::o;29313:190::-;29386:4;29403:13;29419:12;:10;:12::i;:::-;29403:28;;29442:31;29451:5;29458:7;29467:5;29442:8;:31::i;:::-;29491:4;29484:11;;;29313:190;;;;:::o;28122:99::-;28174:7;28201:12;;28194:19;;28122:99;:::o;37597:36::-;;;;;;;;;;;;;:::o;30081:249::-;30168:4;30185:15;30203:12;:10;:12::i;:::-;30185:30;;30226:37;30242:4;30248:7;30257:5;30226:15;:37::i;:::-;30274:26;30284:4;30290:2;30294:5;30274:9;:26::i;:::-;30318:4;30311:11;;;30081:249;;;;;:::o;41016:213::-;11833:13;:11;:13::i;:::-;41110:21:::1;;;;;;;;;;;41100:31;;:6;:31;;::::0;41092:88:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41215:6;41191:21;;:30;;;;;;;;;;;;;;;;;;41016:213:::0;:::o;27941:116::-;28022:5;28047:2;28040:9;;27941:116;:::o;37679:26::-;;;;;;;;;;;;;:::o;36781:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;36966:24::-;;;;;;;;;;;;;:::o;37277:23::-;;;;;;;;;;;;;:::o;28284:118::-;28349:7;28376:9;:18;28386:7;28376:18;;;;;;;;;;;;;;;;28369:25;;28284:118;;;:::o;12622:103::-;11833:13;:11;:13::i;:::-;12687:30:::1;12714:1;12687:18;:30::i;:::-;12622:103::o:0;37490:29::-;;;;:::o;40298:253::-;11833:13;:11;:13::i;:::-;40362:14:::1;;;;;;;;;;;40361:15;40353:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40432:4;40415:14;;:21;;;;;;;;;;;;;;;;;;40461:4;40447:11;;:18;;;;;;;;;;;;;;;;;;40491:12;40476;:27;;;;40528:15;40514:11;:29;;;;40298:253::o:0;11947:87::-;11993:7;12020:6;;;;;;;;;;;12013:13;;11947:87;:::o;27166:127::-;27245:13;27278:7;27271:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27166:127;:::o;36672:19::-;;;;;;;;;;;;;:::o;28607:182::-;28676:4;28693:13;28709:12;:10;:12::i;:::-;28693:28;;28732:27;28742:5;28749:2;28753:5;28732:9;:27::i;:::-;28777:4;28770:11;;;28607:182;;;;:::o;37640:30::-;;;;:::o;37746:26::-;;;;:::o;37069:40::-;;;;;;;;;;;;;:::o;37712:27::-;;;;:::o;40857:151::-;11833:13;:11;:13::i;:::-;40942:4:::1;40927:19;;:11;;;;;;;;;;;:19;;::::0;40919:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40996:4;40982:11;;:18;;;;;;;;;;;;;;;;;;40857:151:::0;:::o;41237:329::-;11833:13;:11;:13::i;:::-;41379:7:::1;41337:49;;:29;:38;41367:7;41337:38;;;;;;;;;;;;;;;;;;;;;;;;;:49;;::::0;41328:98:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41464:4;41445:24;;:7;:24;;::::0;41437:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41551:7;41510:29;:38;41540:7;41510:38;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;41237:329:::0;;:::o;40004:136::-;11833:13;:11;:13::i;:::-;40124:8:::1;40094:18;:27;40113:7;40094:27;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;40004:136:::0;;:::o;28852:142::-;28932:7;28959:11;:18;28971:5;28959:18;;;;;;;;;;;;;;;:27;28978:7;28959:27;;;;;;;;;;;;;;;;28952:34;;28852:142;;;;:::o;40623:104::-;11833:13;:11;:13::i;:::-;40713:6:::1;40696:14;:23;;;;40623:104:::0;:::o;12880:220::-;11833:13;:11;:13::i;:::-;12985:1:::1;12965:22;;:8;:22;;::::0;12961:93:::1;;13039:1;13011:31;;;;;;;;;;;:::i;:::-;;;;;;;;12961:93;13064:28;13083:8;13064:18;:28::i;:::-;12880:220:::0;:::o;36582:32::-;;;;;;;;;;;;;:::o;10222:98::-;10275:7;10302:10;10295:17;;10222:98;:::o;34140:130::-;34225:37;34234:5;34241:7;34250:5;34257:4;34225:8;:37::i;:::-;34140:130;;;:::o;35856:487::-;35956:24;35983:25;35993:5;36000:7;35983:9;:25::i;:::-;35956:52;;36043:17;36023:16;:37;36019:317;;36100:5;36081:16;:24;36077:132;;;36160:7;36169:16;36187:5;36133:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;36077:132;36252:57;36261:5;36268:7;36296:5;36277:16;:24;36303:5;36252:8;:57::i;:::-;36019:317;35945:398;35856:487;;;:::o;30715:308::-;30815:1;30799:18;;:4;:18;;;30795:88;;30868:1;30841:30;;;;;;;;;;;:::i;:::-;;;;;;;;30795:88;30911:1;30897:16;;:2;:16;;;30893:88;;30966:1;30937:32;;;;;;;;;;;:::i;:::-;;;;;;;;30893:88;30991:24;30999:4;31005:2;31009:5;30991:7;:24::i;:::-;30715:308;;;:::o;12112:166::-;12183:12;:10;:12::i;:::-;12172:23;;:7;:5;:7::i;:::-;:23;;;12168:103;;12246:12;:10;:12::i;:::-;12219:40;;;;;;;;;;;:::i;:::-;;;;;;;;12168:103;12112:166::o;13260:191::-;13334:16;13353:6;;;;;;;;;;;13334:25;;13379:8;13370:6;;:17;;;;;;;;;;;;;;;;;;13434:8;13403:40;;13424:8;13403:40;;;;;;;;;;;;13323:128;13260:191;:::o;35121:443::-;35251:1;35234:19;;:5;:19;;;35230:91;;35306:1;35277:32;;;;;;;;;;;:::i;:::-;;;;;;;;35230:91;35354:1;35335:21;;:7;:21;;;35331:92;;35408:1;35380:31;;;;;;;;;;;:::i;:::-;;;;;;;;35331:92;35463:5;35433:11;:18;35445:5;35433:18;;;;;;;;;;;;;;;:27;35452:7;35433:27;;;;;;;;;;;;;;;:35;;;;35483:9;35479:78;;;35530:7;35514:31;;35523:5;35514:31;;;35539:5;35514:31;;;;;;:::i;:::-;;;;;;;;35479:78;35121:443;;;;:::o;41858:2526::-;41963:1;41954:6;:10;41946:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;41989:28;42020:24;42038:4;42020:9;:24::i;:::-;41989:55;;42057:12;42111:15;;;;;;;;;;;42096:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42072:20;:68;;42057:83;;42157:7;:33;;;;;42182:8;;;;;;;;;;;42181:9;42157:33;:62;;;;;42215:4;;;;;;;;;;;42207:12;;:4;:12;;;;42157:62;:90;;;;;42243:4;;;;;;;;;;;42237:10;;:2;:10;;;42157:90;:118;;;;;42264:11;;;;;;;;;;;42157:118;42153:259;;;42313:4;42302:8;;:15;;;;;;;;;;;;;;;;;;42332:37;42348:20;42332:15;:37::i;:::-;42395:5;42384:8;;:16;;;;;;;;;;;;;;;;;;42153:259;42729:11;42785:1;42770:12;;:16;;;;:::i;:::-;42755:12;:31;42751:435;;;42808:10;;;;;;;;;;;42802:16;;;;42751:435;;;42870:1;42855:12;;:16;;;;:::i;:::-;42840:12;:31;42836:350;;;42893:4;42887:10;;42836:350;;;42949:1;42934:12;;:16;;;;:::i;:::-;42919:12;:31;42915:271;;;42972:4;42966:10;;42915:271;;;43028:1;43013:12;;:16;;;;:::i;:::-;42998:12;:31;42994:192;;;43051:4;43045:10;;42994:192;;;43092:12;;43077;:27;43073:113;;;43127:4;43121:10;;43073:113;;;43170:4;43164:10;;43073:113;42994:192;42915:271;42836:350;42751:435;43275:11;43306:18;:24;43325:4;43306:24;;;;;;;;;;;;;;;;;;;;;;;;;43305:25;:52;;;;;43335:18;:22;43354:2;43335:22;;;;;;;;;;;;;;;;;;;;;;;;;43334:23;43305:52;:65;;;;;43362:8;;;;;;;;;;;43361:9;43305:65;:97;;;;;43383:4;;;;;;;;;;;43375:12;;:4;:12;;;:26;;;;43397:4;;;;;;;;;;;43391:10;;:2;:10;;;43375:26;43305:97;43301:275;;;43427:14;;;;;;;;;;;43419:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;43495:14;;43485:6;:24;;43477:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43561:3;43555:9;;43301:275;43701:17;43738:3;43731;43722:6;:12;;;;:::i;:::-;43721:20;;;;:::i;:::-;43701:40;;43752:22;43786:9;43777:6;:18;;;;:::i;:::-;43752:43;;43806:39;43820:4;43826:2;43830:14;43806:13;:39::i;:::-;43872:1;43860:9;:13;43856:91;;;43890:45;43904:4;43918;43925:9;43890:13;:45::i;:::-;43856:91;43963:21;;;;;;;;;;;43959:418;;;44006:29;:35;44036:4;44006:35;;;;;;;;;;;;;;;;;;;;;;;;;44005:36;:92;;;;;44064:29;:33;44094:2;44064:33;;;;;;;;;;;;;;;;;;;;;;;;;44063:34;44005:92;:123;;;;;44124:4;;;;;;;;;;;44118:10;;:2;:10;;;;44005:123;44001:365;;;44163:15;44182:13;44192:2;44182:9;:13::i;:::-;44163:32;;44264:15;;44254:6;44244:7;:16;;;;:::i;:::-;:35;;44214:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;44144:222;44001:365;43959:418;41935:2449;;;;;;41858:2526;;;:::o;44392:693::-;44458:21;44496:1;44482:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44458:40;;44527:4;44509;44514:1;44509:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;44553:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44543:4;44548:1;44543:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;44579:6;;;;;;;;;;;:57;;;44651:11;44677:1;44693:4;44720;44740:15;44579:177;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44797:1;44773:21;:25;44769:309;;;44815:25;44867:1;44843:21;:25;;;;:::i;:::-;44815:53;;44883:22;44932:17;44908:21;:41;;;;:::i;:::-;44883:66;;44964:46;44992:17;44964;;;;;;;;;;;:27;;;;:46;;;;:::i;:::-;45025:41;45051:14;45025:15;;;;;;;;;;;:25;;;;:41;;;;:::i;:::-;44800:278;;44769:309;44447:638;44392:693;:::o;31347:1135::-;31453:1;31437:18;;:4;:18;;;31433:552;;31591:5;31575:12;;:21;;;;;;;:::i;:::-;;;;;;;;31433:552;;;31629:19;31651:9;:15;31661:4;31651:15;;;;;;;;;;;;;;;;31629:37;;31699:5;31685:11;:19;31681:117;;;31757:4;31763:11;31776:5;31732:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;31681:117;31953:5;31939:11;:19;31921:9;:15;31931:4;31921:15;;;;;;;;;;;;;;;:37;;;;31614:371;31433:552;32015:1;32001:16;;:2;:16;;;31997:435;;32183:5;32167:12;;:21;;;;;;;;;;;31997:435;;;32400:5;32383:9;:13;32393:2;32383:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;31997:435;32464:2;32449:25;;32458:4;32449:25;;;32468:5;32449:25;;;;;;:::i;:::-;;;;;;;;31347:1135;;;:::o;14897:340::-;15007:6;14983:21;:30;14979:111;;;15072:4;15037:41;;;;;;;;;;;:::i;:::-;;;;;;;;14979:111;15103:12;15121:9;:14;;15143:6;15121:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15102:52;;;15170:7;15165:65;;15201:17;;;;;;;;;;;;;;15165:65;14968:269;14897:340;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:104::-;184:7;213:24;231:5;213:24;:::i;:::-;202:35;;139:104;;;:::o;249:142::-;352:32;378:5;352:32;:::i;:::-;347:3;340:45;249:142;;:::o;397:254::-;506:4;544:2;533:9;529:18;521:26;;557:87;641:1;630:9;626:17;617:6;557:87;:::i;:::-;397:254;;;;:::o;657:99::-;709:6;743:5;737:12;727:22;;657:99;;;:::o;762:169::-;846:11;880:6;875:3;868:19;920:4;915:3;911:14;896:29;;762:169;;;;:::o;937:246::-;1018:1;1028:113;1042:6;1039:1;1036:13;1028:113;;;1127:1;1122:3;1118:11;1112:18;1108:1;1103:3;1099:11;1092:39;1064:2;1061:1;1057:10;1052:15;;1028:113;;;1175:1;1166:6;1161:3;1157:16;1150:27;999:184;937:246;;;:::o;1189:102::-;1230:6;1281:2;1277:7;1272:2;1265:5;1261:14;1257:28;1247:38;;1189:102;;;:::o;1297:377::-;1385:3;1413:39;1446:5;1413:39;:::i;:::-;1468:71;1532:6;1527:3;1468:71;:::i;:::-;1461:78;;1548:65;1606:6;1601:3;1594:4;1587:5;1583:16;1548:65;:::i;:::-;1638:29;1660:6;1638:29;:::i;:::-;1633:3;1629:39;1622:46;;1389:285;1297:377;;;;:::o;1680:313::-;1793:4;1831:2;1820:9;1816:18;1808:26;;1880:9;1874:4;1870:20;1866:1;1855:9;1851:17;1844:47;1908:78;1981:4;1972:6;1908:78;:::i;:::-;1900:86;;1680:313;;;;:::o;2080:117::-;2189:1;2186;2179:12;2326:96;2363:7;2392:24;2410:5;2392:24;:::i;:::-;2381:35;;2326:96;;;:::o;2428:122::-;2501:24;2519:5;2501:24;:::i;:::-;2494:5;2491:35;2481:63;;2540:1;2537;2530:12;2481:63;2428:122;:::o;2556:139::-;2602:5;2640:6;2627:20;2618:29;;2656:33;2683:5;2656:33;:::i;:::-;2556:139;;;;:::o;2701:77::-;2738:7;2767:5;2756:16;;2701:77;;;:::o;2784:122::-;2857:24;2875:5;2857:24;:::i;:::-;2850:5;2847:35;2837:63;;2896:1;2893;2886:12;2837:63;2784:122;:::o;2912:139::-;2958:5;2996:6;2983:20;2974:29;;3012:33;3039:5;3012:33;:::i;:::-;2912:139;;;;:::o;3057:474::-;3125:6;3133;3182:2;3170:9;3161:7;3157:23;3153:32;3150:119;;;3188:79;;:::i;:::-;3150:119;3308:1;3333:53;3378:7;3369:6;3358:9;3354:22;3333:53;:::i;:::-;3323:63;;3279:117;3435:2;3461:53;3506:7;3497:6;3486:9;3482:22;3461:53;:::i;:::-;3451:63;;3406:118;3057:474;;;;;:::o;3537:90::-;3571:7;3614:5;3607:13;3600:21;3589:32;;3537:90;;;:::o;3633:109::-;3714:21;3729:5;3714:21;:::i;:::-;3709:3;3702:34;3633:109;;:::o;3748:210::-;3835:4;3873:2;3862:9;3858:18;3850:26;;3886:65;3948:1;3937:9;3933:17;3924:6;3886:65;:::i;:::-;3748:210;;;;:::o;3964:118::-;4051:24;4069:5;4051:24;:::i;:::-;4046:3;4039:37;3964:118;;:::o;4088:222::-;4181:4;4219:2;4208:9;4204:18;4196:26;;4232:71;4300:1;4289:9;4285:17;4276:6;4232:71;:::i;:::-;4088:222;;;;:::o;4316:619::-;4393:6;4401;4409;4458:2;4446:9;4437:7;4433:23;4429:32;4426:119;;;4464:79;;:::i;:::-;4426:119;4584:1;4609:53;4654:7;4645:6;4634:9;4630:22;4609:53;:::i;:::-;4599:63;;4555:117;4711:2;4737:53;4782:7;4773:6;4762:9;4758:22;4737:53;:::i;:::-;4727:63;;4682:118;4839:2;4865:53;4910:7;4901:6;4890:9;4886:22;4865:53;:::i;:::-;4855:63;;4810:118;4316:619;;;;;:::o;4941:116::-;5011:21;5026:5;5011:21;:::i;:::-;5004:5;5001:32;4991:60;;5047:1;5044;5037:12;4991:60;4941:116;:::o;5063:133::-;5106:5;5144:6;5131:20;5122:29;;5160:30;5184:5;5160:30;:::i;:::-;5063:133;;;;:::o;5202:323::-;5258:6;5307:2;5295:9;5286:7;5282:23;5278:32;5275:119;;;5313:79;;:::i;:::-;5275:119;5433:1;5458:50;5500:7;5491:6;5480:9;5476:22;5458:50;:::i;:::-;5448:60;;5404:114;5202:323;;;;:::o;5531:86::-;5566:7;5606:4;5599:5;5595:16;5584:27;;5531:86;;;:::o;5623:112::-;5706:22;5722:5;5706:22;:::i;:::-;5701:3;5694:35;5623:112;;:::o;5741:214::-;5830:4;5868:2;5857:9;5853:18;5845:26;;5881:67;5945:1;5934:9;5930:17;5921:6;5881:67;:::i;:::-;5741:214;;;;:::o;5961:329::-;6020:6;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;5961:329;;;;:::o;6296:89::-;6332:7;6372:6;6365:5;6361:18;6350:29;;6296:89;;;:::o;6391:115::-;6476:23;6493:5;6476:23;:::i;:::-;6471:3;6464:36;6391:115;;:::o;6512:218::-;6603:4;6641:2;6630:9;6626:18;6618:26;;6654:69;6720:1;6709:9;6705:17;6696:6;6654:69;:::i;:::-;6512:218;;;;:::o;6736:118::-;6823:24;6841:5;6823:24;:::i;:::-;6818:3;6811:37;6736:118;;:::o;6860:222::-;6953:4;6991:2;6980:9;6976:18;6968:26;;7004:71;7072:1;7061:9;7057:17;7048:6;7004:71;:::i;:::-;6860:222;;;;:::o;7088:468::-;7153:6;7161;7210:2;7198:9;7189:7;7185:23;7181:32;7178:119;;;7216:79;;:::i;:::-;7178:119;7336:1;7361:53;7406:7;7397:6;7386:9;7382:22;7361:53;:::i;:::-;7351:63;;7307:117;7463:2;7489:50;7531:7;7522:6;7511:9;7507:22;7489:50;:::i;:::-;7479:60;;7434:115;7088:468;;;;;:::o;7562:474::-;7630:6;7638;7687:2;7675:9;7666:7;7662:23;7658:32;7655:119;;;7693:79;;:::i;:::-;7655:119;7813:1;7838:53;7883:7;7874:6;7863:9;7859:22;7838:53;:::i;:::-;7828:63;;7784:117;7940:2;7966:53;8011:7;8002:6;7991:9;7987:22;7966:53;:::i;:::-;7956:63;;7911:118;7562:474;;;;;:::o;8042:329::-;8101:6;8150:2;8138:9;8129:7;8125:23;8121:32;8118:119;;;8156:79;;:::i;:::-;8118:119;8276:1;8301:53;8346:7;8337:6;8326:9;8322:22;8301:53;:::i;:::-;8291:63;;8247:117;8042:329;;;;:::o;8377:60::-;8405:3;8426:5;8419:12;;8377:60;;;:::o;8443:142::-;8493:9;8526:53;8544:34;8553:24;8571:5;8553:24;:::i;:::-;8544:34;:::i;:::-;8526:53;:::i;:::-;8513:66;;8443:142;;;:::o;8591:126::-;8641:9;8674:37;8705:5;8674:37;:::i;:::-;8661:50;;8591:126;;;:::o;8723:152::-;8799:9;8832:37;8863:5;8832:37;:::i;:::-;8819:50;;8723:152;;;:::o;8881:183::-;8994:63;9051:5;8994:63;:::i;:::-;8989:3;8982:76;8881:183;;:::o;9070:274::-;9189:4;9227:2;9216:9;9212:18;9204:26;;9240:97;9334:1;9323:9;9319:17;9310:6;9240:97;:::i;:::-;9070:274;;;;:::o;9350:180::-;9398:77;9395:1;9388:88;9495:4;9492:1;9485:15;9519:4;9516:1;9509:15;9536:320;9580:6;9617:1;9611:4;9607:12;9597:22;;9664:1;9658:4;9654:12;9685:18;9675:81;;9741:4;9733:6;9729:17;9719:27;;9675:81;9803:2;9795:6;9792:14;9772:18;9769:38;9766:84;;9822:18;;:::i;:::-;9766:84;9587:269;9536:320;;;:::o;9862:232::-;10002:34;9998:1;9990:6;9986:14;9979:58;10071:15;10066:2;10058:6;10054:15;10047:40;9862:232;:::o;10100:366::-;10242:3;10263:67;10327:2;10322:3;10263:67;:::i;:::-;10256:74;;10339:93;10428:3;10339:93;:::i;:::-;10457:2;10452:3;10448:12;10441:19;;10100:366;;;:::o;10472:419::-;10638:4;10676:2;10665:9;10661:18;10653:26;;10725:9;10719:4;10715:20;10711:1;10700:9;10696:17;10689:47;10753:131;10879:4;10753:131;:::i;:::-;10745:139;;10472:419;;;:::o;10897:173::-;11037:25;11033:1;11025:6;11021:14;11014:49;10897:173;:::o;11076:366::-;11218:3;11239:67;11303:2;11298:3;11239:67;:::i;:::-;11232:74;;11315:93;11404:3;11315:93;:::i;:::-;11433:2;11428:3;11424:12;11417:19;;11076:366;;;:::o;11448:419::-;11614:4;11652:2;11641:9;11637:18;11629:26;;11701:9;11695:4;11691:20;11687:1;11676:9;11672:17;11665:47;11729:131;11855:4;11729:131;:::i;:::-;11721:139;;11448:419;;;:::o;11873:170::-;12013:22;12009:1;12001:6;11997:14;11990:46;11873:170;:::o;12049:366::-;12191:3;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12049:366;;;:::o;12421:419::-;12587:4;12625:2;12614:9;12610:18;12602:26;;12674:9;12668:4;12664:20;12660:1;12649:9;12645:17;12638:47;12702:131;12828:4;12702:131;:::i;:::-;12694:139;;12421:419;;;:::o;12846:223::-;12986:34;12982:1;12974:6;12970:14;12963:58;13055:6;13050:2;13042:6;13038:15;13031:31;12846:223;:::o;13075:366::-;13217:3;13238:67;13302:2;13297:3;13238:67;:::i;:::-;13231:74;;13314:93;13403:3;13314:93;:::i;:::-;13432:2;13427:3;13423:12;13416:19;;13075:366;;;:::o;13447:419::-;13613:4;13651:2;13640:9;13636:18;13628:26;;13700:9;13694:4;13690:20;13686:1;13675:9;13671:17;13664:47;13728:131;13854:4;13728:131;:::i;:::-;13720:139;;13447:419;;;:::o;13872:173::-;14012:25;14008:1;14000:6;13996:14;13989:49;13872:173;:::o;14051:366::-;14193:3;14214:67;14278:2;14273:3;14214:67;:::i;:::-;14207:74;;14290:93;14379:3;14290:93;:::i;:::-;14408:2;14403:3;14399:12;14392:19;;14051:366;;;:::o;14423:419::-;14589:4;14627:2;14616:9;14612:18;14604:26;;14676:9;14670:4;14666:20;14662:1;14651:9;14647:17;14640:47;14704:131;14830:4;14704:131;:::i;:::-;14696:139;;14423:419;;;:::o;14848:442::-;14997:4;15035:2;15024:9;15020:18;15012:26;;15048:71;15116:1;15105:9;15101:17;15092:6;15048:71;:::i;:::-;15129:72;15197:2;15186:9;15182:18;15173:6;15129:72;:::i;:::-;15211;15279:2;15268:9;15264:18;15255:6;15211:72;:::i;:::-;14848:442;;;;;;:::o;15296:163::-;15436:15;15432:1;15424:6;15420:14;15413:39;15296:163;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15465:366;;;:::o;15837:419::-;16003:4;16041:2;16030:9;16026:18;16018:26;;16090:9;16084:4;16080:20;16076:1;16065:9;16061:17;16054:47;16118:131;16244:4;16118:131;:::i;:::-;16110:139;;15837:419;;;:::o;16262:143::-;16319:5;16350:6;16344:13;16335:22;;16366:33;16393:5;16366:33;:::i;:::-;16262:143;;;;:::o;16411:351::-;16481:6;16530:2;16518:9;16509:7;16505:23;16501:32;16498:119;;;16536:79;;:::i;:::-;16498:119;16656:1;16681:64;16737:7;16728:6;16717:9;16713:22;16681:64;:::i;:::-;16671:74;;16627:128;16411:351;;;;:::o;16768:180::-;16816:77;16813:1;16806:88;16913:4;16910:1;16903:15;16937:4;16934:1;16927:15;16954:191;16994:3;17013:20;17031:1;17013:20;:::i;:::-;17008:25;;17047:20;17065:1;17047:20;:::i;:::-;17042:25;;17090:1;17087;17083:9;17076:16;;17111:3;17108:1;17105:10;17102:36;;;17118:18;;:::i;:::-;17102:36;16954:191;;;;:::o;17151:166::-;17291:18;17287:1;17279:6;17275:14;17268:42;17151:166;:::o;17323:366::-;17465:3;17486:67;17550:2;17545:3;17486:67;:::i;:::-;17479:74;;17562:93;17651:3;17562:93;:::i;:::-;17680:2;17675:3;17671:12;17664:19;;17323:366;;;:::o;17695:419::-;17861:4;17899:2;17888:9;17884:18;17876:26;;17948:9;17942:4;17938:20;17934:1;17923:9;17919:17;17912:47;17976:131;18102:4;17976:131;:::i;:::-;17968:139;;17695:419;;;:::o;18120:176::-;18260:28;18256:1;18248:6;18244:14;18237:52;18120:176;:::o;18302:366::-;18444:3;18465:67;18529:2;18524:3;18465:67;:::i;:::-;18458:74;;18541:93;18630:3;18541:93;:::i;:::-;18659:2;18654:3;18650:12;18643:19;;18302:366;;;:::o;18674:419::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:131;19081:4;18955:131;:::i;:::-;18947:139;;18674:419;;;:::o;19099:410::-;19139:7;19162:20;19180:1;19162:20;:::i;:::-;19157:25;;19196:20;19214:1;19196:20;:::i;:::-;19191:25;;19251:1;19248;19244:9;19273:30;19291:11;19273:30;:::i;:::-;19262:41;;19452:1;19443:7;19439:15;19436:1;19433:22;19413:1;19406:9;19386:83;19363:139;;19482:18;;:::i;:::-;19363:139;19147:362;19099:410;;;;:::o;19515:180::-;19563:77;19560:1;19553:88;19660:4;19657:1;19650:15;19684:4;19681:1;19674:15;19701:185;19741:1;19758:20;19776:1;19758:20;:::i;:::-;19753:25;;19792:20;19810:1;19792:20;:::i;:::-;19787:25;;19831:1;19821:35;;19836:18;;:::i;:::-;19821:35;19878:1;19875;19871:9;19866:14;;19701:185;;;;:::o;19892:194::-;19932:4;19952:20;19970:1;19952:20;:::i;:::-;19947:25;;19986:20;20004:1;19986:20;:::i;:::-;19981:25;;20030:1;20027;20023:9;20015:17;;20054:1;20048:4;20045:11;20042:37;;;20059:18;;:::i;:::-;20042:37;19892:194;;;;:::o;20092:176::-;20232:28;20228:1;20220:6;20216:14;20209:52;20092:176;:::o;20274:366::-;20416:3;20437:67;20501:2;20496:3;20437:67;:::i;:::-;20430:74;;20513:93;20602:3;20513:93;:::i;:::-;20631:2;20626:3;20622:12;20615:19;;20274:366;;;:::o;20646:419::-;20812:4;20850:2;20839:9;20835:18;20827:26;;20899:9;20893:4;20889:20;20885:1;20874:9;20870:17;20863:47;20927:131;21053:4;20927:131;:::i;:::-;20919:139;;20646:419;;;:::o;21071:180::-;21119:77;21116:1;21109:88;21216:4;21213:1;21206:15;21240:4;21237:1;21230:15;21257:180;21305:77;21302:1;21295:88;21402:4;21399:1;21392:15;21426:4;21423:1;21416:15;21443:143;21500:5;21531:6;21525:13;21516:22;;21547:33;21574:5;21547:33;:::i;:::-;21443:143;;;;:::o;21592:351::-;21662:6;21711:2;21699:9;21690:7;21686:23;21682:32;21679:119;;;21717:79;;:::i;:::-;21679:119;21837:1;21862:64;21918:7;21909:6;21898:9;21894:22;21862:64;:::i;:::-;21852:74;;21808:128;21592:351;;;;:::o;21949:85::-;21994:7;22023:5;22012:16;;21949:85;;;:::o;22040:158::-;22098:9;22131:61;22149:42;22158:32;22184:5;22158:32;:::i;:::-;22149:42;:::i;:::-;22131:61;:::i;:::-;22118:74;;22040:158;;;:::o;22204:147::-;22299:45;22338:5;22299:45;:::i;:::-;22294:3;22287:58;22204:147;;:::o;22357:114::-;22424:6;22458:5;22452:12;22442:22;;22357:114;;;:::o;22477:184::-;22576:11;22610:6;22605:3;22598:19;22650:4;22645:3;22641:14;22626:29;;22477:184;;;;:::o;22667:132::-;22734:4;22757:3;22749:11;;22787:4;22782:3;22778:14;22770:22;;22667:132;;;:::o;22805:108::-;22882:24;22900:5;22882:24;:::i;:::-;22877:3;22870:37;22805:108;;:::o;22919:179::-;22988:10;23009:46;23051:3;23043:6;23009:46;:::i;:::-;23087:4;23082:3;23078:14;23064:28;;22919:179;;;;:::o;23104:113::-;23174:4;23206;23201:3;23197:14;23189:22;;23104:113;;;:::o;23253:732::-;23372:3;23401:54;23449:5;23401:54;:::i;:::-;23471:86;23550:6;23545:3;23471:86;:::i;:::-;23464:93;;23581:56;23631:5;23581:56;:::i;:::-;23660:7;23691:1;23676:284;23701:6;23698:1;23695:13;23676:284;;;23777:6;23771:13;23804:63;23863:3;23848:13;23804:63;:::i;:::-;23797:70;;23890:60;23943:6;23890:60;:::i;:::-;23880:70;;23736:224;23723:1;23720;23716:9;23711:14;;23676:284;;;23680:14;23976:3;23969:10;;23377:608;;;23253:732;;;;:::o;23991:831::-;24254:4;24292:3;24281:9;24277:19;24269:27;;24306:71;24374:1;24363:9;24359:17;24350:6;24306:71;:::i;:::-;24387:80;24463:2;24452:9;24448:18;24439:6;24387:80;:::i;:::-;24514:9;24508:4;24504:20;24499:2;24488:9;24484:18;24477:48;24542:108;24645:4;24636:6;24542:108;:::i;:::-;24534:116;;24660:72;24728:2;24717:9;24713:18;24704:6;24660:72;:::i;:::-;24742:73;24810:3;24799:9;24795:19;24786:6;24742:73;:::i;:::-;23991:831;;;;;;;;:::o;24828:147::-;24929:11;24966:3;24951:18;;24828:147;;;;:::o;24981:114::-;;:::o;25101:398::-;25260:3;25281:83;25362:1;25357:3;25281:83;:::i;:::-;25274:90;;25373:93;25462:3;25373:93;:::i;:::-;25491:1;25486:3;25482:11;25475:18;;25101:398;;;:::o;25505:379::-;25689:3;25711:147;25854:3;25711:147;:::i;:::-;25704:154;;25875:3;25868:10;;25505:379;;;:::o

Swarm Source

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