ETH Price: $3,281.33 (+0.51%)

Token

KOMPETE Token (KOMPETE)
 

Overview

Max Total Supply

1,000,000,000 KOMPETE

Holders

80

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 10 Decimals)

Filtered by Token Holder
thewindofchange.eth
Balance
1,670,377.4309998014 KOMPETE

Value
$0.00
0x029628c78b3b566ed36d0574ef0dfed4bdf62ab4
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
KOMPETE

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-03
*/

// SPDX-License-Identifier: MIT


// File @openzeppelin/contracts/token/ERC20/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]


pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @uniswap/v2-core/contracts/interfaces/[email protected]

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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


// File contracts/KOMPETE.sol


pragma solidity ^0.8.0;






contract KOMPETE is ERC20, AccessControl {
    using SafeMath for uint256;
    using SafeERC20 for ERC20;

    uint8 private constant DECIMALS = 10;

    uint256 public liquidityFee = 200; // 2%
    uint256 public marketingFee = 1000; // 10%
    uint16 public constant MAX_FEE = 2000; // 20%
    uint256 public constant MAX_TOKEN_PER_WALLET = 10000000 * 10**DECIMALS; // Max holding limit, 1.00% of supply

    bytes32 public constant EXCLUDED_FROM_FEE_ROLE = keccak256("EXCLUDED_FROM_FEE_ROLE");
    bytes32 public constant EXCLUDED_FROM_ANTIWHALE_ROLE = keccak256("EXCLUDED_FROM_ANTIWHALE_ROLE");
    bytes32 public constant DENIED_ROLE = keccak256("DENIED_ROLE");

    address public marketingAddress = 0xb62848195772688117377B4CaC2834a761C244e4;
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    IUniswapV2Router02 public swapRouter;
    address public swapPair;
    address public liquidityOwner;

    bool public processFeesEnabled = true;
    bool private _processingFees;

    uint256 public numTokensToSwap = 200000 * 10**DECIMALS;

    event SwapRouterUpdated(address indexed router, address indexed pair);
    event AddLiquidity(uint256 amountToken, uint256 amountETH);
    event SendToMarketing(address indexed recipient, uint256 amountToken);

    modifier notDenied(address account) {
        require(!hasRole(DENIED_ROLE, account), "Address denied");
        _;
    }

    modifier lockTheSwap() {
        _processingFees = true;
        _;
        _processingFees = false;
    }

    modifier antiWhale(
        address sender,
        address recipient,
        uint256 amount
    ) {
        if (!hasRole(EXCLUDED_FROM_ANTIWHALE_ROLE, recipient)) {
            require(balanceOf(recipient).add(amount) <= MAX_TOKEN_PER_WALLET, "Wallet exceeds max");
        }
        _;
    }

    constructor() ERC20("KOMPETE Token", "KOMPETE") {
        liquidityOwner = _msgSender();

        // Create a uniswap pair for this new token
        swapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        swapPair = IUniswapV2Factory(swapRouter.factory()).createPair(address(this), swapRouter.WETH());

        // configure admin roles
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        // configure excluded from fee role
        _setupRole(EXCLUDED_FROM_FEE_ROLE, _msgSender());
        _setupRole(EXCLUDED_FROM_FEE_ROLE, address(this));
        _setupRole(EXCLUDED_FROM_FEE_ROLE, marketingAddress);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0xFd7d7a2175706E5555aAB0aAAF2251C6BC691ffC);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0xb62848195772688117377B4CaC2834a761C244e4);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x5D2c31eEAc483000Dd6120233AfAAA0535e9C6Ed);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x5623225F296BE00Ec9dB43f3DeD96804f24b062d);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x99B3208625e252eA0fBBe9B63e6004B06489D094);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x596e5556cF23b30e6c2C4c60dE216F66551c0220);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x9406609b3057053573f8d5418C1cbfaAc5161f21);
        _setupRole(EXCLUDED_FROM_FEE_ROLE, 0x71FC956eee0C97B095B70f6B1B263147a6d6799A);

        // configure excluded from antiwhale role
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, _msgSender());
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, address(this));
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, swapPair);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, marketingAddress);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, BURN_ADDRESS);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0xFd7d7a2175706E5555aAB0aAAF2251C6BC691ffC);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0xb62848195772688117377B4CaC2834a761C244e4);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x5D2c31eEAc483000Dd6120233AfAAA0535e9C6Ed);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x5623225F296BE00Ec9dB43f3DeD96804f24b062d);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x99B3208625e252eA0fBBe9B63e6004B06489D094);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x596e5556cF23b30e6c2C4c60dE216F66551c0220);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x9406609b3057053573f8d5418C1cbfaAc5161f21);
        _setupRole(EXCLUDED_FROM_ANTIWHALE_ROLE, 0x71FC956eee0C97B095B70f6B1B263147a6d6799A);

        // mint supply to owner
        _mint(_msgSender(), 1000000000 * 10**DECIMALS);
    }

    // receive ETH when swaping
    receive() external payable {}

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

    function totalFees() public view returns (uint256) {
        return liquidityFee + marketingFee;
    }

    function setLiquidityFee(uint256 _liquidityFee) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(totalFees() - liquidityFee + _liquidityFee <= MAX_FEE, "Tax too high");
        liquidityFee = _liquidityFee;
    }

    function setMarketingFee(uint256 _marketingFee) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(totalFees() - marketingFee + _marketingFee <= MAX_FEE, "Tax too high");
        marketingFee = _marketingFee;
    }

    /// @dev Roles must be granted manually after changing the address
    function setMarketingAddress(address newAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
        marketingAddress = newAddress;
    }

    function setLiquidityOwner(address newOwner) external onlyRole(DEFAULT_ADMIN_ROLE) {
        liquidityOwner = newOwner;
    }

    function updateSwapRouter(address _newRouter) external onlyRole(DEFAULT_ADMIN_ROLE) {
        swapRouter = IUniswapV2Router02(_newRouter);
        swapPair = IUniswapV2Factory(swapRouter.factory()).createPair(address(this), swapRouter.WETH());

        require(swapPair != address(0), "Invalid pair address.");
        emit SwapRouterUpdated(address(swapRouter), swapPair);
    }

    function setProcessFeesEnabled(bool _enabled) external onlyRole(DEFAULT_ADMIN_ROLE) {
        processFeesEnabled = _enabled;
    }

    function processFees(uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(amount <= balanceOf(address(this)), "Amount too high");
        _processFees(amount);
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return hasRole(EXCLUDED_FROM_FEE_ROLE, account);
    }

    function isExcludedAntiWhale(address account) public view returns (bool) {
        return hasRole(EXCLUDED_FROM_ANTIWHALE_ROLE, account);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override notDenied(from) notDenied(to) antiWhale(from, to, amount) {
        require(amount > 0, "Transfer <= 0");

        // process fees
        if (
            processFeesEnabled == true &&
            _processingFees == false &&
            from != swapPair &&
            !isExcludedFromFee(from)
        ) {
            uint256 contractTokenBalance = balanceOf(address(this));
            if (contractTokenBalance >= numTokensToSwap) {
                _processFees(numTokensToSwap);
            }
        }

        uint256 totalTax = totalFees();
        bool takeFee = !_processingFees && totalTax > 0 && !isExcludedFromFee(from) && !isExcludedFromFee(to);

        if (takeFee) {
            uint256 taxAmount = amount.mul(totalTax).div(10000);
            uint256 sendAmount = amount.sub(taxAmount);
            require(amount == sendAmount + taxAmount, "Tax value invalid");

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

            if (sendAmount > 0) {
                super._transfer(from, to, sendAmount);
            }
        } else {
            super._transfer(from, to, amount);
        }
    }

    function _processFees(uint256 tokenAmount) private lockTheSwap {
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 totalTax = totalFees();
        if (contractTokenBalance >= tokenAmount && totalTax > 0) {
            uint256 liquidityAmount = tokenAmount.mul(liquidityFee).div(totalTax);
            uint256 liquidityTokens = liquidityAmount.div(2);
            uint256 marketingAmount = tokenAmount.sub(liquidityAmount);
            uint256 liquifyAmount = liquidityAmount.sub(liquidityTokens).add(marketingAmount);

            // capture the contract's current balance.
            uint256 initialBalance = address(this).balance;

            // swap tokens
            swapTokensForEth(liquifyAmount);

            // how much did we just swap into?
            uint256 newBalance = address(this).balance.sub(initialBalance);

            // add liquidity
            uint256 liquidityETH = newBalance.mul(liquidityTokens).div(liquifyAmount);
            addLiquidity(liquidityTokens, liquidityETH);

            // send to marketing
            uint256 marketingETH = newBalance.sub(liquidityETH);
            sendToMarketing(marketingETH);
        }
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the swap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = swapRouter.WETH();

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

        // make the swap
        swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    /// @dev Add liquidity
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(swapRouter), tokenAmount);

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

        emit AddLiquidity(tokenAmount, ethAmount);
    }

    function sendToMarketing(uint256 amount) private {
        payable(marketingAddress).transfer(amount);
        emit SendToMarketing(marketingAddress, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"SendToMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"SwapRouterUpdated","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":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENIED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCLUDED_FROM_ANTIWHALE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCLUDED_FROM_FEE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"processFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setLiquidityOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setProcessFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"}],"name":"updateSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260c86006556103e860075573b62848195772688117377b4cac2834a761c244e4600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60146101000a81548160ff021916908315150217905550600a806200008e919062001077565b62030d406200009e9190620011b4565b600c55348015620000ae57600080fd5b506040518060400160405280600d81526020017f4b4f4d5045544520546f6b656e000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b4f4d504554450000000000000000000000000000000000000000000000000081525081600390805190602001906200013392919062000deb565b5080600490805190602001906200014c92919062000deb565b5050506200015f62000aed60201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025d57600080fd5b505afa15801562000272573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000298919062000eb2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031d57600080fd5b505afa15801562000332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000358919062000eb2565b6040518363ffffffff1660e01b81526004016200037792919062000f42565b602060405180830381600087803b1580156200039257600080fd5b505af1158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000eb2565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004316000801b6200042562000aed60201b60201c565b62000af560201b60201c565b620004727faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa6200046662000aed60201b60201c565b62000af560201b60201c565b620004a47faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa3062000af560201b60201c565b620004f87faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b6200053e7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73fd7d7a2175706e5555aab0aaaf2251c6bc691ffc62000af560201b60201c565b620005847faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73b62848195772688117377b4cac2834a761c244e462000af560201b60201c565b620005ca7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa735d2c31eeac483000dd6120233afaaa0535e9c6ed62000af560201b60201c565b620006107faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa735623225f296be00ec9db43f3ded96804f24b062d62000af560201b60201c565b620006567faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa7399b3208625e252ea0fbbe9b63e6004b06489d09462000af560201b60201c565b6200069c7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa73596e5556cf23b30e6c2c4c60de216f66551c022062000af560201b60201c565b620006e27faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa739406609b3057053573f8d5418c1cbfaac5161f2162000af560201b60201c565b620007287faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa7371fc956eee0c97b095b70f6b1b263147a6d6799a62000af560201b60201c565b620007697f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87536200075d62000aed60201b60201c565b62000af560201b60201c565b6200079b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87533062000af560201b60201c565b620007ef7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b620008437f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000af560201b60201c565b620008777f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875361dead62000af560201b60201c565b620008bd7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373fd7d7a2175706e5555aab0aaaf2251c6bc691ffc62000af560201b60201c565b620009037f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373b62848195772688117377b4cac2834a761c244e462000af560201b60201c565b620009497f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753735d2c31eeac483000dd6120233afaaa0535e9c6ed62000af560201b60201c565b6200098f7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753735623225f296be00ec9db43f3ded96804f24b062d62000af560201b60201c565b620009d57f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87537399b3208625e252ea0fbbe9b63e6004b06489d09462000af560201b60201c565b62000a1b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875373596e5556cf23b30e6c2c4c60de216f66551c022062000af560201b60201c565b62000a617f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753739406609b3057053573f8d5418c1cbfaac5161f2162000af560201b60201c565b62000aa77f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba87537371fc956eee0c97b095b70f6b1b263147a6d6799a62000af560201b60201c565b62000ae762000abb62000aed60201b60201c565b600a8062000aca919062001077565b633b9aca0062000adb9190620011b4565b62000b0b60201b60201c565b6200131b565b600033905090565b62000b07828262000c8460201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b759062000f6f565b60405180910390fd5b62000b926000838362000d7660201b60201c565b806002600082825462000ba6919062000fbf565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000bfd919062000fbf565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c64919062000f91565b60405180910390a362000c806000838362000d7b60201b60201c565b5050565b62000c96828262000d8060201b60201c565b62000d725760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000d1762000aed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82805462000df99062001260565b90600052602060002090601f01602090048101928262000e1d576000855562000e69565b82601f1062000e3857805160ff191683800117855562000e69565b8280016001018555821562000e69579182015b8281111562000e6857825182559160200191906001019062000e4b565b5b50905062000e78919062000e7c565b5090565b5b8082111562000e9757600081600090555060010162000e7d565b5090565b60008151905062000eac8162001301565b92915050565b60006020828403121562000ec557600080fd5b600062000ed58482850162000e9b565b91505092915050565b62000ee98162001215565b82525050565b600062000efe601f8362000fae565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b62000f3c8162001249565b82525050565b600060408201905062000f59600083018562000ede565b62000f68602083018462000ede565b9392505050565b6000602082019050818103600083015262000f8a8162000eef565b9050919050565b600060208201905062000fa8600083018462000f31565b92915050565b600082825260208201905092915050565b600062000fcc8262001249565b915062000fd98362001249565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001011576200101062001296565b5b828201905092915050565b6000808291508390505b60018511156200106e5780860481111562001046576200104562001296565b5b6001851615620010565780820291505b80810290506200106685620012f4565b945062001026565b94509492505050565b6000620010848262001249565b9150620010918362001253565b9250620010c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620010c8565b905092915050565b600082620010da5760019050620011ad565b81620010ea5760009050620011ad565b81600181146200110357600281146200110e5762001144565b6001915050620011ad565b60ff84111562001123576200112262001296565b5b8360020a9150848211156200113d576200113c62001296565b5b50620011ad565b5060208310610133831016604e8410600b84101617156200117e5782820a90508381111562001178576200117762001296565b5b620011ad565b6200118d84848460016200101c565b92509050818404811115620011a757620011a662001296565b5b81810290505b9392505050565b6000620011c18262001249565b9150620011ce8362001249565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200120a576200120962001296565b5b828202905092915050565b6000620012228262001229565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200127957607f821691505b6020821081141562001290576200128f620012c5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b6200130c8162001215565b81146200131857600080fd5b50565b6140e9806200132b6000396000f3fe6080604052600436106102555760003560e01c80636b67c4df11610139578063a457c2d7116100b6578063c31c9c071161007a578063c31c9c0714610923578063c9e482331461094e578063d547741f14610979578063dca74a19146109a2578063dd62ed3e146109cb578063fccc281314610a085761025c565b8063a457c2d71461082a578063a5ece94114610867578063a9059cbb14610892578063b98b677f146108cf578063bc063e1a146108f85761025c565b8063906e9dd0116100fd578063906e9dd01461074357806391d148541461076c57806395d89b41146107a957806398118cb4146107d4578063a217fddf146107ff5761025c565b80636b67c4df1461065e57806370a082311461068957806372bc5583146106c657806389701db5146106ef5780638e3166bc146107185761025c565b80632f2ff15d116101d25780633950935111610196578063395093511461053a5780633b46f869146105775780633dafaa9c146105a25780635342acb4146105cd578063614217841461060a578063625e764c146106355761025c565b80632f2ff15d14610469578063313ce56714610492578063357bf15c146104bd57806336568abe146104e65780633935ebf91461050f5761025c565b806318160ddd1161021957806318160ddd1461035c578063194f8f801461038757806323b872dd146103c4578063248a9ca31461040157806326991cc81461043e5761025c565b806301a6c43b1461026157806301ffc9a71461028c57806306fdde03146102c9578063095ea7b3146102f457806313114a9d146103315761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a33565b6040516102839190613a98565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612f73565b610a39565b6040516102c0919061380a565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb919061385b565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612ea9565b610b45565b604051610328919061380a565b60405180910390f35b34801561033d57600080fd5b50610346610b63565b6040516103539190613a98565b60405180910390f35b34801561036857600080fd5b50610371610b7a565b60405161037e9190613a98565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612dcc565b610b84565b6040516103bb919061380a565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612e5a565b610bb7565b6040516103f8919061380a565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612f0e565b610caf565b6040516104359190613825565b60405180910390f35b34801561044a57600080fd5b50610453610ccf565b6040516104609190613765565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f37565b610cf5565b005b34801561049e57600080fd5b506104a7610d1e565b6040516104b49190613b36565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f9c565b610d27565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612f37565b610daf565b005b34801561051b57600080fd5b50610524610e32565b6040516105319190613765565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612ea9565b610e58565b60405161056e919061380a565b60405180910390f35b34801561058357600080fd5b5061058c610f04565b6040516105999190613825565b60405180910390f35b3480156105ae57600080fd5b506105b7610f28565b6040516105c49190613825565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190612dcc565b610f4c565b604051610601919061380a565b60405180910390f35b34801561061657600080fd5b5061061f610f7f565b60405161062c919061380a565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612f9c565b610f92565b005b34801561066a57600080fd5b5061067361101a565b6040516106809190613a98565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190612dcc565b611020565b6040516106bd9190613a98565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190612dcc565b611068565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f9c565b6110c2565b005b34801561072457600080fd5b5061072d61112f565b60405161073a9190613825565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612dcc565b611153565b005b34801561077857600080fd5b50610793600480360381019061078e9190612f37565b6111ad565b6040516107a0919061380a565b60405180910390f35b3480156107b557600080fd5b506107be611218565b6040516107cb919061385b565b60405180910390f35b3480156107e057600080fd5b506107e96112aa565b6040516107f69190613a98565b60405180910390f35b34801561080b57600080fd5b506108146112b0565b6040516108219190613825565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190612ea9565b6112b7565b60405161085e919061380a565b60405180910390f35b34801561087357600080fd5b5061087c6113a2565b6040516108899190613765565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190612ea9565b6113c8565b6040516108c6919061380a565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190612dcc565b6113e6565b005b34801561090457600080fd5b5061090d61177b565b60405161091a9190613a7d565b60405180910390f35b34801561092f57600080fd5b50610938611781565b6040516109459190613840565b60405180910390f35b34801561095a57600080fd5b506109636117a7565b6040516109709190613a98565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190612f37565b6117c5565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190612ee5565b6117ee565b005b3480156109d757600080fd5b506109f260048036038101906109ed9190612e1e565b611821565b6040516109ff9190613a98565b60405180910390f35b348015610a1457600080fd5b50610a1d6118a8565b604051610a2a9190613765565b60405180910390f35b600c5481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac5750610aab826118ae565b5b9050919050565b606060038054610ac290613f63565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90613f63565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b59610b52611918565b8484611920565b6001905092915050565b6000600754600654610b759190613bb1565b905090565b6000600254905090565b6000610bb07f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b9050919050565b6000610bc4848484611aeb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c0f611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061395d565b60405180910390fd5b610ca385610c9b611918565b858403611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cfe82610caf565b610d0f81610d0a611918565b611ea7565b610d198383611f44565b505050565b6000600a905090565b6000801b610d3c81610d37611918565b611ea7565b6107d061ffff1682600654610d4f610b63565b610d599190613e03565b610d639190613bb1565b1115610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613a1d565b60405180910390fd5b816006819055505050565b610db7611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613a5d565b60405180910390fd5b610e2e8282612025565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610efa610e65611918565b848460016000610e73611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef59190613bb1565b611920565b6001905092915050565b7fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef81565b7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa81565b6000610f787faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa836111ad565b9050919050565b600b60149054906101000a900460ff1681565b6000801b610fa781610fa2611918565b611ea7565b6107d061ffff1682600754610fba610b63565b610fc49190613e03565b610fce9190613bb1565b111561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613a1d565b60405180910390fd5b816007819055505050565b60075481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61107d81611078611918565b611ea7565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000801b6110d7816110d2611918565b611ea7565b6110e030611020565b821115611122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111199061393d565b60405180910390fd5b61112b82612107565b5050565b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875381565b6000801b61116881611163611918565b611ea7565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461122790613f63565b80601f016020809104026020016040519081016040528092919081815260200182805461125390613f63565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905090565b60065481565b6000801b81565b600080600160006112c6611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613a3d565b60405180910390fd5b61139761138e611918565b85858403611920565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113dc6113d5611918565b8484611aeb565b6001905092915050565b6000801b6113fb816113f6611918565b611ea7565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc9190612df5565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561156057600080fd5b505afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612df5565b6040518363ffffffff1660e01b81526004016115b5929190613780565b602060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612df5565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061399d565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a35050565b6107d081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a806117b49190613c8b565b629896806117c29190613da9565b81565b6117ce82610caf565b6117df816117da611918565b611ea7565b6117e98383612025565b505050565b6000801b611803816117fe611918565b611ea7565b81600b60146101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61dead81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906138dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ade9190613a98565b60405180910390a3505050565b82611b167fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906138fd565b60405180910390fd5b82611b817fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906138fd565b60405180910390fd5b848484611bee7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b611c6a57600a80611bff9190613c8b565b62989680611c0d9190613da9565b611c2882611c1a85611020565b61227490919063ffffffff16565b1115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906139fd565b60405180910390fd5b5b60008611611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061397d565b60405180910390fd5b60011515600b60149054906101000a900460ff161515148015611ce3575060001515600b60159054906101000a900460ff161515145b8015611d3d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b8015611d4f5750611d4d88610f4c565b155b15611d78576000611d5f30611020565b9050600c548110611d7657611d75600c54612107565b5b505b6000611d82610b63565b90506000600b60159054906101000a900460ff16158015611da35750600082115b8015611db55750611db38a610f4c565b155b8015611dc75750611dc589610f4c565b155b90508015611e8f576000611df8612710611dea858c61228a90919063ffffffff16565b6122a090919063ffffffff16565b90506000611e0f828b6122b690919063ffffffff16565b90508181611e1d9190613bb1565b8a14611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906138bd565b60405180910390fd5b6000821115611e7357611e728c30846122cc565b5b6000811115611e8857611e878c8c836122cc565b5b5050611e9b565b611e9a8a8a8a6122cc565b5b50505050505050505050565b611eb182826111ad565b611f4057611ed68173ffffffffffffffffffffffffffffffffffffffff16601461254d565b611ee48360001c602061254d565b604051602001611ef592919061372b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f37919061385b565b60405180910390fd5b5050565b611f4e82826111ad565b6120215760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc6611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202f82826111ad565b156121035760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120a8611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600b60156101000a81548160ff021916908315150217905550600061212d30611020565b90506000612139610b63565b905082821015801561214b5750600081115b156122545760006121798261216b6006548761228a90919063ffffffff16565b6122a090919063ffffffff16565b905060006121916002836122a090919063ffffffff16565b905060006121a883876122b690919063ffffffff16565b905060006121d1826121c385876122b690919063ffffffff16565b61227490919063ffffffff16565b905060004790506121e182612847565b60006121f682476122b690919063ffffffff16565b9050600061221f84612211888561228a90919063ffffffff16565b6122a090919063ffffffff16565b905061222b8682612b0b565b600061224082846122b690919063ffffffff16565b905061224b81612c53565b50505050505050505b50506000600b60156101000a81548160ff02191690831515021790555050565b600081836122829190613bb1565b905092915050565b600081836122989190613da9565b905092915050565b600081836122ae9190613c07565b905092915050565b600081836122c49190613e03565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906139bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061389d565b60405180910390fd5b6123b7838383612d2f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061391d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d09190613bb1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125349190613a98565b60405180910390a3612547848484612d34565b50505050565b6060600060028360026125609190613da9565b61256a9190613bb1565b67ffffffffffffffff8111156125a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125db5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127039190613da9565b61270d9190613bb1565b90505b60018111156127f9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612775577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106127b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127f290613f39565b9050612710565b506000841461283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061387d565b60405180910390fd5b8091505092915050565b6000600267ffffffffffffffff81111561288a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128b85781602001602082028036833780820191505090505b50905030816000815181106128f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d09190612df5565b81600181518110612a0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a7130600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad5959493929190613ab3565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b505050505050565b612b3830600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612bc1969594939291906137a9565b6060604051808303818588803b158015612bda57600080fd5b505af1158015612bee573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c139190612fc5565b5050507fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb48282604051612c47929190613b0d565b60405180910390a15050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612cbb573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7281e2208e56b97e2118a4c1f31dc4badd530977cce4e1985af4f68f316b4ee982604051612d249190613a98565b60405180910390a250565b505050565b505050565b600081359050612d4881614040565b92915050565b600081519050612d5d81614040565b92915050565b600081359050612d7281614057565b92915050565b600081359050612d878161406e565b92915050565b600081359050612d9c81614085565b92915050565b600081359050612db18161409c565b92915050565b600081519050612dc68161409c565b92915050565b600060208284031215612dde57600080fd5b6000612dec84828501612d39565b91505092915050565b600060208284031215612e0757600080fd5b6000612e1584828501612d4e565b91505092915050565b60008060408385031215612e3157600080fd5b6000612e3f85828601612d39565b9250506020612e5085828601612d39565b9150509250929050565b600080600060608486031215612e6f57600080fd5b6000612e7d86828701612d39565b9350506020612e8e86828701612d39565b9250506040612e9f86828701612da2565b9150509250925092565b60008060408385031215612ebc57600080fd5b6000612eca85828601612d39565b9250506020612edb85828601612da2565b9150509250929050565b600060208284031215612ef757600080fd5b6000612f0584828501612d63565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612d78565b91505092915050565b60008060408385031215612f4a57600080fd5b6000612f5885828601612d78565b9250506020612f6985828601612d39565b9150509250929050565b600060208284031215612f8557600080fd5b6000612f9384828501612d8d565b91505092915050565b600060208284031215612fae57600080fd5b6000612fbc84828501612da2565b91505092915050565b600080600060608486031215612fda57600080fd5b6000612fe886828701612db7565b9350506020612ff986828701612db7565b925050604061300a86828701612db7565b9150509250925092565b6000613020838361302c565b60208301905092915050565b61303581613e37565b82525050565b61304481613e37565b82525050565b600061305582613b61565b61305f8185613b84565b935061306a83613b51565b8060005b8381101561309b5781516130828882613014565b975061308d83613b77565b92505060018101905061306e565b5085935050505092915050565b6130b181613e49565b82525050565b6130c081613e55565b82525050565b6130cf81613ed0565b82525050565b6130de81613ef4565b82525050565b60006130ef82613b6c565b6130f98185613b95565b9350613109818560208601613f06565b61311281614022565b840191505092915050565b600061312882613b6c565b6131328185613ba6565b9350613142818560208601613f06565b80840191505092915050565b600061315b602083613b95565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061319b602383613b95565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613201601183613b95565b91507f5461782076616c756520696e76616c69640000000000000000000000000000006000830152602082019050919050565b6000613241602283613b95565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7600e83613b95565b91507f416464726573732064656e6965640000000000000000000000000000000000006000830152602082019050919050565b60006132e7602683613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061334d600f83613b95565b91507f416d6f756e7420746f6f206869676800000000000000000000000000000000006000830152602082019050919050565b600061338d602883613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f3600d83613b95565b91507f5472616e73666572203c3d2030000000000000000000000000000000000000006000830152602082019050919050565b6000613433601583613b95565b91507f496e76616c6964207061697220616464726573732e00000000000000000000006000830152602082019050919050565b6000613473602583613b95565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d9602483613b95565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061353f601283613b95565b91507f57616c6c65742065786365656473206d617800000000000000000000000000006000830152602082019050919050565b600061357f600c83613b95565b91507f54617820746f6f206869676800000000000000000000000000000000000000006000830152602082019050919050565b60006135bf601783613ba6565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006135ff602583613b95565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613665601183613ba6565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136a5602f83613b95565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61370781613e8b565b82525050565b61371681613eb9565b82525050565b61372581613ec3565b82525050565b6000613736826135b2565b9150613742828561311d565b915061374d82613658565b9150613759828461311d565b91508190509392505050565b600060208201905061377a600083018461303b565b92915050565b6000604082019050613795600083018561303b565b6137a2602083018461303b565b9392505050565b600060c0820190506137be600083018961303b565b6137cb602083018861370d565b6137d860408301876130d5565b6137e560608301866130d5565b6137f2608083018561303b565b6137ff60a083018461370d565b979650505050505050565b600060208201905061381f60008301846130a8565b92915050565b600060208201905061383a60008301846130b7565b92915050565b600060208201905061385560008301846130c6565b92915050565b6000602082019050818103600083015261387581846130e4565b905092915050565b600060208201905081810360008301526138968161314e565b9050919050565b600060208201905081810360008301526138b68161318e565b9050919050565b600060208201905081810360008301526138d6816131f4565b9050919050565b600060208201905081810360008301526138f681613234565b9050919050565b600060208201905081810360008301526139168161329a565b9050919050565b60006020820190508181036000830152613936816132da565b9050919050565b6000602082019050818103600083015261395681613340565b9050919050565b6000602082019050818103600083015261397681613380565b9050919050565b60006020820190508181036000830152613996816133e6565b9050919050565b600060208201905081810360008301526139b681613426565b9050919050565b600060208201905081810360008301526139d681613466565b9050919050565b600060208201905081810360008301526139f6816134cc565b9050919050565b60006020820190508181036000830152613a1681613532565b9050919050565b60006020820190508181036000830152613a3681613572565b9050919050565b60006020820190508181036000830152613a56816135f2565b9050919050565b60006020820190508181036000830152613a7681613698565b9050919050565b6000602082019050613a9260008301846136fe565b92915050565b6000602082019050613aad600083018461370d565b92915050565b600060a082019050613ac8600083018861370d565b613ad560208301876130d5565b8181036040830152613ae7818661304a565b9050613af6606083018561303b565b613b03608083018461370d565b9695505050505050565b6000604082019050613b22600083018561370d565b613b2f602083018461370d565b9392505050565b6000602082019050613b4b600083018461371c565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bbc82613eb9565b9150613bc783613eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bfc57613bfb613f95565b5b828201905092915050565b6000613c1282613eb9565b9150613c1d83613eb9565b925082613c2d57613c2c613fc4565b5b828204905092915050565b6000808291508390505b6001851115613c8257808604811115613c5e57613c5d613f95565b5b6001851615613c6d5780820291505b8081029050613c7b85614033565b9450613c42565b94509492505050565b6000613c9682613eb9565b9150613ca183613ec3565b9250613cce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613cd6565b905092915050565b600082613ce65760019050613da2565b81613cf45760009050613da2565b8160018114613d0a5760028114613d1457613d43565b6001915050613da2565b60ff841115613d2657613d25613f95565b5b8360020a915084821115613d3d57613d3c613f95565b5b50613da2565b5060208310610133831016604e8410600b8410161715613d785782820a905083811115613d7357613d72613f95565b5b613da2565b613d858484846001613c38565b92509050818404811115613d9c57613d9b613f95565b5b81810290505b9392505050565b6000613db482613eb9565b9150613dbf83613eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df857613df7613f95565b5b828202905092915050565b6000613e0e82613eb9565b9150613e1983613eb9565b925082821015613e2c57613e2b613f95565b5b828203905092915050565b6000613e4282613e99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edb82613ee2565b9050919050565b6000613eed82613e99565b9050919050565b6000613eff82613eb9565b9050919050565b60005b83811015613f24578082015181840152602081019050613f09565b83811115613f33576000848401525b50505050565b6000613f4482613eb9565b91506000821415613f5857613f57613f95565b5b600182039050919050565b60006002820490506001821680613f7b57607f821691505b60208210811415613f8f57613f8e613ff3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61404981613e37565b811461405457600080fd5b50565b61406081613e49565b811461406b57600080fd5b50565b61407781613e55565b811461408257600080fd5b50565b61408e81613e5f565b811461409957600080fd5b50565b6140a581613eb9565b81146140b057600080fd5b5056fea2646970667358221220e63114547f8b3f0b03b4992bc22100f818b09a6d196f15865c604df769c7919264736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80636b67c4df11610139578063a457c2d7116100b6578063c31c9c071161007a578063c31c9c0714610923578063c9e482331461094e578063d547741f14610979578063dca74a19146109a2578063dd62ed3e146109cb578063fccc281314610a085761025c565b8063a457c2d71461082a578063a5ece94114610867578063a9059cbb14610892578063b98b677f146108cf578063bc063e1a146108f85761025c565b8063906e9dd0116100fd578063906e9dd01461074357806391d148541461076c57806395d89b41146107a957806398118cb4146107d4578063a217fddf146107ff5761025c565b80636b67c4df1461065e57806370a082311461068957806372bc5583146106c657806389701db5146106ef5780638e3166bc146107185761025c565b80632f2ff15d116101d25780633950935111610196578063395093511461053a5780633b46f869146105775780633dafaa9c146105a25780635342acb4146105cd578063614217841461060a578063625e764c146106355761025c565b80632f2ff15d14610469578063313ce56714610492578063357bf15c146104bd57806336568abe146104e65780633935ebf91461050f5761025c565b806318160ddd1161021957806318160ddd1461035c578063194f8f801461038757806323b872dd146103c4578063248a9ca31461040157806326991cc81461043e5761025c565b806301a6c43b1461026157806301ffc9a71461028c57806306fdde03146102c9578063095ea7b3146102f457806313114a9d146103315761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a33565b6040516102839190613a98565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612f73565b610a39565b6040516102c0919061380a565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb919061385b565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612ea9565b610b45565b604051610328919061380a565b60405180910390f35b34801561033d57600080fd5b50610346610b63565b6040516103539190613a98565b60405180910390f35b34801561036857600080fd5b50610371610b7a565b60405161037e9190613a98565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612dcc565b610b84565b6040516103bb919061380a565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612e5a565b610bb7565b6040516103f8919061380a565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612f0e565b610caf565b6040516104359190613825565b60405180910390f35b34801561044a57600080fd5b50610453610ccf565b6040516104609190613765565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f37565b610cf5565b005b34801561049e57600080fd5b506104a7610d1e565b6040516104b49190613b36565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f9c565b610d27565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612f37565b610daf565b005b34801561051b57600080fd5b50610524610e32565b6040516105319190613765565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612ea9565b610e58565b60405161056e919061380a565b60405180910390f35b34801561058357600080fd5b5061058c610f04565b6040516105999190613825565b60405180910390f35b3480156105ae57600080fd5b506105b7610f28565b6040516105c49190613825565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190612dcc565b610f4c565b604051610601919061380a565b60405180910390f35b34801561061657600080fd5b5061061f610f7f565b60405161062c919061380a565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612f9c565b610f92565b005b34801561066a57600080fd5b5061067361101a565b6040516106809190613a98565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190612dcc565b611020565b6040516106bd9190613a98565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190612dcc565b611068565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f9c565b6110c2565b005b34801561072457600080fd5b5061072d61112f565b60405161073a9190613825565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612dcc565b611153565b005b34801561077857600080fd5b50610793600480360381019061078e9190612f37565b6111ad565b6040516107a0919061380a565b60405180910390f35b3480156107b557600080fd5b506107be611218565b6040516107cb919061385b565b60405180910390f35b3480156107e057600080fd5b506107e96112aa565b6040516107f69190613a98565b60405180910390f35b34801561080b57600080fd5b506108146112b0565b6040516108219190613825565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190612ea9565b6112b7565b60405161085e919061380a565b60405180910390f35b34801561087357600080fd5b5061087c6113a2565b6040516108899190613765565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190612ea9565b6113c8565b6040516108c6919061380a565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190612dcc565b6113e6565b005b34801561090457600080fd5b5061090d61177b565b60405161091a9190613a7d565b60405180910390f35b34801561092f57600080fd5b50610938611781565b6040516109459190613840565b60405180910390f35b34801561095a57600080fd5b506109636117a7565b6040516109709190613a98565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b9190612f37565b6117c5565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190612ee5565b6117ee565b005b3480156109d757600080fd5b506109f260048036038101906109ed9190612e1e565b611821565b6040516109ff9190613a98565b60405180910390f35b348015610a1457600080fd5b50610a1d6118a8565b604051610a2a9190613765565b60405180910390f35b600c5481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac5750610aab826118ae565b5b9050919050565b606060038054610ac290613f63565b80601f0160208091040260200160405190810160405280929190818152602001828054610aee90613f63565b8015610b3b5780601f10610b1057610100808354040283529160200191610b3b565b820191906000526020600020905b815481529060010190602001808311610b1e57829003601f168201915b5050505050905090565b6000610b59610b52611918565b8484611920565b6001905092915050565b6000600754600654610b759190613bb1565b905090565b6000600254905090565b6000610bb07f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b9050919050565b6000610bc4848484611aeb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c0f611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061395d565b60405180910390fd5b610ca385610c9b611918565b858403611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cfe82610caf565b610d0f81610d0a611918565b611ea7565b610d198383611f44565b505050565b6000600a905090565b6000801b610d3c81610d37611918565b611ea7565b6107d061ffff1682600654610d4f610b63565b610d599190613e03565b610d639190613bb1565b1115610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613a1d565b60405180910390fd5b816006819055505050565b610db7611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613a5d565b60405180910390fd5b610e2e8282612025565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610efa610e65611918565b848460016000610e73611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef59190613bb1565b611920565b6001905092915050565b7fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef81565b7faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa81565b6000610f787faa2bf0f18a184595f311714f88137302cdcad3d20639b5595c7fe0d3db0658fa836111ad565b9050919050565b600b60149054906101000a900460ff1681565b6000801b610fa781610fa2611918565b611ea7565b6107d061ffff1682600754610fba610b63565b610fc49190613e03565b610fce9190613bb1565b111561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613a1d565b60405180910390fd5b816007819055505050565b60075481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b61107d81611078611918565b611ea7565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000801b6110d7816110d2611918565b611ea7565b6110e030611020565b821115611122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111199061393d565b60405180910390fd5b61112b82612107565b5050565b7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba875381565b6000801b61116881611163611918565b611ea7565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606004805461122790613f63565b80601f016020809104026020016040519081016040528092919081815260200182805461125390613f63565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905090565b60065481565b6000801b81565b600080600160006112c6611918565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613a3d565b60405180910390fd5b61139761138e611918565b85858403611920565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113dc6113d5611918565b8484611aeb565b6001905092915050565b6000801b6113fb816113f6611918565b611ea7565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc9190612df5565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561156057600080fd5b505afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612df5565b6040518363ffffffff1660e01b81526004016115b5929190613780565b602060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612df5565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061399d565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a35050565b6107d081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a806117b49190613c8b565b629896806117c29190613da9565b81565b6117ce82610caf565b6117df816117da611918565b611ea7565b6117e98383612025565b505050565b6000801b611803816117fe611918565b611ea7565b81600b60146101000a81548160ff0219169083151502179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61dead81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906138dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ade9190613a98565b60405180910390a3505050565b82611b167fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906138fd565b60405180910390fd5b82611b817fe26365870a4fc4941079bb663ce6252b0cf41101ec800616561f5c0f30dcf7ef826111ad565b15611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906138fd565b60405180910390fd5b848484611bee7f5df7ebf31955a926cc63dac31c1a31bc588cdae5c3e13e63b89ebfe0eaba8753836111ad565b611c6a57600a80611bff9190613c8b565b62989680611c0d9190613da9565b611c2882611c1a85611020565b61227490919063ffffffff16565b1115611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906139fd565b60405180910390fd5b5b60008611611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061397d565b60405180910390fd5b60011515600b60149054906101000a900460ff161515148015611ce3575060001515600b60159054906101000a900460ff161515145b8015611d3d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b8015611d4f5750611d4d88610f4c565b155b15611d78576000611d5f30611020565b9050600c548110611d7657611d75600c54612107565b5b505b6000611d82610b63565b90506000600b60159054906101000a900460ff16158015611da35750600082115b8015611db55750611db38a610f4c565b155b8015611dc75750611dc589610f4c565b155b90508015611e8f576000611df8612710611dea858c61228a90919063ffffffff16565b6122a090919063ffffffff16565b90506000611e0f828b6122b690919063ffffffff16565b90508181611e1d9190613bb1565b8a14611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906138bd565b60405180910390fd5b6000821115611e7357611e728c30846122cc565b5b6000811115611e8857611e878c8c836122cc565b5b5050611e9b565b611e9a8a8a8a6122cc565b5b50505050505050505050565b611eb182826111ad565b611f4057611ed68173ffffffffffffffffffffffffffffffffffffffff16601461254d565b611ee48360001c602061254d565b604051602001611ef592919061372b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f37919061385b565b60405180910390fd5b5050565b611f4e82826111ad565b6120215760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc6611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202f82826111ad565b156121035760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120a8611918565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6001600b60156101000a81548160ff021916908315150217905550600061212d30611020565b90506000612139610b63565b905082821015801561214b5750600081115b156122545760006121798261216b6006548761228a90919063ffffffff16565b6122a090919063ffffffff16565b905060006121916002836122a090919063ffffffff16565b905060006121a883876122b690919063ffffffff16565b905060006121d1826121c385876122b690919063ffffffff16565b61227490919063ffffffff16565b905060004790506121e182612847565b60006121f682476122b690919063ffffffff16565b9050600061221f84612211888561228a90919063ffffffff16565b6122a090919063ffffffff16565b905061222b8682612b0b565b600061224082846122b690919063ffffffff16565b905061224b81612c53565b50505050505050505b50506000600b60156101000a81548160ff02191690831515021790555050565b600081836122829190613bb1565b905092915050565b600081836122989190613da9565b905092915050565b600081836122ae9190613c07565b905092915050565b600081836122c49190613e03565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906139bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061389d565b60405180910390fd5b6123b7838383612d2f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061391d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d09190613bb1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125349190613a98565b60405180910390a3612547848484612d34565b50505050565b6060600060028360026125609190613da9565b61256a9190613bb1565b67ffffffffffffffff8111156125a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125db5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127039190613da9565b61270d9190613bb1565b90505b60018111156127f9577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612775577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106127b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806127f290613f39565b9050612710565b506000841461283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061387d565b60405180910390fd5b8091505092915050565b6000600267ffffffffffffffff81111561288a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128b85781602001602082028036833780820191505090505b50905030816000815181106128f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d09190612df5565b81600181518110612a0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a7130600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad5959493929190613ab3565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b505050505050565b612b3830600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611920565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612bc1969594939291906137a9565b6060604051808303818588803b158015612bda57600080fd5b505af1158015612bee573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c139190612fc5565b5050507fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb48282604051612c47929190613b0d565b60405180910390a15050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612cbb573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7281e2208e56b97e2118a4c1f31dc4badd530977cce4e1985af4f68f316b4ee982604051612d249190613a98565b60405180910390a250565b505050565b505050565b600081359050612d4881614040565b92915050565b600081519050612d5d81614040565b92915050565b600081359050612d7281614057565b92915050565b600081359050612d878161406e565b92915050565b600081359050612d9c81614085565b92915050565b600081359050612db18161409c565b92915050565b600081519050612dc68161409c565b92915050565b600060208284031215612dde57600080fd5b6000612dec84828501612d39565b91505092915050565b600060208284031215612e0757600080fd5b6000612e1584828501612d4e565b91505092915050565b60008060408385031215612e3157600080fd5b6000612e3f85828601612d39565b9250506020612e5085828601612d39565b9150509250929050565b600080600060608486031215612e6f57600080fd5b6000612e7d86828701612d39565b9350506020612e8e86828701612d39565b9250506040612e9f86828701612da2565b9150509250925092565b60008060408385031215612ebc57600080fd5b6000612eca85828601612d39565b9250506020612edb85828601612da2565b9150509250929050565b600060208284031215612ef757600080fd5b6000612f0584828501612d63565b91505092915050565b600060208284031215612f2057600080fd5b6000612f2e84828501612d78565b91505092915050565b60008060408385031215612f4a57600080fd5b6000612f5885828601612d78565b9250506020612f6985828601612d39565b9150509250929050565b600060208284031215612f8557600080fd5b6000612f9384828501612d8d565b91505092915050565b600060208284031215612fae57600080fd5b6000612fbc84828501612da2565b91505092915050565b600080600060608486031215612fda57600080fd5b6000612fe886828701612db7565b9350506020612ff986828701612db7565b925050604061300a86828701612db7565b9150509250925092565b6000613020838361302c565b60208301905092915050565b61303581613e37565b82525050565b61304481613e37565b82525050565b600061305582613b61565b61305f8185613b84565b935061306a83613b51565b8060005b8381101561309b5781516130828882613014565b975061308d83613b77565b92505060018101905061306e565b5085935050505092915050565b6130b181613e49565b82525050565b6130c081613e55565b82525050565b6130cf81613ed0565b82525050565b6130de81613ef4565b82525050565b60006130ef82613b6c565b6130f98185613b95565b9350613109818560208601613f06565b61311281614022565b840191505092915050565b600061312882613b6c565b6131328185613ba6565b9350613142818560208601613f06565b80840191505092915050565b600061315b602083613b95565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061319b602383613b95565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613201601183613b95565b91507f5461782076616c756520696e76616c69640000000000000000000000000000006000830152602082019050919050565b6000613241602283613b95565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7600e83613b95565b91507f416464726573732064656e6965640000000000000000000000000000000000006000830152602082019050919050565b60006132e7602683613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061334d600f83613b95565b91507f416d6f756e7420746f6f206869676800000000000000000000000000000000006000830152602082019050919050565b600061338d602883613b95565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f3600d83613b95565b91507f5472616e73666572203c3d2030000000000000000000000000000000000000006000830152602082019050919050565b6000613433601583613b95565b91507f496e76616c6964207061697220616464726573732e00000000000000000000006000830152602082019050919050565b6000613473602583613b95565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d9602483613b95565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061353f601283613b95565b91507f57616c6c65742065786365656473206d617800000000000000000000000000006000830152602082019050919050565b600061357f600c83613b95565b91507f54617820746f6f206869676800000000000000000000000000000000000000006000830152602082019050919050565b60006135bf601783613ba6565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006135ff602583613b95565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613665601183613ba6565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136a5602f83613b95565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61370781613e8b565b82525050565b61371681613eb9565b82525050565b61372581613ec3565b82525050565b6000613736826135b2565b9150613742828561311d565b915061374d82613658565b9150613759828461311d565b91508190509392505050565b600060208201905061377a600083018461303b565b92915050565b6000604082019050613795600083018561303b565b6137a2602083018461303b565b9392505050565b600060c0820190506137be600083018961303b565b6137cb602083018861370d565b6137d860408301876130d5565b6137e560608301866130d5565b6137f2608083018561303b565b6137ff60a083018461370d565b979650505050505050565b600060208201905061381f60008301846130a8565b92915050565b600060208201905061383a60008301846130b7565b92915050565b600060208201905061385560008301846130c6565b92915050565b6000602082019050818103600083015261387581846130e4565b905092915050565b600060208201905081810360008301526138968161314e565b9050919050565b600060208201905081810360008301526138b68161318e565b9050919050565b600060208201905081810360008301526138d6816131f4565b9050919050565b600060208201905081810360008301526138f681613234565b9050919050565b600060208201905081810360008301526139168161329a565b9050919050565b60006020820190508181036000830152613936816132da565b9050919050565b6000602082019050818103600083015261395681613340565b9050919050565b6000602082019050818103600083015261397681613380565b9050919050565b60006020820190508181036000830152613996816133e6565b9050919050565b600060208201905081810360008301526139b681613426565b9050919050565b600060208201905081810360008301526139d681613466565b9050919050565b600060208201905081810360008301526139f6816134cc565b9050919050565b60006020820190508181036000830152613a1681613532565b9050919050565b60006020820190508181036000830152613a3681613572565b9050919050565b60006020820190508181036000830152613a56816135f2565b9050919050565b60006020820190508181036000830152613a7681613698565b9050919050565b6000602082019050613a9260008301846136fe565b92915050565b6000602082019050613aad600083018461370d565b92915050565b600060a082019050613ac8600083018861370d565b613ad560208301876130d5565b8181036040830152613ae7818661304a565b9050613af6606083018561303b565b613b03608083018461370d565b9695505050505050565b6000604082019050613b22600083018561370d565b613b2f602083018461370d565b9392505050565b6000602082019050613b4b600083018461371c565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bbc82613eb9565b9150613bc783613eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bfc57613bfb613f95565b5b828201905092915050565b6000613c1282613eb9565b9150613c1d83613eb9565b925082613c2d57613c2c613fc4565b5b828204905092915050565b6000808291508390505b6001851115613c8257808604811115613c5e57613c5d613f95565b5b6001851615613c6d5780820291505b8081029050613c7b85614033565b9450613c42565b94509492505050565b6000613c9682613eb9565b9150613ca183613ec3565b9250613cce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613cd6565b905092915050565b600082613ce65760019050613da2565b81613cf45760009050613da2565b8160018114613d0a5760028114613d1457613d43565b6001915050613da2565b60ff841115613d2657613d25613f95565b5b8360020a915084821115613d3d57613d3c613f95565b5b50613da2565b5060208310610133831016604e8410600b8410161715613d785782820a905083811115613d7357613d72613f95565b5b613da2565b613d858484846001613c38565b92509050818404811115613d9c57613d9b613f95565b5b81810290505b9392505050565b6000613db482613eb9565b9150613dbf83613eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df857613df7613f95565b5b828202905092915050565b6000613e0e82613eb9565b9150613e1983613eb9565b925082821015613e2c57613e2b613f95565b5b828203905092915050565b6000613e4282613e99565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edb82613ee2565b9050919050565b6000613eed82613e99565b9050919050565b6000613eff82613eb9565b9050919050565b60005b83811015613f24578082015181840152602081019050613f09565b83811115613f33576000848401525b50505050565b6000613f4482613eb9565b91506000821415613f5857613f57613f95565b5b600182039050919050565b60006002820490506001821680613f7b57607f821691505b60208210811415613f8f57613f8e613ff3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61404981613e37565b811461405457600080fd5b50565b61406081613e49565b811461406b57600080fd5b50565b61407781613e55565b811461408257600080fd5b50565b61408e81613e5f565b811461409957600080fd5b50565b6140a581613eb9565b81146140b057600080fd5b5056fea2646970667358221220e63114547f8b3f0b03b4992bc22100f818b09a6d196f15865c604df769c7919264736f6c63430008000033

Deployed Bytecode Sourcemap

55377:10574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56429:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37855:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6461:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8628:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60063:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7581:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61858:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9279:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39266:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56280:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39651:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59956:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60175:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40699:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56310:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10180:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55993:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55799:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61713:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56348:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60405:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55583:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7752:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60850;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61518:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55890:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60707:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38151:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6680:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55537:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37242:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10898:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56064:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8092:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60985:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55631:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56237:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55682:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40043:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61378:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8330:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56147:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56429:54;;;;:::o;37855:204::-;37940:4;37979:32;37964:47;;;:11;:47;;;;:87;;;;38015:36;38039:11;38015:23;:36::i;:::-;37964:87;37957:94;;37855:204;;;:::o;6461:100::-;6515:13;6548:5;6541:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6461:100;:::o;8628:169::-;8711:4;8728:39;8737:12;:10;:12::i;:::-;8751:7;8760:6;8728:8;:39::i;:::-;8785:4;8778:11;;8628:169;;;;:::o;60063:104::-;60105:7;60147:12;;60132;;:27;;;;:::i;:::-;60125:34;;60063:104;:::o;7581:108::-;7642:7;7669:12;;7662:19;;7581:108;:::o;61858:145::-;61925:4;61949:46;55945:41;61987:7;61949;:46::i;:::-;61942:53;;61858:145;;;:::o;9279:492::-;9419:4;9436:36;9446:6;9454:9;9465:6;9436:9;:36::i;:::-;9485:24;9512:11;:19;9524:6;9512:19;;;;;;;;;;;;;;;:33;9532:12;:10;:12::i;:::-;9512:33;;;;;;;;;;;;;;;;9485:60;;9584:6;9564:16;:26;;9556:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9671:57;9680:6;9688:12;:10;:12::i;:::-;9721:6;9702:16;:25;9671:8;:57::i;:::-;9759:4;9752:11;;;9279:492;;;;;:::o;39266:123::-;39332:7;39359:6;:12;39366:4;39359:12;;;;;;;;;;;:22;;;39352:29;;39266:123;;;:::o;56280:23::-;;;;;;;;;;;;;:::o;39651:147::-;39734:18;39747:4;39734:12;:18::i;:::-;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;39765:25:::1;39776:4;39782:7;39765:10;:25::i;:::-;39651:147:::0;;;:::o;59956:99::-;60014:5;55526:2;60032:15;;59956:99;:::o;60175:222::-;37287:4;60241:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;55664:4:::1;60280:53;;60309:13;60294:12;;60280:11;:9;:11::i;:::-;:26;;;;:::i;:::-;:42;;;;:::i;:::-;:53;;60272:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60376:13;60361:12;:28;;;;60175:222:::0;;:::o;40699:218::-;40806:12;:10;:12::i;:::-;40795:23;;:7;:23;;;40787:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40883:26;40895:4;40901:7;40883:11;:26::i;:::-;40699:218;;:::o;56310:29::-;;;;;;;;;;;;;:::o;10180:215::-;10268:4;10285:80;10294:12;:10;:12::i;:::-;10308:7;10354:10;10317:11;:25;10329:12;:10;:12::i;:::-;10317:25;;;;;;;;;;;;;;;:34;10343:7;10317:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10285:8;:80::i;:::-;10383:4;10376:11;;10180:215;;;;:::o;55993:62::-;56031:24;55993:62;:::o;55799:84::-;55848:35;55799:84;:::o;61713:137::-;61778:4;61802:40;55848:35;61834:7;61802;:40::i;:::-;61795:47;;61713:137;;;:::o;56348:37::-;;;;;;;;;;;;;:::o;60405:222::-;37287:4;60471:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;55664:4:::1;60510:53;;60539:13;60524:12;;60510:11;:9;:11::i;:::-;:26;;;;:::i;:::-;:42;;;;:::i;:::-;:53;;60502:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;60606:13;60591:12;:28;;;;60405:222:::0;;:::o;55583:34::-;;;;:::o;7752:127::-;7826:7;7853:9;:18;7863:7;7853:18;;;;;;;;;;;;;;;;7846:25;;7752:127;;;:::o;60850:::-;37287:4;60913:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;60961:8:::1;60944:14;;:25;;;;;;;;;;;;;;;;;;60850:127:::0;;:::o;61518:187::-;37287:4;61573:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61622:24:::1;61640:4;61622:9;:24::i;:::-;61612:6;:34;;61604:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61677:20;61690:6;61677:12;:20::i;:::-;61518:187:::0;;:::o;55890:96::-;55945:41;55890:96;:::o;60707:135::-;37287:4;60774:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;60824:10:::1;60805:16;;:29;;;;;;;;;;;;;;;;;;60707:135:::0;;:::o;38151:139::-;38229:4;38253:6;:12;38260:4;38253:12;;;;;;;;;;;:20;;:29;38274:7;38253:29;;;;;;;;;;;;;;;;;;;;;;;;;38246:36;;38151:139;;;;:::o;6680:104::-;6736:13;6769:7;6762:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6680:104;:::o;55537:33::-;;;;:::o;37242:49::-;37287:4;37242:49;;;:::o;10898:413::-;10991:4;11008:24;11035:11;:25;11047:12;:10;:12::i;:::-;11035:25;;;;;;;;;;;;;;;:34;11061:7;11035:34;;;;;;;;;;;;;;;;11008:61;;11108:15;11088:16;:35;;11080:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11201:67;11210:12;:10;:12::i;:::-;11224:7;11252:15;11233:16;:34;11201:8;:67::i;:::-;11299:4;11292:11;;;10898:413;;;;:::o;56064:76::-;;;;;;;;;;;;;:::o;8092:175::-;8178:4;8195:42;8205:12;:10;:12::i;:::-;8219:9;8230:6;8195:9;:42::i;:::-;8255:4;8248:11;;8092:175;;;;:::o;60985:385::-;37287:4;61049:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61112:10:::1;61080;;:43;;;;;;;;;;;;;;;;;;61163:10;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61145:50;;;61204:4;61211:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61145:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61134:8;;:95;;;;;;;;;;;;;;;;;;61270:1;61250:22;;:8;;;;;;;;;;;:22;;;;61242:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;61353:8;;;;;;;;;;;61314:48;;61340:10;;;;;;;;;;;61314:48;;;;;;;;;;;;60985:385:::0;;:::o;55631:37::-;55664:4;55631:37;:::o;56237:36::-;;;;;;;;;;;;;:::o;55682:70::-;55526:2;55740;:12;;;;:::i;:::-;55729:8;:23;;;;:::i;:::-;55682:70;:::o;40043:149::-;40127:18;40140:4;40127:12;:18::i;:::-;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;40158:26:::1;40170:4;40176:7;40158:11;:26::i;:::-;40043:149:::0;;;:::o;61378:132::-;37287:4;61442:18;;37733:30;37744:4;37750:12;:10;:12::i;:::-;37733:10;:30::i;:::-;61494:8:::1;61473:18;;:29;;;;;;;;;;;;;;;;;;61378:132:::0;;:::o;8330:151::-;8419:7;8446:11;:18;8458:5;8446:18;;;;;;;;;;;;;;;:27;8465:7;8446:27;;;;;;;;;;;;;;;;8439:34;;8330:151;;;;:::o;56147:81::-;56186:42;56147:81;:::o;35172:157::-;35257:4;35296:25;35281:40;;;:11;:40;;;;35274:47;;35172:157;;;:::o;4170:98::-;4223:7;4250:10;4243:17;;4170:98;:::o;14582:380::-;14735:1;14718:19;;:5;:19;;;;14710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14816:1;14797:21;;:7;:21;;;;14789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14900:6;14870:11;:18;14882:5;14870:18;;;;;;;;;;;;;;;:27;14889:7;14870:27;;;;;;;;;;;;;;;:36;;;;14938:7;14922:32;;14931:5;14922:32;;;14947:6;14922:32;;;;;;:::i;:::-;;;;;;;;14582:380;;;:::o;62011:1322::-;62134:4;56767:29;56031:24;56788:7;56767;:29::i;:::-;56766:30;56758:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62150:2:::1;56767:29;56031:24;56788:7;56767;:29::i;:::-;56766:30;56758:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62164:4:::2;62170:2;62174:6;57081:48;55945:41;57119:9;57081:7;:48::i;:::-;57076:169;;55526:2;55740::::0;:12:::2;;;;:::i;:::-;55729:8;:23;;;;:::i;:::-;57154:32;57179:6;57154:20;57164:9;57154;:20::i;:::-;:24;;:32;;;;:::i;:::-;:56;;57146:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57076:169;62210:1:::3;62201:6;:10;62193:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;62307:4;62285:26;;:18;;;;;;;;;;;:26;;;:67;;;;;62347:5;62328:24;;:15;;;;;;;;;;;:24;;;62285:67;:100;;;;;62377:8;;;;;;;;;;;62369:16;;:4;:16;;;;62285:100;:141;;;;;62403:23;62421:4;62403:17;:23::i;:::-;62402:24;62285:141;62267:376;;;62453:28;62484:24;62502:4;62484:9;:24::i;:::-;62453:55;;62551:15;;62527:20;:39;62523:109;;62587:29;62600:15;;62587:12;:29::i;:::-;62523:109;62267:376;;62655:16;62674:11;:9;:11::i;:::-;62655:30;;62696:12;62712:15;;;;;;;;;;;62711:16;:32;;;;;62742:1;62731:8;:12;62711:32;:60;;;;;62748:23;62766:4;62748:17;:23::i;:::-;62747:24;62711:60;:86;;;;;62776:21;62794:2;62776:17;:21::i;:::-;62775:22;62711:86;62696:101;;62814:7;62810:516;;;62838:17;62858:31;62883:5;62858:20;62869:8;62858:6;:10;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;62838:51;;62904:18;62925:21;62936:9;62925:6;:10;;:21;;;;:::i;:::-;62904:42;;62992:9;62979:10;:22;;;;:::i;:::-;62969:6;:32;62961:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63056:1;63044:9;:13;63040:101;;;63078:47;63094:4;63108;63115:9;63078:15;:47::i;:::-;63040:101;63174:1;63161:10;:14;63157:92;;;63196:37;63212:4;63218:2;63222:10;63196:15;:37::i;:::-;63157:92;62810:516;;;;;63281:33;63297:4;63303:2;63307:6;63281:15;:33::i;:::-;62810:516;57255:1;;56826::::2;;;::::1;62011:1322:::0;;;;:::o;38580:497::-;38661:22;38669:4;38675:7;38661;:22::i;:::-;38656:414;;38849:41;38877:7;38849:41;;38887:2;38849:19;:41::i;:::-;38963:38;38991:4;38983:13;;38998:2;38963:19;:38::i;:::-;38754:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38700:358;;;;;;;;;;;:::i;:::-;;;;;;;;38656:414;38580:497;;:::o;42003:229::-;42078:22;42086:4;42092:7;42078;:22::i;:::-;42073:152;;42149:4;42117:6;:12;42124:4;42117:12;;;;;;;;;;;:20;;:29;42138:7;42117:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42200:12;:10;:12::i;:::-;42173:40;;42191:7;42173:40;;42185:4;42173:40;;;;;;;;;;42073:152;42003:229;;:::o;42240:230::-;42315:22;42323:4;42329:7;42315;:22::i;:::-;42311:152;;;42386:5;42354:6;:12;42361:4;42354:12;;;;;;;;;;;:20;;:29;42375:7;42354:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42438:12;:10;:12::i;:::-;42411:40;;42429:7;42411:40;;42423:4;42411:40;;;;;;;;;;42311:152;42240:230;;:::o;63341:1219::-;56895:4;56877:15;;:22;;;;;;;;;;;;;;;;;;63415:28:::1;63446:24;63464:4;63446:9;:24::i;:::-;63415:55;;63481:16;63500:11;:9;:11::i;:::-;63481:30;;63550:11;63526:20;:35;;:51;;;;;63576:1;63565:8;:12;63526:51;63522:1031;;;63594:23;63620:43;63654:8;63620:29;63636:12;;63620:11;:15;;:29;;;;:::i;:::-;:33;;:43;;;;:::i;:::-;63594:69;;63678:23;63704:22;63724:1;63704:15;:19;;:22;;;;:::i;:::-;63678:48;;63741:23;63767:32;63783:15;63767:11;:15;;:32;;;;:::i;:::-;63741:58;;63814:21;63838:57;63879:15;63838:36;63858:15;63838;:19;;:36;;;;:::i;:::-;:40;;:57;;;;:::i;:::-;63814:81;;63968:22;63993:21;63968:46;;64059:31;64076:13;64059:16;:31::i;:::-;64155:18;64176:41;64202:14;64176:21;:25;;:41;;;;:::i;:::-;64155:62;;64264:20;64287:50;64323:13;64287:31;64302:15;64287:10;:14;;:31;;;;:::i;:::-;:35;;:50;;;;:::i;:::-;64264:73;;64352:43;64365:15;64382:12;64352;:43::i;:::-;64446:20;64469:28;64484:12;64469:10;:14;;:28;;;;:::i;:::-;64446:51;;64512:29;64528:12;64512:15;:29::i;:::-;63522:1031;;;;;;;;;56910:1;;56940:5:::0;56922:15;;:23;;;;;;;;;;;;;;;;;;63341:1219;:::o;45275:98::-;45333:7;45364:1;45360;:5;;;;:::i;:::-;45353:12;;45275:98;;;;:::o;46013:::-;46071:7;46102:1;46098;:5;;;;:::i;:::-;46091:12;;46013:98;;;;:::o;46412:::-;46470:7;46501:1;46497;:5;;;;:::i;:::-;46490:12;;46412:98;;;;:::o;45656:::-;45714:7;45745:1;45741;:5;;;;:::i;:::-;45734:12;;45656:98;;;;:::o;11801:733::-;11959:1;11941:20;;:6;:20;;;;11933:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12043:1;12022:23;;:9;:23;;;;12014:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12098:47;12119:6;12127:9;12138:6;12098:20;:47::i;:::-;12158:21;12182:9;:17;12192:6;12182:17;;;;;;;;;;;;;;;;12158:41;;12235:6;12218:13;:23;;12210:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12356:6;12340:13;:22;12320:9;:17;12330:6;12320:17;;;;;;;;;;;;;;;:42;;;;12408:6;12384:9;:20;12394:9;12384:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12449:9;12432:35;;12441:6;12432:35;;;12460:6;12432:35;;;;;;:::i;:::-;;;;;;;;12480:46;12500:6;12508:9;12519:6;12480:19;:46::i;:::-;11801:733;;;;:::o;33057:451::-;33132:13;33158:19;33203:1;33194:6;33190:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;33180:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33158:47;;33216:15;:6;33223:1;33216:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;33242;:6;33249:1;33242:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;33273:9;33298:1;33289:6;33285:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;33273:26;;33268:135;33305:1;33301;:5;33268:135;;;33340:12;33361:3;33353:5;:11;33340:25;;;;;;;;;;;;;;;;;;33328:6;33335:1;33328:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;33390:1;33380:11;;;;;33308:3;;;;:::i;:::-;;;33268:135;;;;33430:1;33421:5;:10;33413:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33493:6;33479:21;;;33057:451;;;;:::o;64602:571::-;64725:21;64763:1;64749:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64725:40;;64794:4;64776;64781:1;64776:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;64820:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64810:4;64815:1;64810:7;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;64850:57;64867:4;64882:10;;;;;;;;;;;64895:11;64850:8;:57::i;:::-;64946:10;;;;;;;;;;;:61;;;65022:11;65048:1;65092:4;65119;65139:15;64946:219;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64602:571;;:::o;65209:564::-;65357:57;65374:4;65389:10;;;;;;;;;;;65402:11;65357:8;:57::i;:::-;65457:10;;;;;;;;;;;:26;;;65491:9;65524:4;65544:11;65570:1;65613;65656:14;;;;;;;;;;;65685:15;65457:254;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;65729:36;65742:11;65755:9;65729:36;;;;;;;:::i;:::-;;;;;;;;65209:564;;:::o;65781:167::-;65849:16;;;;;;;;;;;65841:34;;:42;65876:6;65841:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65915:16;;;;;;;;;;;65899:41;;;65933:6;65899:41;;;;;;:::i;:::-;;;;;;;;65781:167;:::o;15562:125::-;;;;:::o;16291:124::-;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:133::-;;382:6;369:20;360:29;;398:30;422:5;398:30;:::i;:::-;350:84;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:137::-;;668:6;655:20;646:29;;684:32;710:5;684:32;:::i;:::-;636:86;;;;:::o;728:139::-;;812:6;799:20;790:29;;828:33;855:5;828:33;:::i;:::-;780:87;;;;:::o;873:143::-;;961:6;955:13;946:22;;977:33;1004:5;977:33;:::i;:::-;936:80;;;;:::o;1022:262::-;;1130:2;1118:9;1109:7;1105:23;1101:32;1098:2;;;1146:1;1143;1136:12;1098:2;1189:1;1214:53;1259:7;1250:6;1239:9;1235:22;1214:53;:::i;:::-;1204:63;;1160:117;1088:196;;;;:::o;1290:284::-;;1409:2;1397:9;1388:7;1384:23;1380:32;1377:2;;;1425:1;1422;1415:12;1377:2;1468:1;1493:64;1549:7;1540:6;1529:9;1525:22;1493:64;:::i;:::-;1483:74;;1439:128;1367:207;;;;:::o;1580:407::-;;;1705:2;1693:9;1684:7;1680:23;1676:32;1673:2;;;1721:1;1718;1711:12;1673:2;1764:1;1789:53;1834:7;1825:6;1814:9;1810:22;1789:53;:::i;:::-;1779:63;;1735:117;1891:2;1917:53;1962:7;1953:6;1942:9;1938:22;1917:53;:::i;:::-;1907:63;;1862:118;1663:324;;;;;:::o;1993:552::-;;;;2135:2;2123:9;2114:7;2110:23;2106:32;2103:2;;;2151:1;2148;2141:12;2103:2;2194:1;2219:53;2264:7;2255:6;2244:9;2240:22;2219:53;:::i;:::-;2209:63;;2165:117;2321:2;2347:53;2392:7;2383:6;2372:9;2368:22;2347:53;:::i;:::-;2337:63;;2292:118;2449:2;2475:53;2520:7;2511:6;2500:9;2496:22;2475:53;:::i;:::-;2465:63;;2420:118;2093:452;;;;;:::o;2551:407::-;;;2676:2;2664:9;2655:7;2651:23;2647:32;2644:2;;;2692:1;2689;2682:12;2644:2;2735:1;2760:53;2805:7;2796:6;2785:9;2781:22;2760:53;:::i;:::-;2750:63;;2706:117;2862:2;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2833:118;2634:324;;;;;:::o;2964:256::-;;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3085:1;3082;3075:12;3037:2;3128:1;3153:50;3195:7;3186:6;3175:9;3171:22;3153:50;:::i;:::-;3143:60;;3099:114;3027:193;;;;:::o;3226:262::-;;3334:2;3322:9;3313:7;3309:23;3305:32;3302:2;;;3350:1;3347;3340:12;3302:2;3393:1;3418:53;3463:7;3454:6;3443:9;3439:22;3418:53;:::i;:::-;3408:63;;3364:117;3292:196;;;;:::o;3494:407::-;;;3619:2;3607:9;3598:7;3594:23;3590:32;3587:2;;;3635:1;3632;3625:12;3587:2;3678:1;3703:53;3748:7;3739:6;3728:9;3724:22;3703:53;:::i;:::-;3693:63;;3649:117;3805:2;3831:53;3876:7;3867:6;3856:9;3852:22;3831:53;:::i;:::-;3821:63;;3776:118;3577:324;;;;;:::o;3907:260::-;;4014:2;4002:9;3993:7;3989:23;3985:32;3982:2;;;4030:1;4027;4020:12;3982:2;4073:1;4098:52;4142:7;4133:6;4122:9;4118:22;4098:52;:::i;:::-;4088:62;;4044:116;3972:195;;;;:::o;4173:262::-;;4281:2;4269:9;4260:7;4256:23;4252:32;4249:2;;;4297:1;4294;4287:12;4249:2;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4239:196;;;;:::o;4441:596::-;;;;4594:2;4582:9;4573:7;4569:23;4565:32;4562:2;;;4610:1;4607;4600:12;4562:2;4653:1;4678:64;4734:7;4725:6;4714:9;4710:22;4678:64;:::i;:::-;4668:74;;4624:128;4791:2;4817:64;4873:7;4864:6;4853:9;4849:22;4817:64;:::i;:::-;4807:74;;4762:129;4930:2;4956:64;5012:7;5003:6;4992:9;4988:22;4956:64;:::i;:::-;4946:74;;4901:129;4552:485;;;;;:::o;5043:179::-;;5133:46;5175:3;5167:6;5133:46;:::i;:::-;5211:4;5206:3;5202:14;5188:28;;5123:99;;;;:::o;5228:108::-;5305:24;5323:5;5305:24;:::i;:::-;5300:3;5293:37;5283:53;;:::o;5342:118::-;5429:24;5447:5;5429:24;:::i;:::-;5424:3;5417:37;5407:53;;:::o;5496:732::-;;5644:54;5692:5;5644:54;:::i;:::-;5714:86;5793:6;5788:3;5714:86;:::i;:::-;5707:93;;5824:56;5874:5;5824:56;:::i;:::-;5903:7;5934:1;5919:284;5944:6;5941:1;5938:13;5919:284;;;6020:6;6014:13;6047:63;6106:3;6091:13;6047:63;:::i;:::-;6040:70;;6133:60;6186:6;6133:60;:::i;:::-;6123:70;;5979:224;5966:1;5963;5959:9;5954:14;;5919:284;;;5923:14;6219:3;6212:10;;5620:608;;;;;;;:::o;6234:109::-;6315:21;6330:5;6315:21;:::i;:::-;6310:3;6303:34;6293:50;;:::o;6349:118::-;6436:24;6454:5;6436:24;:::i;:::-;6431:3;6424:37;6414:53;;:::o;6473:185::-;6587:64;6645:5;6587:64;:::i;:::-;6582:3;6575:77;6565:93;;:::o;6664:147::-;6759:45;6798:5;6759:45;:::i;:::-;6754:3;6747:58;6737:74;;:::o;6817:364::-;;6933:39;6966:5;6933:39;:::i;:::-;6988:71;7052:6;7047:3;6988:71;:::i;:::-;6981:78;;7068:52;7113:6;7108:3;7101:4;7094:5;7090:16;7068:52;:::i;:::-;7145:29;7167:6;7145:29;:::i;:::-;7140:3;7136:39;7129:46;;6909:272;;;;;:::o;7187:377::-;;7321:39;7354:5;7321:39;:::i;:::-;7376:89;7458:6;7453:3;7376:89;:::i;:::-;7369:96;;7474:52;7519:6;7514:3;7507:4;7500:5;7496:16;7474:52;:::i;:::-;7551:6;7546:3;7542:16;7535:23;;7297:267;;;;;:::o;7570:330::-;;7733:67;7797:2;7792:3;7733:67;:::i;:::-;7726:74;;7830:34;7826:1;7821:3;7817:11;7810:55;7891:2;7886:3;7882:12;7875:19;;7716:184;;;:::o;7906:367::-;;8069:67;8133:2;8128:3;8069:67;:::i;:::-;8062:74;;8166:34;8162:1;8157:3;8153:11;8146:55;8232:5;8227:2;8222:3;8218:12;8211:27;8264:2;8259:3;8255:12;8248:19;;8052:221;;;:::o;8279:315::-;;8442:67;8506:2;8501:3;8442:67;:::i;:::-;8435:74;;8539:19;8535:1;8530:3;8526:11;8519:40;8585:2;8580:3;8576:12;8569:19;;8425:169;;;:::o;8600:366::-;;8763:67;8827:2;8822:3;8763:67;:::i;:::-;8756:74;;8860:34;8856:1;8851:3;8847:11;8840:55;8926:4;8921:2;8916:3;8912:12;8905:26;8957:2;8952:3;8948:12;8941:19;;8746:220;;;:::o;8972:312::-;;9135:67;9199:2;9194:3;9135:67;:::i;:::-;9128:74;;9232:16;9228:1;9223:3;9219:11;9212:37;9275:2;9270:3;9266:12;9259:19;;9118:166;;;:::o;9290:370::-;;9453:67;9517:2;9512:3;9453:67;:::i;:::-;9446:74;;9550:34;9546:1;9541:3;9537:11;9530:55;9616:8;9611:2;9606:3;9602:12;9595:30;9651:2;9646:3;9642:12;9635:19;;9436:224;;;:::o;9666:313::-;;9829:67;9893:2;9888:3;9829:67;:::i;:::-;9822:74;;9926:17;9922:1;9917:3;9913:11;9906:38;9970:2;9965:3;9961:12;9954:19;;9812:167;;;:::o;9985:372::-;;10148:67;10212:2;10207:3;10148:67;:::i;:::-;10141:74;;10245:34;10241:1;10236:3;10232:11;10225:55;10311:10;10306:2;10301:3;10297:12;10290:32;10348:2;10343:3;10339:12;10332:19;;10131:226;;;:::o;10363:311::-;;10526:67;10590:2;10585:3;10526:67;:::i;:::-;10519:74;;10623:15;10619:1;10614:3;10610:11;10603:36;10665:2;10660:3;10656:12;10649:19;;10509:165;;;:::o;10680:319::-;;10843:67;10907:2;10902:3;10843:67;:::i;:::-;10836:74;;10940:23;10936:1;10931:3;10927:11;10920:44;10990:2;10985:3;10981:12;10974:19;;10826:173;;;:::o;11005:369::-;;11168:67;11232:2;11227:3;11168:67;:::i;:::-;11161:74;;11265:34;11261:1;11256:3;11252:11;11245:55;11331:7;11326:2;11321:3;11317:12;11310:29;11365:2;11360:3;11356:12;11349:19;;11151:223;;;:::o;11380:368::-;;11543:67;11607:2;11602:3;11543:67;:::i;:::-;11536:74;;11640:34;11636:1;11631:3;11627:11;11620:55;11706:6;11701:2;11696:3;11692:12;11685:28;11739:2;11734:3;11730:12;11723:19;;11526:222;;;:::o;11754:316::-;;11917:67;11981:2;11976:3;11917:67;:::i;:::-;11910:74;;12014:20;12010:1;12005:3;12001:11;11994:41;12061:2;12056:3;12052:12;12045:19;;11900:170;;;:::o;12076:310::-;;12239:67;12303:2;12298:3;12239:67;:::i;:::-;12232:74;;12336:14;12332:1;12327:3;12323:11;12316:35;12377:2;12372:3;12368:12;12361:19;;12222:164;;;:::o;12392:357::-;;12573:85;12655:2;12650:3;12573:85;:::i;:::-;12566:92;;12688:25;12684:1;12679:3;12675:11;12668:46;12740:2;12735:3;12731:12;12724:19;;12556:193;;;:::o;12755:369::-;;12918:67;12982:2;12977:3;12918:67;:::i;:::-;12911:74;;13015:34;13011:1;13006:3;13002:11;12995:55;13081:7;13076:2;13071:3;13067:12;13060:29;13115:2;13110:3;13106:12;13099:19;;12901:223;;;:::o;13130:351::-;;13311:85;13393:2;13388:3;13311:85;:::i;:::-;13304:92;;13426:19;13422:1;13417:3;13413:11;13406:40;13472:2;13467:3;13463:12;13456:19;;13294:187;;;:::o;13487:379::-;;13650:67;13714:2;13709:3;13650:67;:::i;:::-;13643:74;;13747:34;13743:1;13738:3;13734:11;13727:55;13813:17;13808:2;13803:3;13799:12;13792:39;13857:2;13852:3;13848:12;13841:19;;13633:233;;;:::o;13872:115::-;13957:23;13974:5;13957:23;:::i;:::-;13952:3;13945:36;13935:52;;:::o;13993:118::-;14080:24;14098:5;14080:24;:::i;:::-;14075:3;14068:37;14058:53;;:::o;14117:112::-;14200:22;14216:5;14200:22;:::i;:::-;14195:3;14188:35;14178:51;;:::o;14235:967::-;;14639:148;14783:3;14639:148;:::i;:::-;14632:155;;14804:95;14895:3;14886:6;14804:95;:::i;:::-;14797:102;;14916:148;15060:3;14916:148;:::i;:::-;14909:155;;15081:95;15172:3;15163:6;15081:95;:::i;:::-;15074:102;;15193:3;15186:10;;14621:581;;;;;:::o;15208:222::-;;15339:2;15328:9;15324:18;15316:26;;15352:71;15420:1;15409:9;15405:17;15396:6;15352:71;:::i;:::-;15306:124;;;;:::o;15436:332::-;;15595:2;15584:9;15580:18;15572:26;;15608:71;15676:1;15665:9;15661:17;15652:6;15608:71;:::i;:::-;15689:72;15757:2;15746:9;15742:18;15733:6;15689:72;:::i;:::-;15562:206;;;;;:::o;15774:807::-;;16061:3;16050:9;16046:19;16038:27;;16075:71;16143:1;16132:9;16128:17;16119:6;16075:71;:::i;:::-;16156:72;16224:2;16213:9;16209:18;16200:6;16156:72;:::i;:::-;16238:80;16314:2;16303:9;16299:18;16290:6;16238:80;:::i;:::-;16328;16404:2;16393:9;16389:18;16380:6;16328:80;:::i;:::-;16418:73;16486:3;16475:9;16471:19;16462:6;16418:73;:::i;:::-;16501;16569:3;16558:9;16554:19;16545:6;16501:73;:::i;:::-;16028:553;;;;;;;;;:::o;16587:210::-;;16712:2;16701:9;16697:18;16689:26;;16725:65;16787:1;16776:9;16772:17;16763:6;16725:65;:::i;:::-;16679:118;;;;:::o;16803:222::-;;16934:2;16923:9;16919:18;16911:26;;16947:71;17015:1;17004:9;17000:17;16991:6;16947:71;:::i;:::-;16901:124;;;;:::o;17031:276::-;;17189:2;17178:9;17174:18;17166:26;;17202:98;17297:1;17286:9;17282:17;17273:6;17202:98;:::i;:::-;17156:151;;;;:::o;17313:313::-;;17464:2;17453:9;17449:18;17441:26;;17513:9;17507:4;17503:20;17499:1;17488:9;17484:17;17477:47;17541:78;17614:4;17605:6;17541:78;:::i;:::-;17533:86;;17431:195;;;;:::o;17632:419::-;;17836:2;17825:9;17821:18;17813:26;;17885:9;17879:4;17875:20;17871:1;17860:9;17856:17;17849:47;17913:131;18039:4;17913:131;:::i;:::-;17905:139;;17803:248;;;:::o;18057:419::-;;18261:2;18250:9;18246:18;18238:26;;18310:9;18304:4;18300:20;18296:1;18285:9;18281:17;18274:47;18338:131;18464:4;18338:131;:::i;:::-;18330:139;;18228:248;;;:::o;18482:419::-;;18686:2;18675:9;18671:18;18663:26;;18735:9;18729:4;18725:20;18721:1;18710:9;18706:17;18699:47;18763:131;18889:4;18763:131;:::i;:::-;18755:139;;18653:248;;;:::o;18907:419::-;;19111:2;19100:9;19096:18;19088:26;;19160:9;19154:4;19150:20;19146:1;19135:9;19131:17;19124:47;19188:131;19314:4;19188:131;:::i;:::-;19180:139;;19078:248;;;:::o;19332:419::-;;19536:2;19525:9;19521:18;19513:26;;19585:9;19579:4;19575:20;19571:1;19560:9;19556:17;19549:47;19613:131;19739:4;19613:131;:::i;:::-;19605:139;;19503:248;;;:::o;19757:419::-;;19961:2;19950:9;19946:18;19938:26;;20010:9;20004:4;20000:20;19996:1;19985:9;19981:17;19974:47;20038:131;20164:4;20038:131;:::i;:::-;20030:139;;19928:248;;;:::o;20182:419::-;;20386:2;20375:9;20371:18;20363:26;;20435:9;20429:4;20425:20;20421:1;20410:9;20406:17;20399:47;20463:131;20589:4;20463:131;:::i;:::-;20455:139;;20353:248;;;:::o;20607:419::-;;20811:2;20800:9;20796:18;20788:26;;20860:9;20854:4;20850:20;20846:1;20835:9;20831:17;20824:47;20888:131;21014:4;20888:131;:::i;:::-;20880:139;;20778:248;;;:::o;21032:419::-;;21236:2;21225:9;21221:18;21213:26;;21285:9;21279:4;21275:20;21271:1;21260:9;21256:17;21249:47;21313:131;21439:4;21313:131;:::i;:::-;21305:139;;21203:248;;;:::o;21457:419::-;;21661:2;21650:9;21646:18;21638:26;;21710:9;21704:4;21700:20;21696:1;21685:9;21681:17;21674:47;21738:131;21864:4;21738:131;:::i;:::-;21730:139;;21628:248;;;:::o;21882:419::-;;22086:2;22075:9;22071:18;22063:26;;22135:9;22129:4;22125:20;22121:1;22110:9;22106:17;22099:47;22163:131;22289:4;22163:131;:::i;:::-;22155:139;;22053:248;;;:::o;22307:419::-;;22511:2;22500:9;22496:18;22488:26;;22560:9;22554:4;22550:20;22546:1;22535:9;22531:17;22524:47;22588:131;22714:4;22588:131;:::i;:::-;22580:139;;22478:248;;;:::o;22732:419::-;;22936:2;22925:9;22921:18;22913:26;;22985:9;22979:4;22975:20;22971:1;22960:9;22956:17;22949:47;23013:131;23139:4;23013:131;:::i;:::-;23005:139;;22903:248;;;:::o;23157:419::-;;23361:2;23350:9;23346:18;23338:26;;23410:9;23404:4;23400:20;23396:1;23385:9;23381:17;23374:47;23438:131;23564:4;23438:131;:::i;:::-;23430:139;;23328:248;;;:::o;23582:419::-;;23786:2;23775:9;23771:18;23763:26;;23835:9;23829:4;23825:20;23821:1;23810:9;23806:17;23799:47;23863:131;23989:4;23863:131;:::i;:::-;23855:139;;23753:248;;;:::o;24007:419::-;;24211:2;24200:9;24196:18;24188:26;;24260:9;24254:4;24250:20;24246:1;24235:9;24231:17;24224:47;24288:131;24414:4;24288:131;:::i;:::-;24280:139;;24178:248;;;:::o;24432:218::-;;24561:2;24550:9;24546:18;24538:26;;24574:69;24640:1;24629:9;24625:17;24616:6;24574:69;:::i;:::-;24528:122;;;;:::o;24656:222::-;;24787:2;24776:9;24772:18;24764:26;;24800:71;24868:1;24857:9;24853:17;24844:6;24800:71;:::i;:::-;24754:124;;;;:::o;24884:831::-;;25185:3;25174:9;25170:19;25162:27;;25199:71;25267:1;25256:9;25252:17;25243:6;25199:71;:::i;:::-;25280:80;25356:2;25345:9;25341:18;25332:6;25280:80;:::i;:::-;25407:9;25401:4;25397:20;25392:2;25381:9;25377:18;25370:48;25435:108;25538:4;25529:6;25435:108;:::i;:::-;25427:116;;25553:72;25621:2;25610:9;25606:18;25597:6;25553:72;:::i;:::-;25635:73;25703:3;25692:9;25688:19;25679:6;25635:73;:::i;:::-;25152:563;;;;;;;;:::o;25721:332::-;;25880:2;25869:9;25865:18;25857:26;;25893:71;25961:1;25950:9;25946:17;25937:6;25893:71;:::i;:::-;25974:72;26042:2;26031:9;26027:18;26018:6;25974:72;:::i;:::-;25847:206;;;;;:::o;26059:214::-;;26186:2;26175:9;26171:18;26163:26;;26199:67;26263:1;26252:9;26248:17;26239:6;26199:67;:::i;:::-;26153:120;;;;:::o;26279:132::-;;26369:3;26361:11;;26399:4;26394:3;26390:14;26382:22;;26351:60;;;:::o;26417:114::-;;26518:5;26512:12;26502:22;;26491:40;;;:::o;26537:99::-;;26623:5;26617:12;26607:22;;26596:40;;;:::o;26642:113::-;;26744:4;26739:3;26735:14;26727:22;;26717:38;;;:::o;26761:184::-;;26894:6;26889:3;26882:19;26934:4;26929:3;26925:14;26910:29;;26872:73;;;;:::o;26951:169::-;;27069:6;27064:3;27057:19;27109:4;27104:3;27100:14;27085:29;;27047:73;;;;:::o;27126:148::-;;27265:3;27250:18;;27240:34;;;;:::o;27280:305::-;;27339:20;27357:1;27339:20;:::i;:::-;27334:25;;27373:20;27391:1;27373:20;:::i;:::-;27368:25;;27527:1;27459:66;27455:74;27452:1;27449:81;27446:2;;;27533:18;;:::i;:::-;27446:2;27577:1;27574;27570:9;27563:16;;27324:261;;;;:::o;27591:185::-;;27648:20;27666:1;27648:20;:::i;:::-;27643:25;;27682:20;27700:1;27682:20;:::i;:::-;27677:25;;27721:1;27711:2;;27726:18;;:::i;:::-;27711:2;27768:1;27765;27761:9;27756:14;;27633:143;;;;:::o;27782:848::-;;;27874:6;27865:15;;27898:5;27889:14;;27912:712;27933:1;27923:8;27920:15;27912:712;;;28028:4;28023:3;28019:14;28013:4;28010:24;28007:2;;;28037:18;;:::i;:::-;28007:2;28087:1;28077:8;28073:16;28070:2;;;28502:4;28495:5;28491:16;28482:25;;28070:2;28552:4;28546;28542:15;28534:23;;28582:32;28605:8;28582:32;:::i;:::-;28570:44;;27912:712;;;27855:775;;;;;;;:::o;28636:281::-;;28718:23;28736:4;28718:23;:::i;:::-;28710:31;;28762:25;28778:8;28762:25;:::i;:::-;28750:37;;28806:104;28843:66;28833:8;28827:4;28806:104;:::i;:::-;28797:113;;28700:217;;;;:::o;28923:1073::-;;29168:8;29158:2;;29189:1;29180:10;;29191:5;;29158:2;29217:4;29207:2;;29234:1;29225:10;;29236:5;;29207:2;29303:4;29351:1;29346:27;;;;29387:1;29382:191;;;;29296:277;;29346:27;29364:1;29355:10;;29366:5;;;29382:191;29427:3;29417:8;29414:17;29411:2;;;29434:18;;:::i;:::-;29411:2;29483:8;29480:1;29476:16;29467:25;;29518:3;29511:5;29508:14;29505:2;;;29525:18;;:::i;:::-;29505:2;29558:5;;;29296:277;;29682:2;29672:8;29669:16;29663:3;29657:4;29654:13;29650:36;29632:2;29622:8;29619:16;29614:2;29608:4;29605:12;29601:35;29585:111;29582:2;;;29738:8;29732:4;29728:19;29719:28;;29773:3;29766:5;29763:14;29760:2;;;29780:18;;:::i;:::-;29760:2;29813:5;;29582:2;29853:42;29891:3;29881:8;29875:4;29872:1;29853:42;:::i;:::-;29838:57;;;;29927:4;29922:3;29918:14;29911:5;29908:25;29905:2;;;29936:18;;:::i;:::-;29905:2;29985:4;29978:5;29974:16;29965:25;;28983:1013;;;;;;:::o;30002:348::-;;30065:20;30083:1;30065:20;:::i;:::-;30060:25;;30099:20;30117:1;30099:20;:::i;:::-;30094:25;;30287:1;30219:66;30215:74;30212:1;30209:81;30204:1;30197:9;30190:17;30186:105;30183:2;;;30294:18;;:::i;:::-;30183:2;30342:1;30339;30335:9;30324:20;;30050:300;;;;:::o;30356:191::-;;30416:20;30434:1;30416:20;:::i;:::-;30411:25;;30450:20;30468:1;30450:20;:::i;:::-;30445:25;;30489:1;30486;30483:8;30480:2;;;30494:18;;:::i;:::-;30480:2;30539:1;30536;30532:9;30524:17;;30401:146;;;;:::o;30553:96::-;;30619:24;30637:5;30619:24;:::i;:::-;30608:35;;30598:51;;;:::o;30655:90::-;;30732:5;30725:13;30718:21;30707:32;;30697:48;;;:::o;30751:77::-;;30817:5;30806:16;;30796:32;;;:::o;30834:149::-;;30910:66;30903:5;30899:78;30888:89;;30878:105;;;:::o;30989:89::-;;31065:6;31058:5;31054:18;31043:29;;31033:45;;;:::o;31084:126::-;;31161:42;31154:5;31150:54;31139:65;;31129:81;;;:::o;31216:77::-;;31282:5;31271:16;;31261:32;;;:::o;31299:86::-;;31374:4;31367:5;31363:16;31352:27;;31342:43;;;:::o;31391:180::-;;31501:64;31559:5;31501:64;:::i;:::-;31488:77;;31478:93;;;:::o;31577:140::-;;31687:24;31705:5;31687:24;:::i;:::-;31674:37;;31664:53;;;:::o;31723:121::-;;31814:24;31832:5;31814:24;:::i;:::-;31801:37;;31791:53;;;:::o;31850:307::-;31918:1;31928:113;31942:6;31939:1;31936:13;31928:113;;;32027:1;32022:3;32018:11;32012:18;32008:1;32003:3;31999:11;31992:39;31964:2;31961:1;31957:10;31952:15;;31928:113;;;32059:6;32056:1;32053:13;32050:2;;;32139:1;32130:6;32125:3;32121:16;32114:27;32050:2;31899:258;;;;:::o;32163:171::-;;32225:24;32243:5;32225:24;:::i;:::-;32216:33;;32271:4;32264:5;32261:15;32258:2;;;32279:18;;:::i;:::-;32258:2;32326:1;32319:5;32315:13;32308:20;;32206:128;;;:::o;32340:320::-;;32421:1;32415:4;32411:12;32401:22;;32468:1;32462:4;32458:12;32489:18;32479:2;;32545:4;32537:6;32533:17;32523:27;;32479:2;32607;32599:6;32596:14;32576:18;32573:38;32570:2;;;32626:18;;:::i;:::-;32570:2;32391:269;;;;:::o;32666:180::-;32714:77;32711:1;32704:88;32811:4;32808:1;32801:15;32835:4;32832:1;32825:15;32852:180;32900:77;32897:1;32890:88;32997:4;32994:1;32987:15;33021:4;33018:1;33011:15;33038:180;33086:77;33083:1;33076:88;33183:4;33180:1;33173:15;33207:4;33204:1;33197:15;33224:102;;33316:2;33312:7;33307:2;33300:5;33296:14;33292:28;33282:38;;33272:54;;;:::o;33332:102::-;;33421:5;33418:1;33414:13;33393:34;;33383:51;;;:::o;33440:122::-;33513:24;33531:5;33513:24;:::i;:::-;33506:5;33503:35;33493:2;;33552:1;33549;33542:12;33493:2;33483:79;:::o;33568:116::-;33638:21;33653:5;33638:21;:::i;:::-;33631:5;33628:32;33618:2;;33674:1;33671;33664:12;33618:2;33608:76;:::o;33690:122::-;33763:24;33781:5;33763:24;:::i;:::-;33756:5;33753:35;33743:2;;33802:1;33799;33792:12;33743:2;33733:79;:::o;33818:120::-;33890:23;33907:5;33890:23;:::i;:::-;33883:5;33880:34;33870:2;;33928:1;33925;33918:12;33870:2;33860:78;:::o;33944:122::-;34017:24;34035:5;34017:24;:::i;:::-;34010:5;34007:35;33997:2;;34056:1;34053;34046:12;33997:2;33987:79;:::o

Swarm Source

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