ETH Price: $3,352.19 (-3.67%)

Token

Blacklist (BL)
 

Overview

Max Total Supply

1,002 BL

Holders

513

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Blacklist

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
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;
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    /**
     * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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(to).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 {}
}

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
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();
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
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);
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.2;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

contract Blacklist is ERC721A, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    constructor() ERC721A("Blacklist", "BL") {}
    
    uint256 public constant maxSupply = 8888;
    uint256 public totalMints = 0;
    uint256 devReserve = 80;
    uint256 maxMintPerCall = 3;
    uint256 mintPrice = 0.1 ether;
    uint256 devMinted = 0;

    uint256 presaleMaxMint = 8568;

    struct mintTracker {
        uint256 amount;
    }

    bool public blacklistedSaleStatus = false;
    bool public publicSaleStatus = false;

    string private _baseTokenURI;

    address private signer = 0xad4cE29E1443ff40C72984e800a55c93C89abE21;

    mapping(address => mintTracker) private _minttracker;
    mapping(address => uint) devMintsTo;

    modifier mintChecks(uint numNFTs) {
        unchecked {
            require(tx.origin == msg.sender);
            require(numNFTs <= maxMintPerCall, "Number to mint exceeds maximum per tx");
            require(numNFTs + totalSupply() <= maxSupply - devReserve + devMinted, "Mint would exceed supply");
            require(msg.value >= mintPrice * numNFTs, "Incorrect ether value");
        }
        _;
    }

    // Minting

    function publicMint(uint256 numNFTs) public payable mintChecks(numNFTs) {
        require(publicSaleStatus, "Sale has not started");

        _safeMint(msg.sender, numNFTs);
    }

    function whitelistMint(uint256 numNFTs, bytes calldata signature) public payable mintChecks(numNFTs) {
        unchecked {
            require(blacklistedSaleStatus, "Sale has not started");
            require(verifySignature(abi.encodePacked(msg.sender), signature), "Invalid signature provided");
            require(_numberMinted(msg.sender) + numNFTs - devMintsTo[msg.sender] <= presaleMaxMint, "Can't mint that many in pre-sale");
            require(_minttracker[msg.sender].amount + numNFTs <= 2, "Can't mint more than 2 NFTs during PRE-SALE.");
        }
        _minttracker[msg.sender].amount = _minttracker[msg.sender].amount + numNFTs;
        _safeMint(msg.sender, numNFTs);
    }

    // View only

    function tokenURI(uint tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json"));
    }

    function getMintedAmountForAddress(address _address) public view returns(uint256){
        return _minttracker[_address].amount;
    }

    function getMintedAmountForMyself() public view returns(uint256){
        return _minttracker[msg.sender].amount;
    }

    // ERC-721 stuff

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    // Internal

    function verifySignature(bytes memory data, bytes calldata signature) internal view returns(bool) {
        return (keccak256(data).toEthSignedMessageHash().recover(signature) == signer);
    }

    // Owner Only

    function devMint(address to, uint256 numNFTs) external onlyOwner {
        require((devMinted += numNFTs) <= devReserve, "Not enough in the dev reserve, mint a smaller amount");
        devMintsTo[msg.sender] += numNFTs;
        _safeMint(to, numNFTs);
    }

    function setSaleStates(bool new_publicSaleStatus, bool new_blacklistedSaleStatus) external onlyOwner{
        publicSaleStatus = new_publicSaleStatus;
        blacklistedSaleStatus = new_blacklistedSaleStatus;
    }

    function setSigner(address new_signer) external onlyOwner {
        signer = new_signer;
    }

    function setMintPrice(uint256 new_mintPrice) external onlyOwner {
        mintPrice = new_mintPrice;
    }

    function setDevReserve(uint256 new_devReserve) external onlyOwner {
        devReserve = new_devReserve;
    }

    function setBaseURI(string calldata new_baseURI) external onlyOwner {
        _baseTokenURI = new_baseURI;
    }

    function setMaxMint(uint256 new_presaleMaxMint) public onlyOwner {
        presaleMaxMint = new_presaleMaxMint;
    }

    function getSigner() public view returns(address){
        return signer;
    }

    function getMintPrice() public view returns(uint256){
        return mintPrice;
    }

    function getDevMinted() public view returns(uint256){
        return devMinted;
    }

    function getPresaleMaxMint() public view returns(uint256){
        return presaleMaxMint;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(0xd7C6B6e70dA164132d3E73E894Dfca3E58756eA0).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"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":[{"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":[],"name":"blacklistedSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDevMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintedAmountForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedAmountForMyself","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"new_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_devReserve","type":"uint256"}],"name":"setDevReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_presaleMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"new_publicSaleStatus","type":"bool"},{"internalType":"bool","name":"new_blacklistedSaleStatus","type":"bool"}],"name":"setSaleStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","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":"totalMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256","name":"numNFTs","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260008055600060085560506009556003600a5567016345785d8a0000600b556000600c55612178600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555073ad4ce29e1443ff40c72984e800a55c93c89abe21601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000c657600080fd5b506040518060400160405280600981526020017f426c61636b6c69737400000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f424c00000000000000000000000000000000000000000000000000000000000081525081600190805190602001906200014b9291906200025b565b508060029080519060200190620001649291906200025b565b505050620001876200017b6200018d60201b60201c565b6200019560201b60201c565b62000370565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000269906200030b565b90600052602060002090601f0160209004810192826200028d5760008555620002d9565b82601f10620002a857805160ff1916838001178555620002d9565b82800160010185558215620002d9579182015b82811115620002d8578251825591602001919060010190620002bb565b5b509050620002e89190620002ec565b5090565b5b8082111562000307576000816000905550600101620002ed565b5090565b600060028204905060018216806200032457607f821691505b602082108114156200033b576200033a62000341565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61598b80620003806000396000f3fe6080604052600436106102465760003560e01c80636c19e78311610139578063b6c693e5116100b6578063d5abeb011161007a578063d5abeb0114610872578063dc33e6811461089d578063e4460909146108da578063e985e9c514610905578063f2fde38b14610942578063f4a0a5281461096b57610246565b8063b6c693e51461078d578063b88d4fde146107b8578063bbd640f8146107e1578063c87b56dd1461080c578063d15e2ee31461084957610246565b80639231ab2a116100fd5780639231ab2a146106b557806395d89b41146106f25780639e852f751461071d578063a22cb46514610739578063a7f93ebd1461076257610246565b80636c19e783146105e257806370a082311461060b578063715018a6146106485780637ac3c02f1461065f5780638da5cb5b1461068a57610246565b80632f745c59116101c7578063547520fe1161018b578063547520fe146104ff57806355f804b31461052857806359c819d314610551578063627804af1461057c5780636352211e146105a557610246565b80632f745c591461041c5780633ccfd60b1461045957806342842e0e146104705780634a646799146104995780634f6ccce7146104c257610246565b806318160ddd1161020e57806318160ddd146103445780631c26c0641461036f5780631f21bfbf146103ac57806323b872dd146103d75780632db115441461040057610246565b806301ffc9a71461024b578063040786e11461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e53565b610994565b60405161027f91906146d0565b60405180910390f35b34801561029457600080fd5b5061029d610ade565b6040516102aa91906146d0565b60405180910390f35b3480156102bf57600080fd5b506102c8610af1565b6040516102d59190614730565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613eea565b610b83565b6040516103129190614669565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613ddb565b610c08565b005b34801561035057600080fd5b50610359610d21565b6040516103669190614b6d565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613c70565b610d2a565b6040516103a39190614b6d565b60405180910390f35b3480156103b857600080fd5b506103c1610d76565b6040516103ce9190614b6d565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613cd5565b610d7c565b005b61041a60048036038101906104159190613eea565b610d8c565b005b34801561042857600080fd5b50610443600480360381019061043e9190613ddb565b610f04565b6040516104509190614b6d565b60405180910390f35b34801561046557600080fd5b5061046e611102565b005b34801561047c57600080fd5b5061049760048036038101906104929190613cd5565b6111e1565b005b3480156104a557600080fd5b506104c060048036038101906104bb9190613eea565b611201565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613eea565b611287565b6040516104f69190614b6d565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613eea565b6112da565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613ea5565b611360565b005b34801561055d57600080fd5b506105666113f2565b6040516105739190614b6d565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613ddb565b61143c565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190613eea565b611578565b6040516105d99190614669565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190613c70565b61158e565b005b34801561061757600080fd5b50610632600480360381019061062d9190613c70565b61164e565b60405161063f9190614b6d565b60405180910390f35b34801561065457600080fd5b5061065d611737565b005b34801561066b57600080fd5b506106746117bf565b6040516106819190614669565b60405180910390f35b34801561069657600080fd5b5061069f6117e9565b6040516106ac9190614669565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613eea565b611813565b6040516106e99190614b52565b60405180910390f35b3480156106fe57600080fd5b5061070761182b565b6040516107149190614730565b60405180910390f35b61073760048036038101906107329190613f13565b6118bd565b005b34801561074557600080fd5b50610760600480360381019061075b9190613d9f565b611c4c565b005b34801561076e57600080fd5b50610777611dcd565b6040516107849190614b6d565b60405180910390f35b34801561079957600080fd5b506107a2611dd7565b6040516107af91906146d0565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190613d24565b611dea565b005b3480156107ed57600080fd5b506107f6611e46565b6040516108039190614b6d565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613eea565b611e50565b6040516108409190614730565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190613e17565b611ecc565b005b34801561087e57600080fd5b50610887611f80565b6040516108949190614b6d565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613c70565b611f86565b6040516108d19190614b6d565b60405180910390f35b3480156108e657600080fd5b506108ef611f98565b6040516108fc9190614b6d565b60405180910390f35b34801561091157600080fd5b5061092c60048036038101906109279190613c99565b611fa2565b60405161093991906146d0565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190613c70565b612036565b005b34801561097757600080fd5b50610992600480360381019061098d9190613eea565b61212e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad75750610ad6826121b4565b5b9050919050565b600e60009054906101000a900460ff1681565b606060018054610b0090614e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2c90614e5e565b8015610b795780601f10610b4e57610100808354040283529160200191610b79565b820191906000526020600020905b815481529060010190602001808311610b5c57829003601f168201915b5050505050905090565b6000610b8e8261221e565b610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc490614b12565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1382611578565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b906149b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca361222b565b73ffffffffffffffffffffffffffffffffffffffff161480610cd25750610cd181610ccc61222b565b611fa2565b5b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614892565b60405180910390fd5b610d1c838383612233565b505050565b60008054905090565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60085481565b610d878383836122e5565b505050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dc557600080fd5b600a54811115610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190614af2565b60405180910390fd5b600c546009546122b80301610e1d610d21565b82011115610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790614952565b60405180910390fd5b80600b5402341015610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90614a72565b60405180910390fd5b600e60019054906101000a900460ff16610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90614ad2565b60405180910390fd5b610f00338361288c565b5050565b6000610f0f8361164e565b8210610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614772565b60405180910390fd5b6000610f5a610d21565b905060008060005b838110156110c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461105457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ac578684141561109d5781955050505050506110fc565b83806110a890614ec1565b9450505b5080806110b890614ec1565b915050610f62565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614a92565b60405180910390fd5b92915050565b61110a61222b565b73ffffffffffffffffffffffffffffffffffffffff166111286117e9565b73ffffffffffffffffffffffffffffffffffffffff161461117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590614912565b60405180910390fd5b600047905073d7c6b6e70da164132d3e73e894dfca3e58756ea073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111dd573d6000803e3d6000fd5b5050565b6111fc83838360405180602001604052806000815250611dea565b505050565b61120961222b565b73ffffffffffffffffffffffffffffffffffffffff166112276117e9565b73ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614912565b60405180910390fd5b8060098190555050565b6000611291610d21565b82106112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990614812565b60405180910390fd5b819050919050565b6112e261222b565b73ffffffffffffffffffffffffffffffffffffffff166113006117e9565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614912565b60405180910390fd5b80600d8190555050565b61136861222b565b73ffffffffffffffffffffffffffffffffffffffff166113866117e9565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614912565b60405180910390fd5b8181600f91906113ed929190613a2e565b505050565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b61144461222b565b73ffffffffffffffffffffffffffffffffffffffff166114626117e9565b73ffffffffffffffffffffffffffffffffffffffff16146114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614912565b60405180910390fd5b60095481600c60008282546114cd9190614c7c565b9250508190551115611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90614ab2565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115639190614c7c565b92505081905550611574828261288c565b5050565b6000611583826128aa565b600001519050919050565b61159661222b565b73ffffffffffffffffffffffffffffffffffffffff166115b46117e9565b73ffffffffffffffffffffffffffffffffffffffff161461160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190614912565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b6906148b2565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61173f61222b565b73ffffffffffffffffffffffffffffffffffffffff1661175d6117e9565b73ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614912565b60405180910390fd5b6117bd6000612a05565b565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61181b613ab4565b611824826128aa565b9050919050565b60606002805461183a90614e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461186690614e5e565b80156118b35780601f10611888576101008083540402835291602001916118b3565b820191906000526020600020905b81548152906001019060200180831161189657829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118f657600080fd5b600a5481111561193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614af2565b60405180910390fd5b600c546009546122b8030161194e610d21565b82011115611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890614952565b60405180910390fd5b80600b54023410156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90614a72565b60405180910390fd5b600e60009054906101000a900460ff16611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614ad2565b60405180910390fd5b611a5133604051602001611a3b91906145f9565b6040516020818303038152906040528484612acb565b611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790614a32565b60405180910390fd5b600d54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611add33612b8c565b01031115611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790614b32565b60405180910390fd5b600284601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90614792565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611bf69190614c7c565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611c46338561288c565b50505050565b611c5461222b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb990614972565b60405180910390fd5b8060066000611ccf61222b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d7c61222b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dc191906146d0565b60405180910390a35050565b6000600b54905090565b600e60019054906101000a900460ff1681565b611df58484846122e5565b611e0184848484612c75565b611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e37906149f2565b60405180910390fd5b50505050565b6000600d54905090565b6060611e5b8261221e565b611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190614932565b60405180910390fd5b600f611ea583612e0c565b604051602001611eb6929190614614565b6040516020818303038152906040529050919050565b611ed461222b565b73ffffffffffffffffffffffffffffffffffffffff16611ef26117e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614912565b60405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6122b881565b6000611f9182612b8c565b9050919050565b6000600c54905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61203e61222b565b73ffffffffffffffffffffffffffffffffffffffff1661205c6117e9565b73ffffffffffffffffffffffffffffffffffffffff16146120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614912565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612122576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612119906147d2565b60405180910390fd5b61212b81612a05565b50565b61213661222b565b73ffffffffffffffffffffffffffffffffffffffff166121546117e9565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190614912565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006122f0826128aa565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661231761222b565b73ffffffffffffffffffffffffffffffffffffffff161480612373575061233c61222b565b73ffffffffffffffffffffffffffffffffffffffff1661235b84610b83565b73ffffffffffffffffffffffffffffffffffffffff16145b8061238f575061238e826000015161238961222b565b611fa2565b5b9050806123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614992565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906148f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614832565b60405180910390fd5b6124c08585856001612fb9565b6124d06000848460000151612233565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846126d69190614c7c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561281c5761274c8161221e565b1561281b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128848686866001612fbf565b505050505050565b6128a6828260405180602001604052806000815250612fc5565b5050565b6128b2613ab4565b6128bb8261221e565b6128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906147f2565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129ec578092505050612a00565b5080806129f890614e34565b915050612900565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b6c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b5e8780519060200120613484565b6134b490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614852565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6000612c968473ffffffffffffffffffffffffffffffffffffffff166134db565b15612dff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cbf61222b565b8786866040518563ffffffff1660e01b8152600401612ce19493929190614684565b602060405180830381600087803b158015612cfb57600080fd5b505af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190613e7c565b60015b612daf573d8060008114612d5c576040519150601f19603f3d011682016040523d82523d6000602084013e612d61565b606091505b50600081511415612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e906149f2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e04565b600190505b949350505050565b60606000821415612e54576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb4565b600082905060005b60008214612e86578080612e6f90614ec1565b915050600a82612e7f9190614cd2565b9150612e5c565b60008167ffffffffffffffff811115612ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612efa5781602001600182028036833780820191505090505b5090505b60008514612fad57600182612f139190614d03565b9150600a85612f229190614f38565b6030612f2e9190614c7c565b60f81b818381518110612f6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fa69190614cd2565b9450612efe565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561303b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303290614a52565b60405180910390fd5b6130448161221e565b15613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b90614a12565b60405180910390fd5b600083116130c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130be906149d2565b60405180910390fd5b6130d46000858386612fb9565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131d19190614c36565b6fffffffffffffffffffffffffffffffff1681526020018583602001516131f89190614c36565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561346757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134076000888488612c75565b613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343d906149f2565b60405180910390fd5b818061345190614ec1565b925050808061345f90614ec1565b915050613396565b508060008190555061347c6000878588612fbf565b505050505050565b6000816040516020016134979190614643565b604051602081830303815290604052805190602001209050919050565b60008060006134c385856134ee565b915091506134d081613571565b819250505092915050565b600080823b905060008111915050919050565b6000806041835114156135305760008060006020860151925060408601519150606086015160001a9050613524878285856138c2565b9450945050505061356a565b6040835114156135615760008060208501519150604085015190506135568683836139cf565b93509350505061356a565b60006002915091505b9250929050565b600060048111156135ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156135e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156135ef576138bf565b60016004811115613629577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613662577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156136a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369a90614752565b60405180910390fd5b600260048111156136dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613716577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e906147b2565b60405180910390fd5b60036004811115613791577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156137ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561380b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380290614872565b60405180910390fd5b600480811115613844577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561387d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156138be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b5906148d2565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138fd5760006003915091506139c6565b601b8560ff16141580156139155750601c8560ff1614155b156139275760006004915091506139c6565b60006001878787876040516000815260200160405260405161394c94939291906146eb565b6020604051602081039080840390855afa15801561396e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139bd576000600192509250506139c6565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613a129190614c7c565b9050613a20878288856138c2565b935093505050935093915050565b828054613a3a90614e5e565b90600052602060002090601f016020900481019282613a5c5760008555613aa3565b82601f10613a7557803560ff1916838001178555613aa3565b82800160010185558215613aa3579182015b82811115613aa2578235825591602001919060010190613a87565b5b509050613ab09190613aee565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b07576000816000905550600101613aef565b5090565b6000613b1e613b1984614bad565b614b88565b905082815260208101848484011115613b3657600080fd5b613b41848285614df2565b509392505050565b600081359050613b58816158f9565b92915050565b600081359050613b6d81615910565b92915050565b600081359050613b8281615927565b92915050565b600081519050613b9781615927565b92915050565b60008083601f840112613baf57600080fd5b8235905067ffffffffffffffff811115613bc857600080fd5b602083019150836001820283011115613be057600080fd5b9250929050565b600082601f830112613bf857600080fd5b8135613c08848260208601613b0b565b91505092915050565b60008083601f840112613c2357600080fd5b8235905067ffffffffffffffff811115613c3c57600080fd5b602083019150836001820283011115613c5457600080fd5b9250929050565b600081359050613c6a8161593e565b92915050565b600060208284031215613c8257600080fd5b6000613c9084828501613b49565b91505092915050565b60008060408385031215613cac57600080fd5b6000613cba85828601613b49565b9250506020613ccb85828601613b49565b9150509250929050565b600080600060608486031215613cea57600080fd5b6000613cf886828701613b49565b9350506020613d0986828701613b49565b9250506040613d1a86828701613c5b565b9150509250925092565b60008060008060808587031215613d3a57600080fd5b6000613d4887828801613b49565b9450506020613d5987828801613b49565b9350506040613d6a87828801613c5b565b925050606085013567ffffffffffffffff811115613d8757600080fd5b613d9387828801613be7565b91505092959194509250565b60008060408385031215613db257600080fd5b6000613dc085828601613b49565b9250506020613dd185828601613b5e565b9150509250929050565b60008060408385031215613dee57600080fd5b6000613dfc85828601613b49565b9250506020613e0d85828601613c5b565b9150509250929050565b60008060408385031215613e2a57600080fd5b6000613e3885828601613b5e565b9250506020613e4985828601613b5e565b9150509250929050565b600060208284031215613e6557600080fd5b6000613e7384828501613b73565b91505092915050565b600060208284031215613e8e57600080fd5b6000613e9c84828501613b88565b91505092915050565b60008060208385031215613eb857600080fd5b600083013567ffffffffffffffff811115613ed257600080fd5b613ede85828601613c11565b92509250509250929050565b600060208284031215613efc57600080fd5b6000613f0a84828501613c5b565b91505092915050565b600080600060408486031215613f2857600080fd5b6000613f3686828701613c5b565b935050602084013567ffffffffffffffff811115613f5357600080fd5b613f5f86828701613b9d565b92509250509250925092565b613f7481614d37565b82525050565b613f8381614d37565b82525050565b613f9a613f9582614d37565b614f0a565b82525050565b613fa981614d49565b82525050565b613fb881614d55565b82525050565b613fcf613fca82614d55565b614f1c565b82525050565b6000613fe082614bf3565b613fea8185614c09565b9350613ffa818560208601614e01565b61400381615025565b840191505092915050565b600061401982614bfe565b6140238185614c1a565b9350614033818560208601614e01565b61403c81615025565b840191505092915050565b600061405282614bfe565b61405c8185614c2b565b935061406c818560208601614e01565b80840191505092915050565b6000815461408581614e5e565b61408f8186614c2b565b945060018216600081146140aa57600181146140bb576140ee565b60ff198316865281860193506140ee565b6140c485614bde565b60005b838110156140e6578154818901526001820191506020810190506140c7565b838801955050505b50505092915050565b6000614104601883614c1a565b915061410f82615043565b602082019050919050565b6000614127602283614c1a565b91506141328261506c565b604082019050919050565b600061414a602c83614c1a565b9150614155826150bb565b604082019050919050565b600061416d601f83614c1a565b91506141788261510a565b602082019050919050565b6000614190601c83614c2b565b915061419b82615133565b601c82019050919050565b60006141b3602683614c1a565b91506141be8261515c565b604082019050919050565b60006141d6602a83614c1a565b91506141e1826151ab565b604082019050919050565b60006141f9602383614c1a565b9150614204826151fa565b604082019050919050565b600061421c602583614c1a565b915061422782615249565b604082019050919050565b600061423f603183614c1a565b915061424a82615298565b604082019050919050565b6000614262602283614c1a565b915061426d826152e7565b604082019050919050565b6000614285603983614c1a565b915061429082615336565b604082019050919050565b60006142a8602b83614c1a565b91506142b382615385565b604082019050919050565b60006142cb602283614c1a565b91506142d6826153d4565b604082019050919050565b60006142ee602683614c1a565b91506142f982615423565b604082019050919050565b6000614311600583614c2b565b915061431c82615472565b600582019050919050565b6000614334602083614c1a565b915061433f8261549b565b602082019050919050565b6000614357602f83614c1a565b9150614362826154c4565b604082019050919050565b600061437a601883614c1a565b915061438582615513565b602082019050919050565b600061439d601a83614c1a565b91506143a88261553c565b602082019050919050565b60006143c0603283614c1a565b91506143cb82615565565b604082019050919050565b60006143e3602283614c1a565b91506143ee826155b4565b604082019050919050565b6000614406602383614c1a565b915061441182615603565b604082019050919050565b6000614429603383614c1a565b915061443482615652565b604082019050919050565b600061444c601d83614c1a565b9150614457826156a1565b602082019050919050565b600061446f601a83614c1a565b915061447a826156ca565b602082019050919050565b6000614492602183614c1a565b915061449d826156f3565b604082019050919050565b60006144b5601583614c1a565b91506144c082615742565b602082019050919050565b60006144d8602e83614c1a565b91506144e38261576b565b604082019050919050565b60006144fb603483614c1a565b9150614506826157ba565b604082019050919050565b600061451e601483614c1a565b915061452982615809565b602082019050919050565b6000614541602583614c1a565b915061454c82615832565b604082019050919050565b6000614564602d83614c1a565b915061456f82615881565b604082019050919050565b6000614587602083614c1a565b9150614592826158d0565b602082019050919050565b6040820160008201516145b36000850182613f6b565b5060208201516145c660208501826145db565b50505050565b6145d581614dc7565b82525050565b6145e481614dd1565b82525050565b6145f381614de5565b82525050565b60006146058284613f89565b60148201915081905092915050565b60006146208285614078565b915061462c8284614047565b915061463782614304565b91508190509392505050565b600061464e82614183565b915061465a8284613fbe565b60208201915081905092915050565b600060208201905061467e6000830184613f7a565b92915050565b60006080820190506146996000830187613f7a565b6146a66020830186613f7a565b6146b360408301856145cc565b81810360608301526146c58184613fd5565b905095945050505050565b60006020820190506146e56000830184613fa0565b92915050565b60006080820190506147006000830187613faf565b61470d60208301866145ea565b61471a6040830185613faf565b6147276060830184613faf565b95945050505050565b6000602082019050818103600083015261474a818461400e565b905092915050565b6000602082019050818103600083015261476b816140f7565b9050919050565b6000602082019050818103600083015261478b8161411a565b9050919050565b600060208201905081810360008301526147ab8161413d565b9050919050565b600060208201905081810360008301526147cb81614160565b9050919050565b600060208201905081810360008301526147eb816141a6565b9050919050565b6000602082019050818103600083015261480b816141c9565b9050919050565b6000602082019050818103600083015261482b816141ec565b9050919050565b6000602082019050818103600083015261484b8161420f565b9050919050565b6000602082019050818103600083015261486b81614232565b9050919050565b6000602082019050818103600083015261488b81614255565b9050919050565b600060208201905081810360008301526148ab81614278565b9050919050565b600060208201905081810360008301526148cb8161429b565b9050919050565b600060208201905081810360008301526148eb816142be565b9050919050565b6000602082019050818103600083015261490b816142e1565b9050919050565b6000602082019050818103600083015261492b81614327565b9050919050565b6000602082019050818103600083015261494b8161434a565b9050919050565b6000602082019050818103600083015261496b8161436d565b9050919050565b6000602082019050818103600083015261498b81614390565b9050919050565b600060208201905081810360008301526149ab816143b3565b9050919050565b600060208201905081810360008301526149cb816143d6565b9050919050565b600060208201905081810360008301526149eb816143f9565b9050919050565b60006020820190508181036000830152614a0b8161441c565b9050919050565b60006020820190508181036000830152614a2b8161443f565b9050919050565b60006020820190508181036000830152614a4b81614462565b9050919050565b60006020820190508181036000830152614a6b81614485565b9050919050565b60006020820190508181036000830152614a8b816144a8565b9050919050565b60006020820190508181036000830152614aab816144cb565b9050919050565b60006020820190508181036000830152614acb816144ee565b9050919050565b60006020820190508181036000830152614aeb81614511565b9050919050565b60006020820190508181036000830152614b0b81614534565b9050919050565b60006020820190508181036000830152614b2b81614557565b9050919050565b60006020820190508181036000830152614b4b8161457a565b9050919050565b6000604082019050614b67600083018461459d565b92915050565b6000602082019050614b8260008301846145cc565b92915050565b6000614b92614ba3565b9050614b9e8282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614bc857614bc7614ff6565b5b614bd182615025565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c4182614d8b565b9150614c4c83614d8b565b9250826fffffffffffffffffffffffffffffffff03821115614c7157614c70614f69565b5b828201905092915050565b6000614c8782614dc7565b9150614c9283614dc7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc757614cc6614f69565b5b828201905092915050565b6000614cdd82614dc7565b9150614ce883614dc7565b925082614cf857614cf7614f98565b5b828204905092915050565b6000614d0e82614dc7565b9150614d1983614dc7565b925082821015614d2c57614d2b614f69565b5b828203905092915050565b6000614d4282614da7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e1f578082015181840152602081019050614e04565b83811115614e2e576000848401525b50505050565b6000614e3f82614dc7565b91506000821415614e5357614e52614f69565b5b600182039050919050565b60006002820490506001821680614e7657607f821691505b60208210811415614e8a57614e89614fc7565b5b50919050565b614e9982615025565b810181811067ffffffffffffffff82111715614eb857614eb7614ff6565b5b80604052505050565b6000614ecc82614dc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f69565b5b600182019050919050565b6000614f1582614f26565b9050919050565b6000819050919050565b6000614f3182615036565b9050919050565b6000614f4382614dc7565b9150614f4e83614dc7565b925082614f5e57614f5d614f98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2032204e465473206475726960008201527f6e67205052452d53414c452e0000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f72726563742065746865722076616c75650000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820696e207468652064657620726573657276652c206d60008201527f696e74206120736d616c6c657220616d6f756e74000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b61590281614d37565b811461590d57600080fd5b50565b61591981614d49565b811461592457600080fd5b50565b61593081614d5f565b811461593b57600080fd5b50565b61594781614dc7565b811461595257600080fd5b5056fea26469706673582212207886e4c3bc7a697f03c9ce78b800f7c0daaec57575e76c093837e05f17de4f5564736f6c63430008020033

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636c19e78311610139578063b6c693e5116100b6578063d5abeb011161007a578063d5abeb0114610872578063dc33e6811461089d578063e4460909146108da578063e985e9c514610905578063f2fde38b14610942578063f4a0a5281461096b57610246565b8063b6c693e51461078d578063b88d4fde146107b8578063bbd640f8146107e1578063c87b56dd1461080c578063d15e2ee31461084957610246565b80639231ab2a116100fd5780639231ab2a146106b557806395d89b41146106f25780639e852f751461071d578063a22cb46514610739578063a7f93ebd1461076257610246565b80636c19e783146105e257806370a082311461060b578063715018a6146106485780637ac3c02f1461065f5780638da5cb5b1461068a57610246565b80632f745c59116101c7578063547520fe1161018b578063547520fe146104ff57806355f804b31461052857806359c819d314610551578063627804af1461057c5780636352211e146105a557610246565b80632f745c591461041c5780633ccfd60b1461045957806342842e0e146104705780634a646799146104995780634f6ccce7146104c257610246565b806318160ddd1161020e57806318160ddd146103445780631c26c0641461036f5780631f21bfbf146103ac57806323b872dd146103d75780632db115441461040057610246565b806301ffc9a71461024b578063040786e11461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e53565b610994565b60405161027f91906146d0565b60405180910390f35b34801561029457600080fd5b5061029d610ade565b6040516102aa91906146d0565b60405180910390f35b3480156102bf57600080fd5b506102c8610af1565b6040516102d59190614730565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613eea565b610b83565b6040516103129190614669565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613ddb565b610c08565b005b34801561035057600080fd5b50610359610d21565b6040516103669190614b6d565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613c70565b610d2a565b6040516103a39190614b6d565b60405180910390f35b3480156103b857600080fd5b506103c1610d76565b6040516103ce9190614b6d565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613cd5565b610d7c565b005b61041a60048036038101906104159190613eea565b610d8c565b005b34801561042857600080fd5b50610443600480360381019061043e9190613ddb565b610f04565b6040516104509190614b6d565b60405180910390f35b34801561046557600080fd5b5061046e611102565b005b34801561047c57600080fd5b5061049760048036038101906104929190613cd5565b6111e1565b005b3480156104a557600080fd5b506104c060048036038101906104bb9190613eea565b611201565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613eea565b611287565b6040516104f69190614b6d565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613eea565b6112da565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613ea5565b611360565b005b34801561055d57600080fd5b506105666113f2565b6040516105739190614b6d565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613ddb565b61143c565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190613eea565b611578565b6040516105d99190614669565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190613c70565b61158e565b005b34801561061757600080fd5b50610632600480360381019061062d9190613c70565b61164e565b60405161063f9190614b6d565b60405180910390f35b34801561065457600080fd5b5061065d611737565b005b34801561066b57600080fd5b506106746117bf565b6040516106819190614669565b60405180910390f35b34801561069657600080fd5b5061069f6117e9565b6040516106ac9190614669565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613eea565b611813565b6040516106e99190614b52565b60405180910390f35b3480156106fe57600080fd5b5061070761182b565b6040516107149190614730565b60405180910390f35b61073760048036038101906107329190613f13565b6118bd565b005b34801561074557600080fd5b50610760600480360381019061075b9190613d9f565b611c4c565b005b34801561076e57600080fd5b50610777611dcd565b6040516107849190614b6d565b60405180910390f35b34801561079957600080fd5b506107a2611dd7565b6040516107af91906146d0565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190613d24565b611dea565b005b3480156107ed57600080fd5b506107f6611e46565b6040516108039190614b6d565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613eea565b611e50565b6040516108409190614730565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190613e17565b611ecc565b005b34801561087e57600080fd5b50610887611f80565b6040516108949190614b6d565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613c70565b611f86565b6040516108d19190614b6d565b60405180910390f35b3480156108e657600080fd5b506108ef611f98565b6040516108fc9190614b6d565b60405180910390f35b34801561091157600080fd5b5061092c60048036038101906109279190613c99565b611fa2565b60405161093991906146d0565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190613c70565b612036565b005b34801561097757600080fd5b50610992600480360381019061098d9190613eea565b61212e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad75750610ad6826121b4565b5b9050919050565b600e60009054906101000a900460ff1681565b606060018054610b0090614e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2c90614e5e565b8015610b795780601f10610b4e57610100808354040283529160200191610b79565b820191906000526020600020905b815481529060010190602001808311610b5c57829003601f168201915b5050505050905090565b6000610b8e8261221e565b610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc490614b12565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1382611578565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b906149b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca361222b565b73ffffffffffffffffffffffffffffffffffffffff161480610cd25750610cd181610ccc61222b565b611fa2565b5b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614892565b60405180910390fd5b610d1c838383612233565b505050565b60008054905090565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60085481565b610d878383836122e5565b505050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dc557600080fd5b600a54811115610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190614af2565b60405180910390fd5b600c546009546122b80301610e1d610d21565b82011115610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790614952565b60405180910390fd5b80600b5402341015610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90614a72565b60405180910390fd5b600e60019054906101000a900460ff16610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90614ad2565b60405180910390fd5b610f00338361288c565b5050565b6000610f0f8361164e565b8210610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614772565b60405180910390fd5b6000610f5a610d21565b905060008060005b838110156110c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461105457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ac578684141561109d5781955050505050506110fc565b83806110a890614ec1565b9450505b5080806110b890614ec1565b915050610f62565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614a92565b60405180910390fd5b92915050565b61110a61222b565b73ffffffffffffffffffffffffffffffffffffffff166111286117e9565b73ffffffffffffffffffffffffffffffffffffffff161461117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590614912565b60405180910390fd5b600047905073d7c6b6e70da164132d3e73e894dfca3e58756ea073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111dd573d6000803e3d6000fd5b5050565b6111fc83838360405180602001604052806000815250611dea565b505050565b61120961222b565b73ffffffffffffffffffffffffffffffffffffffff166112276117e9565b73ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614912565b60405180910390fd5b8060098190555050565b6000611291610d21565b82106112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990614812565b60405180910390fd5b819050919050565b6112e261222b565b73ffffffffffffffffffffffffffffffffffffffff166113006117e9565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614912565b60405180910390fd5b80600d8190555050565b61136861222b565b73ffffffffffffffffffffffffffffffffffffffff166113866117e9565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614912565b60405180910390fd5b8181600f91906113ed929190613a2e565b505050565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b61144461222b565b73ffffffffffffffffffffffffffffffffffffffff166114626117e9565b73ffffffffffffffffffffffffffffffffffffffff16146114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614912565b60405180910390fd5b60095481600c60008282546114cd9190614c7c565b9250508190551115611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90614ab2565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115639190614c7c565b92505081905550611574828261288c565b5050565b6000611583826128aa565b600001519050919050565b61159661222b565b73ffffffffffffffffffffffffffffffffffffffff166115b46117e9565b73ffffffffffffffffffffffffffffffffffffffff161461160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190614912565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b6906148b2565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61173f61222b565b73ffffffffffffffffffffffffffffffffffffffff1661175d6117e9565b73ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614912565b60405180910390fd5b6117bd6000612a05565b565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61181b613ab4565b611824826128aa565b9050919050565b60606002805461183a90614e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461186690614e5e565b80156118b35780601f10611888576101008083540402835291602001916118b3565b820191906000526020600020905b81548152906001019060200180831161189657829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118f657600080fd5b600a5481111561193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614af2565b60405180910390fd5b600c546009546122b8030161194e610d21565b82011115611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890614952565b60405180910390fd5b80600b54023410156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90614a72565b60405180910390fd5b600e60009054906101000a900460ff16611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614ad2565b60405180910390fd5b611a5133604051602001611a3b91906145f9565b6040516020818303038152906040528484612acb565b611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790614a32565b60405180910390fd5b600d54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611add33612b8c565b01031115611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790614b32565b60405180910390fd5b600284601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90614792565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611bf69190614c7c565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611c46338561288c565b50505050565b611c5461222b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb990614972565b60405180910390fd5b8060066000611ccf61222b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d7c61222b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dc191906146d0565b60405180910390a35050565b6000600b54905090565b600e60019054906101000a900460ff1681565b611df58484846122e5565b611e0184848484612c75565b611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e37906149f2565b60405180910390fd5b50505050565b6000600d54905090565b6060611e5b8261221e565b611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190614932565b60405180910390fd5b600f611ea583612e0c565b604051602001611eb6929190614614565b6040516020818303038152906040529050919050565b611ed461222b565b73ffffffffffffffffffffffffffffffffffffffff16611ef26117e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614912565b60405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6122b881565b6000611f9182612b8c565b9050919050565b6000600c54905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61203e61222b565b73ffffffffffffffffffffffffffffffffffffffff1661205c6117e9565b73ffffffffffffffffffffffffffffffffffffffff16146120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614912565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612122576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612119906147d2565b60405180910390fd5b61212b81612a05565b50565b61213661222b565b73ffffffffffffffffffffffffffffffffffffffff166121546117e9565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190614912565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006122f0826128aa565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661231761222b565b73ffffffffffffffffffffffffffffffffffffffff161480612373575061233c61222b565b73ffffffffffffffffffffffffffffffffffffffff1661235b84610b83565b73ffffffffffffffffffffffffffffffffffffffff16145b8061238f575061238e826000015161238961222b565b611fa2565b5b9050806123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614992565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906148f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614832565b60405180910390fd5b6124c08585856001612fb9565b6124d06000848460000151612233565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846126d69190614c7c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561281c5761274c8161221e565b1561281b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128848686866001612fbf565b505050505050565b6128a6828260405180602001604052806000815250612fc5565b5050565b6128b2613ab4565b6128bb8261221e565b6128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906147f2565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129ec578092505050612a00565b5080806129f890614e34565b915050612900565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b6c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b5e8780519060200120613484565b6134b490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614852565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6000612c968473ffffffffffffffffffffffffffffffffffffffff166134db565b15612dff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cbf61222b565b8786866040518563ffffffff1660e01b8152600401612ce19493929190614684565b602060405180830381600087803b158015612cfb57600080fd5b505af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190613e7c565b60015b612daf573d8060008114612d5c576040519150601f19603f3d011682016040523d82523d6000602084013e612d61565b606091505b50600081511415612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e906149f2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e04565b600190505b949350505050565b60606000821415612e54576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb4565b600082905060005b60008214612e86578080612e6f90614ec1565b915050600a82612e7f9190614cd2565b9150612e5c565b60008167ffffffffffffffff811115612ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612efa5781602001600182028036833780820191505090505b5090505b60008514612fad57600182612f139190614d03565b9150600a85612f229190614f38565b6030612f2e9190614c7c565b60f81b818381518110612f6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fa69190614cd2565b9450612efe565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561303b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303290614a52565b60405180910390fd5b6130448161221e565b15613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b90614a12565b60405180910390fd5b600083116130c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130be906149d2565b60405180910390fd5b6130d46000858386612fb9565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131d19190614c36565b6fffffffffffffffffffffffffffffffff1681526020018583602001516131f89190614c36565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561346757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134076000888488612c75565b613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343d906149f2565b60405180910390fd5b818061345190614ec1565b925050808061345f90614ec1565b915050613396565b508060008190555061347c6000878588612fbf565b505050505050565b6000816040516020016134979190614643565b604051602081830303815290604052805190602001209050919050565b60008060006134c385856134ee565b915091506134d081613571565b819250505092915050565b600080823b905060008111915050919050565b6000806041835114156135305760008060006020860151925060408601519150606086015160001a9050613524878285856138c2565b9450945050505061356a565b6040835114156135615760008060208501519150604085015190506135568683836139cf565b93509350505061356a565b60006002915091505b9250929050565b600060048111156135ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156135e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156135ef576138bf565b60016004811115613629577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613662577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156136a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369a90614752565b60405180910390fd5b600260048111156136dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613716577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e906147b2565b60405180910390fd5b60036004811115613791577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156137ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561380b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380290614872565b60405180910390fd5b600480811115613844577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561387d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156138be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b5906148d2565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138fd5760006003915091506139c6565b601b8560ff16141580156139155750601c8560ff1614155b156139275760006004915091506139c6565b60006001878787876040516000815260200160405260405161394c94939291906146eb565b6020604051602081039080840390855afa15801561396e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139bd576000600192509250506139c6565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613a129190614c7c565b9050613a20878288856138c2565b935093505050935093915050565b828054613a3a90614e5e565b90600052602060002090601f016020900481019282613a5c5760008555613aa3565b82601f10613a7557803560ff1916838001178555613aa3565b82800160010185558215613aa3579182015b82811115613aa2578235825591602001919060010190613a87565b5b509050613ab09190613aee565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613b07576000816000905550600101613aef565b5090565b6000613b1e613b1984614bad565b614b88565b905082815260208101848484011115613b3657600080fd5b613b41848285614df2565b509392505050565b600081359050613b58816158f9565b92915050565b600081359050613b6d81615910565b92915050565b600081359050613b8281615927565b92915050565b600081519050613b9781615927565b92915050565b60008083601f840112613baf57600080fd5b8235905067ffffffffffffffff811115613bc857600080fd5b602083019150836001820283011115613be057600080fd5b9250929050565b600082601f830112613bf857600080fd5b8135613c08848260208601613b0b565b91505092915050565b60008083601f840112613c2357600080fd5b8235905067ffffffffffffffff811115613c3c57600080fd5b602083019150836001820283011115613c5457600080fd5b9250929050565b600081359050613c6a8161593e565b92915050565b600060208284031215613c8257600080fd5b6000613c9084828501613b49565b91505092915050565b60008060408385031215613cac57600080fd5b6000613cba85828601613b49565b9250506020613ccb85828601613b49565b9150509250929050565b600080600060608486031215613cea57600080fd5b6000613cf886828701613b49565b9350506020613d0986828701613b49565b9250506040613d1a86828701613c5b565b9150509250925092565b60008060008060808587031215613d3a57600080fd5b6000613d4887828801613b49565b9450506020613d5987828801613b49565b9350506040613d6a87828801613c5b565b925050606085013567ffffffffffffffff811115613d8757600080fd5b613d9387828801613be7565b91505092959194509250565b60008060408385031215613db257600080fd5b6000613dc085828601613b49565b9250506020613dd185828601613b5e565b9150509250929050565b60008060408385031215613dee57600080fd5b6000613dfc85828601613b49565b9250506020613e0d85828601613c5b565b9150509250929050565b60008060408385031215613e2a57600080fd5b6000613e3885828601613b5e565b9250506020613e4985828601613b5e565b9150509250929050565b600060208284031215613e6557600080fd5b6000613e7384828501613b73565b91505092915050565b600060208284031215613e8e57600080fd5b6000613e9c84828501613b88565b91505092915050565b60008060208385031215613eb857600080fd5b600083013567ffffffffffffffff811115613ed257600080fd5b613ede85828601613c11565b92509250509250929050565b600060208284031215613efc57600080fd5b6000613f0a84828501613c5b565b91505092915050565b600080600060408486031215613f2857600080fd5b6000613f3686828701613c5b565b935050602084013567ffffffffffffffff811115613f5357600080fd5b613f5f86828701613b9d565b92509250509250925092565b613f7481614d37565b82525050565b613f8381614d37565b82525050565b613f9a613f9582614d37565b614f0a565b82525050565b613fa981614d49565b82525050565b613fb881614d55565b82525050565b613fcf613fca82614d55565b614f1c565b82525050565b6000613fe082614bf3565b613fea8185614c09565b9350613ffa818560208601614e01565b61400381615025565b840191505092915050565b600061401982614bfe565b6140238185614c1a565b9350614033818560208601614e01565b61403c81615025565b840191505092915050565b600061405282614bfe565b61405c8185614c2b565b935061406c818560208601614e01565b80840191505092915050565b6000815461408581614e5e565b61408f8186614c2b565b945060018216600081146140aa57600181146140bb576140ee565b60ff198316865281860193506140ee565b6140c485614bde565b60005b838110156140e6578154818901526001820191506020810190506140c7565b838801955050505b50505092915050565b6000614104601883614c1a565b915061410f82615043565b602082019050919050565b6000614127602283614c1a565b91506141328261506c565b604082019050919050565b600061414a602c83614c1a565b9150614155826150bb565b604082019050919050565b600061416d601f83614c1a565b91506141788261510a565b602082019050919050565b6000614190601c83614c2b565b915061419b82615133565b601c82019050919050565b60006141b3602683614c1a565b91506141be8261515c565b604082019050919050565b60006141d6602a83614c1a565b91506141e1826151ab565b604082019050919050565b60006141f9602383614c1a565b9150614204826151fa565b604082019050919050565b600061421c602583614c1a565b915061422782615249565b604082019050919050565b600061423f603183614c1a565b915061424a82615298565b604082019050919050565b6000614262602283614c1a565b915061426d826152e7565b604082019050919050565b6000614285603983614c1a565b915061429082615336565b604082019050919050565b60006142a8602b83614c1a565b91506142b382615385565b604082019050919050565b60006142cb602283614c1a565b91506142d6826153d4565b604082019050919050565b60006142ee602683614c1a565b91506142f982615423565b604082019050919050565b6000614311600583614c2b565b915061431c82615472565b600582019050919050565b6000614334602083614c1a565b915061433f8261549b565b602082019050919050565b6000614357602f83614c1a565b9150614362826154c4565b604082019050919050565b600061437a601883614c1a565b915061438582615513565b602082019050919050565b600061439d601a83614c1a565b91506143a88261553c565b602082019050919050565b60006143c0603283614c1a565b91506143cb82615565565b604082019050919050565b60006143e3602283614c1a565b91506143ee826155b4565b604082019050919050565b6000614406602383614c1a565b915061441182615603565b604082019050919050565b6000614429603383614c1a565b915061443482615652565b604082019050919050565b600061444c601d83614c1a565b9150614457826156a1565b602082019050919050565b600061446f601a83614c1a565b915061447a826156ca565b602082019050919050565b6000614492602183614c1a565b915061449d826156f3565b604082019050919050565b60006144b5601583614c1a565b91506144c082615742565b602082019050919050565b60006144d8602e83614c1a565b91506144e38261576b565b604082019050919050565b60006144fb603483614c1a565b9150614506826157ba565b604082019050919050565b600061451e601483614c1a565b915061452982615809565b602082019050919050565b6000614541602583614c1a565b915061454c82615832565b604082019050919050565b6000614564602d83614c1a565b915061456f82615881565b604082019050919050565b6000614587602083614c1a565b9150614592826158d0565b602082019050919050565b6040820160008201516145b36000850182613f6b565b5060208201516145c660208501826145db565b50505050565b6145d581614dc7565b82525050565b6145e481614dd1565b82525050565b6145f381614de5565b82525050565b60006146058284613f89565b60148201915081905092915050565b60006146208285614078565b915061462c8284614047565b915061463782614304565b91508190509392505050565b600061464e82614183565b915061465a8284613fbe565b60208201915081905092915050565b600060208201905061467e6000830184613f7a565b92915050565b60006080820190506146996000830187613f7a565b6146a66020830186613f7a565b6146b360408301856145cc565b81810360608301526146c58184613fd5565b905095945050505050565b60006020820190506146e56000830184613fa0565b92915050565b60006080820190506147006000830187613faf565b61470d60208301866145ea565b61471a6040830185613faf565b6147276060830184613faf565b95945050505050565b6000602082019050818103600083015261474a818461400e565b905092915050565b6000602082019050818103600083015261476b816140f7565b9050919050565b6000602082019050818103600083015261478b8161411a565b9050919050565b600060208201905081810360008301526147ab8161413d565b9050919050565b600060208201905081810360008301526147cb81614160565b9050919050565b600060208201905081810360008301526147eb816141a6565b9050919050565b6000602082019050818103600083015261480b816141c9565b9050919050565b6000602082019050818103600083015261482b816141ec565b9050919050565b6000602082019050818103600083015261484b8161420f565b9050919050565b6000602082019050818103600083015261486b81614232565b9050919050565b6000602082019050818103600083015261488b81614255565b9050919050565b600060208201905081810360008301526148ab81614278565b9050919050565b600060208201905081810360008301526148cb8161429b565b9050919050565b600060208201905081810360008301526148eb816142be565b9050919050565b6000602082019050818103600083015261490b816142e1565b9050919050565b6000602082019050818103600083015261492b81614327565b9050919050565b6000602082019050818103600083015261494b8161434a565b9050919050565b6000602082019050818103600083015261496b8161436d565b9050919050565b6000602082019050818103600083015261498b81614390565b9050919050565b600060208201905081810360008301526149ab816143b3565b9050919050565b600060208201905081810360008301526149cb816143d6565b9050919050565b600060208201905081810360008301526149eb816143f9565b9050919050565b60006020820190508181036000830152614a0b8161441c565b9050919050565b60006020820190508181036000830152614a2b8161443f565b9050919050565b60006020820190508181036000830152614a4b81614462565b9050919050565b60006020820190508181036000830152614a6b81614485565b9050919050565b60006020820190508181036000830152614a8b816144a8565b9050919050565b60006020820190508181036000830152614aab816144cb565b9050919050565b60006020820190508181036000830152614acb816144ee565b9050919050565b60006020820190508181036000830152614aeb81614511565b9050919050565b60006020820190508181036000830152614b0b81614534565b9050919050565b60006020820190508181036000830152614b2b81614557565b9050919050565b60006020820190508181036000830152614b4b8161457a565b9050919050565b6000604082019050614b67600083018461459d565b92915050565b6000602082019050614b8260008301846145cc565b92915050565b6000614b92614ba3565b9050614b9e8282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614bc857614bc7614ff6565b5b614bd182615025565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c4182614d8b565b9150614c4c83614d8b565b9250826fffffffffffffffffffffffffffffffff03821115614c7157614c70614f69565b5b828201905092915050565b6000614c8782614dc7565b9150614c9283614dc7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc757614cc6614f69565b5b828201905092915050565b6000614cdd82614dc7565b9150614ce883614dc7565b925082614cf857614cf7614f98565b5b828204905092915050565b6000614d0e82614dc7565b9150614d1983614dc7565b925082821015614d2c57614d2b614f69565b5b828203905092915050565b6000614d4282614da7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e1f578082015181840152602081019050614e04565b83811115614e2e576000848401525b50505050565b6000614e3f82614dc7565b91506000821415614e5357614e52614f69565b5b600182039050919050565b60006002820490506001821680614e7657607f821691505b60208210811415614e8a57614e89614fc7565b5b50919050565b614e9982615025565b810181811067ffffffffffffffff82111715614eb857614eb7614ff6565b5b80604052505050565b6000614ecc82614dc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f69565b5b600182019050919050565b6000614f1582614f26565b9050919050565b6000819050919050565b6000614f3182615036565b9050919050565b6000614f4382614dc7565b9150614f4e83614dc7565b925082614f5e57614f5d614f98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2032204e465473206475726960008201527f6e67205052452d53414c452e0000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f72726563742065746865722076616c75650000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820696e207468652064657620726573657276652c206d60008201527f696e74206120736d616c6c657220616d6f756e74000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b61590281614d37565b811461590d57600080fd5b50565b61591981614d49565b811461592457600080fd5b50565b61593081614d5f565b811461593b57600080fd5b50565b61594781614dc7565b811461595257600080fd5b5056fea26469706673582212207886e4c3bc7a697f03c9ce78b800f7c0daaec57575e76c093837e05f17de4f5564736f6c63430008020033

Deployed Bytecode Sourcemap

66702:4864:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45331:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67174:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46958:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48519:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48040:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43772:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69113:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66911:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49395:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67926:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44436:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71386:177;;;;;;;;;;;;;:::i;:::-;;49628;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70633:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43949:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70875:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70753:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69257:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69917:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46767:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70413:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45767:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41222:103;;;;;;;;;;;;;:::i;:::-;;71002:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69531:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47127:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68117:703;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48805:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71091:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67222:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49876:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71281:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68848:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70187:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66864:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69410:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71186:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49164:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41480:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70517:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45331:372;45433:4;45485:25;45470:40;;;:11;:40;;;;:105;;;;45542:33;45527:48;;;:11;:48;;;;45470:105;:172;;;;45607:35;45592:50;;;:11;:50;;;;45470:172;:225;;;;45659:36;45683:11;45659:23;:36::i;:::-;45470:225;45450:245;;45331:372;;;:::o;67174:41::-;;;;;;;;;;;;;:::o;46958:100::-;47012:13;47045:5;47038:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46958:100;:::o;48519:214::-;48587:7;48615:16;48623:7;48615;:16::i;:::-;48607:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48701:15;:24;48717:7;48701:24;;;;;;;;;;;;;;;;;;;;;48694:31;;48519:214;;;:::o;48040:413::-;48113:13;48129:24;48145:7;48129:15;:24::i;:::-;48113:40;;48178:5;48172:11;;:2;:11;;;;48164:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48273:5;48257:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48282:37;48299:5;48306:12;:10;:12::i;:::-;48282:16;:37::i;:::-;48257:62;48235:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;48417:28;48426:2;48430:7;48439:5;48417:8;:28::i;:::-;48040:413;;;:::o;43772:100::-;43825:7;43852:12;;43845:19;;43772:100;:::o;69113:136::-;69186:7;69212:12;:22;69225:8;69212:22;;;;;;;;;;;;;;;:29;;;69205:36;;69113:136;;;:::o;66911:29::-;;;;:::o;49395:162::-;49521:28;49531:4;49537:2;49541:7;49521:9;:28::i;:::-;49395:162;;;:::o;67926:183::-;67989:7;67574:10;67561:23;;:9;:23;;;67553:32;;;;;;67619:14;;67608:7;:25;;67600:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;67750:9;;67737:10;;66900:4;67725:22;:34;67708:13;:11;:13::i;:::-;67698:7;:23;:61;;67690:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;67836:7;67824:9;;:19;67811:9;:32;;67803:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68017:16:::1;;;;;;;;;;;68009:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;68071:30;68081:10;68093:7;68071:9;:30::i;:::-;67926:183:::0;;:::o;44436:823::-;44525:7;44561:16;44571:5;44561:9;:16::i;:::-;44553:5;:24;44545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44627:22;44652:13;:11;:13::i;:::-;44627:38;;44676:19;44710:25;44764:9;44759:426;44783:14;44779:1;:18;44759:426;;;44819:31;44853:11;:14;44865:1;44853:14;;;;;;;;;;;44819:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44912:1;44886:28;;:9;:14;;;:28;;;44882:103;;44955:9;:14;;;44935:34;;44882:103;45024:5;45003:26;;:17;:26;;;44999:175;;;45069:5;45054:11;:20;45050:77;;;45106:1;45099:8;;;;;;;;;45050:77;45145:13;;;;;:::i;:::-;;;;44999:175;44759:426;44799:3;;;;;:::i;:::-;;;;44759:426;;;;45195:56;;;;;;;;;;:::i;:::-;;;;;;;;44436:823;;;;;:::o;71386:177::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71436:15:::1;71454:21;71436:39;;71494:42;71486:60;;:69;71547:7;71486:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40862:1;71386:177::o:0;49628:::-;49758:39;49775:4;49781:2;49785:7;49758:39;;;;;;;;;;;;:16;:39::i;:::-;49628:177;;;:::o;70633:112::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70723:14:::1;70710:10;:27;;;;70633:112:::0;:::o;43949:187::-;44016:7;44052:13;:11;:13::i;:::-;44044:5;:21;44036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44123:5;44116:12;;43949:187;;;:::o;70875:119::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70968:18:::1;70951:14;:35;;;;70875:119:::0;:::o;70753:114::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70848:11:::1;;70832:13;:27;;;;;;;:::i;:::-;;70753:114:::0;;:::o;69257:121::-;69313:7;69339:12;:24;69352:10;69339:24;;;;;;;;;;;;;;;:31;;;69332:38;;69257:121;:::o;69917:262::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70027:10:::1;;70015:7;70002:9;;:20;;;;;;;:::i;:::-;;;;;;;70001:36;;69993:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;70131:7;70105:10;:22;70116:10;70105:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;70149:22;70159:2;70163:7;70149:9;:22::i;:::-;69917:262:::0;;:::o;46767:124::-;46831:7;46858:20;46870:7;46858:11;:20::i;:::-;:25;;;46851:32;;46767:124;;;:::o;70413:96::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70491:10:::1;70482:6;;:19;;;;;;;;;;;;;;;;;;70413:96:::0;:::o;45767:221::-;45831:7;45876:1;45859:19;;:5;:19;;;;45851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45952:12;:19;45965:5;45952:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;45944:36;;45937:43;;45767:221;;;:::o;41222:103::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41287:30:::1;41314:1;41287:18;:30::i;:::-;41222:103::o:0;71002:81::-;71043:7;71069:6;;;;;;;;;;;71062:13;;71002:81;:::o;40571:87::-;40617:7;40644:6;;;;;;;;;;;40637:13;;40571:87;:::o;69531:135::-;69597:21;;:::i;:::-;69638:20;69650:7;69638:11;:20::i;:::-;69631:27;;69531:135;;;:::o;47127:104::-;47183:13;47216:7;47209:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47127:104;:::o;68117:703::-;68209:7;67574:10;67561:23;;:9;:23;;;67553:32;;;;;;67619:14;;67608:7;:25;;67600:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;67750:9;;67737:10;;66900:4;67725:22;:34;67708:13;:11;:13::i;:::-;67698:7;:23;:61;;67690:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;67836:7;67824:9;;:19;67811:9;:32;;67803:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68262:21:::1;;;;;;;;;;;68254:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68331:56;68364:10;68347:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;68377:9;;68331:15;:56::i;:::-;68323:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68505:14;;68479:10;:22;68490:10;68479:22;;;;;;;;;;;;;;;;68469:7;68441:25;68455:10;68441:13;:25::i;:::-;:35;:60;:78;;68433:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;68624:1;68613:7;68579:12;:24;68592:10;68579:24;;;;;;;;;;;;;;;:31;;;:41;:46;;68571:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;68764:7;68730:12;:24;68743:10;68730:24;;;;;;;;;;;;;;;:31;;;:41;;;;:::i;:::-;68696:12;:24;68709:10;68696:24;;;;;;;;;;;;;;;:31;;:75;;;;68782:30;68792:10;68804:7;68782:9;:30::i;:::-;68117:703:::0;;;;:::o;48805:288::-;48912:12;:10;:12::i;:::-;48900:24;;:8;:24;;;;48892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49013:8;48968:18;:32;48987:12;:10;:12::i;:::-;48968:32;;;;;;;;;;;;;;;:42;49001:8;48968:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49066:8;49037:48;;49052:12;:10;:12::i;:::-;49037:48;;;49076:8;49037:48;;;;;;:::i;:::-;;;;;;;;48805:288;;:::o;71091:87::-;71135:7;71161:9;;71154:16;;71091:87;:::o;67222:36::-;;;;;;;;;;;;;:::o;49876:355::-;50035:28;50045:4;50051:2;50055:7;50035:9;:28::i;:::-;50096:48;50119:4;50125:2;50129:7;50138:5;50096:22;:48::i;:::-;50074:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;49876:355;;;;:::o;71281:97::-;71330:7;71356:14;;71349:21;;71281:97;:::o;68848:257::-;68909:13;68943:16;68951:7;68943;:16::i;:::-;68935:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;69053:13;69068:18;:7;:16;:18::i;:::-;69036:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69022:75;;68848:257;;;:::o;70187:218::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70317:20:::1;70298:16;;:39;;;;;;;;;;;;;;;;;;70372:25;70348:21;;:49;;;;;;;;;;;;;;;;;;70187:218:::0;;:::o;66864:40::-;66900:4;66864:40;:::o;69410:113::-;69468:7;69495:20;69509:5;69495:13;:20::i;:::-;69488:27;;69410:113;;;:::o;71186:87::-;71230:7;71256:9;;71249:16;;71186:87;:::o;49164:164::-;49261:4;49285:18;:25;49304:5;49285:25;;;;;;;;;;;;;;;:35;49311:8;49285:35;;;;;;;;;;;;;;;;;;;;;;;;;49278:42;;49164:164;;;;:::o;41480:201::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41589:1:::1;41569:22;;:8;:22;;;;41561:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41645:28;41664:8;41645:18;:28::i;:::-;41480:201:::0;:::o;70517:108::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70604:13:::1;70592:9;:25;;;;70517:108:::0;:::o;918:157::-;1003:4;1042:25;1027:40;;;:11;:40;;;;1020:47;;918:157;;;:::o;50486:111::-;50543:4;50577:12;;50567:7;:22;50560:29;;50486:111;;;:::o;1648:98::-;1701:7;1728:10;1721:17;;1648:98;:::o;54530:196::-;54672:2;54645:15;:24;54661:7;54645:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54710:7;54706:2;54690:28;;54699:5;54690:28;;;;;;;;;;;;54530:196;;;:::o;52629:1783::-;52744:35;52782:20;52794:7;52782:11;:20::i;:::-;52744:58;;52815:22;52857:13;:18;;;52841:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52916:12;:10;:12::i;:::-;52892:36;;:20;52904:7;52892:11;:20::i;:::-;:36;;;52841:87;:154;;;;52945:50;52962:13;:18;;;52982:12;:10;:12::i;:::-;52945:16;:50::i;:::-;52841:154;52815:181;;53017:17;53009:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53132:4;53110:26;;:13;:18;;;:26;;;53102:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53212:1;53198:16;;:2;:16;;;;53190:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53269:43;53291:4;53297:2;53301:7;53310:1;53269:21;:43::i;:::-;53377:49;53394:1;53398:7;53407:13;:18;;;53377:8;:49::i;:::-;53661:1;53631:12;:18;53644:4;53631:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53705:1;53677:12;:16;53690:2;53677:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53753:43;;;;;;;;53768:2;53753:43;;;;;;53779:15;53753:43;;;;;53730:11;:20;53742:7;53730:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54036:19;54068:1;54058:7;:11;;;;:::i;:::-;54036:33;;54125:1;54084:43;;:11;:24;54096:11;54084:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;54080:227;;;54148:20;54156:11;54148:7;:20::i;:::-;54144:152;;;54216:64;;;;;;;;54231:13;:18;;;54216:64;;;;;;54251:13;:28;;;54216:64;;;;;54189:11;:24;54201:11;54189:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54144:152;54080:227;54343:7;54339:2;54324:27;;54333:4;54324:27;;;;;;;;;;;;54362:42;54383:4;54389:2;54393:7;54402:1;54362:20;:42::i;:::-;52629:1783;;;;;;:::o;50605:104::-;50674:27;50684:2;50688:8;50674:27;;;;;;;;;;;;:9;:27::i;:::-;50605:104;;:::o;46233:472::-;46294:21;;:::i;:::-;46336:16;46344:7;46336;:16::i;:::-;46328:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46417:12;46432:7;46417:22;;46412:216;46466:31;46500:11;:17;46512:4;46500:17;;;;;;;;;;;46466:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46562:1;46536:28;;:9;:14;;;:28;;;46532:85;;46592:9;46585:16;;;;;;46532:85;46412:216;46443:6;;;;;:::i;:::-;;;;46412:216;;46233:472;;;;:::o;41841:191::-;41915:16;41934:6;;;;;;;;;;;41915:25;;41960:8;41951:6;;:17;;;;;;;;;;;;;;;;;;42015:8;41984:40;;42005:8;41984:40;;;;;;;;;;;;41841:191;;:::o;69693:195::-;69785:4;69873:6;;;;;;;;;;;69810:69;;:59;69859:9;;69810:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;69820:4;69810:15;;;;;;:38;:40::i;:::-;:48;;:59;;;;:::i;:::-;:69;;;69802:78;;69693:195;;;;;:::o;45996:229::-;46057:7;46102:1;46085:19;;:5;:19;;;;46077:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46184:12;:19;46197:5;46184:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;46176:41;;46169:48;;45996:229;;;:::o;55291:804::-;55446:4;55467:15;:2;:13;;;:15::i;:::-;55463:625;;;55519:2;55503:36;;;55540:12;:10;:12::i;:::-;55554:4;55560:7;55569:5;55503:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55499:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55766:1;55749:6;:13;:18;55745:273;;;55792:61;;;;;;;;;;:::i;:::-;;;;;;;;55745:273;55968:6;55962:13;55953:6;55949:2;55945:15;55938:38;55499:534;55636:45;;;55626:55;;;:6;:55;;;;55619:62;;;;;55463:625;56072:4;56065:11;;55291:804;;;;;;;:::o;7933:723::-;7989:13;8219:1;8210:5;:10;8206:53;;;8237:10;;;;;;;;;;;;;;;;;;;;;8206:53;8269:12;8284:5;8269:20;;8300:14;8325:78;8340:1;8332:4;:9;8325:78;;8358:8;;;;;:::i;:::-;;;;8389:2;8381:10;;;;;:::i;:::-;;;8325:78;;;8413:19;8445:6;8435:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:39;;8463:154;8479:1;8470:5;:10;8463:154;;8507:1;8497:11;;;;;:::i;:::-;;;8574:2;8566:5;:10;;;;:::i;:::-;8553:2;:24;;;;:::i;:::-;8540:39;;8523:6;8530;8523:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8603:2;8594:11;;;;;:::i;:::-;;;8463:154;;;8641:6;8627:21;;;;;7933:723;;;;:::o;56583:159::-;;;;;:::o;57154:158::-;;;;;:::o;50986:1389::-;51109:20;51132:12;;51109:35;;51177:1;51163:16;;:2;:16;;;;51155:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51362:21;51370:12;51362:7;:21::i;:::-;51361:22;51353:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51447:1;51436:8;:12;51428:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51501:61;51531:1;51535:2;51539:12;51553:8;51501:21;:61::i;:::-;51575:30;51608:12;:16;51621:2;51608:16;;;;;;;;;;;;;;;51575:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51654:135;;;;;;;;51710:8;51680:11;:19;;;:39;;;;:::i;:::-;51654:135;;;;;;51769:8;51734:11;:24;;;:44;;;;:::i;:::-;51654:135;;;;;51635:12;:16;51648:2;51635:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51828:43;;;;;;;;51843:2;51828:43;;;;;;51854:15;51828:43;;;;;51800:11;:25;51812:12;51800:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51884:20;51907:12;51884:35;;51937:9;51932:325;51956:8;51952:1;:12;51932:325;;;52016:12;52012:2;51991:38;;52008:1;51991:38;;;;;;;;;;;;52070:59;52101:1;52105:2;52109:12;52123:5;52070:22;:59::i;:::-;52044:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;52231:14;;;;;:::i;:::-;;;;51966:3;;;;;:::i;:::-;;;;51932:325;;;;52284:12;52269;:27;;;;52307:60;52336:1;52340:2;52344:12;52358:8;52307:20;:60::i;:::-;50986:1389;;;;;;:::o;65387:269::-;65456:7;65642:4;65589:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;65579:69;;;;;;65572:76;;65387:269;;;:::o;61585:231::-;61663:7;61684:17;61703:18;61725:27;61736:4;61742:9;61725:10;:27::i;:::-;61683:69;;;;61763:18;61775:5;61763:11;:18::i;:::-;61799:9;61792:16;;;;61585:231;;;;:::o;31542:387::-;31602:4;31810:12;31877:7;31865:20;31857:28;;31920:1;31913:4;:8;31906:15;;;31542:387;;;:::o;59475:1308::-;59556:7;59565:12;59810:2;59790:9;:16;:22;59786:990;;;59829:9;59853;59877:7;60086:4;60075:9;60071:20;60065:27;60060:32;;60136:4;60125:9;60121:20;60115:27;60110:32;;60194:4;60183:9;60179:20;60173:27;60170:1;60165:36;60160:41;;60237:25;60248:4;60254:1;60257;60260;60237:10;:25::i;:::-;60230:32;;;;;;;;;59786:990;60304:2;60284:9;:16;:22;60280:496;;;60323:9;60347:10;60559:4;60548:9;60544:20;60538:27;60533:32;;60610:4;60599:9;60595:20;60589:27;60583:33;;60652:23;60663:4;60669:1;60672:2;60652:10;:23::i;:::-;60645:30;;;;;;;;60280:496;60724:1;60728:35;60708:56;;;;59475:1308;;;;;;:::o;57746:643::-;57824:20;57815:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;57811:571;;;57861:7;;57811:571;57922:29;57913:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;57909:473;;;57968:34;;;;;;;;;;:::i;:::-;;;;;;;;57909:473;58033:35;58024:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;58020:362;;;58085:41;;;;;;;;;;:::i;:::-;;;;;;;;58020:362;58157:30;58148:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;58144:238;;;58204:44;;;;;;;;;;:::i;:::-;;;;;;;;58144:238;58279:30;58270:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;58266:116;;;58326:44;;;;;;;;;;:::i;:::-;;;;;;;;58266:116;57746:643;;:::o;63037:1632::-;63168:7;63177:12;64102:66;64097:1;64089:10;;:79;64085:163;;;64201:1;64205:30;64185:51;;;;;;64085:163;64267:2;64262:1;:7;;;;:18;;;;;64278:2;64273:1;:7;;;;64262:18;64258:102;;;64313:1;64317:30;64297:51;;;;;;64258:102;64457:14;64474:24;64484:4;64490:1;64493;64496;64474:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64457:41;;64531:1;64513:20;;:6;:20;;;64509:103;;;64566:1;64570:29;64550:50;;;;;;;64509:103;64632:6;64640:20;64624:37;;;;;63037:1632;;;;;;;;:::o;62079:344::-;62193:7;62202:12;62227:9;62252:66;62244:75;;62239:2;:80;62227:92;;62330:7;62369:2;62362:3;62355:2;62347:11;;:18;;62346:25;;;;:::i;:::-;62330:42;;62390:25;62401:4;62407:1;62410;62413;62390:10;:25::i;:::-;62383:32;;;;;;62079:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:351::-;;;1060:3;1053:4;1045:6;1041:17;1037:27;1027:2;;1078:1;1075;1068:12;1027:2;1114:6;1101:20;1091:30;;1144:18;1136:6;1133:30;1130:2;;;1176:1;1173;1166:12;1130:2;1213:4;1205:6;1201:17;1189:29;;1267:3;1259:4;1251:6;1247:17;1237:8;1233:32;1230:41;1227:2;;;1284:1;1281;1274:12;1227:2;1017:277;;;;;:::o;1313:271::-;;1417:3;1410:4;1402:6;1398:17;1394:27;1384:2;;1435:1;1432;1425:12;1384:2;1475:6;1462:20;1500:78;1574:3;1566:6;1559:4;1551:6;1547:17;1500:78;:::i;:::-;1491:87;;1374:210;;;;;:::o;1604:352::-;;;1722:3;1715:4;1707:6;1703:17;1699:27;1689:2;;1740:1;1737;1730:12;1689:2;1776:6;1763:20;1753:30;;1806:18;1798:6;1795:30;1792:2;;;1838:1;1835;1828:12;1792:2;1875:4;1867:6;1863:17;1851:29;;1929:3;1921:4;1913:6;1909:17;1899:8;1895:32;1892:41;1889:2;;;1946:1;1943;1936:12;1889:2;1679:277;;;;;:::o;1962:139::-;;2046:6;2033:20;2024:29;;2062:33;2089:5;2062:33;:::i;:::-;2014:87;;;;:::o;2107:262::-;;2215:2;2203:9;2194:7;2190:23;2186:32;2183:2;;;2231:1;2228;2221:12;2183:2;2274:1;2299:53;2344:7;2335:6;2324:9;2320:22;2299:53;:::i;:::-;2289:63;;2245:117;2173:196;;;;:::o;2375:407::-;;;2500:2;2488:9;2479:7;2475:23;2471:32;2468:2;;;2516:1;2513;2506:12;2468:2;2559:1;2584:53;2629:7;2620:6;2609:9;2605:22;2584:53;:::i;:::-;2574:63;;2530:117;2686:2;2712:53;2757:7;2748:6;2737:9;2733:22;2712:53;:::i;:::-;2702:63;;2657:118;2458:324;;;;;:::o;2788:552::-;;;;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2946:1;2943;2936:12;2898:2;2989:1;3014:53;3059:7;3050:6;3039:9;3035:22;3014:53;:::i;:::-;3004:63;;2960:117;3116:2;3142:53;3187:7;3178:6;3167:9;3163:22;3142:53;:::i;:::-;3132:63;;3087:118;3244:2;3270:53;3315:7;3306:6;3295:9;3291:22;3270:53;:::i;:::-;3260:63;;3215:118;2888:452;;;;;:::o;3346:809::-;;;;;3514:3;3502:9;3493:7;3489:23;3485:33;3482:2;;;3531:1;3528;3521:12;3482:2;3574:1;3599:53;3644:7;3635:6;3624:9;3620:22;3599:53;:::i;:::-;3589:63;;3545:117;3701:2;3727:53;3772:7;3763:6;3752:9;3748:22;3727:53;:::i;:::-;3717:63;;3672:118;3829:2;3855:53;3900:7;3891:6;3880:9;3876:22;3855:53;:::i;:::-;3845:63;;3800:118;3985:2;3974:9;3970:18;3957:32;4016:18;4008:6;4005:30;4002:2;;;4048:1;4045;4038:12;4002:2;4076:62;4130:7;4121:6;4110:9;4106:22;4076:62;:::i;:::-;4066:72;;3928:220;3472:683;;;;;;;:::o;4161:401::-;;;4283:2;4271:9;4262:7;4258:23;4254:32;4251:2;;;4299:1;4296;4289:12;4251:2;4342:1;4367:53;4412:7;4403:6;4392:9;4388:22;4367:53;:::i;:::-;4357:63;;4313:117;4469:2;4495:50;4537:7;4528:6;4517:9;4513:22;4495:50;:::i;:::-;4485:60;;4440:115;4241:321;;;;;:::o;4568:407::-;;;4693:2;4681:9;4672:7;4668:23;4664:32;4661:2;;;4709:1;4706;4699:12;4661:2;4752:1;4777:53;4822:7;4813:6;4802:9;4798:22;4777:53;:::i;:::-;4767:63;;4723:117;4879:2;4905:53;4950:7;4941:6;4930:9;4926:22;4905:53;:::i;:::-;4895:63;;4850:118;4651:324;;;;;:::o;4981:395::-;;;5100:2;5088:9;5079:7;5075:23;5071:32;5068:2;;;5116:1;5113;5106:12;5068:2;5159:1;5184:50;5226:7;5217:6;5206:9;5202:22;5184:50;:::i;:::-;5174:60;;5130:114;5283:2;5309:50;5351:7;5342:6;5331:9;5327:22;5309:50;:::i;:::-;5299:60;;5254:115;5058:318;;;;;:::o;5382:260::-;;5489:2;5477:9;5468:7;5464:23;5460:32;5457:2;;;5505:1;5502;5495:12;5457:2;5548:1;5573:52;5617:7;5608:6;5597:9;5593:22;5573:52;:::i;:::-;5563:62;;5519:116;5447:195;;;;:::o;5648:282::-;;5766:2;5754:9;5745:7;5741:23;5737:32;5734:2;;;5782:1;5779;5772:12;5734:2;5825:1;5850:63;5905:7;5896:6;5885:9;5881:22;5850:63;:::i;:::-;5840:73;;5796:127;5724:206;;;;:::o;5936:395::-;;;6064:2;6052:9;6043:7;6039:23;6035:32;6032:2;;;6080:1;6077;6070:12;6032:2;6151:1;6140:9;6136:17;6123:31;6181:18;6173:6;6170:30;6167:2;;;6213:1;6210;6203:12;6167:2;6249:65;6306:7;6297:6;6286:9;6282:22;6249:65;:::i;:::-;6231:83;;;;6094:230;6022:309;;;;;:::o;6337:262::-;;6445:2;6433:9;6424:7;6420:23;6416:32;6413:2;;;6461:1;6458;6451:12;6413:2;6504:1;6529:53;6574:7;6565:6;6554:9;6550:22;6529:53;:::i;:::-;6519:63;;6475:117;6403:196;;;;:::o;6605:538::-;;;;6749:2;6737:9;6728:7;6724:23;6720:32;6717:2;;;6765:1;6762;6755:12;6717:2;6808:1;6833:53;6878:7;6869:6;6858:9;6854:22;6833:53;:::i;:::-;6823:63;;6779:117;6963:2;6952:9;6948:18;6935:32;6994:18;6986:6;6983:30;6980:2;;;7026:1;7023;7016:12;6980:2;7062:64;7118:7;7109:6;7098:9;7094:22;7062:64;:::i;:::-;7044:82;;;;6906:230;6707:436;;;;;:::o;7149:108::-;7226:24;7244:5;7226:24;:::i;:::-;7221:3;7214:37;7204:53;;:::o;7263:118::-;7350:24;7368:5;7350:24;:::i;:::-;7345:3;7338:37;7328:53;;:::o;7387:157::-;7492:45;7512:24;7530:5;7512:24;:::i;:::-;7492:45;:::i;:::-;7487:3;7480:58;7470:74;;:::o;7550:109::-;7631:21;7646:5;7631:21;:::i;:::-;7626:3;7619:34;7609:50;;:::o;7665:118::-;7752:24;7770:5;7752:24;:::i;:::-;7747:3;7740:37;7730:53;;:::o;7789:157::-;7894:45;7914:24;7932:5;7914:24;:::i;:::-;7894:45;:::i;:::-;7889:3;7882:58;7872:74;;:::o;7952:360::-;;8066:38;8098:5;8066:38;:::i;:::-;8120:70;8183:6;8178:3;8120:70;:::i;:::-;8113:77;;8199:52;8244:6;8239:3;8232:4;8225:5;8221:16;8199:52;:::i;:::-;8276:29;8298:6;8276:29;:::i;:::-;8271:3;8267:39;8260:46;;8042:270;;;;;:::o;8318:364::-;;8434:39;8467:5;8434:39;:::i;:::-;8489:71;8553:6;8548:3;8489:71;:::i;:::-;8482:78;;8569:52;8614:6;8609:3;8602:4;8595:5;8591:16;8569:52;:::i;:::-;8646:29;8668:6;8646:29;:::i;:::-;8641:3;8637:39;8630:46;;8410:272;;;;;:::o;8688:377::-;;8822:39;8855:5;8822:39;:::i;:::-;8877:89;8959:6;8954:3;8877:89;:::i;:::-;8870:96;;8975:52;9020:6;9015:3;9008:4;9001:5;8997:16;8975:52;:::i;:::-;9052:6;9047:3;9043:16;9036:23;;8798:267;;;;;:::o;9095:845::-;;9235:5;9229:12;9264:36;9290:9;9264:36;:::i;:::-;9316:89;9398:6;9393:3;9316:89;:::i;:::-;9309:96;;9436:1;9425:9;9421:17;9452:1;9447:137;;;;9598:1;9593:341;;;;9414:520;;9447:137;9531:4;9527:9;9516;9512:25;9507:3;9500:38;9567:6;9562:3;9558:16;9551:23;;9447:137;;9593:341;9660:38;9692:5;9660:38;:::i;:::-;9720:1;9734:154;9748:6;9745:1;9742:13;9734:154;;;9822:7;9816:14;9812:1;9807:3;9803:11;9796:35;9872:1;9863:7;9859:15;9848:26;;9770:4;9767:1;9763:12;9758:17;;9734:154;;;9917:6;9912:3;9908:16;9901:23;;9600:334;;9414:520;;9202:738;;;;;;:::o;9946:366::-;;10109:67;10173:2;10168:3;10109:67;:::i;:::-;10102:74;;10185:93;10274:3;10185:93;:::i;:::-;10303:2;10298:3;10294:12;10287:19;;10092:220;;;:::o;10318:366::-;;10481:67;10545:2;10540:3;10481:67;:::i;:::-;10474:74;;10557:93;10646:3;10557:93;:::i;:::-;10675:2;10670:3;10666:12;10659:19;;10464:220;;;:::o;10690:366::-;;10853:67;10917:2;10912:3;10853:67;:::i;:::-;10846:74;;10929:93;11018:3;10929:93;:::i;:::-;11047:2;11042:3;11038:12;11031:19;;10836:220;;;:::o;11062:366::-;;11225:67;11289:2;11284:3;11225:67;:::i;:::-;11218:74;;11301:93;11390:3;11301:93;:::i;:::-;11419:2;11414:3;11410:12;11403:19;;11208:220;;;:::o;11434:402::-;;11615:85;11697:2;11692:3;11615:85;:::i;:::-;11608:92;;11709:93;11798:3;11709:93;:::i;:::-;11827:2;11822:3;11818:12;11811:19;;11598:238;;;:::o;11842:366::-;;12005:67;12069:2;12064:3;12005:67;:::i;:::-;11998:74;;12081:93;12170:3;12081:93;:::i;:::-;12199:2;12194:3;12190:12;12183:19;;11988:220;;;:::o;12214:366::-;;12377:67;12441:2;12436:3;12377:67;:::i;:::-;12370:74;;12453:93;12542:3;12453:93;:::i;:::-;12571:2;12566:3;12562:12;12555:19;;12360:220;;;:::o;12586:366::-;;12749:67;12813:2;12808:3;12749:67;:::i;:::-;12742:74;;12825:93;12914:3;12825:93;:::i;:::-;12943:2;12938:3;12934:12;12927:19;;12732:220;;;:::o;12958:366::-;;13121:67;13185:2;13180:3;13121:67;:::i;:::-;13114:74;;13197:93;13286:3;13197:93;:::i;:::-;13315:2;13310:3;13306:12;13299:19;;13104:220;;;:::o;13330:366::-;;13493:67;13557:2;13552:3;13493:67;:::i;:::-;13486:74;;13569:93;13658:3;13569:93;:::i;:::-;13687:2;13682:3;13678:12;13671:19;;13476:220;;;:::o;13702:366::-;;13865:67;13929:2;13924:3;13865:67;:::i;:::-;13858:74;;13941:93;14030:3;13941:93;:::i;:::-;14059:2;14054:3;14050:12;14043:19;;13848:220;;;:::o;14074:366::-;;14237:67;14301:2;14296:3;14237:67;:::i;:::-;14230:74;;14313:93;14402:3;14313:93;:::i;:::-;14431:2;14426:3;14422:12;14415:19;;14220:220;;;:::o;14446:366::-;;14609:67;14673:2;14668:3;14609:67;:::i;:::-;14602:74;;14685:93;14774:3;14685:93;:::i;:::-;14803:2;14798:3;14794:12;14787:19;;14592:220;;;:::o;14818:366::-;;14981:67;15045:2;15040:3;14981:67;:::i;:::-;14974:74;;15057:93;15146:3;15057:93;:::i;:::-;15175:2;15170:3;15166:12;15159:19;;14964:220;;;:::o;15190:366::-;;15353:67;15417:2;15412:3;15353:67;:::i;:::-;15346:74;;15429:93;15518:3;15429:93;:::i;:::-;15547:2;15542:3;15538:12;15531:19;;15336:220;;;:::o;15562:400::-;;15743:84;15825:1;15820:3;15743:84;:::i;:::-;15736:91;;15836:93;15925:3;15836:93;:::i;:::-;15954:1;15949:3;15945:11;15938:18;;15726:236;;;:::o;15968:366::-;;16131:67;16195:2;16190:3;16131:67;:::i;:::-;16124:74;;16207:93;16296:3;16207:93;:::i;:::-;16325:2;16320:3;16316:12;16309:19;;16114:220;;;:::o;16340:366::-;;16503:67;16567:2;16562:3;16503:67;:::i;:::-;16496:74;;16579:93;16668:3;16579:93;:::i;:::-;16697:2;16692:3;16688:12;16681:19;;16486:220;;;:::o;16712:366::-;;16875:67;16939:2;16934:3;16875:67;:::i;:::-;16868:74;;16951:93;17040:3;16951:93;:::i;:::-;17069:2;17064:3;17060:12;17053:19;;16858:220;;;:::o;17084:366::-;;17247:67;17311:2;17306:3;17247:67;:::i;:::-;17240:74;;17323:93;17412:3;17323:93;:::i;:::-;17441:2;17436:3;17432:12;17425:19;;17230:220;;;:::o;17456:366::-;;17619:67;17683:2;17678:3;17619:67;:::i;:::-;17612:74;;17695:93;17784:3;17695:93;:::i;:::-;17813:2;17808:3;17804:12;17797:19;;17602:220;;;:::o;17828:366::-;;17991:67;18055:2;18050:3;17991:67;:::i;:::-;17984:74;;18067:93;18156:3;18067:93;:::i;:::-;18185:2;18180:3;18176:12;18169:19;;17974:220;;;:::o;18200:366::-;;18363:67;18427:2;18422:3;18363:67;:::i;:::-;18356:74;;18439:93;18528:3;18439:93;:::i;:::-;18557:2;18552:3;18548:12;18541:19;;18346:220;;;:::o;18572:366::-;;18735:67;18799:2;18794:3;18735:67;:::i;:::-;18728:74;;18811:93;18900:3;18811:93;:::i;:::-;18929:2;18924:3;18920:12;18913:19;;18718:220;;;:::o;18944:366::-;;19107:67;19171:2;19166:3;19107:67;:::i;:::-;19100:74;;19183:93;19272:3;19183:93;:::i;:::-;19301:2;19296:3;19292:12;19285:19;;19090:220;;;:::o;19316:366::-;;19479:67;19543:2;19538:3;19479:67;:::i;:::-;19472:74;;19555:93;19644:3;19555:93;:::i;:::-;19673:2;19668:3;19664:12;19657:19;;19462:220;;;:::o;19688:366::-;;19851:67;19915:2;19910:3;19851:67;:::i;:::-;19844:74;;19927:93;20016:3;19927:93;:::i;:::-;20045:2;20040:3;20036:12;20029:19;;19834:220;;;:::o;20060:366::-;;20223:67;20287:2;20282:3;20223:67;:::i;:::-;20216:74;;20299:93;20388:3;20299:93;:::i;:::-;20417:2;20412:3;20408:12;20401:19;;20206:220;;;:::o;20432:366::-;;20595:67;20659:2;20654:3;20595:67;:::i;:::-;20588:74;;20671:93;20760:3;20671:93;:::i;:::-;20789:2;20784:3;20780:12;20773:19;;20578:220;;;:::o;20804:366::-;;20967:67;21031:2;21026:3;20967:67;:::i;:::-;20960:74;;21043:93;21132:3;21043:93;:::i;:::-;21161:2;21156:3;21152:12;21145:19;;20950:220;;;:::o;21176:366::-;;21339:67;21403:2;21398:3;21339:67;:::i;:::-;21332:74;;21415:93;21504:3;21415:93;:::i;:::-;21533:2;21528:3;21524:12;21517:19;;21322:220;;;:::o;21920:366::-;;22083:67;22147:2;22142:3;22083:67;:::i;:::-;22076:74;;22159:93;22248:3;22159:93;:::i;:::-;22277:2;22272:3;22268:12;22261:19;;22066:220;;;:::o;22292:366::-;;22455:67;22519:2;22514:3;22455:67;:::i;:::-;22448:74;;22531:93;22620:3;22531:93;:::i;:::-;22649:2;22644:3;22640:12;22633:19;;22438:220;;;:::o;22664:366::-;;22827:67;22891:2;22886:3;22827:67;:::i;:::-;22820:74;;22903:93;22992:3;22903:93;:::i;:::-;23021:2;23016:3;23012:12;23005:19;;22810:220;;;:::o;23106:529::-;23267:4;23262:3;23258:14;23354:4;23347:5;23343:16;23337:23;23373:63;23430:4;23425:3;23421:14;23407:12;23373:63;:::i;:::-;23282:164;23538:4;23531:5;23527:16;23521:23;23557:61;23612:4;23607:3;23603:14;23589:12;23557:61;:::i;:::-;23456:172;23236:399;;;:::o;23641:118::-;23728:24;23746:5;23728:24;:::i;:::-;23723:3;23716:37;23706:53;;:::o;23765:105::-;23840:23;23857:5;23840:23;:::i;:::-;23835:3;23828:36;23818:52;;:::o;23876:112::-;23959:22;23975:5;23959:22;:::i;:::-;23954:3;23947:35;23937:51;;:::o;23994:256::-;;24121:75;24192:3;24183:6;24121:75;:::i;:::-;24221:2;24216:3;24212:12;24205:19;;24241:3;24234:10;;24110:140;;;;:::o;24256:695::-;;24556:92;24644:3;24635:6;24556:92;:::i;:::-;24549:99;;24665:95;24756:3;24747:6;24665:95;:::i;:::-;24658:102;;24777:148;24921:3;24777:148;:::i;:::-;24770:155;;24942:3;24935:10;;24538:413;;;;;:::o;24957:522::-;;25192:148;25336:3;25192:148;:::i;:::-;25185:155;;25350:75;25421:3;25412:6;25350:75;:::i;:::-;25450:2;25445:3;25441:12;25434:19;;25470:3;25463:10;;25174:305;;;;:::o;25485:222::-;;25616:2;25605:9;25601:18;25593:26;;25629:71;25697:1;25686:9;25682:17;25673:6;25629:71;:::i;:::-;25583:124;;;;:::o;25713:640::-;;25946:3;25935:9;25931:19;25923:27;;25960:71;26028:1;26017:9;26013:17;26004:6;25960:71;:::i;:::-;26041:72;26109:2;26098:9;26094:18;26085:6;26041:72;:::i;:::-;26123;26191:2;26180:9;26176:18;26167:6;26123:72;:::i;:::-;26242:9;26236:4;26232:20;26227:2;26216:9;26212:18;26205:48;26270:76;26341:4;26332:6;26270:76;:::i;:::-;26262:84;;25913:440;;;;;;;:::o;26359:210::-;;26484:2;26473:9;26469:18;26461:26;;26497:65;26559:1;26548:9;26544:17;26535:6;26497:65;:::i;:::-;26451:118;;;;:::o;26575:545::-;;26786:3;26775:9;26771:19;26763:27;;26800:71;26868:1;26857:9;26853:17;26844:6;26800:71;:::i;:::-;26881:68;26945:2;26934:9;26930:18;26921:6;26881:68;:::i;:::-;26959:72;27027:2;27016:9;27012:18;27003:6;26959:72;:::i;:::-;27041;27109:2;27098:9;27094:18;27085:6;27041:72;:::i;:::-;26753:367;;;;;;;:::o;27126:313::-;;27277:2;27266:9;27262:18;27254:26;;27326:9;27320:4;27316:20;27312:1;27301:9;27297:17;27290:47;27354:78;27427:4;27418:6;27354:78;:::i;:::-;27346:86;;27244:195;;;;:::o;27445:419::-;;27649:2;27638:9;27634:18;27626:26;;27698:9;27692:4;27688:20;27684:1;27673:9;27669:17;27662:47;27726:131;27852:4;27726:131;:::i;:::-;27718:139;;27616:248;;;:::o;27870:419::-;;28074:2;28063:9;28059:18;28051:26;;28123:9;28117:4;28113:20;28109:1;28098:9;28094:17;28087:47;28151:131;28277:4;28151:131;:::i;:::-;28143:139;;28041:248;;;:::o;28295:419::-;;28499:2;28488:9;28484:18;28476:26;;28548:9;28542:4;28538:20;28534:1;28523:9;28519:17;28512:47;28576:131;28702:4;28576:131;:::i;:::-;28568:139;;28466:248;;;:::o;28720:419::-;;28924:2;28913:9;28909:18;28901:26;;28973:9;28967:4;28963:20;28959:1;28948:9;28944:17;28937:47;29001:131;29127:4;29001:131;:::i;:::-;28993:139;;28891:248;;;:::o;29145:419::-;;29349:2;29338:9;29334:18;29326:26;;29398:9;29392:4;29388:20;29384:1;29373:9;29369:17;29362:47;29426:131;29552:4;29426:131;:::i;:::-;29418:139;;29316:248;;;:::o;29570:419::-;;29774:2;29763:9;29759:18;29751:26;;29823:9;29817:4;29813:20;29809:1;29798:9;29794:17;29787:47;29851:131;29977:4;29851:131;:::i;:::-;29843:139;;29741:248;;;:::o;29995:419::-;;30199:2;30188:9;30184:18;30176:26;;30248:9;30242:4;30238:20;30234:1;30223:9;30219:17;30212:47;30276:131;30402:4;30276:131;:::i;:::-;30268:139;;30166:248;;;:::o;30420:419::-;;30624:2;30613:9;30609:18;30601:26;;30673:9;30667:4;30663:20;30659:1;30648:9;30644:17;30637:47;30701:131;30827:4;30701:131;:::i;:::-;30693:139;;30591:248;;;:::o;30845:419::-;;31049:2;31038:9;31034:18;31026:26;;31098:9;31092:4;31088:20;31084:1;31073:9;31069:17;31062:47;31126:131;31252:4;31126:131;:::i;:::-;31118:139;;31016:248;;;:::o;31270:419::-;;31474:2;31463:9;31459:18;31451:26;;31523:9;31517:4;31513:20;31509:1;31498:9;31494:17;31487:47;31551:131;31677:4;31551:131;:::i;:::-;31543:139;;31441:248;;;:::o;31695:419::-;;31899:2;31888:9;31884:18;31876:26;;31948:9;31942:4;31938:20;31934:1;31923:9;31919:17;31912:47;31976:131;32102:4;31976:131;:::i;:::-;31968:139;;31866:248;;;:::o;32120:419::-;;32324:2;32313:9;32309:18;32301:26;;32373:9;32367:4;32363:20;32359:1;32348:9;32344:17;32337:47;32401:131;32527:4;32401:131;:::i;:::-;32393:139;;32291:248;;;:::o;32545:419::-;;32749:2;32738:9;32734:18;32726:26;;32798:9;32792:4;32788:20;32784:1;32773:9;32769:17;32762:47;32826:131;32952:4;32826:131;:::i;:::-;32818:139;;32716:248;;;:::o;32970:419::-;;33174:2;33163:9;33159:18;33151:26;;33223:9;33217:4;33213:20;33209:1;33198:9;33194:17;33187:47;33251:131;33377:4;33251:131;:::i;:::-;33243:139;;33141:248;;;:::o;33395:419::-;;33599:2;33588:9;33584:18;33576:26;;33648:9;33642:4;33638:20;33634:1;33623:9;33619:17;33612:47;33676:131;33802:4;33676:131;:::i;:::-;33668:139;;33566:248;;;:::o;33820:419::-;;34024:2;34013:9;34009:18;34001:26;;34073:9;34067:4;34063:20;34059:1;34048:9;34044:17;34037:47;34101:131;34227:4;34101:131;:::i;:::-;34093:139;;33991:248;;;:::o;34245:419::-;;34449:2;34438:9;34434:18;34426:26;;34498:9;34492:4;34488:20;34484:1;34473:9;34469:17;34462:47;34526:131;34652:4;34526:131;:::i;:::-;34518:139;;34416:248;;;:::o;34670:419::-;;34874:2;34863:9;34859:18;34851:26;;34923:9;34917:4;34913:20;34909:1;34898:9;34894:17;34887:47;34951:131;35077:4;34951:131;:::i;:::-;34943:139;;34841:248;;;:::o;35095:419::-;;35299:2;35288:9;35284:18;35276:26;;35348:9;35342:4;35338:20;35334:1;35323:9;35319:17;35312:47;35376:131;35502:4;35376:131;:::i;:::-;35368:139;;35266:248;;;:::o;35520:419::-;;35724:2;35713:9;35709:18;35701:26;;35773:9;35767:4;35763:20;35759:1;35748:9;35744:17;35737:47;35801:131;35927:4;35801:131;:::i;:::-;35793:139;;35691:248;;;:::o;35945:419::-;;36149:2;36138:9;36134:18;36126:26;;36198:9;36192:4;36188:20;36184:1;36173:9;36169:17;36162:47;36226:131;36352:4;36226:131;:::i;:::-;36218:139;;36116:248;;;:::o;36370:419::-;;36574:2;36563:9;36559:18;36551:26;;36623:9;36617:4;36613:20;36609:1;36598:9;36594:17;36587:47;36651:131;36777:4;36651:131;:::i;:::-;36643:139;;36541:248;;;:::o;36795:419::-;;36999:2;36988:9;36984:18;36976:26;;37048:9;37042:4;37038:20;37034:1;37023:9;37019:17;37012:47;37076:131;37202:4;37076:131;:::i;:::-;37068:139;;36966:248;;;:::o;37220:419::-;;37424:2;37413:9;37409:18;37401:26;;37473:9;37467:4;37463:20;37459:1;37448:9;37444:17;37437:47;37501:131;37627:4;37501:131;:::i;:::-;37493:139;;37391:248;;;:::o;37645:419::-;;37849:2;37838:9;37834:18;37826:26;;37898:9;37892:4;37888:20;37884:1;37873:9;37869:17;37862:47;37926:131;38052:4;37926:131;:::i;:::-;37918:139;;37816:248;;;:::o;38070:419::-;;38274:2;38263:9;38259:18;38251:26;;38323:9;38317:4;38313:20;38309:1;38298:9;38294:17;38287:47;38351:131;38477:4;38351:131;:::i;:::-;38343:139;;38241:248;;;:::o;38495:419::-;;38699:2;38688:9;38684:18;38676:26;;38748:9;38742:4;38738:20;38734:1;38723:9;38719:17;38712:47;38776:131;38902:4;38776:131;:::i;:::-;38768:139;;38666:248;;;:::o;38920:419::-;;39124:2;39113:9;39109:18;39101:26;;39173:9;39167:4;39163:20;39159:1;39148:9;39144:17;39137:47;39201:131;39327:4;39201:131;:::i;:::-;39193:139;;39091:248;;;:::o;39345:419::-;;39549:2;39538:9;39534:18;39526:26;;39598:9;39592:4;39588:20;39584:1;39573:9;39569:17;39562:47;39626:131;39752:4;39626:131;:::i;:::-;39618:139;;39516:248;;;:::o;40195:419::-;;40399:2;40388:9;40384:18;40376:26;;40448:9;40442:4;40438:20;40434:1;40423:9;40419:17;40412:47;40476:131;40602:4;40476:131;:::i;:::-;40468:139;;40366:248;;;:::o;40620:419::-;;40824:2;40813:9;40809:18;40801:26;;40873:9;40867:4;40863:20;40859:1;40848:9;40844:17;40837:47;40901:131;41027:4;40901:131;:::i;:::-;40893:139;;40791:248;;;:::o;41045:419::-;;41249:2;41238:9;41234:18;41226:26;;41298:9;41292:4;41288:20;41284:1;41273:9;41269:17;41262:47;41326:131;41452:4;41326:131;:::i;:::-;41318:139;;41216:248;;;:::o;41470:350::-;;41665:2;41654:9;41650:18;41642:26;;41678:135;41810:1;41799:9;41795:17;41786:6;41678:135;:::i;:::-;41632:188;;;;:::o;41826:222::-;;41957:2;41946:9;41942:18;41934:26;;41970:71;42038:1;42027:9;42023:17;42014:6;41970:71;:::i;:::-;41924:124;;;;:::o;42054:129::-;;42115:20;;:::i;:::-;42105:30;;42144:33;42172:4;42164:6;42144:33;:::i;:::-;42095:88;;;:::o;42189:75::-;;42255:2;42249:9;42239:19;;42229:35;:::o;42270:307::-;;42421:18;42413:6;42410:30;42407:2;;;42443:18;;:::i;:::-;42407:2;42481:29;42503:6;42481:29;:::i;:::-;42473:37;;42565:4;42559;42555:15;42547:23;;42336:241;;;:::o;42583:141::-;;42655:3;42647:11;;42678:3;42675:1;42668:14;42712:4;42709:1;42699:18;42691:26;;42637:87;;;:::o;42730:98::-;;42815:5;42809:12;42799:22;;42788:40;;;:::o;42834:99::-;;42920:5;42914:12;42904:22;;42893:40;;;:::o;42939:168::-;;43056:6;43051:3;43044:19;43096:4;43091:3;43087:14;43072:29;;43034:73;;;;:::o;43113:169::-;;43231:6;43226:3;43219:19;43271:4;43266:3;43262:14;43247:29;;43209:73;;;;:::o;43288:148::-;;43427:3;43412:18;;43402:34;;;;:::o;43442:273::-;;43501:20;43519:1;43501:20;:::i;:::-;43496:25;;43535:20;43553:1;43535:20;:::i;:::-;43530:25;;43657:1;43621:34;43617:42;43614:1;43611:49;43608:2;;;43663:18;;:::i;:::-;43608:2;43707:1;43704;43700:9;43693:16;;43486:229;;;;:::o;43721:305::-;;43780:20;43798:1;43780:20;:::i;:::-;43775:25;;43814:20;43832:1;43814:20;:::i;:::-;43809:25;;43968:1;43900:66;43896:74;43893:1;43890:81;43887:2;;;43974:18;;:::i;:::-;43887:2;44018:1;44015;44011:9;44004:16;;43765:261;;;;:::o;44032:185::-;;44089:20;44107:1;44089:20;:::i;:::-;44084:25;;44123:20;44141:1;44123:20;:::i;:::-;44118:25;;44162:1;44152:2;;44167:18;;:::i;:::-;44152:2;44209:1;44206;44202:9;44197:14;;44074:143;;;;:::o;44223:191::-;;44283:20;44301:1;44283:20;:::i;:::-;44278:25;;44317:20;44335:1;44317:20;:::i;:::-;44312:25;;44356:1;44353;44350:8;44347:2;;;44361:18;;:::i;:::-;44347:2;44406:1;44403;44399:9;44391:17;;44268:146;;;;:::o;44420:96::-;;44486:24;44504:5;44486:24;:::i;:::-;44475:35;;44465:51;;;:::o;44522:90::-;;44599:5;44592:13;44585:21;44574:32;;44564:48;;;:::o;44618:77::-;;44684:5;44673:16;;44663:32;;;:::o;44701:149::-;;44777:66;44770:5;44766:78;44755:89;;44745:105;;;:::o;44856:118::-;;44933:34;44926:5;44922:46;44911:57;;44901:73;;;:::o;44980:126::-;;45057:42;45050:5;45046:54;45035:65;;45025:81;;;:::o;45112:77::-;;45178:5;45167:16;;45157:32;;;:::o;45195:101::-;;45271:18;45264:5;45260:30;45249:41;;45239:57;;;:::o;45302:86::-;;45377:4;45370:5;45366:16;45355:27;;45345:43;;;:::o;45394:154::-;45478:6;45473:3;45468;45455:30;45540:1;45531:6;45526:3;45522:16;45515:27;45445:103;;;:::o;45554:307::-;45622:1;45632:113;45646:6;45643:1;45640:13;45632:113;;;45731:1;45726:3;45722:11;45716:18;45712:1;45707:3;45703:11;45696:39;45668:2;45665:1;45661:10;45656:15;;45632:113;;;45763:6;45760:1;45757:13;45754:2;;;45843:1;45834:6;45829:3;45825:16;45818:27;45754:2;45603:258;;;;:::o;45867:171::-;;45929:24;45947:5;45929:24;:::i;:::-;45920:33;;45975:4;45968:5;45965:15;45962:2;;;45983:18;;:::i;:::-;45962:2;46030:1;46023:5;46019:13;46012:20;;45910:128;;;:::o;46044:320::-;;46125:1;46119:4;46115:12;46105:22;;46172:1;46166:4;46162:12;46193:18;46183:2;;46249:4;46241:6;46237:17;46227:27;;46183:2;46311;46303:6;46300:14;46280:18;46277:38;46274:2;;;46330:18;;:::i;:::-;46274:2;46095:269;;;;:::o;46370:281::-;46453:27;46475:4;46453:27;:::i;:::-;46445:6;46441:40;46583:6;46571:10;46568:22;46547:18;46535:10;46532:34;46529:62;46526:2;;;46594:18;;:::i;:::-;46526:2;46634:10;46630:2;46623:22;46413:238;;;:::o;46657:233::-;;46719:24;46737:5;46719:24;:::i;:::-;46710:33;;46765:66;46758:5;46755:77;46752:2;;;46835:18;;:::i;:::-;46752:2;46882:1;46875:5;46871:13;46864:20;;46700:190;;;:::o;46896:100::-;;46964:26;46984:5;46964:26;:::i;:::-;46953:37;;46943:53;;;:::o;47002:79::-;;47070:5;47059:16;;47049:32;;;:::o;47087:94::-;;47155:20;47169:5;47155:20;:::i;:::-;47144:31;;47134:47;;;:::o;47187:176::-;;47236:20;47254:1;47236:20;:::i;:::-;47231:25;;47270:20;47288:1;47270:20;:::i;:::-;47265:25;;47309:1;47299:2;;47314:18;;:::i;:::-;47299:2;47355:1;47352;47348:9;47343:14;;47221:142;;;;:::o;47369:180::-;47417:77;47414:1;47407:88;47514:4;47511:1;47504:15;47538:4;47535:1;47528:15;47555:180;47603:77;47600:1;47593:88;47700:4;47697:1;47690:15;47724:4;47721:1;47714:15;47741:180;47789:77;47786:1;47779:88;47886:4;47883:1;47876:15;47910:4;47907:1;47900:15;47927:180;47975:77;47972:1;47965:88;48072:4;48069:1;48062:15;48096:4;48093:1;48086:15;48113:102;;48205:2;48201:7;48196:2;48189:5;48185:14;48181:28;48171:38;;48161:54;;;:::o;48221:94::-;;48302:5;48298:2;48294:14;48273:35;;48263:52;;;:::o;48321:174::-;48461:26;48457:1;48449:6;48445:14;48438:50;48427:68;:::o;48501:221::-;48641:34;48637:1;48629:6;48625:14;48618:58;48710:4;48705:2;48697:6;48693:15;48686:29;48607:115;:::o;48728:231::-;48868:34;48864:1;48856:6;48852:14;48845:58;48937:14;48932:2;48924:6;48920:15;48913:39;48834:125;:::o;48965:181::-;49105:33;49101:1;49093:6;49089:14;49082:57;49071:75;:::o;49152:214::-;49292:66;49288:1;49280:6;49276:14;49269:90;49258:108;:::o;49372:225::-;49512:34;49508:1;49500:6;49496:14;49489:58;49581:8;49576:2;49568:6;49564:15;49557:33;49478:119;:::o;49603:229::-;49743:34;49739:1;49731:6;49727:14;49720:58;49812:12;49807:2;49799:6;49795:15;49788:37;49709:123;:::o;49838:222::-;49978:34;49974:1;49966:6;49962:14;49955:58;50047:5;50042:2;50034:6;50030:15;50023:30;49944:116;:::o;50066:224::-;50206:34;50202:1;50194:6;50190:14;50183:58;50275:7;50270:2;50262:6;50258:15;50251:32;50172:118;:::o;50296:236::-;50436:34;50432:1;50424:6;50420:14;50413:58;50505:19;50500:2;50492:6;50488:15;50481:44;50402:130;:::o;50538:221::-;50678:34;50674:1;50666:6;50662:14;50655:58;50747:4;50742:2;50734:6;50730:15;50723:29;50644:115;:::o;50765:244::-;50905:34;50901:1;50893:6;50889:14;50882:58;50974:27;50969:2;50961:6;50957:15;50950:52;50871:138;:::o;51015:230::-;51155:34;51151:1;51143:6;51139:14;51132:58;51224:13;51219:2;51211:6;51207:15;51200:38;51121:124;:::o;51251:221::-;51391:34;51387:1;51379:6;51375:14;51368:58;51460:4;51455:2;51447:6;51443:15;51436:29;51357:115;:::o;51478:225::-;51618:34;51614:1;51606:6;51602:14;51595:58;51687:8;51682:2;51674:6;51670:15;51663:33;51584:119;:::o;51709:155::-;51849:7;51845:1;51837:6;51833:14;51826:31;51815:49;:::o;51870:182::-;52010:34;52006:1;51998:6;51994:14;51987:58;51976:76;:::o;52058:234::-;52198:34;52194:1;52186:6;52182:14;52175:58;52267:17;52262:2;52254:6;52250:15;52243:42;52164:128;:::o;52298:174::-;52438:26;52434:1;52426:6;52422:14;52415:50;52404:68;:::o;52478:176::-;52618:28;52614:1;52606:6;52602:14;52595:52;52584:70;:::o;52660:237::-;52800:34;52796:1;52788:6;52784:14;52777:58;52869:20;52864:2;52856:6;52852:15;52845:45;52766:131;:::o;52903:221::-;53043:34;53039:1;53031:6;53027:14;53020:58;53112:4;53107:2;53099:6;53095:15;53088:29;53009:115;:::o;53130:222::-;53270:34;53266:1;53258:6;53254:14;53247:58;53339:5;53334:2;53326:6;53322:15;53315:30;53236:116;:::o;53358:238::-;53498:34;53494:1;53486:6;53482:14;53475:58;53567:21;53562:2;53554:6;53550:15;53543:46;53464:132;:::o;53602:179::-;53742:31;53738:1;53730:6;53726:14;53719:55;53708:73;:::o;53787:176::-;53927:28;53923:1;53915:6;53911:14;53904:52;53893:70;:::o;53969:220::-;54109:34;54105:1;54097:6;54093:14;54086:58;54178:3;54173:2;54165:6;54161:15;54154:28;54075:114;:::o;54195:171::-;54335:23;54331:1;54323:6;54319:14;54312:47;54301:65;:::o;54372:233::-;54512:34;54508:1;54500:6;54496:14;54489:58;54581:16;54576:2;54568:6;54564:15;54557:41;54478:127;:::o;54611:239::-;54751:34;54747:1;54739:6;54735:14;54728:58;54820:22;54815:2;54807:6;54803:15;54796:47;54717:133;:::o;54856:170::-;54996:22;54992:1;54984:6;54980:14;54973:46;54962:64;:::o;55272:224::-;55412:34;55408:1;55400:6;55396:14;55389:58;55481:7;55476:2;55468:6;55464:15;55457:32;55378:118;:::o;55502:232::-;55642:34;55638:1;55630:6;55626:14;55619:58;55711:15;55706:2;55698:6;55694:15;55687:40;55608:126;:::o;55740:182::-;55880:34;55876:1;55868:6;55864:14;55857:58;55846:76;:::o;55928:122::-;56001:24;56019:5;56001:24;:::i;:::-;55994:5;55991:35;55981:2;;56040:1;56037;56030:12;55981:2;55971:79;:::o;56056:116::-;56126:21;56141:5;56126:21;:::i;:::-;56119:5;56116:32;56106:2;;56162:1;56159;56152:12;56106:2;56096:76;:::o;56178:120::-;56250:23;56267:5;56250:23;:::i;:::-;56243:5;56240:34;56230:2;;56288:1;56285;56278:12;56230:2;56220:78;:::o;56304:122::-;56377:24;56395:5;56377:24;:::i;:::-;56370:5;56367:35;56357:2;;56416:1;56413;56406:12;56357:2;56347:79;:::o

Swarm Source

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