ETH Price: $3,137.67 (-0.80%)

Token

ApeOnly Island (Island Apes)
 

Overview

Max Total Supply

2,914 Island Apes

Holders

753

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Island Apes
0x9D9c5F28de1e9c398161963eF0b8498dabA1c194
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 2914 Apes living on an Island. Choose a clan or betray clan by switching clans.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Collection

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-21
*/

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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

interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library Strings {
    /**
     * @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);
    }
}

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string internal _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _tokenBaseURI;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return _tokenBaseURI;
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _tokenBaseURI = baseURI_;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

interface Token is IERC20 {
    function burn(address account, uint256 amount) external returns (bool);
}

contract Collection is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant TOTAL_LIMIT = 8888;
    uint256 public constant BATCH_LIMIT = 8;

    bool private constant RESERVED = true;
    bool private constant FREE = false;

    bool public utilityEnabled;

    uint256 public tokenNameChangePrice;
    uint256 public tokenBiogChangePrice;
    uint256 public tokenClanChangePrice;

    uint256 public price = 0.06 ether; //60000000000000000 Wei, You are welcome :)
    uint256 public reserved = 100;

    bool public activated;
    uint256 public activatedAt;

    string[4] public clans;
    uint8[] private availableClans;

    mapping(uint8 => uint256) public clanMemberCount;

    mapping(uint256 => string) private _tokenName;
    mapping(uint256 => string) private _tokenBiog;
    mapping(uint256 => uint8) private _tokenClanId;

    mapping(string => bool) private _tokenNameReserved;

    mapping(uint256 => bool) private _genesisMints;
    uint256 private _genesisMintsTotal;

    //contract address, total supply, and headstart for genesis only ape collection
    address private constant _GENESIS_APE_ONLY_CA =
        0xf1e0bEcA4eac65F902466881CDfDD0099D91e47b;
    uint256 private constant _GENESIS_APE_ONLY_TS = 999;
    uint256 private constant _GENESIS_APE_ONLY_PP = 86400;

    //contract address of the ape only island yield token
    address public tokenAddress;

    event Activated(address indexed account, uint256 timestamp);

    event Changed(address indexed account, uint256 id);

    constructor() ERC721("ApeOnly Island", "Island Apes") {
        _setBaseURI("https://metadata.apeonlyisland.com/");

        tokenNameChangePrice = 150 ether;
        tokenBiogChangePrice = 50 ether;
        tokenClanChangePrice = 300 ether;

        clans[0] = "coconut bashers";
        clans[1] = "wave riders";
        clans[2] = "banana rippers";
        clans[3] = "seashell drifters";

        availableClans.push(0);
        availableClans.push(1);
        availableClans.push(2);
        availableClans.push(3);
    }

    function setUtilityStatus(bool newStatus)
        external
        onlyOwner
        returns (bool isUtilityEnabled)
    {
        utilityEnabled = newStatus;
        return utilityEnabled;
    }

    function setTokenNameChangePrice(uint256 newPrice)
        external
        onlyOwner
        returns (bool)
    {
        tokenNameChangePrice = newPrice;
        return true;
    }

    function setTokenBiogChangePrice(uint256 newPrice)
        external
        onlyOwner
        returns (bool)
    {
        tokenBiogChangePrice = newPrice;
        return true;
    }

    function setTokenClanChangePrice(uint256 newPrice)
        external
        onlyOwner
        returns (bool)
    {
        tokenClanChangePrice = newPrice;
        return true;
    }

    function setTokenAddress(address tokenAddressArg)
        external
        onlyOwner
        returns (bool)
    {
        tokenAddress = tokenAddressArg;
        return true;
    }

    function setPrice(uint256 amount) external onlyOwner returns (bool) {
        require(amount > 0, "Collection: must be a valid amount");

        price = amount;
        return true;
    }

    function setReserve(uint16 amount) external onlyOwner returns (bool) {
        require(amount <= 100, "Collection: must be a valid amount");
        reserved = amount;
        return true;
    }

    function setBaseURI(string memory newURI)
        external
        onlyOwner
        returns (bool)
    {
        _setBaseURI(newURI);
        return true;
    }

    function activate() external onlyOwner returns (bool) {
        require(!activated, "Collection: minting must be activated");

        activatedAt = block.timestamp;
        activated = true;

        emit Activated(_msgSender(), block.timestamp);
        return true;
    }

    function airdrop(address account, uint256 amount)
        external
        onlyOwner
        returns (bool)
    {
        require(amount > 0, "Collection: must be a valid amount");

        uint256 current = totalSupply();

        require(
            current + amount <= TOTAL_LIMIT,
            "Collection: supply must be available for minting"
        );

        for (uint256 i = 1; i <= amount; i++) {
            uint256 next = current + i;
            if (next <= TOTAL_LIMIT) {
                _mintApe(account, next);
            }
        }
        return true;
    }

    function withdraw() external onlyOwner returns (bool) {
        uint256 balance = address(this).balance;

        require(balance > 0, "Collection: no withdrawable funds found");

        payable(_msgSender()).transfer(balance);

        return true;
    }

    function priorityMint(uint256[] calldata ids) external returns (bool) {
        require(activated, "Collection: minting must be activated");

        require(
            block.timestamp < activatedAt + _GENESIS_APE_ONLY_PP,
            "Collection: public minting have started"
        );

        uint256 counter = ids.length;
        address account = _msgSender();

        require(
            counter <= BATCH_LIMIT,
            "Collection: minted amount must not exceed batch limit"
        );

        uint256 next = totalSupply() + 1;

        for (uint256 i = 0; i < counter; i++) {
            require(
                !_genesisMints[ids[i]],
                "Collection: genesis ape <ID> free mint have been claimed"
            );

            require(
                IERC721(_GENESIS_APE_ONLY_CA).ownerOf(ids[i]) == account,
                "Collection: account must be the owner of the genesis ape <ID>"
            );

            if (next <= _GENESIS_APE_ONLY_TS) {
                _genesisMints[ids[i]] = true;
                _mintApe(account, next);
                next++;
                _genesisMintsTotal++;
            }
        }

        return true;
    }

    function publicMint(uint256 amount) external payable returns (bool) {
        require(activated, "Collection: minting must be activated");

        require(
            block.timestamp >= activatedAt + _GENESIS_APE_ONLY_PP,
            "Collection: public minting not started"
        );

        require(
            amount <= BATCH_LIMIT,
            "Collection: minted amount must not exceed batch limit"
        );

        uint256 current = totalSupply();

        require(
            current + amount <= TOTAL_LIMIT,
            "Collection: supply must be available for minting"
        );

        require(
            current + amount <= (TOTAL_LIMIT - reserved),
            "Collection: supply reached reserved tokens"
        );

        require(
            price * amount == msg.value,
            "Collection: account must pay the correct mint price"
        );

        for (uint256 i = 1; i <= amount; i++) {
            uint256 next = current + i;

            if (next <= TOTAL_LIMIT) {
                _mintApe(_msgSender(), next);
            }
        }

        return true;
    }

    function changeTokenName(string calldata newName, uint256 tokenId)
        external
        returns (bool)
    {
        require(utilityEnabled, "Collection: Shilling not enabled");

        address account = _msgSender();

        require(
            ownerOf(tokenId) == account,
            "Collection: account must be owner of token"
        );

        require(_validateName(newName), "Collection: name must be valid");

        // name is not already reserved and not the same current one
        require(isUniqueName(newName), "Collection: name must be unique");

        require(
            Token(tokenAddress).balanceOf(account) >= tokenNameChangePrice,
            "Collection: account must have sufficient tokens"
        );

        //free old name before renaming token
        if (bytes(_tokenName[tokenId]).length > 0) {
            _changeNameReserveStatus(_tokenName[tokenId], FREE);
        }

        Token(tokenAddress).burn(account, tokenNameChangePrice);

        _tokenName[tokenId] = newName;
        _changeNameReserveStatus(newName, RESERVED);

        emit Changed(account, tokenId);
        return true;
    }

    function changeTokenBiog(string calldata newBio, uint256 tokenId)
        external
        returns (bool)
    {
        require(utilityEnabled, "Collection: Shilling not enabled");

        address account = _msgSender();

        require(
            ownerOf(tokenId) == account,
            "Collection: account must be owner of token"
        );
        require(
            Token(tokenAddress).balanceOf(account) >= tokenBiogChangePrice,
            "Collection: account must have sufficient tokens"
        );

        Token(tokenAddress).burn(account, tokenBiogChangePrice);
        _tokenBiog[tokenId] = newBio;

        emit Changed(account, tokenId);
        return true;
    }

    function changeTokenClan(uint8 clanId, uint256 tokenId)
        external
        returns (bool)
    {
        require(utilityEnabled, "Collection: Shilling not enabled");

        address account = _msgSender();

        require(
            ownerOf(tokenId) == account,
            "Collection: account must be owner of token"
        );
        require(
            Token(tokenAddress).balanceOf(account) >= tokenClanChangePrice,
            "XX"
        );

        require(clanId < 4, "Collection: invalid clan index [0-3]");

        // reduce previous clan total member count
        clanMemberCount[_tokenClanId[tokenId]]--;

        Token(tokenAddress).burn(account, tokenClanChangePrice);
        _tokenClanId[tokenId] = clanId;

        // increase new clan total member count
        clanMemberCount[clanId]++;

        emit Changed(account, tokenId);
        return true;
    }

    function getGenesisMintedID(uint256 id) external view returns (bool) {
        //return valid genesis free mint
        return _genesisMints[id];
    }

    function getGenesisMintedTotal() external view returns (uint256) {
        //return valid genesis collection supply
        return _genesisMintsTotal;
    }

    function getTokenNameByIndex(uint256 index)
        external
        view
        returns (string memory)
    {
        //return valid token name by index
        return _tokenName[index];
    }

    function isPublicSaleActivated() external view returns (bool) {
        return
            activated && block.timestamp >= activatedAt + _GENESIS_APE_ONLY_PP;
    }

    function isUniqueName(string memory str) public view returns (bool) {
        //return valid name
        return !_tokenNameReserved[_toLower(str)];
    }

    function getTokenName(uint256 id) public view returns (string memory) {
        //return token name
        string memory tokenName = _tokenName[id];
        if (bytes(tokenName).length > 0) {
            return tokenName;
        }
        return string(abi.encodePacked("island ape #", id.toString()));
    }

    function getTokenBiography(uint256 id) public view returns (string memory) {
        //return token biography
        return _tokenBiog[id];
    }

    function getTokenClan(uint256 id) public view returns (string memory) {
        //return token clan
        return clans[getTokenClanId(id)];
    }

    function getTokenClanId(uint256 id) public view returns (uint8) {
        //return token clan id
        return _tokenClanId[id];
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "Collection: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        uint256 clanId = getTokenClanId(tokenId);
        return
            string(
                abi.encodePacked(
                    baseURI,
                    tokenId.toString(),
                    "?c=",
                    clanId.toString()
                )
            );
    }

    function _mintApe(address to, uint256 tokenId) private {
        _mint(to, tokenId);
        _onMintAddTokenToRandomClan(tokenId);
    }

    /**
     * @dev This Hook will randomly add a token to a clan by linking the Token with clanId using `_tokenClanId`
     * Requirements:
     *  - Max clan members is 2222 during mint and user cant change clan only after mint is closed.
     */
    function _onMintAddTokenToRandomClan(uint256 tokenId)
        private
        returns (bool)
    {
        uint256 _random = _generateRandom(tokenId);

        uint256 availableClansCount = availableClans.length;
        uint256 availableClanIndex = _random % availableClansCount;

        uint8 _clanId = availableClans[availableClanIndex];
        _tokenClanId[tokenId] = _clanId;
        clanMemberCount[_clanId]++;

        if (clanMemberCount[_clanId] == 2222) {
            // swap the clan reached maximum count with the last element;
            availableClans[availableClanIndex] = availableClans[
                availableClansCount - 1
            ];
            // delete the last element which will be the swapped element;
            availableClans.pop();
        }
        return true;
    }

    function _generateRandom(uint256 tokenId) private view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        tokenId,
                        _msgSender(),
                        block.timestamp,
                        block.difficulty,
                        gasleft()
                    )
                )
            );
    }

    function _changeNameReserveStatus(string memory str, bool state) private {
        _tokenNameReserved[_toLower(str)] = state;
    }

    function _validateName(string memory str) private pure returns (bool) {
        bytes memory b = bytes(str);

        if (b.length < 1) return false;
        if (b.length > 25) return false; //must be shorter than 25 characters
        if (b[0] == 0x20) return false; //no leading space
        if (b[b.length - 1] == 0x20) return false; //no trailing space

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];

            //no continous spaces
            if (char == 0x20 && lastChar == 0x20) return false;

            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            ) return false;

            lastChar = char;
        }
        //return valid name
        return true;
    }

    function _toLower(string memory str) private pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);

        for (uint256 i = 0; i < bStr.length; i++) {
            //no uppercase characters
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        //return all lowercase
        return string(bLower);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BATCH_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newBio","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeTokenBiog","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"clanId","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeTokenClan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeTokenName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"clanMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clans","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getGenesisMintedID","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisMintedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenBiography","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenClan","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenClanId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"isUniqueName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"priorityMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setReserve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddressArg","type":"address"}],"name":"setTokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTokenBiogChangePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTokenClanChangePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTokenNameChangePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"setUtilityStatus","outputs":[{"internalType":"bool","name":"isUtilityEnabled","type":"bool"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBiogChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenClanChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenNameChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utilityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405266d529ae9e860000600f5560646010553480156200002157600080fd5b50604080518082018252600e81526d105c1953db9b1e48125cdb185b9960921b60208083019182528351808501909452600b84526a49736c616e64204170657360a81b9084015281519192916200007b9160009162000306565b5080516200009190600190602084019062000306565b505050620000ae620000a86200029760201b60201c565b6200029b565b620000d26040518060600160405280602381526020016200460260239139620002ed565b680821ab0d4414980000600c556802b5e3af16b1880000600d55681043561a8829300000600e5560408051808201909152600f8082526e636f636f6e7574206261736865727360881b6020909201918252620001319160139162000306565b5060408051808201909152600b8082526a776176652072696465727360a81b6020909201918252620001669160149162000306565b5060408051808201909152600e8082526d62616e616e61207269707065727360901b60209092019182526200019e9160159162000306565b50604080518082019091526011808252707365617368656c6c20647269667465727360781b6020909201918252620001d99160169162000306565b506017805460018181018355600083905260208083047fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15908101805460ff601f96871661010090810a8202199092169092558654808601885584810484018054918816830a8085021990921690911790558654808601885584810484018054918816830a600281029085021990921691909117905586549485019096559183040180549290931690930a6003810293021916919091179055620003e9565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516200030290600290602084019062000306565b5050565b8280546200031490620003ac565b90600052602060002090601f01602090048101928262000338576000855562000383565b82601f106200035357805160ff191683800117855562000383565b8280016001018555821562000383579182015b828111156200038357825182559160200191906001019062000366565b506200039192915062000395565b5090565b5b8082111562000391576000815560010162000396565b600181811c90821680620003c157607f821691505b60208210811415620003e357634e487b7160e01b600052602260045260246000fd5b50919050565b61420980620003f96000396000f3fe6080604052600436106103765760003560e01c806370a08231116101d1578063a22cb46511610102578063e93b3a73116100a0578063f7c7318f1161006f578063f7c7318f14610a21578063fa7f369714610a36578063fe60d12c14610a56578063feaa896814610a6c57600080fd5b8063e93b3a7314610982578063e985e9c5146109a2578063eca17e04146109eb578063f2fde38b14610a0157600080fd5b8063c87b56dd116100dc578063c87b56dd14610916578063ca74a78414610936578063db925fcf1461094c578063dbe16c071461096257600080fd5b8063a22cb465146108b6578063b88d4fde146108d6578063c21b6432146108f657600080fd5b80638da5cb5b1161016f57806395d89b411161014957806395d89b411461084b5780639d76ea5814610860578063a035b1fe14610880578063a0b133b01461089657600080fd5b80638da5cb5b146107f857806391b7f5ed146108165780639559c0bd1461083657600080fd5b8063798ca2e6116101ab578063798ca2e6146107785780637e707be31461079857806388c4a3e0146107b85780638ba4cc3c146107d857600080fd5b806370a0823114610716578063715018a61461073657806372fd0d891461074b57600080fd5b80632f745c59116102ab57806342842e0e1161024957806355f804b31161022357806355f804b3146106a0578063597be6d1146106c05780636352211e146106d657806366469a3a146106f657600080fd5b806342842e0e146106405780634bd06083146106605780634f6ccce71461068057600080fd5b806339d60e3d1161028557806339d60e3d146105cb5780633cb50c23146105eb5780633ccfd60b1461060b578063409981de1461062057600080fd5b80632f745c59146105395780632ff047221461055957806337803e5e1461058957600080fd5b806318160ddd116103185780632532884e116102f25780632532884e146104d057806326a4e8d2146104f05780632a958572146105105780632db115441461052657600080fd5b806318160ddd14610481578063186601ca1461049657806323b872dd146104b057600080fd5b8063095ea7b311610354578063095ea7b31461040a5780630ad5b0a01461042c5780630f15f4c01461044d57806311e23f4f1461046257600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613a80565b610a8c565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ab7565b6040516103a79190613d13565b3480156103de57600080fd5b506103f26103ed366004613b9f565b610b49565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a6104253660046139a5565b610be3565b005b34801561043857600080fd5b50600b5461039b90600160a01b900460ff1681565b34801561045957600080fd5b5061039b610cf9565b34801561046e57600080fd5b50601e545b6040519081526020016103a7565b34801561048d57600080fd5b50600954610473565b3480156104a257600080fd5b5060115461039b9060ff1681565b3480156104bc57600080fd5b5061042a6104cb3660046138b6565b610da9565b3480156104dc57600080fd5b5061039b6104eb366004613aba565b610dda565b3480156104fc57600080fd5b5061039b61050b36600461383c565b610fc7565b34801561051c57600080fd5b50610473600e5481565b61039b610534366004613b9f565b611018565b34801561054557600080fd5b506104736105543660046139a5565b61123f565b34801561056557600080fd5b5061039b610574366004613b9f565b6000908152601d602052604090205460ff1690565b34801561059557600080fd5b506105b96105a4366004613b9f565b6000908152601b602052604090205460ff1690565b60405160ff90911681526020016103a7565b3480156105d757600080fd5b5061039b6105e6366004613b9f565b6112d5565b3480156105f757600080fd5b506103c5610606366004613b9f565b61130b565b34801561061757600080fd5b5061039b6113ad565b34801561062c57600080fd5b5061039b61063b366004613b7b565b61146e565b34801561064c57600080fd5b5061042a61065b3660046138b6565b6114cd565b34801561066c57600080fd5b5061039b61067b3660046139d1565b6114e8565b34801561068c57600080fd5b5061047361069b366004613b9f565b61182a565b3480156106ac57600080fd5b5061039b6106bb366004613b32565b6118bd565b3480156106cc57600080fd5b5061047360125481565b3480156106e257600080fd5b506103f26106f1366004613b9f565b6118fb565b34801561070257600080fd5b506103c5610711366004613b9f565b611972565b34801561072257600080fd5b5061047361073136600461383c565b611a12565b34801561074257600080fd5b5061042a611a99565b34801561075757600080fd5b50610473610766366004613bd1565b60186020526000908152604090205481565b34801561078457600080fd5b5061039b610793366004613b9f565b611acf565b3480156107a457600080fd5b5061039b6107b3366004613b9f565b611b05565b3480156107c457600080fd5b506103c56107d3366004613b9f565b611b3b565b3480156107e457600080fd5b5061039b6107f33660046139a5565b611b77565b34801561080457600080fd5b50600b546001600160a01b03166103f2565b34801561082257600080fd5b5061039b610831366004613b9f565b611c45565b34801561084257600080fd5b50610473600881565b34801561085757600080fd5b506103c5611c9b565b34801561086c57600080fd5b50601f546103f2906001600160a01b031681565b34801561088c57600080fd5b50610473600f5481565b3480156108a257600080fd5b5061039b6108b1366004613b32565b611caa565b3480156108c257600080fd5b5061042a6108d1366004613977565b611cde565b3480156108e257600080fd5b5061042a6108f13660046138f7565b611ced565b34801561090257600080fd5b5061039b610911366004613a46565b611d25565b34801561092257600080fd5b506103c5610931366004613b9f565b611d76565b34801561094257600080fd5b50610473600c5481565b34801561095857600080fd5b50610473600d5481565b34801561096e57600080fd5b506103c561097d366004613b9f565b611e4d565b34801561098e57600080fd5b5061039b61099d366004613bec565b611f2b565b3480156109ae57600080fd5b5061039b6109bd36600461387d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156109f757600080fd5b506104736122b881565b348015610a0d57600080fd5b5061042a610a1c36600461383c565b6121db565b348015610a2d57600080fd5b5061039b612276565b348015610a4257600080fd5b506103c5610a51366004613b9f565b6122a0565b348015610a6257600080fd5b5061047360105481565b348015610a7857600080fd5b5061039b610a87366004613aba565b6122bd565b60006001600160e01b0319821663780e9d6360e01b1480610ab15750610ab1826126b3565b92915050565b606060008054610ac6906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af2906140c2565b8015610b3f5780601f10610b1457610100808354040283529160200191610b3f565b820191906000526020600020905b815481529060010190602001808311610b2257829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bc75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bee826118fb565b9050806001600160a01b0316836001600160a01b03161415610c5c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bbe565b336001600160a01b0382161480610c785750610c7881336109bd565b610cea5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bbe565b610cf48383612703565b505050565b600b546000906001600160a01b03163314610d265760405162461bcd60e51b8152600401610bbe90613e59565b60115460ff1615610d495760405162461bcd60e51b8152600401610bbe90613fb3565b426012556011805460ff19166001179055610d613390565b6001600160a01b03167fcffdf6de62e8d9ae544ba4c36565fe4bcef3c1a96f174abbe6c56e25e2b220ed42604051610d9b91815260200190565b60405180910390a250600190565b610db33382612771565b610dcf5760405162461bcd60e51b8152600401610bbe90613edd565b610cf4838383612868565b600b54600090600160a01b900460ff16610e065760405162461bcd60e51b8152600401610bbe90613f7e565b3380610e11846118fb565b6001600160a01b031614610e375760405162461bcd60e51b8152600401610bbe90613d78565b600d54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb79190613bb8565b1015610ed55760405162461bcd60e51b8152600401610bbe90613e8e565b601f54600d54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b158015610f2657600080fd5b505af1158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190613a63565b506000838152601a60205260409020610f789086866136a8565b50806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594684604051610fb491815260200190565b60405180910390a2506001949350505050565b600b546000906001600160a01b03163314610ff45760405162461bcd60e51b8152600401610bbe90613e59565b50601f80546001600160a01b0319166001600160a01b03831617905560015b919050565b60115460009060ff1661103d5760405162461bcd60e51b8152600401610bbe90613fb3565b6201518060125461104e9190613ff8565b4210156110ac5760405162461bcd60e51b815260206004820152602660248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e67206e6f7420736044820152651d185c9d195960d21b6064820152608401610bbe565b60088211156110cd5760405162461bcd60e51b8152600401610bbe90613dc2565b60006110d860095490565b90506122b86110e78483613ff8565b11156111055760405162461bcd60e51b8152600401610bbe90613f2e565b601054611114906122b8614068565b61111e8483613ff8565b111561117f5760405162461bcd60e51b815260206004820152602a60248201527f436f6c6c656374696f6e3a20737570706c79207265616368656420726573657260448201526976656420746f6b656e7360b01b6064820152608401610bbe565b3483600f5461118e9190614049565b146111f75760405162461bcd60e51b815260206004820152603360248201527f436f6c6c656374696f6e3a206163636f756e74206d757374207061792074686560448201527220636f7272656374206d696e7420707269636560681b6064820152608401610bbe565b60015b83811161123557600061120d8284613ff8565b90506122b88111611222576112223382612a13565b508061122d816140fd565b9150506111fa565b5060019392505050565b600061124a83611a12565b82106112ac5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bbe565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b031633146113025760405162461bcd60e51b8152600401610bbe90613e59565b50600d55600190565b6000818152601a60205260409020805460609190611328906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611354906140c2565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b50505050509050919050565b600b546000906001600160a01b031633146113da5760405162461bcd60e51b8152600401610bbe90613e59565b47806114385760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a206e6f20776974686472617761626c652066756e646044820152661cc8199bdd5b9960ca1b6064820152608401610bbe565b604051339082156108fc029083906000818181858888f19350505050158015611465573d6000803e3d6000fd5b50600191505090565b600b546000906001600160a01b0316331461149b5760405162461bcd60e51b8152600401610bbe90613e59565b60648261ffff1611156114c05760405162461bcd60e51b8152600401610bbe90613e17565b5061ffff16601055600190565b610cf483838360405180602001604052806000815250611ced565b60115460009060ff1661150d5760405162461bcd60e51b8152600401610bbe90613fb3565b6201518060125461151e9190613ff8565b421061157c5760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e672068617665206044820152661cdd185c9d195960ca1b6064820152608401610bbe565b8133600882111561159f5760405162461bcd60e51b8152600401610bbe90613dc2565b60006115aa60095490565b6115b5906001613ff8565b905060005b8381101561181d57601d60008888848181106115d8576115d861416e565b602090810292909201358352508101919091526040016000205460ff16156116685760405162461bcd60e51b815260206004820152603860248201527f436f6c6c656374696f6e3a2067656e6573697320617065203c49443e2066726560448201527f65206d696e742068617665206265656e20636c61696d656400000000000000006064820152608401610bbe565b6001600160a01b03831673f1e0beca4eac65f902466881cdfdd0099d91e47b636352211e89898581811061169e5761169e61416e565b905060200201356040518263ffffffff1660e01b81526004016116c391815260200190565b60206040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190613860565b6001600160a01b03161461178f5760405162461bcd60e51b815260206004820152603d60248201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265207468652060448201527f6f776e6572206f66207468652067656e6573697320617065203c49443e0000006064820152608401610bbe565b6103e7821161180b576001601d60008989858181106117b0576117b061416e565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055506117e68383612a13565b816117f0816140fd565b601e80549194509091506000611805836140fd565b91905055505b80611815816140fd565b9150506115ba565b5060019695505050505050565b600061183560095490565b82106118985760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bbe565b600982815481106118ab576118ab61416e565b90600052602060002001549050919050565b600b546000906001600160a01b031633146118ea5760405162461bcd60e51b8152600401610bbe90613e59565b6118f382612a26565b506001919050565b6000818152600360205260408120546001600160a01b031680610ab15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bbe565b6013816004811061198257600080fd5b018054909150611991906140c2565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd906140c2565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b505050505081565b60006001600160a01b038216611a7d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bbe565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b03163314611ac35760405162461bcd60e51b8152600401610bbe90613e59565b611acd6000612a39565b565b600b546000906001600160a01b03163314611afc5760405162461bcd60e51b8152600401610bbe90613e59565b50600c55600190565b600b546000906001600160a01b03163314611b325760405162461bcd60e51b8152600401610bbe90613e59565b50600e55600190565b60606013611b58836000908152601b602052604090205460ff1690565b60ff1660048110611b6b57611b6b61416e565b018054611328906140c2565b600b546000906001600160a01b03163314611ba45760405162461bcd60e51b8152600401610bbe90613e59565b60008211611bc45760405162461bcd60e51b8152600401610bbe90613e17565b6000611bcf60095490565b90506122b8611bde8483613ff8565b1115611bfc5760405162461bcd60e51b8152600401610bbe90613f2e565b60015b838111611c3a576000611c128284613ff8565b90506122b88111611c2757611c278682612a13565b5080611c32816140fd565b915050611bff565b506001949350505050565b600b546000906001600160a01b03163314611c725760405162461bcd60e51b8152600401610bbe90613e59565b60008211611c925760405162461bcd60e51b8152600401610bbe90613e17565b50600f55600190565b606060018054610ac6906140c2565b6000601c611cb783612a8b565b604051611cc49190613c34565b9081526040519081900360200190205460ff161592915050565b611ce9338383612bee565b5050565b611cf73383612771565b611d135760405162461bcd60e51b8152600401610bbe90613edd565b611d1f84848484612cbd565b50505050565b600b546000906001600160a01b03163314611d525760405162461bcd60e51b8152600401610bbe90613e59565b50600b805460ff60a01b1916600160a01b9215158302179081905560ff9190041690565b6000818152600360205260409020546060906001600160a01b0316611df15760405162461bcd60e51b815260206004820152602b60248201527f436f6c6c656374696f6e3a2055524920717565727920666f72206e6f6e65786960448201526a39ba32b73a103a37b5b2b760a91b6064820152608401610bbe565b6000611dfb612cf0565b6000848152601b602052604090205490915060ff1681611e1a85612cff565b611e2383612cff565b604051602001611e3593929190613c50565b60405160208183030381529060405292505050919050565b600081815260196020526040812080546060929190611e6b906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e97906140c2565b8015611ee45780601f10611eb957610100808354040283529160200191611ee4565b820191906000526020600020905b815481529060010190602001808311611ec757829003601f168201915b50505050509050600081511115611efb5792915050565b611f0483612cff565b604051602001611f149190613ca2565b604051602081830303815290604052915050919050565b600b54600090600160a01b900460ff16611f575760405162461bcd60e51b8152600401610bbe90613f7e565b3380611f62846118fb565b6001600160a01b031614611f885760405162461bcd60e51b8152600401610bbe90613d78565b600e54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015611fd057600080fd5b505afa158015611fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120089190613bb8565b101561203b5760405162461bcd60e51b81526020600482015260026024820152610b0b60f31b6044820152606401610bbe565b60048460ff161061209a5760405162461bcd60e51b8152602060048201526024808201527f436f6c6c656374696f6e3a20696e76616c696420636c616e20696e646578205b604482015263302d335d60e01b6064820152608401610bbe565b6000838152601b602090815260408083205460ff168352601890915281208054916120c4836140ab565b9091555050601f54600e54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b15801561211a57600080fd5b505af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190613a63565b506000838152601b60209081526040808320805460ff191660ff8916908117909155835260189091528120805491612189836140fd565b9190505550806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af5946846040516121c991815260200190565b60405180910390a25060019392505050565b600b546001600160a01b031633146122055760405162461bcd60e51b8152600401610bbe90613e59565b6001600160a01b03811661226a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbe565b61227381612a39565b50565b60115460009060ff16801561229b5750620151806012546122979190613ff8565b4210155b905090565b6000818152601960205260409020805460609190611328906140c2565b600b54600090600160a01b900460ff166122e95760405162461bcd60e51b8152600401610bbe90613f7e565b33806122f4846118fb565b6001600160a01b03161461231a5760405162461bcd60e51b8152600401610bbe90613d78565b61235985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612dfd92505050565b6123a55760405162461bcd60e51b815260206004820152601e60248201527f436f6c6c656374696f6e3a206e616d65206d7573742062652076616c696400006044820152606401610bbe565b6123e485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611caa92505050565b6124305760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e616d65206d75737420626520756e69717565006044820152606401610bbe565b600c54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b15801561247857600080fd5b505afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613bb8565b10156124ce5760405162461bcd60e51b8152600401610bbe90613e8e565b600083815260196020526040812080546124e7906140c2565b905011156125925760008381526019602052604090208054612592919061250d906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612539906140c2565b80156125865780601f1061255b57610100808354040283529160200191612586565b820191906000526020600020905b81548152906001019060200180831161256957829003601f168201915b50505050506000613001565b601f54600c54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b1580156125e357600080fd5b505af11580156125f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261b9190613a63565b5060008381526019602052604090206126359086866136a8565b5061267885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250613001915050565b806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594684604051610fb491815260200190565b60006001600160e01b031982166380ac58cd60e01b14806126e457506001600160e01b03198216635b5e139f60e01b145b80610ab157506301ffc9a760e01b6001600160e01b0319831614610ab1565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612738826118fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166127ea5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bbe565b60006127f5836118fb565b9050806001600160a01b0316846001600160a01b031614806128305750836001600160a01b031661282584610b49565b6001600160a01b0316145b8061286057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661287b826118fb565b6001600160a01b0316146128e35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bbe565b6001600160a01b0382166129455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bbe565b61295083838361303e565b61295b600082612703565b6001600160a01b0383166000908152600460205260408120805460019290612984908490614068565b90915550506001600160a01b03821660009081526004602052604081208054600192906129b2908490613ff8565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612a1d82826130f6565b610cf481613244565b8051611ce990600290602084019061372c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060008290506000815167ffffffffffffffff811115612aae57612aae614184565b6040519080825280601f01601f191660200182016040528015612ad8576020820181803683370190505b50905060005b8251811015612be6576041838281518110612afb57612afb61416e565b016020015160f81c10801590612b2b5750605a838281518110612b2057612b2061416e565b016020015160f81c11155b15612b8d57828181518110612b4257612b4261416e565b602001015160f81c60f81b60f81c6020612b5c9190614010565b60f81b828281518110612b7157612b7161416e565b60200101906001600160f81b031916908160001a905350612bd4565b828181518110612b9f57612b9f61416e565b602001015160f81c60f81b828281518110612bbc57612bbc61416e565b60200101906001600160f81b031916908160001a9053505b80612bde816140fd565b915050612ade565b509392505050565b816001600160a01b0316836001600160a01b03161415612c505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bbe565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612cc8848484612868565b612cd4848484846133ad565b611d1f5760405162461bcd60e51b8152600401610bbe90613d26565b606060028054610ac6906140c2565b606081612d235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d4d5780612d37816140fd565b9150612d469050600a83614035565b9150612d27565b60008167ffffffffffffffff811115612d6857612d68614184565b6040519080825280601f01601f191660200182016040528015612d92576020820181803683370190505b5090505b841561286057612da7600183614068565b9150612db4600a86614118565b612dbf906030613ff8565b60f81b818381518110612dd457612dd461416e565b60200101906001600160f81b031916908160001a905350612df6600a86614035565b9450612d96565b600080829050600181511015612e165750600092915050565b601981511115612e295750600092915050565b80600081518110612e3c57612e3c61416e565b6020910101516001600160f81b031916600160fd1b1415612e605750600092915050565b8060018251612e6f9190614068565b81518110612e7f57612e7f61416e565b6020910101516001600160f81b031916600160fd1b1415612ea35750600092915050565b600081600081518110612eb857612eb861416e565b01602001516001600160f81b031916905060005b8251811015611c3a576000838281518110612ee957612ee961416e565b01602001516001600160f81b0319169050600160fd1b81148015612f1a5750600160fd1b6001600160f81b03198416145b15612f2b5750600095945050505050565b600360fc1b6001600160f81b0319821610801590612f575750603960f81b6001600160f81b0319821611155b158015612f8d5750604160f81b6001600160f81b0319821610801590612f8b5750602d60f91b6001600160f81b0319821611155b155b8015612fc25750606160f81b6001600160f81b0319821610801590612fc05750603d60f91b6001600160f81b0319821611155b155b8015612fdc5750600160fd1b6001600160f81b0319821614155b15612fed5750600095945050505050565b915080612ff9816140fd565b915050612ecc565b80601c61300d84612a8b565b60405161301a9190613c34565b908152604051908190036020019020805491151560ff199092169190911790555050565b6001600160a01b0383166130995761309481600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6130bc565b816001600160a01b0316836001600160a01b0316146130bc576130bc83826134af565b6001600160a01b0382166130d357610cf48161354c565b826001600160a01b0316826001600160a01b031614610cf457610cf482826135fb565b6001600160a01b03821661314c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bbe565b6000818152600360205260409020546001600160a01b0316156131b15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bbe565b6131bd6000838361303e565b6001600160a01b03821660009081526004602052604081208054600192906131e6908490613ff8565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806132508361363f565b60175490915060006132628284614118565b90506000601782815481106132795761327961416e565b600091825260208083208183040154898452601b825260408085208054601f9095166101000a90920460ff1660ff19909416841790915582845260189091528220805491935090916132ca836140fd565b909155505060ff81166000908152601860205260409020546108ae14156133a15760176132f8600185614068565b815481106133085761330861416e565b90600052602060002090602091828204019190069054906101000a900460ff166017838154811061333b5761333b61416e565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550601780548061337657613376614158565b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b50600195945050505050565b60006001600160a01b0384163b15611c3a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133f1903390899088908890600401613cd6565b602060405180830381600087803b15801561340b57600080fd5b505af192505050801561343b575060408051601f3d908101601f1916820190925261343891810190613a9d565b60015b613495573d808015613469576040519150601f19603f3d011682016040523d82523d6000602084013e61346e565b606091505b50805161348d5760405162461bcd60e51b8152600401610bbe90613d26565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612860565b600060016134bc84611a12565b6134c69190614068565b600083815260086020526040902054909150808214613519576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061355e90600190614068565b6000838152600a6020526040812054600980549394509092849081106135865761358661416e565b9060005260206000200154905080600983815481106135a7576135a761416e565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806135df576135df614158565b6001900381819060005260206000200160009055905550505050565b600061360683611a12565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000813342445a60405160200161368a95949392919094855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b60408051601f19818403018152919052805160209091012092915050565b8280546136b4906140c2565b90600052602060002090601f0160209004810192826136d6576000855561371c565b82601f106136ef5782800160ff1982351617855561371c565b8280016001018555821561371c579182015b8281111561371c578235825591602001919060010190613701565b506137289291506137a0565b5090565b828054613738906140c2565b90600052602060002090601f01602090048101928261375a576000855561371c565b82601f1061377357805160ff191683800117855561371c565b8280016001018555821561371c579182015b8281111561371c578251825591602001919060010190613785565b5b8082111561372857600081556001016137a1565b600067ffffffffffffffff808411156137d0576137d0614184565b604051601f8501601f19908116603f011681019082821181831017156137f8576137f8614184565b8160405280935085815286868601111561381157600080fd5b858560208301376000602087830101525050509392505050565b803560ff8116811461101357600080fd5b60006020828403121561384e57600080fd5b81356138598161419a565b9392505050565b60006020828403121561387257600080fd5b81516138598161419a565b6000806040838503121561389057600080fd5b823561389b8161419a565b915060208301356138ab8161419a565b809150509250929050565b6000806000606084860312156138cb57600080fd5b83356138d68161419a565b925060208401356138e68161419a565b929592945050506040919091013590565b6000806000806080858703121561390d57600080fd5b84356139188161419a565b935060208501356139288161419a565b925060408501359150606085013567ffffffffffffffff81111561394b57600080fd5b8501601f8101871361395c57600080fd5b61396b878235602084016137b5565b91505092959194509250565b6000806040838503121561398a57600080fd5b82356139958161419a565b915060208301356138ab816141af565b600080604083850312156139b857600080fd5b82356139c38161419a565b946020939093013593505050565b600080602083850312156139e457600080fd5b823567ffffffffffffffff808211156139fc57600080fd5b818501915085601f830112613a1057600080fd5b813581811115613a1f57600080fd5b8660208260051b8501011115613a3457600080fd5b60209290920196919550909350505050565b600060208284031215613a5857600080fd5b8135613859816141af565b600060208284031215613a7557600080fd5b8151613859816141af565b600060208284031215613a9257600080fd5b8135613859816141bd565b600060208284031215613aaf57600080fd5b8151613859816141bd565b600080600060408486031215613acf57600080fd5b833567ffffffffffffffff80821115613ae757600080fd5b818601915086601f830112613afb57600080fd5b813581811115613b0a57600080fd5b876020828501011115613b1c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613b4457600080fd5b813567ffffffffffffffff811115613b5b57600080fd5b8201601f81018413613b6c57600080fd5b612860848235602084016137b5565b600060208284031215613b8d57600080fd5b813561ffff8116811461385957600080fd5b600060208284031215613bb157600080fd5b5035919050565b600060208284031215613bca57600080fd5b5051919050565b600060208284031215613be357600080fd5b6138598261382b565b60008060408385031215613bff57600080fd5b6139c38361382b565b60008151808452613c2081602086016020860161407f565b601f01601f19169290920160200192915050565b60008251613c4681846020870161407f565b9190910192915050565b60008451613c6281846020890161407f565b845190830190613c7681836020890161407f565b623f633d60e81b91019081528351613c9581600384016020880161407f565b0160030195945050505050565b6b69736c616e6420617065202360a01b815260008251613cc981600c85016020870161407f565b91909101600c0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d0990830184613c08565b9695505050505050565b6020815260006138596020830184613c08565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602a908201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265206f776e65604082015269391037b3103a37b5b2b760b11b606082015260800190565b60208082526035908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e6040820152741bdd08195e18d959590818985d18da081b1a5b5a5d605a1b606082015260800190565b60208082526022908201527f436f6c6c656374696f6e3a206d75737420626520612076616c696420616d6f756040820152611b9d60f21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f436f6c6c656374696f6e3a206163636f756e74206d757374206861766520737560408201526e6666696369656e7420746f6b656e7360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f436f6c6c656374696f6e3a20737570706c79206d75737420626520617661696c60408201526f61626c6520666f72206d696e74696e6760801b606082015260800190565b6020808252818101527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c6564604082015260600190565b60208082526025908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520616374696040820152641d985d195960da1b606082015260800190565b6000821982111561400b5761400b61412c565b500190565b600060ff821660ff84168060ff0382111561402d5761402d61412c565b019392505050565b60008261404457614044614142565b500490565b60008160001904831182151516156140635761406361412c565b500290565b60008282101561407a5761407a61412c565b500390565b60005b8381101561409a578181015183820152602001614082565b83811115611d1f5750506000910152565b6000816140ba576140ba61412c565b506000190190565b600181811c908216806140d657607f821691505b602082108114156140f757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156141115761411161412c565b5060010190565b60008261412757614127614142565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461227357600080fd5b801515811461227357600080fd5b6001600160e01b03198116811461227357600080fdfea26469706673582212204de2b7672670fd6ea987fac361c35626078c4548005145eb0145e92eac2e6c2d64736f6c6343000807003368747470733a2f2f6d657461646174612e6170656f6e6c7969736c616e642e636f6d2f

Deployed Bytecode

0x6080604052600436106103765760003560e01c806370a08231116101d1578063a22cb46511610102578063e93b3a73116100a0578063f7c7318f1161006f578063f7c7318f14610a21578063fa7f369714610a36578063fe60d12c14610a56578063feaa896814610a6c57600080fd5b8063e93b3a7314610982578063e985e9c5146109a2578063eca17e04146109eb578063f2fde38b14610a0157600080fd5b8063c87b56dd116100dc578063c87b56dd14610916578063ca74a78414610936578063db925fcf1461094c578063dbe16c071461096257600080fd5b8063a22cb465146108b6578063b88d4fde146108d6578063c21b6432146108f657600080fd5b80638da5cb5b1161016f57806395d89b411161014957806395d89b411461084b5780639d76ea5814610860578063a035b1fe14610880578063a0b133b01461089657600080fd5b80638da5cb5b146107f857806391b7f5ed146108165780639559c0bd1461083657600080fd5b8063798ca2e6116101ab578063798ca2e6146107785780637e707be31461079857806388c4a3e0146107b85780638ba4cc3c146107d857600080fd5b806370a0823114610716578063715018a61461073657806372fd0d891461074b57600080fd5b80632f745c59116102ab57806342842e0e1161024957806355f804b31161022357806355f804b3146106a0578063597be6d1146106c05780636352211e146106d657806366469a3a146106f657600080fd5b806342842e0e146106405780634bd06083146106605780634f6ccce71461068057600080fd5b806339d60e3d1161028557806339d60e3d146105cb5780633cb50c23146105eb5780633ccfd60b1461060b578063409981de1461062057600080fd5b80632f745c59146105395780632ff047221461055957806337803e5e1461058957600080fd5b806318160ddd116103185780632532884e116102f25780632532884e146104d057806326a4e8d2146104f05780632a958572146105105780632db115441461052657600080fd5b806318160ddd14610481578063186601ca1461049657806323b872dd146104b057600080fd5b8063095ea7b311610354578063095ea7b31461040a5780630ad5b0a01461042c5780630f15f4c01461044d57806311e23f4f1461046257600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613a80565b610a8c565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ab7565b6040516103a79190613d13565b3480156103de57600080fd5b506103f26103ed366004613b9f565b610b49565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a6104253660046139a5565b610be3565b005b34801561043857600080fd5b50600b5461039b90600160a01b900460ff1681565b34801561045957600080fd5b5061039b610cf9565b34801561046e57600080fd5b50601e545b6040519081526020016103a7565b34801561048d57600080fd5b50600954610473565b3480156104a257600080fd5b5060115461039b9060ff1681565b3480156104bc57600080fd5b5061042a6104cb3660046138b6565b610da9565b3480156104dc57600080fd5b5061039b6104eb366004613aba565b610dda565b3480156104fc57600080fd5b5061039b61050b36600461383c565b610fc7565b34801561051c57600080fd5b50610473600e5481565b61039b610534366004613b9f565b611018565b34801561054557600080fd5b506104736105543660046139a5565b61123f565b34801561056557600080fd5b5061039b610574366004613b9f565b6000908152601d602052604090205460ff1690565b34801561059557600080fd5b506105b96105a4366004613b9f565b6000908152601b602052604090205460ff1690565b60405160ff90911681526020016103a7565b3480156105d757600080fd5b5061039b6105e6366004613b9f565b6112d5565b3480156105f757600080fd5b506103c5610606366004613b9f565b61130b565b34801561061757600080fd5b5061039b6113ad565b34801561062c57600080fd5b5061039b61063b366004613b7b565b61146e565b34801561064c57600080fd5b5061042a61065b3660046138b6565b6114cd565b34801561066c57600080fd5b5061039b61067b3660046139d1565b6114e8565b34801561068c57600080fd5b5061047361069b366004613b9f565b61182a565b3480156106ac57600080fd5b5061039b6106bb366004613b32565b6118bd565b3480156106cc57600080fd5b5061047360125481565b3480156106e257600080fd5b506103f26106f1366004613b9f565b6118fb565b34801561070257600080fd5b506103c5610711366004613b9f565b611972565b34801561072257600080fd5b5061047361073136600461383c565b611a12565b34801561074257600080fd5b5061042a611a99565b34801561075757600080fd5b50610473610766366004613bd1565b60186020526000908152604090205481565b34801561078457600080fd5b5061039b610793366004613b9f565b611acf565b3480156107a457600080fd5b5061039b6107b3366004613b9f565b611b05565b3480156107c457600080fd5b506103c56107d3366004613b9f565b611b3b565b3480156107e457600080fd5b5061039b6107f33660046139a5565b611b77565b34801561080457600080fd5b50600b546001600160a01b03166103f2565b34801561082257600080fd5b5061039b610831366004613b9f565b611c45565b34801561084257600080fd5b50610473600881565b34801561085757600080fd5b506103c5611c9b565b34801561086c57600080fd5b50601f546103f2906001600160a01b031681565b34801561088c57600080fd5b50610473600f5481565b3480156108a257600080fd5b5061039b6108b1366004613b32565b611caa565b3480156108c257600080fd5b5061042a6108d1366004613977565b611cde565b3480156108e257600080fd5b5061042a6108f13660046138f7565b611ced565b34801561090257600080fd5b5061039b610911366004613a46565b611d25565b34801561092257600080fd5b506103c5610931366004613b9f565b611d76565b34801561094257600080fd5b50610473600c5481565b34801561095857600080fd5b50610473600d5481565b34801561096e57600080fd5b506103c561097d366004613b9f565b611e4d565b34801561098e57600080fd5b5061039b61099d366004613bec565b611f2b565b3480156109ae57600080fd5b5061039b6109bd36600461387d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156109f757600080fd5b506104736122b881565b348015610a0d57600080fd5b5061042a610a1c36600461383c565b6121db565b348015610a2d57600080fd5b5061039b612276565b348015610a4257600080fd5b506103c5610a51366004613b9f565b6122a0565b348015610a6257600080fd5b5061047360105481565b348015610a7857600080fd5b5061039b610a87366004613aba565b6122bd565b60006001600160e01b0319821663780e9d6360e01b1480610ab15750610ab1826126b3565b92915050565b606060008054610ac6906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af2906140c2565b8015610b3f5780601f10610b1457610100808354040283529160200191610b3f565b820191906000526020600020905b815481529060010190602001808311610b2257829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bc75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bee826118fb565b9050806001600160a01b0316836001600160a01b03161415610c5c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bbe565b336001600160a01b0382161480610c785750610c7881336109bd565b610cea5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bbe565b610cf48383612703565b505050565b600b546000906001600160a01b03163314610d265760405162461bcd60e51b8152600401610bbe90613e59565b60115460ff1615610d495760405162461bcd60e51b8152600401610bbe90613fb3565b426012556011805460ff19166001179055610d613390565b6001600160a01b03167fcffdf6de62e8d9ae544ba4c36565fe4bcef3c1a96f174abbe6c56e25e2b220ed42604051610d9b91815260200190565b60405180910390a250600190565b610db33382612771565b610dcf5760405162461bcd60e51b8152600401610bbe90613edd565b610cf4838383612868565b600b54600090600160a01b900460ff16610e065760405162461bcd60e51b8152600401610bbe90613f7e565b3380610e11846118fb565b6001600160a01b031614610e375760405162461bcd60e51b8152600401610bbe90613d78565b600d54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb79190613bb8565b1015610ed55760405162461bcd60e51b8152600401610bbe90613e8e565b601f54600d54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b158015610f2657600080fd5b505af1158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190613a63565b506000838152601a60205260409020610f789086866136a8565b50806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594684604051610fb491815260200190565b60405180910390a2506001949350505050565b600b546000906001600160a01b03163314610ff45760405162461bcd60e51b8152600401610bbe90613e59565b50601f80546001600160a01b0319166001600160a01b03831617905560015b919050565b60115460009060ff1661103d5760405162461bcd60e51b8152600401610bbe90613fb3565b6201518060125461104e9190613ff8565b4210156110ac5760405162461bcd60e51b815260206004820152602660248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e67206e6f7420736044820152651d185c9d195960d21b6064820152608401610bbe565b60088211156110cd5760405162461bcd60e51b8152600401610bbe90613dc2565b60006110d860095490565b90506122b86110e78483613ff8565b11156111055760405162461bcd60e51b8152600401610bbe90613f2e565b601054611114906122b8614068565b61111e8483613ff8565b111561117f5760405162461bcd60e51b815260206004820152602a60248201527f436f6c6c656374696f6e3a20737570706c79207265616368656420726573657260448201526976656420746f6b656e7360b01b6064820152608401610bbe565b3483600f5461118e9190614049565b146111f75760405162461bcd60e51b815260206004820152603360248201527f436f6c6c656374696f6e3a206163636f756e74206d757374207061792074686560448201527220636f7272656374206d696e7420707269636560681b6064820152608401610bbe565b60015b83811161123557600061120d8284613ff8565b90506122b88111611222576112223382612a13565b508061122d816140fd565b9150506111fa565b5060019392505050565b600061124a83611a12565b82106112ac5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bbe565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b031633146113025760405162461bcd60e51b8152600401610bbe90613e59565b50600d55600190565b6000818152601a60205260409020805460609190611328906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611354906140c2565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b50505050509050919050565b600b546000906001600160a01b031633146113da5760405162461bcd60e51b8152600401610bbe90613e59565b47806114385760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a206e6f20776974686472617761626c652066756e646044820152661cc8199bdd5b9960ca1b6064820152608401610bbe565b604051339082156108fc029083906000818181858888f19350505050158015611465573d6000803e3d6000fd5b50600191505090565b600b546000906001600160a01b0316331461149b5760405162461bcd60e51b8152600401610bbe90613e59565b60648261ffff1611156114c05760405162461bcd60e51b8152600401610bbe90613e17565b5061ffff16601055600190565b610cf483838360405180602001604052806000815250611ced565b60115460009060ff1661150d5760405162461bcd60e51b8152600401610bbe90613fb3565b6201518060125461151e9190613ff8565b421061157c5760405162461bcd60e51b815260206004820152602760248201527f436f6c6c656374696f6e3a207075626c6963206d696e74696e672068617665206044820152661cdd185c9d195960ca1b6064820152608401610bbe565b8133600882111561159f5760405162461bcd60e51b8152600401610bbe90613dc2565b60006115aa60095490565b6115b5906001613ff8565b905060005b8381101561181d57601d60008888848181106115d8576115d861416e565b602090810292909201358352508101919091526040016000205460ff16156116685760405162461bcd60e51b815260206004820152603860248201527f436f6c6c656374696f6e3a2067656e6573697320617065203c49443e2066726560448201527f65206d696e742068617665206265656e20636c61696d656400000000000000006064820152608401610bbe565b6001600160a01b03831673f1e0beca4eac65f902466881cdfdd0099d91e47b636352211e89898581811061169e5761169e61416e565b905060200201356040518263ffffffff1660e01b81526004016116c391815260200190565b60206040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190613860565b6001600160a01b03161461178f5760405162461bcd60e51b815260206004820152603d60248201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265207468652060448201527f6f776e6572206f66207468652067656e6573697320617065203c49443e0000006064820152608401610bbe565b6103e7821161180b576001601d60008989858181106117b0576117b061416e565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055506117e68383612a13565b816117f0816140fd565b601e80549194509091506000611805836140fd565b91905055505b80611815816140fd565b9150506115ba565b5060019695505050505050565b600061183560095490565b82106118985760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bbe565b600982815481106118ab576118ab61416e565b90600052602060002001549050919050565b600b546000906001600160a01b031633146118ea5760405162461bcd60e51b8152600401610bbe90613e59565b6118f382612a26565b506001919050565b6000818152600360205260408120546001600160a01b031680610ab15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bbe565b6013816004811061198257600080fd5b018054909150611991906140c2565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd906140c2565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b505050505081565b60006001600160a01b038216611a7d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bbe565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b03163314611ac35760405162461bcd60e51b8152600401610bbe90613e59565b611acd6000612a39565b565b600b546000906001600160a01b03163314611afc5760405162461bcd60e51b8152600401610bbe90613e59565b50600c55600190565b600b546000906001600160a01b03163314611b325760405162461bcd60e51b8152600401610bbe90613e59565b50600e55600190565b60606013611b58836000908152601b602052604090205460ff1690565b60ff1660048110611b6b57611b6b61416e565b018054611328906140c2565b600b546000906001600160a01b03163314611ba45760405162461bcd60e51b8152600401610bbe90613e59565b60008211611bc45760405162461bcd60e51b8152600401610bbe90613e17565b6000611bcf60095490565b90506122b8611bde8483613ff8565b1115611bfc5760405162461bcd60e51b8152600401610bbe90613f2e565b60015b838111611c3a576000611c128284613ff8565b90506122b88111611c2757611c278682612a13565b5080611c32816140fd565b915050611bff565b506001949350505050565b600b546000906001600160a01b03163314611c725760405162461bcd60e51b8152600401610bbe90613e59565b60008211611c925760405162461bcd60e51b8152600401610bbe90613e17565b50600f55600190565b606060018054610ac6906140c2565b6000601c611cb783612a8b565b604051611cc49190613c34565b9081526040519081900360200190205460ff161592915050565b611ce9338383612bee565b5050565b611cf73383612771565b611d135760405162461bcd60e51b8152600401610bbe90613edd565b611d1f84848484612cbd565b50505050565b600b546000906001600160a01b03163314611d525760405162461bcd60e51b8152600401610bbe90613e59565b50600b805460ff60a01b1916600160a01b9215158302179081905560ff9190041690565b6000818152600360205260409020546060906001600160a01b0316611df15760405162461bcd60e51b815260206004820152602b60248201527f436f6c6c656374696f6e3a2055524920717565727920666f72206e6f6e65786960448201526a39ba32b73a103a37b5b2b760a91b6064820152608401610bbe565b6000611dfb612cf0565b6000848152601b602052604090205490915060ff1681611e1a85612cff565b611e2383612cff565b604051602001611e3593929190613c50565b60405160208183030381529060405292505050919050565b600081815260196020526040812080546060929190611e6b906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e97906140c2565b8015611ee45780601f10611eb957610100808354040283529160200191611ee4565b820191906000526020600020905b815481529060010190602001808311611ec757829003601f168201915b50505050509050600081511115611efb5792915050565b611f0483612cff565b604051602001611f149190613ca2565b604051602081830303815290604052915050919050565b600b54600090600160a01b900460ff16611f575760405162461bcd60e51b8152600401610bbe90613f7e565b3380611f62846118fb565b6001600160a01b031614611f885760405162461bcd60e51b8152600401610bbe90613d78565b600e54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015611fd057600080fd5b505afa158015611fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120089190613bb8565b101561203b5760405162461bcd60e51b81526020600482015260026024820152610b0b60f31b6044820152606401610bbe565b60048460ff161061209a5760405162461bcd60e51b8152602060048201526024808201527f436f6c6c656374696f6e3a20696e76616c696420636c616e20696e646578205b604482015263302d335d60e01b6064820152608401610bbe565b6000838152601b602090815260408083205460ff168352601890915281208054916120c4836140ab565b9091555050601f54600e54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b15801561211a57600080fd5b505af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190613a63565b506000838152601b60209081526040808320805460ff191660ff8916908117909155835260189091528120805491612189836140fd565b9190505550806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af5946846040516121c991815260200190565b60405180910390a25060019392505050565b600b546001600160a01b031633146122055760405162461bcd60e51b8152600401610bbe90613e59565b6001600160a01b03811661226a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbe565b61227381612a39565b50565b60115460009060ff16801561229b5750620151806012546122979190613ff8565b4210155b905090565b6000818152601960205260409020805460609190611328906140c2565b600b54600090600160a01b900460ff166122e95760405162461bcd60e51b8152600401610bbe90613f7e565b33806122f4846118fb565b6001600160a01b03161461231a5760405162461bcd60e51b8152600401610bbe90613d78565b61235985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612dfd92505050565b6123a55760405162461bcd60e51b815260206004820152601e60248201527f436f6c6c656374696f6e3a206e616d65206d7573742062652076616c696400006044820152606401610bbe565b6123e485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611caa92505050565b6124305760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e3a206e616d65206d75737420626520756e69717565006044820152606401610bbe565b600c54601f546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b15801561247857600080fd5b505afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613bb8565b10156124ce5760405162461bcd60e51b8152600401610bbe90613e8e565b600083815260196020526040812080546124e7906140c2565b905011156125925760008381526019602052604090208054612592919061250d906140c2565b80601f0160208091040260200160405190810160405280929190818152602001828054612539906140c2565b80156125865780601f1061255b57610100808354040283529160200191612586565b820191906000526020600020905b81548152906001019060200180831161256957829003601f168201915b50505050506000613001565b601f54600c54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820192909252911690639dc29fac90604401602060405180830381600087803b1580156125e357600080fd5b505af11580156125f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261b9190613a63565b5060008381526019602052604090206126359086866136a8565b5061267885858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250613001915050565b806001600160a01b03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594684604051610fb491815260200190565b60006001600160e01b031982166380ac58cd60e01b14806126e457506001600160e01b03198216635b5e139f60e01b145b80610ab157506301ffc9a760e01b6001600160e01b0319831614610ab1565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612738826118fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166127ea5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bbe565b60006127f5836118fb565b9050806001600160a01b0316846001600160a01b031614806128305750836001600160a01b031661282584610b49565b6001600160a01b0316145b8061286057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661287b826118fb565b6001600160a01b0316146128e35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bbe565b6001600160a01b0382166129455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bbe565b61295083838361303e565b61295b600082612703565b6001600160a01b0383166000908152600460205260408120805460019290612984908490614068565b90915550506001600160a01b03821660009081526004602052604081208054600192906129b2908490613ff8565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612a1d82826130f6565b610cf481613244565b8051611ce990600290602084019061372c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060008290506000815167ffffffffffffffff811115612aae57612aae614184565b6040519080825280601f01601f191660200182016040528015612ad8576020820181803683370190505b50905060005b8251811015612be6576041838281518110612afb57612afb61416e565b016020015160f81c10801590612b2b5750605a838281518110612b2057612b2061416e565b016020015160f81c11155b15612b8d57828181518110612b4257612b4261416e565b602001015160f81c60f81b60f81c6020612b5c9190614010565b60f81b828281518110612b7157612b7161416e565b60200101906001600160f81b031916908160001a905350612bd4565b828181518110612b9f57612b9f61416e565b602001015160f81c60f81b828281518110612bbc57612bbc61416e565b60200101906001600160f81b031916908160001a9053505b80612bde816140fd565b915050612ade565b509392505050565b816001600160a01b0316836001600160a01b03161415612c505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bbe565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612cc8848484612868565b612cd4848484846133ad565b611d1f5760405162461bcd60e51b8152600401610bbe90613d26565b606060028054610ac6906140c2565b606081612d235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d4d5780612d37816140fd565b9150612d469050600a83614035565b9150612d27565b60008167ffffffffffffffff811115612d6857612d68614184565b6040519080825280601f01601f191660200182016040528015612d92576020820181803683370190505b5090505b841561286057612da7600183614068565b9150612db4600a86614118565b612dbf906030613ff8565b60f81b818381518110612dd457612dd461416e565b60200101906001600160f81b031916908160001a905350612df6600a86614035565b9450612d96565b600080829050600181511015612e165750600092915050565b601981511115612e295750600092915050565b80600081518110612e3c57612e3c61416e565b6020910101516001600160f81b031916600160fd1b1415612e605750600092915050565b8060018251612e6f9190614068565b81518110612e7f57612e7f61416e565b6020910101516001600160f81b031916600160fd1b1415612ea35750600092915050565b600081600081518110612eb857612eb861416e565b01602001516001600160f81b031916905060005b8251811015611c3a576000838281518110612ee957612ee961416e565b01602001516001600160f81b0319169050600160fd1b81148015612f1a5750600160fd1b6001600160f81b03198416145b15612f2b5750600095945050505050565b600360fc1b6001600160f81b0319821610801590612f575750603960f81b6001600160f81b0319821611155b158015612f8d5750604160f81b6001600160f81b0319821610801590612f8b5750602d60f91b6001600160f81b0319821611155b155b8015612fc25750606160f81b6001600160f81b0319821610801590612fc05750603d60f91b6001600160f81b0319821611155b155b8015612fdc5750600160fd1b6001600160f81b0319821614155b15612fed5750600095945050505050565b915080612ff9816140fd565b915050612ecc565b80601c61300d84612a8b565b60405161301a9190613c34565b908152604051908190036020019020805491151560ff199092169190911790555050565b6001600160a01b0383166130995761309481600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6130bc565b816001600160a01b0316836001600160a01b0316146130bc576130bc83826134af565b6001600160a01b0382166130d357610cf48161354c565b826001600160a01b0316826001600160a01b031614610cf457610cf482826135fb565b6001600160a01b03821661314c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bbe565b6000818152600360205260409020546001600160a01b0316156131b15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bbe565b6131bd6000838361303e565b6001600160a01b03821660009081526004602052604081208054600192906131e6908490613ff8565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806132508361363f565b60175490915060006132628284614118565b90506000601782815481106132795761327961416e565b600091825260208083208183040154898452601b825260408085208054601f9095166101000a90920460ff1660ff19909416841790915582845260189091528220805491935090916132ca836140fd565b909155505060ff81166000908152601860205260409020546108ae14156133a15760176132f8600185614068565b815481106133085761330861416e565b90600052602060002090602091828204019190069054906101000a900460ff166017838154811061333b5761333b61416e565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550601780548061337657613376614158565b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b50600195945050505050565b60006001600160a01b0384163b15611c3a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133f1903390899088908890600401613cd6565b602060405180830381600087803b15801561340b57600080fd5b505af192505050801561343b575060408051601f3d908101601f1916820190925261343891810190613a9d565b60015b613495573d808015613469576040519150601f19603f3d011682016040523d82523d6000602084013e61346e565b606091505b50805161348d5760405162461bcd60e51b8152600401610bbe90613d26565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612860565b600060016134bc84611a12565b6134c69190614068565b600083815260086020526040902054909150808214613519576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061355e90600190614068565b6000838152600a6020526040812054600980549394509092849081106135865761358661416e565b9060005260206000200154905080600983815481106135a7576135a761416e565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806135df576135df614158565b6001900381819060005260206000200160009055905550505050565b600061360683611a12565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000813342445a60405160200161368a95949392919094855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b60408051601f19818403018152919052805160209091012092915050565b8280546136b4906140c2565b90600052602060002090601f0160209004810192826136d6576000855561371c565b82601f106136ef5782800160ff1982351617855561371c565b8280016001018555821561371c579182015b8281111561371c578235825591602001919060010190613701565b506137289291506137a0565b5090565b828054613738906140c2565b90600052602060002090601f01602090048101928261375a576000855561371c565b82601f1061377357805160ff191683800117855561371c565b8280016001018555821561371c579182015b8281111561371c578251825591602001919060010190613785565b5b8082111561372857600081556001016137a1565b600067ffffffffffffffff808411156137d0576137d0614184565b604051601f8501601f19908116603f011681019082821181831017156137f8576137f8614184565b8160405280935085815286868601111561381157600080fd5b858560208301376000602087830101525050509392505050565b803560ff8116811461101357600080fd5b60006020828403121561384e57600080fd5b81356138598161419a565b9392505050565b60006020828403121561387257600080fd5b81516138598161419a565b6000806040838503121561389057600080fd5b823561389b8161419a565b915060208301356138ab8161419a565b809150509250929050565b6000806000606084860312156138cb57600080fd5b83356138d68161419a565b925060208401356138e68161419a565b929592945050506040919091013590565b6000806000806080858703121561390d57600080fd5b84356139188161419a565b935060208501356139288161419a565b925060408501359150606085013567ffffffffffffffff81111561394b57600080fd5b8501601f8101871361395c57600080fd5b61396b878235602084016137b5565b91505092959194509250565b6000806040838503121561398a57600080fd5b82356139958161419a565b915060208301356138ab816141af565b600080604083850312156139b857600080fd5b82356139c38161419a565b946020939093013593505050565b600080602083850312156139e457600080fd5b823567ffffffffffffffff808211156139fc57600080fd5b818501915085601f830112613a1057600080fd5b813581811115613a1f57600080fd5b8660208260051b8501011115613a3457600080fd5b60209290920196919550909350505050565b600060208284031215613a5857600080fd5b8135613859816141af565b600060208284031215613a7557600080fd5b8151613859816141af565b600060208284031215613a9257600080fd5b8135613859816141bd565b600060208284031215613aaf57600080fd5b8151613859816141bd565b600080600060408486031215613acf57600080fd5b833567ffffffffffffffff80821115613ae757600080fd5b818601915086601f830112613afb57600080fd5b813581811115613b0a57600080fd5b876020828501011115613b1c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613b4457600080fd5b813567ffffffffffffffff811115613b5b57600080fd5b8201601f81018413613b6c57600080fd5b612860848235602084016137b5565b600060208284031215613b8d57600080fd5b813561ffff8116811461385957600080fd5b600060208284031215613bb157600080fd5b5035919050565b600060208284031215613bca57600080fd5b5051919050565b600060208284031215613be357600080fd5b6138598261382b565b60008060408385031215613bff57600080fd5b6139c38361382b565b60008151808452613c2081602086016020860161407f565b601f01601f19169290920160200192915050565b60008251613c4681846020870161407f565b9190910192915050565b60008451613c6281846020890161407f565b845190830190613c7681836020890161407f565b623f633d60e81b91019081528351613c9581600384016020880161407f565b0160030195945050505050565b6b69736c616e6420617065202360a01b815260008251613cc981600c85016020870161407f565b91909101600c0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d0990830184613c08565b9695505050505050565b6020815260006138596020830184613c08565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602a908201527f436f6c6c656374696f6e3a206163636f756e74206d757374206265206f776e65604082015269391037b3103a37b5b2b760b11b606082015260800190565b60208082526035908201527f436f6c6c656374696f6e3a206d696e74656420616d6f756e74206d757374206e6040820152741bdd08195e18d959590818985d18da081b1a5b5a5d605a1b606082015260800190565b60208082526022908201527f436f6c6c656374696f6e3a206d75737420626520612076616c696420616d6f756040820152611b9d60f21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f436f6c6c656374696f6e3a206163636f756e74206d757374206861766520737560408201526e6666696369656e7420746f6b656e7360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f436f6c6c656374696f6e3a20737570706c79206d75737420626520617661696c60408201526f61626c6520666f72206d696e74696e6760801b606082015260800190565b6020808252818101527f436f6c6c656374696f6e3a205368696c6c696e67206e6f7420656e61626c6564604082015260600190565b60208082526025908201527f436f6c6c656374696f6e3a206d696e74696e67206d75737420626520616374696040820152641d985d195960da1b606082015260800190565b6000821982111561400b5761400b61412c565b500190565b600060ff821660ff84168060ff0382111561402d5761402d61412c565b019392505050565b60008261404457614044614142565b500490565b60008160001904831182151516156140635761406361412c565b500290565b60008282101561407a5761407a61412c565b500390565b60005b8381101561409a578181015183820152602001614082565b83811115611d1f5750506000910152565b6000816140ba576140ba61412c565b506000190190565b600181811c908216806140d657607f821691505b602082108114156140f757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156141115761411161412c565b5060010190565b60008261412757614127614142565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461227357600080fd5b801515811461227357600080fd5b6001600160e01b03198116811461227357600080fdfea26469706673582212204de2b7672670fd6ea987fac361c35626078c4548005145eb0145e92eac2e6c2d64736f6c63430008070033

Deployed Bytecode Sourcemap

54987:15694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48464:300;;;;;;;;;;-1:-1:-1;48464:300:0;;;;;:::i;:::-;;:::i;:::-;;;10953:14:1;;10946:22;10928:41;;10916:2;10901:18;48464:300:0;;;;;;;;35500:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37317:308::-;;;;;;;;;;-1:-1:-1;37317:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9972:32:1;;;9954:51;;9942:2;9927:18;37317:308:0;9808:203:1;36840:411:0;;;;;;;;;;-1:-1:-1;36840:411:0;;;;;:::i;:::-;;:::i;:::-;;55261:26;;;;;;;;;;-1:-1:-1;55261:26:0;;;;-1:-1:-1;;;55261:26:0;;;;;;58710:282;;;;;;;;;;;;;:::i;65250:159::-;;;;;;;;;;-1:-1:-1;65383:18:0;;65250:159;;;25752:25:1;;;25740:2;25725:18;65250:159:0;25606:177:1;49267:113:0;;;;;;;;;;-1:-1:-1;49355:10:0;:17;49267:113;;55546:21;;;;;;;;;;-1:-1:-1;55546:21:0;;;;;;;;38236:376;;;;;;;;;;-1:-1:-1;38236:376:0;;;;;:::i;:::-;;:::i;63445:708::-;;;;;;;;;;-1:-1:-1;63445:708:0;;;;;:::i;:::-;;:::i;57932:187::-;;;;;;;;;;-1:-1:-1;57932:187:0;;;;;:::i;:::-;;:::i;55380:35::-;;;;;;;;;;;;;;;;61111:1144;;;;;;:::i;:::-;;:::i;48848:343::-;;;;;;;;;;-1:-1:-1;48848:343:0;;;;;:::i;:::-;;:::i;65088:154::-;;;;;;;;;;-1:-1:-1;65088:154:0;;;;;:::i;:::-;65151:4;65217:17;;;:13;:17;;;;;;;;;65088:154;66606:138;;;;;;;;;;-1:-1:-1;66606:138:0;;;;;:::i;:::-;66663:5;66720:16;;;:12;:16;;;;;;;;;66606:138;;;;25960:4:1;25948:17;;;25930:36;;25918:2;25903:18;66606:138:0;25788:184:1;57538:189:0;;;;;;;;;;-1:-1:-1;57538:189:0;;;;;:::i;:::-;;:::i;66291:149::-;;;;;;;;;;-1:-1:-1;66291:149:0;;;;;:::i;:::-;;:::i;59608:264::-;;;;;;;;;;;;;:::i;58328:198::-;;;;;;;;;;-1:-1:-1;58328:198:0;;;;;:::i;:::-;;:::i;38683:185::-;;;;;;;;;;-1:-1:-1;38683:185:0;;;;;:::i;:::-;;:::i;59880:1223::-;;;;;;;;;;-1:-1:-1;59880:1223:0;;;;;:::i;:::-;;:::i;49457:320::-;;;;;;;;;;-1:-1:-1;49457:320:0;;;;;:::i;:::-;;:::i;58534:168::-;;;;;;;;;;-1:-1:-1;58534:168:0;;;;;:::i;:::-;;:::i;55574:26::-;;;;;;;;;;;;;;;;35107:326;;;;;;;;;;-1:-1:-1;35107:326:0;;;;;:::i;:::-;;:::i;55609:22::-;;;;;;;;;;-1:-1:-1;55609:22:0;;;;;:::i;:::-;;:::i;34750:295::-;;;;;;;;;;-1:-1:-1;34750:295:0;;;;;:::i;:::-;;:::i;21166:94::-;;;;;;;;;;;;;:::i;55677:48::-;;;;;;;;;;-1:-1:-1;55677:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;57341:189;;;;;;;;;;-1:-1:-1;57341:189:0;;;;;:::i;:::-;;:::i;57735:::-;;;;;;;;;;-1:-1:-1;57735:189:0;;;;;:::i;:::-;;:::i;66448:150::-;;;;;;;;;;-1:-1:-1;66448:150:0;;;;;:::i;:::-;;:::i;59000:600::-;;;;;;;;;;-1:-1:-1;59000:600:0;;;;;:::i;:::-;;:::i;20515:87::-;;;;;;;;;;-1:-1:-1;20588:6:0;;-1:-1:-1;;;;;20588:6:0;20515:87;;58127:193;;;;;;;;;;-1:-1:-1;58127:193:0;;;;;:::i;:::-;;:::i;55126:39::-;;;;;;;;;;;;55164:1;55126:39;;35669:104;;;;;;;;;;;;;:::i;56418:27::-;;;;;;;;;;-1:-1:-1;56418:27:0;;;;-1:-1:-1;;;;;56418:27:0;;;55424:33;;;;;;;;;;;;;;;;65801:157;;;;;;;;;;-1:-1:-1;65801:157:0;;;;;:::i;:::-;;:::i;37697:187::-;;;;;;;;;;-1:-1:-1;37697:187:0;;;;;:::i;:::-;;:::i;38939:365::-;;;;;;;;;;-1:-1:-1;38939:365:0;;;;;:::i;:::-;;:::i;57131:202::-;;;;;;;;;;-1:-1:-1;57131:202:0;;;;;:::i;:::-;;:::i;66752:592::-;;;;;;;;;;-1:-1:-1;66752:592:0;;;;;:::i;:::-;;:::i;55296:35::-;;;;;;;;;;;;;;;;55338;;;;;;;;;;;;;;;;65966:317;;;;;;;;;;-1:-1:-1;65966:317:0;;;;;:::i;:::-;;:::i;64161:919::-;;;;;;;;;;-1:-1:-1;64161:919:0;;;;;:::i;:::-;;:::i;37955:214::-;;;;;;;;;;-1:-1:-1;37955:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;38126:25:0;;;38097:4;38126:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37955:214;55077:42;;;;;;;;;;;;55115:4;55077:42;;21415:229;;;;;;;;;;-1:-1:-1;21415:229:0;;;;;:::i;:::-;;:::i;65626:167::-;;;;;;;;;;;;;:::i;65417:201::-;;;;;;;;;;-1:-1:-1;65417:201:0;;;;;:::i;:::-;;:::i;55508:29::-;;;;;;;;;;;;;;;;62263:1174;;;;;;;;;;-1:-1:-1;62263:1174:0;;;;;:::i;:::-;;:::i;48464:300::-;48611:4;-1:-1:-1;;;;;;48653:50:0;;-1:-1:-1;;;48653:50:0;;:103;;;48720:36;48744:11;48720:23;:36::i;:::-;48633:123;48464:300;-1:-1:-1;;48464:300:0:o;35500:100::-;35554:13;35587:5;35580:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35500:100;:::o;37317:308::-;37438:7;40940:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40940:16:0;37463:110;;;;-1:-1:-1;;;37463:110:0;;20126:2:1;37463:110:0;;;20108:21:1;20165:2;20145:18;;;20138:30;20204:34;20184:18;;;20177:62;-1:-1:-1;;;20255:18:1;;;20248:42;20307:19;;37463:110:0;;;;;;;;;-1:-1:-1;37593:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37593:24:0;;37317:308::o;36840:411::-;36921:13;36937:23;36952:7;36937:14;:23::i;:::-;36921:39;;36985:5;-1:-1:-1;;;;;36979:11:0;:2;-1:-1:-1;;;;;36979:11:0;;;36971:57;;;;-1:-1:-1;;;36971:57:0;;21726:2:1;36971:57:0;;;21708:21:1;21765:2;21745:18;;;21738:30;21804:34;21784:18;;;21777:62;-1:-1:-1;;;21855:18:1;;;21848:31;21896:19;;36971:57:0;21524:397:1;36971:57:0;19938:10;-1:-1:-1;;;;;37063:21:0;;;;:62;;-1:-1:-1;37088:37:0;37105:5;19938:10;37955:214;:::i;37088:37::-;37041:168;;;;-1:-1:-1;;;37041:168:0;;17269:2:1;37041:168:0;;;17251:21:1;17308:2;17288:18;;;17281:30;17347:34;17327:18;;;17320:62;17418:26;17398:18;;;17391:54;17462:19;;37041:168:0;17067:420:1;37041:168:0;37222:21;37231:2;37235:7;37222:8;:21::i;:::-;36910:341;36840:411;;:::o;58710:282::-;20588:6;;58758:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;58784:9:::1;::::0;::::1;;58783:10;58775:60;;;;-1:-1:-1::0;;;58775:60:0::1;;;;;;;:::i;:::-;58862:15;58848:11;:29:::0;58888:9:::1;:16:::0;;-1:-1:-1;;58888:16:0::1;58900:4;58888:16;::::0;;58932:12:::1;19938:10:::0;;19858:98;58932:12:::1;-1:-1:-1::0;;;;;58922:40:0::1;;58946:15;58922:40;;;;25752:25:1::0;;25740:2;25725:18;;25606:177;58922:40:0::1;;;;;;;;-1:-1:-1::0;58980:4:0::1;58710:282:::0;:::o;38236:376::-;38445:41;19938:10;38478:7;38445:18;:41::i;:::-;38423:140;;;;-1:-1:-1;;;38423:140:0;;;;;;;:::i;:::-;38576:28;38586:4;38592:2;38596:7;38576:9;:28::i;63445:708::-;63577:14;;63547:4;;-1:-1:-1;;;63577:14:0;;;;63569:59;;;;-1:-1:-1;;;63569:59:0;;;;;;;:::i;:::-;19938:10;;63706:16;63714:7;63706;:16::i;:::-;-1:-1:-1;;;;;63706:27:0;;63684:119;;;;-1:-1:-1;;;63684:119:0;;;;;;;:::i;:::-;63878:20;;63842:12;;63836:38;;-1:-1:-1;;;63836:38:0;;-1:-1:-1;;;;;9972:32:1;;;63836:38:0;;;9954:51:1;63842:12:0;;;;63836:29;;9927:18:1;;63836:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;63814:159;;;;-1:-1:-1;;;63814:159:0;;;;;;;:::i;:::-;63992:12;;64020:20;;63986:55;;-1:-1:-1;;;63986:55:0;;-1:-1:-1;;;;;10701:32:1;;;63986:55:0;;;10683:51:1;10750:18;;;10743:34;;;;63992:12:0;;;63986:24;;10656:18:1;;63986:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64052:19:0;;;;:10;:19;;;;;:28;;64074:6;;64052:28;:::i;:::-;;64106:7;-1:-1:-1;;;;;64098:25:0;;64115:7;64098:25;;;;25752::1;;25740:2;25725:18;;25606:177;64098:25:0;;;;;;;;-1:-1:-1;64141:4:0;;63445:708;-1:-1:-1;;;;63445:708:0:o;57932:187::-;20588:6;;58037:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;58059:12:0::1;:30:::0;;-1:-1:-1;;;;;;58059:30:0::1;-1:-1:-1::0;;;;;58059:30:0;::::1;;::::0;;-1:-1:-1;20806:1:0::1;57932:187:::0;;;:::o;61111:1144::-;61198:9;;61173:4;;61198:9;;61190:59;;;;-1:-1:-1;;;61190:59:0;;;;;;;:::i;:::-;56345:5;61303:11;;:34;;;;:::i;:::-;61284:15;:53;;61262:141;;;;-1:-1:-1;;;61262:141:0;;22128:2:1;61262:141:0;;;22110:21:1;22167:2;22147:18;;;22140:30;22206:34;22186:18;;;22179:62;-1:-1:-1;;;22257:18:1;;;22250:36;22303:19;;61262:141:0;21926:402:1;61262:141:0;55164:1;61438:6;:21;;61416:124;;;;-1:-1:-1;;;61416:124:0;;;;;;;:::i;:::-;61553:15;61571:13;49355:10;:17;;49267:113;61571:13;61553:31;-1:-1:-1;55115:4:0;61619:16;61629:6;61553:31;61619:16;:::i;:::-;:31;;61597:129;;;;-1:-1:-1;;;61597:129:0;;;;;;;:::i;:::-;61796:8;;61782:22;;55115:4;61782:22;:::i;:::-;61761:16;61771:6;61761:7;:16;:::i;:::-;:44;;61739:136;;;;-1:-1:-1;;;61739:136:0;;14540:2:1;61739:136:0;;;14522:21:1;14579:2;14559:18;;;14552:30;14618:34;14598:18;;;14591:62;-1:-1:-1;;;14669:18:1;;;14662:40;14719:19;;61739:136:0;14338:406:1;61739:136:0;61928:9;61918:6;61910:5;;:14;;;;:::i;:::-;:27;61888:128;;;;-1:-1:-1;;;61888:128:0;;24958:2:1;61888:128:0;;;24940:21:1;24997:2;24977:18;;;24970:30;25036:34;25016:18;;;25009:62;-1:-1:-1;;;25087:18:1;;;25080:49;25146:19;;61888:128:0;24756:415:1;61888:128:0;62046:1;62029:195;62054:6;62049:1;:11;62029:195;;62082:12;62097:11;62107:1;62097:7;:11;:::i;:::-;62082:26;;55115:4;62129;:19;62125:88;;62169:28;19938:10;62192:4;62169:8;:28::i;:::-;-1:-1:-1;62062:3:0;;;;:::i;:::-;;;;62029:195;;;-1:-1:-1;62243:4:0;;61111:1144;-1:-1:-1;;;61111:1144:0:o;48848:343::-;48990:7;49045:23;49062:5;49045:16;:23::i;:::-;49037:5;:31;49015:124;;;;-1:-1:-1;;;49015:124:0;;12174:2:1;49015:124:0;;;12156:21:1;12213:2;12193:18;;;12186:30;12252:34;12232:18;;;12225:62;-1:-1:-1;;;12303:18:1;;;12296:41;12354:19;;49015:124:0;11972:407:1;49015:124:0;-1:-1:-1;;;;;;49157:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;48848:343::o;57538:189::-;20588:6;;57644:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;57666:20:0::1;:31:::0;57715:4:::1;::::0;57538:189::o;66291:149::-;66418:14;;;;:10;:14;;;;;66411:21;;66351:13;;66418:14;66411:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66291:149;;;:::o;59608:264::-;20588:6;;59656:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;59691:21:::1;59733:11:::0;59725:63:::1;;;::::0;-1:-1:-1;;;59725:63:0;;23783:2:1;59725:63:0::1;::::0;::::1;23765:21:1::0;23822:2;23802:18;;;23795:30;23861:34;23841:18;;;23834:62;-1:-1:-1;;;23912:18:1;;;23905:37;23959:19;;59725:63:0::1;23581:403:1::0;59725:63:0::1;59801:39;::::0;19938:10;;59801:39;::::1;;;::::0;59832:7;;59801:39:::1;::::0;;;59832:7;19938:10;59801:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;59860:4;59853:11;;;59608:264:::0;:::o;58328:198::-;20588:6;;58391:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;58426:3:::1;58416:6;:13;;;;58408:60;;;;-1:-1:-1::0;;;58408:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;58479:17:0::1;;:8;:17:::0;58514:4:::1;::::0;58328:198::o;38683:185::-;38821:39;38838:4;38844:2;38848:7;38821:39;;;;;;;;;;;;:16;:39::i;59880:1223::-;59969:9;;59944:4;;59969:9;;59961:59;;;;-1:-1:-1;;;59961:59:0;;;;;;;:::i;:::-;56345:5;60073:11;;:34;;;;:::i;:::-;60055:15;:52;60033:141;;;;-1:-1:-1;;;60033:141:0;;11406:2:1;60033:141:0;;;11388:21:1;11445:2;11425:18;;;11418:30;11484:34;11464:18;;;11457:62;-1:-1:-1;;;11535:18:1;;;11528:37;11582:19;;60033:141:0;11204:403:1;60033:141:0;60205:3;19938:10;55164:1;60291:22;;;60269:125;;;;-1:-1:-1;;;60269:125:0;;;;;;;:::i;:::-;60407:12;60422:13;49355:10;:17;;49267:113;60422:13;:17;;60438:1;60422:17;:::i;:::-;60407:32;;60457:9;60452:620;60476:7;60472:1;:11;60452:620;;;60532:13;:21;60546:3;;60550:1;60546:6;;;;;;;:::i;:::-;;;;;;;;;;60532:21;;-1:-1:-1;60532:21:0;;;;;;;;-1:-1:-1;60532:21:0;;;;60531:22;60505:140;;;;-1:-1:-1;;;60505:140:0;;17694:2:1;60505:140:0;;;17676:21:1;17733:2;17713:18;;;17706:30;17772:34;17752:18;;;17745:62;17843:26;17823:18;;;17816:54;17887:19;;60505:140:0;17492:420:1;60505:140:0;-1:-1:-1;;;;;60688:56:0;;56190:42;60688:37;60726:3;;60730:1;60726:6;;;;;;;:::i;:::-;;;;;;;60688:45;;;;;;;;;;;;;25752:25:1;;25740:2;25725:18;;25606:177;60688:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60688:56:0;;60662:179;;;;-1:-1:-1;;;60662:179:0;;25378:2:1;60662:179:0;;;25360:21:1;25417:2;25397:18;;;25390:30;25456:34;25436:18;;;25429:62;25527:31;25507:18;;;25500:59;25576:19;;60662:179:0;25176:425:1;60662:179:0;56287:3;60862:4;:28;60858:203;;60935:4;60911:13;:21;60925:3;;60929:1;60925:6;;;;;;;:::i;:::-;;;;;;;60911:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;60958:23;60967:7;60976:4;60958:8;:23::i;:::-;61000:6;;;;:::i;:::-;61025:18;:20;;61000:6;;-1:-1:-1;61025:20:0;;-1:-1:-1;61025:18:0;:20;;;:::i;:::-;;;;;;60858:203;60485:3;;;;:::i;:::-;;;;60452:620;;;-1:-1:-1;61091:4:0;;59880:1223;-1:-1:-1;;;;;;59880:1223:0:o;49457:320::-;49577:7;49632:30;49355:10;:17;;49267:113;49632:30;49624:5;:38;49602:132;;;;-1:-1:-1;;;49602:132:0;;22953:2:1;49602:132:0;;;22935:21:1;22992:2;22972:18;;;22965:30;23031:34;23011:18;;;23004:62;-1:-1:-1;;;23082:18:1;;;23075:42;23134:19;;49602:132:0;22751:408:1;49602:132:0;49752:10;49763:5;49752:17;;;;;;;;:::i;:::-;;;;;;;;;49745:24;;49457:320;;;:::o;58534:168::-;20588:6;;58631:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;58653:19:::1;58665:6;58653:11;:19::i;:::-;-1:-1:-1::0;58690:4:0::1;58534:168:::0;;;:::o;35107:326::-;35224:7;35265:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35265:16:0;35314:19;35292:110;;;;-1:-1:-1;;;35292:110:0;;18530:2:1;35292:110:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:39;18708:19;;35292:110:0;18328:405:1;55609:22:0;;;;;;;;;;;;;;;;;-1:-1:-1;55609:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34750:295::-;34867:7;-1:-1:-1;;;;;34914:19:0;;34892:111;;;;-1:-1:-1;;;34892:111:0;;18119:2:1;34892:111:0;;;18101:21:1;18158:2;18138:18;;;18131:30;18197:34;18177:18;;;18170:62;-1:-1:-1;;;18248:18:1;;;18241:40;18298:19;;34892:111:0;17917:406:1;34892:111:0;-1:-1:-1;;;;;;35021:16:0;;;;;:9;:16;;;;;;;34750:295::o;21166:94::-;20588:6;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;21231:21:::1;21249:1;21231:9;:21::i;:::-;21166:94::o:0;57341:189::-;20588:6;;57447:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;57469:20:0::1;:31:::0;57518:4:::1;::::0;57341:189::o;57735:::-;20588:6;;57841:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;57863:20:0::1;:31:::0;57912:4:::1;::::0;57735:189::o;66448:150::-;66503:13;66565:5;66571:18;66586:2;66663:5;66720:16;;;:12;:16;;;;;;;;;66606:138;66571:18;66565:25;;;;;;;;;:::i;:::-;;66558:32;;;;;:::i;59000:600::-;20588:6;;59105:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;59144:1:::1;59135:6;:10;59127:57;;;;-1:-1:-1::0;;;59127:57:0::1;;;;;;;:::i;:::-;59197:15;59215:13;49355:10:::0;:17;;49267:113;59215:13:::1;59197:31:::0;-1:-1:-1;55115:4:0::1;59263:16;59273:6:::0;59197:31;59263:16:::1;:::i;:::-;:31;;59241:129;;;;-1:-1:-1::0;;;59241:129:0::1;;;;;;;:::i;:::-;59400:1;59383:188;59408:6;59403:1;:11;59383:188;;59436:12;59451:11;59461:1:::0;59451:7;:11:::1;:::i;:::-;59436:26;;55115:4;59481;:19;59477:83;;59521:23;59530:7;59539:4;59521:8;:23::i;:::-;-1:-1:-1::0;59416:3:0;::::1;::::0;::::1;:::i;:::-;;;;59383:188;;;-1:-1:-1::0;59588:4:0::1;::::0;59000:600;-1:-1:-1;;;;59000:600:0:o;58127:193::-;20588:6;;58189:4;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;58223:1:::1;58214:6;:10;58206:57;;;;-1:-1:-1::0;;;58206:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;58276:5:0::1;:14:::0;58308:4:::1;::::0;58127:193::o;35669:104::-;35725:13;35758:7;35751:14;;;;;:::i;65801:157::-;65863:4;65917:18;65936:13;65945:3;65936:8;:13::i;:::-;65917:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65916:34;;65801:157;-1:-1:-1;;65801:157:0:o;37697:187::-;37824:52;19938:10;37857:8;37867;37824:18;:52::i;:::-;37697:187;;:::o;38939:365::-;39128:41;19938:10;39161:7;39128:18;:41::i;:::-;39106:140;;;;-1:-1:-1;;;39106:140:0;;;;;;;:::i;:::-;39257:39;39271:4;39277:2;39281:7;39290:5;39257:13;:39::i;:::-;38939:365;;;;:::o;57131:202::-;20588:6;;57228:21;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;57267:14:0::1;:26:::0;;-1:-1:-1;;;;57267:26:0::1;-1:-1:-1::0;;;57267:26:0;::::1;;::::0;::::1;;::::0;;;;::::1;57311:14:::0;;::::1;;::::0;57131:202::o;66752:592::-;40916:4;40940:16;;;:7;:16;;;;;;66853:13;;-1:-1:-1;;;;;40940:16:0;66884:109;;;;-1:-1:-1;;;66884:109:0;;13005:2:1;66884:109:0;;;12987:21:1;13044:2;13024:18;;;13017:30;13083:34;13063:18;;;13056:62;-1:-1:-1;;;13134:18:1;;;13127:41;13185:19;;66884:109:0;12803:407:1;66884:109:0;67006:21;67030:10;:8;:10::i;:::-;67051:14;66720:16;;;:12;:16;;;;;;67006:34;;-1:-1:-1;66720:16:0;;67006:34;67216:18;66720:16;67216;:18::i;:::-;67285:17;:6;:15;:17::i;:::-;67147:174;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67102:234;;;;66752:592;;;:::o;65966:317::-;66076:23;66102:14;;;:10;:14;;;;;66076:40;;66021:13;;66076:23;66102:14;66076:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66157:1;66137:9;66131:23;:27;66127:76;;;66182:9;65966:317;-1:-1:-1;;65966:317:0:o;66127:76::-;66260:13;:2;:11;:13::i;:::-;66227:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;66213:62;;;65966:317;;;:::o;64161:919::-;64283:14;;64253:4;;-1:-1:-1;;;64283:14:0;;;;64275:59;;;;-1:-1:-1;;;64275:59:0;;;;;;;:::i;:::-;19938:10;;64412:16;64420:7;64412;:16::i;:::-;-1:-1:-1;;;;;64412:27:0;;64390:119;;;;-1:-1:-1;;;64390:119:0;;;;;;;:::i;:::-;64584:20;;64548:12;;64542:38;;-1:-1:-1;;;64542:38:0;;-1:-1:-1;;;;;9972:32:1;;;64542:38:0;;;9954:51:1;64548:12:0;;;;64542:29;;9927:18:1;;64542:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;64520:114;;;;-1:-1:-1;;;64520:114:0;;16121:2:1;64520:114:0;;;16103:21:1;16160:1;16140:18;;;16133:29;-1:-1:-1;;;16178:18:1;;;16171:32;16220:18;;64520:114:0;15919:325:1;64520:114:0;64664:1;64655:6;:10;;;64647:59;;;;-1:-1:-1;;;64647:59:0;;16864:2:1;64647:59:0;;;16846:21:1;16903:2;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;-1:-1:-1;;;16993:18:1;;;16986:34;17037:19;;64647:59:0;16662:400:1;64647:59:0;64771:38;64787:21;;;:12;:21;;;;;;;;;;;64771:38;;:15;:38;;;;;:40;;;;;;:::i;:::-;;;;-1:-1:-1;;64830:12:0;;64858:20;;64824:55;;-1:-1:-1;;;64824:55:0;;-1:-1:-1;;;;;10701:32:1;;;64824:55:0;;;10683:51:1;10750:18;;;10743:34;;;;64830:12:0;;;64824:24;;10656:18:1;;64824:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64890:21:0;;;;:12;:21;;;;;;;;:30;;-1:-1:-1;;64890:30:0;;;;;;;;;;64982:23;;:15;:23;;;;;:25;;;;;;:::i;:::-;;;;;;65033:7;-1:-1:-1;;;;;65025:25:0;;65042:7;65025:25;;;;25752::1;;25740:2;25725:18;;25606:177;65025:25:0;;;;;;;;-1:-1:-1;65068:4:0;;64161:919;-1:-1:-1;;;64161:919:0:o;21415:229::-;20588:6;;-1:-1:-1;;;;;20588:6:0;19938:10;20735:23;20727:68;;;;-1:-1:-1;;;20727:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21518:22:0;::::1;21496:110;;;::::0;-1:-1:-1;;;21496:110:0;;13417:2:1;21496:110:0::1;::::0;::::1;13399:21:1::0;13456:2;13436:18;;;13429:30;13495:34;13475:18;;;13468:62;-1:-1:-1;;;13546:18:1;;;13539:36;13592:19;;21496:110:0::1;13215:402:1::0;21496:110:0::1;21617:19;21627:8;21617:9;:19::i;:::-;21415:229:::0;:::o;65626:167::-;65719:9;;65682:4;;65719:9;;:66;;;;;56345:5;65751:11;;:34;;;;:::i;:::-;65732:15;:53;;65719:66;65699:86;;65626:167;:::o;65417:201::-;65593:17;;;;:10;:17;;;;;65586:24;;65511:13;;65593:17;65586:24;;;:::i;62263:1174::-;62396:14;;62366:4;;-1:-1:-1;;;62396:14:0;;;;62388:59;;;;-1:-1:-1;;;62388:59:0;;;;;;;:::i;:::-;19938:10;;62525:16;62533:7;62525;:16::i;:::-;-1:-1:-1;;;;;62525:27:0;;62503:119;;;;-1:-1:-1;;;62503:119:0;;;;;;;:::i;:::-;62643:22;62657:7;;62643:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62643:13:0;;-1:-1:-1;;;62643:22:0:i;:::-;62635:65;;;;-1:-1:-1;;;62635:65:0;;14181:2:1;62635:65:0;;;14163:21:1;14220:2;14200:18;;;14193:30;14259:32;14239:18;;;14232:60;14309:18;;62635:65:0;13979:354:1;62635:65:0;62791:21;62804:7;;62791:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62791:12:0;;-1:-1:-1;;;62791:21:0:i;:::-;62783:65;;;;-1:-1:-1;;;62783:65:0;;11814:2:1;62783:65:0;;;11796:21:1;11853:2;11833:18;;;11826:30;11892:33;11872:18;;;11865:61;11943:18;;62783:65:0;11612:355:1;62783:65:0;62925:20;;62889:12;;62883:38;;-1:-1:-1;;;62883:38:0;;-1:-1:-1;;;;;9972:32:1;;;62883:38:0;;;9954:51:1;62889:12:0;;;;62883:29;;9927:18:1;;62883:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;62861:159;;;;-1:-1:-1;;;62861:159:0;;;;;;;:::i;:::-;63120:1;63090:19;;;:10;:19;;;;;63084:33;;;;;:::i;:::-;;;:37;63080:121;;;63163:19;;;;:10;:19;;;;;63138:51;;;;63163:19;63138:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55247:5;63138:24;:51::i;:::-;63219:12;;63247:20;;63213:55;;-1:-1:-1;;;63213:55:0;;-1:-1:-1;;;;;10701:32:1;;;63213:55:0;;;10683:51:1;10750:18;;;10743:34;;;;63219:12:0;;;63213:24;;10656:18:1;;63213:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63281:19:0;;;;:10;:19;;;;;:29;;63303:7;;63281:29;:::i;:::-;;63321:43;63346:7;;63321:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55207:4:0;;-1:-1:-1;63321:24:0;;-1:-1:-1;;63321:43:0:i;:::-;63390:7;-1:-1:-1;;;;;63382:25:0;;63399:7;63382:25;;;;25752::1;;25740:2;25725:18;;25606:177;34331:355:0;34478:4;-1:-1:-1;;;;;;34520:40:0;;-1:-1:-1;;;34520:40:0;;:105;;-1:-1:-1;;;;;;;34577:48:0;;-1:-1:-1;;;34577:48:0;34520:105;:158;;;-1:-1:-1;;;;;;;;;;33246:40:0;;;34642:36;33087:207;44974:174;45049:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45049:29:0;-1:-1:-1;;;;;45049:29:0;;;;;;;;:24;;45103:23;45049:24;45103:14;:23::i;:::-;-1:-1:-1;;;;;45094:46:0;;;;;;;;;;;44974:174;;:::o;41145:452::-;41274:4;40940:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40940:16:0;41296:110;;;;-1:-1:-1;;;41296:110:0;;16451:2:1;41296:110:0;;;16433:21:1;16490:2;16470:18;;;16463:30;16529:34;16509:18;;;16502:62;-1:-1:-1;;;16580:18:1;;;16573:42;16632:19;;41296:110:0;16249:408:1;41296:110:0;41417:13;41433:23;41448:7;41433:14;:23::i;:::-;41417:39;;41486:5;-1:-1:-1;;;;;41475:16:0;:7;-1:-1:-1;;;;;41475:16:0;;:64;;;;41532:7;-1:-1:-1;;;;;41508:31:0;:20;41520:7;41508:11;:20::i;:::-;-1:-1:-1;;;;;41508:31:0;;41475:64;:113;;;-1:-1:-1;;;;;;38126:25:0;;;38097:4;38126:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41556:32;41467:122;41145:452;-1:-1:-1;;;;41145:452:0:o;44241:615::-;44414:4;-1:-1:-1;;;;;44387:31:0;:23;44402:7;44387:14;:23::i;:::-;-1:-1:-1;;;;;44387:31:0;;44365:122;;;;-1:-1:-1;;;44365:122:0;;21316:2:1;44365:122:0;;;21298:21:1;21355:2;21335:18;;;21328:30;21394:34;21374:18;;;21367:62;-1:-1:-1;;;21445:18:1;;;21438:39;21494:19;;44365:122:0;21114:405:1;44365:122:0;-1:-1:-1;;;;;44506:16:0;;44498:65;;;;-1:-1:-1;;;44498:65:0;;15362:2:1;44498:65:0;;;15344:21:1;15401:2;15381:18;;;15374:30;15440:34;15420:18;;;15413:62;-1:-1:-1;;;15491:18:1;;;15484:34;15535:19;;44498:65:0;15160:400:1;44498:65:0;44576:39;44597:4;44603:2;44607:7;44576:20;:39::i;:::-;44680:29;44697:1;44701:7;44680:8;:29::i;:::-;-1:-1:-1;;;;;44722:15:0;;;;;;:9;:15;;;;;:20;;44741:1;;44722:15;:20;;44741:1;;44722:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44753:13:0;;;;;;:9;:13;;;;;:18;;44770:1;;44753:13;:18;;44770:1;;44753:18;:::i;:::-;;;;-1:-1:-1;;44782:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44782:21:0;-1:-1:-1;;;;;44782:21:0;;;;;;;;;44821:27;;44782:16;;44821:27;;;;;;;44241:615;;;:::o;67352:139::-;67418:18;67424:2;67428:7;67418:5;:18::i;:::-;67447:36;67475:7;67447:27;:36::i;36673:105::-;36746:24;;;;:13;;:24;;;;;:::i;21652:173::-;21727:6;;;-1:-1:-1;;;;;21744:17:0;;;-1:-1:-1;;;;;;21744:17:0;;;;;;;21777:40;;21727:6;;;21744:17;21727:6;;21777:40;;21708:16;;21777:40;21697:128;21652:173;:::o;70129:549::-;70188:13;70214:17;70240:3;70214:30;;70255:19;70287:4;:11;70277:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70277:22:0;;70255:44;;70317:9;70312:295;70336:4;:11;70332:1;:15;70312:295;;;70431:2;70419:4;70424:1;70419:7;;;;;;;;:::i;:::-;;;;;;;70413:20;;;;70412:48;;;70457:2;70445:4;70450:1;70445:7;;;;;;;;:::i;:::-;;;;;;;70439:20;;70412:48;70408:188;;;70506:4;70511:1;70506:7;;;;;;;;:::i;:::-;;;;;;;;;70500:14;;70517:2;70500:19;;;;:::i;:::-;70493:27;;70481:6;70488:1;70481:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;70481:39:0;;;;;;;;;70408:188;;;70573:4;70578:1;70573:7;;;;;;;;:::i;:::-;;;;;;;;;70561:6;70568:1;70561:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;70561:19:0;;;;;;;;;70408:188;70349:3;;;;:::i;:::-;;;;70312:295;;;-1:-1:-1;70663:6:0;70129:549;-1:-1:-1;;;70129:549:0:o;45290:315::-;45445:8;-1:-1:-1;;;;;45436:17:0;:5;-1:-1:-1;;;;;45436:17:0;;;45428:55;;;;-1:-1:-1;;;45428:55:0;;15767:2:1;45428:55:0;;;15749:21:1;15806:2;15786:18;;;15779:30;15845:27;15825:18;;;15818:55;15890:18;;45428:55:0;15565:349:1;45428:55:0;-1:-1:-1;;;;;45494:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45494:46:0;;;;;;;;;;45556:41;;10928::1;;;45556::0;;10901:18:1;45556:41:0;;;;;;;45290:315;;;:::o;40186:352::-;40343:28;40353:4;40359:2;40363:7;40343:9;:28::i;:::-;40404:48;40427:4;40433:2;40437:7;40446:5;40404:22;:48::i;:::-;40382:148;;;;-1:-1:-1;;;40382:148:0;;;;;;;:::i;36560:105::-;36611:13;36644;36637:20;;;;;:::i;19095:723::-;19151:13;19372:10;19368:53;;-1:-1:-1;;19399:10:0;;;;;;;;;;;;-1:-1:-1;;;19399:10:0;;;;;19095:723::o;19368:53::-;19446:5;19431:12;19487:78;19494:9;;19487:78;;19520:8;;;;:::i;:::-;;-1:-1:-1;19543:10:0;;-1:-1:-1;19551:2:0;19543:10;;:::i;:::-;;;19487:78;;;19575:19;19607:6;19597:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19597:17:0;;19575:39;;19625:154;19632:10;;19625:154;;19659:11;19669:1;19659:11;;:::i;:::-;;-1:-1:-1;19728:10:0;19736:2;19728:5;:10;:::i;:::-;19715:24;;:2;:24;:::i;:::-;19702:39;;19685:6;19692;19685:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19685:56:0;;;;;;;;-1:-1:-1;19756:11:0;19765:2;19756:11;;:::i;:::-;;;19625:154;;69175:946;69239:4;69256:14;69279:3;69256:27;;69311:1;69300;:8;:12;69296:30;;;-1:-1:-1;69321:5:0;;69175:946;-1:-1:-1;;69175:946:0:o;69296:30::-;69352:2;69341:1;:8;:13;69337:31;;;-1:-1:-1;69363:5:0;;69175:946;-1:-1:-1;;69175:946:0:o;69337:31::-;69420:1;69422;69420:4;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;69420:4:0;-1:-1:-1;;;69420:12:0;69416:30;;;-1:-1:-1;69441:5:0;;69175:946;-1:-1:-1;;69175:946:0:o;69416:30::-;69480:1;69493;69482;:8;:12;;;;:::i;:::-;69480:15;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;69480:15:0;-1:-1:-1;;;69480:23:0;69476:41;;;-1:-1:-1;69512:5:0;;69175:946;-1:-1:-1;;69175:946:0:o;69476:41::-;69550:15;69568:1;69570;69568:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;69568:4:0;;-1:-1:-1;69590:9:0;69585:478;69605:1;:8;69601:1;:12;69585:478;;;69635:11;69649:1;69651;69649:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;69649:4:0;;-1:-1:-1;;;;69709:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;69725:16:0;;;69709:32;69705:50;;;-1:-1:-1;69750:5:0;;69175:946;-1:-1:-1;;;;;69175:946:0:o;69705:50::-;-1:-1:-1;;;;;;;;;69796:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;69812:12:0;;;;69796:28;69794:31;:89;;;;-1:-1:-1;;;;;;;;;;69854:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;69870:12:0;;;;69854:28;69852:31;69794:89;:147;;;;-1:-1:-1;;;;;;;;;;69912:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;69928:12:0;;;;69912:28;69910:31;69794:147;:189;;;;-1:-1:-1;;;;;;;;;;69970:12:0;;;69968:15;69794:189;69772:247;;;-1:-1:-1;70014:5:0;;69175:946;-1:-1:-1;;;;;69175:946:0:o;69772:247::-;70047:4;-1:-1:-1;69615:3:0;;;;:::i;:::-;;;;69585:478;;69034:133;69154:5;69118:18;69137:13;69146:3;69137:8;:13::i;:::-;69118:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;;;-1:-1:-1;;69118:41:0;;;;;;;;;-1:-1:-1;;69034:133:0:o;50390:589::-;-1:-1:-1;;;;;50596:18:0;;50592:187;;50631:40;50663:7;51806:10;:17;;51779:24;;;;:15;:24;;;;;:44;;;51834:24;;;;;;;;;;;;51702:164;50631:40;50592:187;;;50701:2;-1:-1:-1;;;;;50693:10:0;:4;-1:-1:-1;;;;;50693:10:0;;50689:90;;50720:47;50753:4;50759:7;50720:32;:47::i;:::-;-1:-1:-1;;;;;50793:16:0;;50789:183;;50826:45;50863:7;50826:36;:45::i;50789:183::-;50899:4;-1:-1:-1;;;;;50893:10:0;:2;-1:-1:-1;;;;;50893:10:0;;50889:83;;50920:40;50948:2;50952:7;50920:27;:40::i;42933:382::-;-1:-1:-1;;;;;43013:16:0;;43005:61;;;;-1:-1:-1;;;43005:61:0;;19765:2:1;43005:61:0;;;19747:21:1;;;19784:18;;;19777:30;19843:34;19823:18;;;19816:62;19895:18;;43005:61:0;19563:356:1;43005:61:0;40916:4;40940:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40940:16:0;:30;43077:58;;;;-1:-1:-1;;;43077:58:0;;13824:2:1;43077:58:0;;;13806:21:1;13863:2;13843:18;;;13836:30;13902;13882:18;;;13875:58;13950:18;;43077:58:0;13622:352:1;43077:58:0;43148:45;43177:1;43181:2;43185:7;43148:20;:45::i;:::-;-1:-1:-1;;;;;43206:13:0;;;;;;:9;:13;;;;;:18;;43223:1;;43206:13;:18;;43223:1;;43206:18;:::i;:::-;;;;-1:-1:-1;;43235:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43235:21:0;-1:-1:-1;;;;;43235:21:0;;;;;;;;43274:33;;43235:16;;;43274:33;;43235:16;;43274:33;42933:382;;:::o;67753:828::-;67842:4;67864:15;67882:24;67898:7;67882:15;:24::i;:::-;67949:14;:21;67864:42;;-1:-1:-1;67919:27:0;68010:29;67949:21;67864:42;68010:29;:::i;:::-;67981:58;;68052:13;68068:14;68083:18;68068:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;68113:21;;;:12;:21;;;;;;:31;;68068:34;;;;;;;;;;;-1:-1:-1;;68113:31:0;;;;;;;;68155:24;;;:15;:24;;;;;:26;;68068:34;;-1:-1:-1;68155:26:0;;;;;:::i;:::-;;;;-1:-1:-1;;68198:24:0;;;;;;;:15;:24;;;;;;68226:4;68198:32;68194:358;;;68359:14;68392:23;68414:1;68392:19;:23;:::i;:::-;68359:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;68322:14;68337:18;68322:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:108;;;;;;;;;;;;;;;;;;68520:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68194:358;-1:-1:-1;68569:4:0;;67753:828;-1:-1:-1;;;;;67753:828:0:o;46170:980::-;46325:4;-1:-1:-1;;;;;46346:13:0;;11394:20;11442:8;46342:801;;46399:175;;-1:-1:-1;;;46399:175:0;;-1:-1:-1;;;;;46399:36:0;;;;;:175;;19938:10;;46493:4;;46520:7;;46550:5;;46399:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46399:175:0;;;;;;;;-1:-1:-1;;46399:175:0;;;;;;;;;;;;:::i;:::-;;;46378:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46757:13:0;;46753:320;;46800:108;;-1:-1:-1;;;46800:108:0;;;;;;;:::i;46753:320::-;47023:6;47017:13;47008:6;47004:2;47000:15;46993:38;46378:710;-1:-1:-1;;;;;;46638:51:0;-1:-1:-1;;;46638:51:0;;-1:-1:-1;46631:58:0;;52493:1002;52773:22;52823:1;52798:22;52815:4;52798:16;:22::i;:::-;:26;;;;:::i;:::-;52835:18;52856:26;;;:17;:26;;;;;;52773:51;;-1:-1:-1;52989:28:0;;;52985:328;;-1:-1:-1;;;;;53056:18:0;;53034:19;53056:18;;;:12;:18;;;;;;;;:34;;;;;;;;;53107:30;;;;;;:44;;;53224:30;;:17;:30;;;;;:43;;;52985:328;-1:-1:-1;53409:26:0;;;;:17;:26;;;;;;;;53402:33;;;-1:-1:-1;;;;;53453:18:0;;;;;:12;:18;;;;;:34;;;;;;;53446:41;52493:1002::o;53790:1079::-;54068:10;:17;54043:22;;54068:21;;54088:1;;54068:21;:::i;:::-;54100:18;54121:24;;;:15;:24;;;;;;54494:10;:26;;54043:46;;-1:-1:-1;54121:24:0;;54043:46;;54494:26;;;;;;:::i;:::-;;;;;;;;;54472:48;;54558:11;54533:10;54544;54533:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;54638:28;;;:15;:28;;;;;;;:41;;;54810:24;;;;;54803:31;54845:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;53861:1008;;;53790:1079;:::o;51280:221::-;51365:14;51382:20;51399:2;51382:16;:20::i;:::-;-1:-1:-1;;;;;51413:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;51458:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;51280:221:0:o;68589:437::-;68653:7;68794;19938:10;68867:15;68909:16;68952:9;68751:233;;;;;;;;;;;9553:19:1;;;9610:2;9606:15;;;;-1:-1:-1;;9602:53:1;9597:2;9588:12;;9581:75;9681:2;9672:12;;9665:28;;;;9718:2;9709:12;;9702:28;9755:3;9746:13;;9739:29;9793:3;9784:13;;9312:491;68751:233:0;;;;-1:-1:-1;;68751:233:0;;;;;;;;;68719:284;;68751:233;68719:284;;;;;68589:437;-1:-1:-1;;68589:437:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:156::-;716:20;;776:4;765:16;;755:27;;745:55;;796:1;793;786:12;811:247;870:6;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;978:9;965:23;997:31;1022:5;997:31;:::i;:::-;1047:5;811:247;-1:-1:-1;;;811:247:1:o;1063:251::-;1133:6;1186:2;1174:9;1165:7;1161:23;1157:32;1154:52;;;1202:1;1199;1192:12;1154:52;1234:9;1228:16;1253:31;1278:5;1253:31;:::i;1319:388::-;1387:6;1395;1448:2;1436:9;1427:7;1423:23;1419:32;1416:52;;;1464:1;1461;1454:12;1416:52;1503:9;1490:23;1522:31;1547:5;1522:31;:::i;:::-;1572:5;-1:-1:-1;1629:2:1;1614:18;;1601:32;1642:33;1601:32;1642:33;:::i;:::-;1694:7;1684:17;;;1319:388;;;;;:::o;1712:456::-;1789:6;1797;1805;1858:2;1846:9;1837:7;1833:23;1829:32;1826:52;;;1874:1;1871;1864:12;1826:52;1913:9;1900:23;1932:31;1957:5;1932:31;:::i;:::-;1982:5;-1:-1:-1;2039:2:1;2024:18;;2011:32;2052:33;2011:32;2052:33;:::i;:::-;1712:456;;2104:7;;-1:-1:-1;;;2158:2:1;2143:18;;;;2130:32;;1712:456::o;2173:794::-;2268:6;2276;2284;2292;2345:3;2333:9;2324:7;2320:23;2316:33;2313:53;;;2362:1;2359;2352:12;2313:53;2401:9;2388:23;2420:31;2445:5;2420:31;:::i;:::-;2470:5;-1:-1:-1;2527:2:1;2512:18;;2499:32;2540:33;2499:32;2540:33;:::i;:::-;2592:7;-1:-1:-1;2646:2:1;2631:18;;2618:32;;-1:-1:-1;2701:2:1;2686:18;;2673:32;2728:18;2717:30;;2714:50;;;2760:1;2757;2750:12;2714:50;2783:22;;2836:4;2828:13;;2824:27;-1:-1:-1;2814:55:1;;2865:1;2862;2855:12;2814:55;2888:73;2953:7;2948:2;2935:16;2930:2;2926;2922:11;2888:73;:::i;:::-;2878:83;;;2173:794;;;;;;;:::o;2972:382::-;3037:6;3045;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3153:9;3140:23;3172:31;3197:5;3172:31;:::i;:::-;3222:5;-1:-1:-1;3279:2:1;3264:18;;3251:32;3292:30;3251:32;3292:30;:::i;3359:315::-;3427:6;3435;3488:2;3476:9;3467:7;3463:23;3459:32;3456:52;;;3504:1;3501;3494:12;3456:52;3543:9;3530:23;3562:31;3587:5;3562:31;:::i;:::-;3612:5;3664:2;3649:18;;;;3636:32;;-1:-1:-1;;;3359:315:1:o;3679:615::-;3765:6;3773;3826:2;3814:9;3805:7;3801:23;3797:32;3794:52;;;3842:1;3839;3832:12;3794:52;3882:9;3869:23;3911:18;3952:2;3944:6;3941:14;3938:34;;;3968:1;3965;3958:12;3938:34;4006:6;3995:9;3991:22;3981:32;;4051:7;4044:4;4040:2;4036:13;4032:27;4022:55;;4073:1;4070;4063:12;4022:55;4113:2;4100:16;4139:2;4131:6;4128:14;4125:34;;;4155:1;4152;4145:12;4125:34;4208:7;4203:2;4193:6;4190:1;4186:14;4182:2;4178:23;4174:32;4171:45;4168:65;;;4229:1;4226;4219:12;4168:65;4260:2;4252:11;;;;;4282:6;;-1:-1:-1;3679:615:1;;-1:-1:-1;;;;3679:615:1:o;4299:241::-;4355:6;4408:2;4396:9;4387:7;4383:23;4379:32;4376:52;;;4424:1;4421;4414:12;4376:52;4463:9;4450:23;4482:28;4504:5;4482:28;:::i;4545:245::-;4612:6;4665:2;4653:9;4644:7;4640:23;4636:32;4633:52;;;4681:1;4678;4671:12;4633:52;4713:9;4707:16;4732:28;4754:5;4732:28;:::i;4795:245::-;4853:6;4906:2;4894:9;4885:7;4881:23;4877:32;4874:52;;;4922:1;4919;4912:12;4874:52;4961:9;4948:23;4980:30;5004:5;4980:30;:::i;5045:249::-;5114:6;5167:2;5155:9;5146:7;5142:23;5138:32;5135:52;;;5183:1;5180;5173:12;5135:52;5215:9;5209:16;5234:30;5258:5;5234:30;:::i;5299:666::-;5379:6;5387;5395;5448:2;5436:9;5427:7;5423:23;5419:32;5416:52;;;5464:1;5461;5454:12;5416:52;5504:9;5491:23;5533:18;5574:2;5566:6;5563:14;5560:34;;;5590:1;5587;5580:12;5560:34;5628:6;5617:9;5613:22;5603:32;;5673:7;5666:4;5662:2;5658:13;5654:27;5644:55;;5695:1;5692;5685:12;5644:55;5735:2;5722:16;5761:2;5753:6;5750:14;5747:34;;;5777:1;5774;5767:12;5747:34;5824:7;5817:4;5808:6;5804:2;5800:15;5796:26;5793:39;5790:59;;;5845:1;5842;5835:12;5790:59;5876:4;5868:13;;;;5900:6;;-1:-1:-1;5938:20:1;;;;5925:34;;5299:666;-1:-1:-1;;;;5299:666:1:o;5970:450::-;6039:6;6092:2;6080:9;6071:7;6067:23;6063:32;6060:52;;;6108:1;6105;6098:12;6060:52;6148:9;6135:23;6181:18;6173:6;6170:30;6167:50;;;6213:1;6210;6203:12;6167:50;6236:22;;6289:4;6281:13;;6277:27;-1:-1:-1;6267:55:1;;6318:1;6315;6308:12;6267:55;6341:73;6406:7;6401:2;6388:16;6383:2;6379;6375:11;6341:73;:::i;6425:272::-;6483:6;6536:2;6524:9;6515:7;6511:23;6507:32;6504:52;;;6552:1;6549;6542:12;6504:52;6591:9;6578:23;6641:6;6634:5;6630:18;6623:5;6620:29;6610:57;;6663:1;6660;6653:12;6702:180;6761:6;6814:2;6802:9;6793:7;6789:23;6785:32;6782:52;;;6830:1;6827;6820:12;6782:52;-1:-1:-1;6853:23:1;;6702:180;-1:-1:-1;6702:180:1:o;6887:184::-;6957:6;7010:2;6998:9;6989:7;6985:23;6981:32;6978:52;;;7026:1;7023;7016:12;6978:52;-1:-1:-1;7049:16:1;;6887:184;-1:-1:-1;6887:184:1:o;7076:182::-;7133:6;7186:2;7174:9;7165:7;7161:23;7157:32;7154:52;;;7202:1;7199;7192:12;7154:52;7225:27;7242:9;7225:27;:::i;7263:250::-;7329:6;7337;7390:2;7378:9;7369:7;7365:23;7361:32;7358:52;;;7406:1;7403;7396:12;7358:52;7429:27;7446:9;7429:27;:::i;7518:257::-;7559:3;7597:5;7591:12;7624:6;7619:3;7612:19;7640:63;7696:6;7689:4;7684:3;7680:14;7673:4;7666:5;7662:16;7640:63;:::i;:::-;7757:2;7736:15;-1:-1:-1;;7732:29:1;7723:39;;;;7764:4;7719:50;;7518:257;-1:-1:-1;;7518:257:1:o;7780:276::-;7911:3;7949:6;7943:13;7965:53;8011:6;8006:3;7999:4;7991:6;7987:17;7965:53;:::i;:::-;8034:16;;;;;7780:276;-1:-1:-1;;7780:276:1:o;8061:810::-;8389:3;8427:6;8421:13;8443:53;8489:6;8484:3;8477:4;8469:6;8465:17;8443:53;:::i;:::-;8559:13;;8518:16;;;;8581:57;8559:13;8518:16;8615:4;8603:17;;8581:57;:::i;:::-;-1:-1:-1;;;8660:20:1;;8689;;;8734:13;;8756:65;8734:13;8808:1;8797:13;;8790:4;8778:17;;8756:65;:::i;:::-;8841:20;8863:1;8837:28;;8061:810;-1:-1:-1;;;;;8061:810:1:o;8876:431::-;-1:-1:-1;;;9133:3:1;9126:27;9108:3;9182:6;9176:13;9198:62;9253:6;9248:2;9243:3;9239:12;9232:4;9224:6;9220:17;9198:62;:::i;:::-;9280:16;;;;9298:2;9276:25;;8876:431;-1:-1:-1;;8876:431:1:o;10016:488::-;-1:-1:-1;;;;;10285:15:1;;;10267:34;;10337:15;;10332:2;10317:18;;10310:43;10384:2;10369:18;;10362:34;;;10432:3;10427:2;10412:18;;10405:31;;;10210:4;;10453:45;;10478:19;;10470:6;10453:45;:::i;:::-;10445:53;10016:488;-1:-1:-1;;;;;;10016:488:1:o;10980:219::-;11129:2;11118:9;11111:21;11092:4;11149:44;11189:2;11178:9;11174:18;11166:6;11149:44;:::i;12384:414::-;12586:2;12568:21;;;12625:2;12605:18;;;12598:30;12664:34;12659:2;12644:18;;12637:62;-1:-1:-1;;;12730:2:1;12715:18;;12708:48;12788:3;12773:19;;12384:414::o;14749:406::-;14951:2;14933:21;;;14990:2;14970:18;;;14963:30;15029:34;15024:2;15009:18;;15002:62;-1:-1:-1;;;15095:2:1;15080:18;;15073:40;15145:3;15130:19;;14749:406::o;18738:417::-;18940:2;18922:21;;;18979:2;18959:18;;;18952:30;19018:34;19013:2;18998:18;;18991:62;-1:-1:-1;;;19084:2:1;19069:18;;19062:51;19145:3;19130:19;;18738:417::o;19160:398::-;19362:2;19344:21;;;19401:2;19381:18;;;19374:30;19440:34;19435:2;19420:18;;19413:62;-1:-1:-1;;;19506:2:1;19491:18;;19484:32;19548:3;19533:19;;19160:398::o;20337:356::-;20539:2;20521:21;;;20558:18;;;20551:30;20617:34;20612:2;20597:18;;20590:62;20684:2;20669:18;;20337:356::o;20698:411::-;20900:2;20882:21;;;20939:2;20919:18;;;20912:30;20978:34;20973:2;20958:18;;20951:62;-1:-1:-1;;;21044:2:1;21029:18;;21022:45;21099:3;21084:19;;20698:411::o;22333:413::-;22535:2;22517:21;;;22574:2;22554:18;;;22547:30;22613:34;22608:2;22593:18;;22586:62;-1:-1:-1;;;22679:2:1;22664:18;;22657:47;22736:3;22721:19;;22333:413::o;23164:412::-;23366:2;23348:21;;;23405:2;23385:18;;;23378:30;23444:34;23439:2;23424:18;;23417:62;-1:-1:-1;;;23510:2:1;23495:18;;23488:46;23566:3;23551:19;;23164:412::o;23989:356::-;24191:2;24173:21;;;24210:18;;;24203:30;24269:34;24264:2;24249:18;;24242:62;24336:2;24321:18;;23989:356::o;24350:401::-;24552:2;24534:21;;;24591:2;24571:18;;;24564:30;24630:34;24625:2;24610:18;;24603:62;-1:-1:-1;;;24696:2:1;24681:18;;24674:35;24741:3;24726:19;;24350:401::o;25977:128::-;26017:3;26048:1;26044:6;26041:1;26038:13;26035:39;;;26054:18;;:::i;:::-;-1:-1:-1;26090:9:1;;25977:128::o;26110:204::-;26148:3;26184:4;26181:1;26177:12;26216:4;26213:1;26209:12;26251:3;26245:4;26241:14;26236:3;26233:23;26230:49;;;26259:18;;:::i;:::-;26295:13;;26110:204;-1:-1:-1;;;26110:204:1:o;26319:120::-;26359:1;26385;26375:35;;26390:18;;:::i;:::-;-1:-1:-1;26424:9:1;;26319:120::o;26444:168::-;26484:7;26550:1;26546;26542:6;26538:14;26535:1;26532:21;26527:1;26520:9;26513:17;26509:45;26506:71;;;26557:18;;:::i;:::-;-1:-1:-1;26597:9:1;;26444:168::o;26617:125::-;26657:4;26685:1;26682;26679:8;26676:34;;;26690:18;;:::i;:::-;-1:-1:-1;26727:9:1;;26617:125::o;26747:258::-;26819:1;26829:113;26843:6;26840:1;26837:13;26829:113;;;26919:11;;;26913:18;26900:11;;;26893:39;26865:2;26858:10;26829:113;;;26960:6;26957:1;26954:13;26951:48;;;-1:-1:-1;;26995:1:1;26977:16;;26970:27;26747:258::o;27010:136::-;27049:3;27077:5;27067:39;;27086:18;;:::i;:::-;-1:-1:-1;;;27122:18:1;;27010:136::o;27151:380::-;27230:1;27226:12;;;;27273;;;27294:61;;27348:4;27340:6;27336:17;27326:27;;27294:61;27401:2;27393:6;27390:14;27370:18;27367:38;27364:161;;;27447:10;27442:3;27438:20;27435:1;27428:31;27482:4;27479:1;27472:15;27510:4;27507:1;27500:15;27364:161;;27151:380;;;:::o;27536:135::-;27575:3;-1:-1:-1;;27596:17:1;;27593:43;;;27616:18;;:::i;:::-;-1:-1:-1;27663:1:1;27652:13;;27536:135::o;27676:112::-;27708:1;27734;27724:35;;27739:18;;:::i;:::-;-1:-1:-1;27773:9:1;;27676:112::o;27793:127::-;27854:10;27849:3;27845:20;27842:1;27835:31;27885:4;27882:1;27875:15;27909:4;27906:1;27899:15;27925:127;27986:10;27981:3;27977:20;27974:1;27967:31;28017:4;28014:1;28007:15;28041:4;28038:1;28031:15;28057:127;28118:10;28113:3;28109:20;28106:1;28099:31;28149:4;28146:1;28139:15;28173:4;28170:1;28163:15;28189:127;28250:10;28245:3;28241:20;28238:1;28231:31;28281:4;28278:1;28271:15;28305:4;28302:1;28295:15;28321:127;28382:10;28377:3;28373:20;28370:1;28363:31;28413:4;28410:1;28403:15;28437:4;28434:1;28427:15;28453:131;-1:-1:-1;;;;;28528:31:1;;28518:42;;28508:70;;28574:1;28571;28564:12;28589:118;28675:5;28668:13;28661:21;28654:5;28651:32;28641:60;;28697:1;28694;28687:12;28712:131;-1:-1:-1;;;;;;28786:32:1;;28776:43;;28766:71;;28833:1;28830;28823:12

Swarm Source

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