ETH Price: $2,962.65 (-1.66%)
Gas: 4 Gwei

Token

CuratorsSociety (CURATORS)
 

Overview

Max Total Supply

1,000 CURATORS

Holders

309

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
autom8ed.eth
Balance
1 CURATORS
0x2ba34c711fbd3ab880f32c87889191a663152400
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:
CuratorsSociety

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-31
*/

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

// 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/IERC721Receiver.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);
}

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



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/utils/Address.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);
    }

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

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

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



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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = 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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: @openzeppelin/contracts/access/Ownable.sol



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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol



pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// File: @chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;
}

// File: @chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

// File: contracts/CURATORS.sol



pragma solidity ^0.8.4;






contract CuratorsSociety is ERC721A, Ownable, VRFConsumerBaseV2 {

  using SafeMath for uint256;
  VRFCoordinatorV2Interface COORDINATOR;

  uint64 s_subscriptionId;
  bytes32 keyHash;
  uint32 callbackGasLimit = 100000;
  uint16 requestConfirmations = 3;
  uint32 numWords = 1;
  uint256[] public s_randomWords;
  uint256 public s_requestId;

  string public baseURI='';
  string public provenanceHash;
  uint256 public startingIndex;
  uint256 public emergencyStartingIndexUsed;
  uint256 public maxMint;
  uint256 public maxTokens;
  uint256 public maxPresaleMintTotal = 3;
  uint256 public maxPresaleTxnTotal = 3;
  bytes32 public merkleroot;
  mapping (address => uint256) private whitelist;  
  address payable cakeWallet;
  address payable founderWallet; 
  bool public saleIsActive = false;
  uint256 public mintPrice = .16 ether;

  constructor(uint256 initialSupply, uint256 maxTotalMints, address payable founders, address vrfCoordinator, bytes32 _keyHash, uint64 subscriptionId) 
    ERC721A("CuratorsSociety", "CURATORS")
    VRFConsumerBaseV2(vrfCoordinator){
      maxTokens = initialSupply;
      maxMint = maxTotalMints;      
      founderWallet = founders;
      cakeWallet = payable(msg.sender);

      COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);      
      keyHash = _keyHash;
      s_subscriptionId = subscriptionId;
  }  

  function setProvenanceHash(string memory _provenanceHash) external onlyOwner {    
    require(bytes(provenanceHash).length==0, "Provenance Hash Has Already Been Set");
    provenanceHash = _provenanceHash;
  }

  function withdraw() external onlyFounders {    
    require(address(this).balance > 0, "This contract has no balance");
    
    cakeWallet.transfer(address(this).balance.mul(125).div(4000));
    founderWallet.transfer(address(this).balance);

  }

  function setBaseURI(string memory newURI) external onlyOwner {
    baseURI = newURI;
  }

   function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }

  modifier onlyFounders() {    
    require(msg.sender == founderWallet || msg.sender == owner(), "Only founders can call this function.");
    _;
  }

  // reserve 50 tokens to deployer wallet
  function reserveMint() external onlyOwner {      
    require(totalSupply().add(50) <= maxTokens, "Purchase would exceed max supply of tokens");      
    _safeMint(founderWallet, 50);
  }

  function mint(uint256 quantity) public payable {

    require(saleIsActive, "You cannot mint at this time"); 
    require(quantity > 0, "Must mint at least 1 token");
    require(quantity <= maxMint, "Exceeds txn mint token limit");
    require(totalSupply().add(quantity) <= maxTokens, "Purchase would exceed max supply of tokens");
    require(mintPrice.mul(quantity) <= msg.value, "Ether value sent is not correct");

    // _safeMint's second argument now takes in a quantity, not a tokenId.
    _safeMint(msg.sender, quantity);
  }

  function presaleMint(bytes32[] calldata proof, uint256 quantity) public payable {

    require(!saleIsActive, "Presale mint is closed.");
    require(verifyWhitelistMembership(proof, msg.sender), "You are not on the whitelist");
    require(quantity > 0, "Must mint at least 1 token");
    require(quantity <= maxPresaleTxnTotal, "You exceeded the allowed presale txn mint limit");
    require(whitelist[msg.sender] + quantity <= maxPresaleMintTotal, "You exceeded the max Presale mint limit.");    
    require(totalSupply().add(quantity) <= maxTokens, "Purchase would exceed max supply of tokens");
    require(mintPrice.mul(quantity) <= msg.value, "Ether value sent is not correct");
    
    // add count to presale mint mapping
    whitelist[msg.sender] += quantity;
    
    // _safeMint's second argument now takes in a quantity, not a tokenId.
    _safeMint(msg.sender, quantity);

  }

  function setNewPresaleLimits(uint256 _maxPresaleTxnTotal, uint256 _maxPresaleMintTotal) external onlyFounders {
    maxPresaleTxnTotal = _maxPresaleTxnTotal;
    maxPresaleMintTotal = _maxPresaleMintTotal;
  }

  function flipSaleState() external onlyOwner {    
    saleIsActive = !saleIsActive;
  }

  function verifyWhitelistMembership(bytes32[] calldata proof, address _address) internal view returns (bool){    

    // bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    bytes32 leaf = keccak256(abi.encodePacked(_address));
    return MerkleProof.verify(proof, merkleroot, leaf);
  }

  function setMerkleRoot(bytes32 _merkleroot) external onlyOwner {
    merkleroot = _merkleroot;
  }

  function setMaxPresaleMintTotal(uint256 _newMax) external onlyFounders {
    maxPresaleMintTotal = _newMax;
  }

  function setMaxPublicMint(uint256 _newMax) external onlyFounders {
    maxMint = _newMax;
  }

  function setMintPrice(uint256 newMintPrice) external onlyFounders {
    mintPrice = (newMintPrice * 10**17);
  }

  function requestRandomWords() external onlyOwner {
    require(startingIndex == 0, "Starting Index Already Set");
    require(bytes(provenanceHash).length>0, "Must Set Provenance Hash");

    s_requestId = COORDINATOR.requestRandomWords(
      keyHash,
      s_subscriptionId,
      requestConfirmations,
      callbackGasLimit,
      numWords
    );

  }
  
  function fulfillRandomWords(
    uint256, /* requestId */
    uint256[] memory randomWords
  ) internal override {    
    startingIndex = randomWords[0] % maxTokens;    
  }

  function emergencySetStartingIndex() external onlyOwner {
    require(startingIndex == 0, "Starting Index Already Set");
    require(emergencyStartingIndexUsed == 0, "Emergency Starting Index Has Already Been Used");
    require(bytes(provenanceHash).length>0, "Must Set Provenance Hash");
    startingIndex = uint(keccak256(abi.encodePacked(block.timestamp, block.difficulty))) % maxTokens;    
    emergencyStartingIndexUsed = 1;
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"maxTotalMints","type":"uint256"},{"internalType":"address payable","name":"founders","type":"address"},{"internalType":"address","name":"vrfCoordinator","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint64","name":"subscriptionId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyStartingIndexUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":[{"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":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleTxnTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_randomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setMaxPresaleMintTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleroot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPresaleTxnTotal","type":"uint256"},{"internalType":"uint256","name":"_maxPresaleMintTotal","type":"uint256"}],"name":"setNewPresaleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052620186a0600b60006101000a81548163ffffffff021916908363ffffffff1602179055506003600b60046101000a81548161ffff021916908361ffff1602179055506001600b60066101000a81548163ffffffff021916908363ffffffff16021790555060405180602001604052806000815250600e90805190602001906200008f929190620003e3565b50600360145560036015556000601960146101000a81548160ff0219169083151502179055506702386f26fc100000601a55348015620000ce57600080fd5b50604051620059a4380380620059a48339818101604052810190620000f4919062000506565b826040518060400160405280600f81526020017f43757261746f7273536f636965747900000000000000000000000000000000008152506040518060400160405280600881526020017f43555241544f5253000000000000000000000000000000000000000000000000815250816002908051906020019062000179929190620003e3565b50806003908051906020019062000192929190620003e3565b50620001a36200031060201b60201c565b6000819055505050620001cb620001bf6200031560201b60201c565b6200031d60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050856013819055508460128190555083601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a8190555080600960146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050505050620006fe565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003f19062000612565b90600052602060002090601f01602090048101928262000415576000855562000461565b82601f106200043057805160ff191683800117855562000461565b8280016001018555821562000461579182015b828111156200046057825182559160200191906001019062000443565b5b50905062000470919062000474565b5090565b5b808211156200048f57600081600090555060010162000475565b5090565b600081519050620004a4816200067c565b92915050565b600081519050620004bb8162000696565b92915050565b600081519050620004d281620006b0565b92915050565b600081519050620004e981620006ca565b92915050565b6000815190506200050081620006e4565b92915050565b60008060008060008060c0878903121562000526576200052562000677565b5b60006200053689828a01620004d8565b96505060206200054989828a01620004d8565b95505060406200055c89828a01620004aa565b94505060606200056f89828a0162000493565b93505060806200058289828a01620004c1565b92505060a06200059589828a01620004ef565b9150509295509295509295565b6000620005af82620005d4565b9050919050565b6000620005c382620005d4565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060028204905060018216806200062b57607f821691505b6020821081141562000642576200064162000648565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200068781620005a2565b81146200069357600080fd5b50565b620006a181620005b6565b8114620006ad57600080fd5b50565b620006bb81620005ca565b8114620006c757600080fd5b50565b620006d581620005f4565b8114620006e157600080fd5b50565b620006ef81620005fe565b8114620006fb57600080fd5b50565b60805160601c6152806200072460003960008181610f730152610fc701526152806000f3fe6080604052600436106102725760003560e01c80637cb647591161014f578063cb774d47116100c1578063eb8d24441161007a578063eb8d2444146108d1578063f2fde38b146108fc578063f4a0a52814610925578063f6eaffc81461094e578063fde5f5481461098b578063fffe312f146109a757610272565b8063cb774d47146107d3578063cd8bffff146107fe578063e0c8628914610827578063e83157421461083e578063e89e106a14610869578063e985e9c51461089457610272565b8063b14363bb11610113578063b14363bb146106c3578063b6c7ecf5146106ee578063b88d4fde14610719578063c6ab67a314610742578063c87b56dd1461076d578063cadf6af8146107aa57610272565b80637cb64759146105ff5780638da5cb5b1461062857806395d89b4114610653578063a0712d681461067e578063a22cb4651461069a57610272565b8063270ab52c116101e85780636352211e116101ac5780636352211e146104ed5780636817c76c1461052a5780636c0360eb1461055557806370a0823114610580578063715018a6146105bd5780637501f741146105d457610272565b8063270ab52c1461044457806334918dfd1461046d5780633ccfd60b1461048457806342842e0e1461049b57806355f804b3146104c457610272565b8063109695231161023a578063109695231461037057806318160ddd146103995780631ec0c2b1146103c45780631fe543e3146103db57806321c8d6761461040457806323b872dd1461041b57610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df57806308ebd8b21461031c578063095ea7b314610347575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613f3a565b6109d2565b6040516102ab91906145cc565b60405180910390f35b3480156102c057600080fd5b506102c9610ab4565b6040516102d69190614655565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613fdd565b610b46565b604051610313919061453c565b60405180910390f35b34801561032857600080fd5b50610331610bc2565b60405161033e9190614897565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613e6d565b610bc8565b005b34801561037c57600080fd5b5061039760048036038101906103929190613f94565b610cd3565b005b3480156103a557600080fd5b506103ae610dba565b6040516103bb9190614897565b60405180910390f35b3480156103d057600080fd5b506103d9610dd1565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614037565b610f71565b005b34801561041057600080fd5b50610419611031565b005b34801561042757600080fd5b50610442600480360381019061043d9190613d57565b61113b565b005b34801561045057600080fd5b5061046b60048036038101906104669190613fdd565b61114b565b005b34801561047957600080fd5b50610482611222565b005b34801561049057600080fd5b506104996112ca565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613d57565b6114d5565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613f94565b6114f5565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613fdd565b61158b565b604051610521919061453c565b60405180910390f35b34801561053657600080fd5b5061053f6115a1565b60405161054c9190614897565b60405180910390f35b34801561056157600080fd5b5061056a6115a7565b6040516105779190614655565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613cea565b611635565b6040516105b49190614897565b60405180910390f35b3480156105c957600080fd5b506105d2611705565b005b3480156105e057600080fd5b506105e961178d565b6040516105f69190614897565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613f0d565b611793565b005b34801561063457600080fd5b5061063d611819565b60405161064a919061453c565b60405180910390f35b34801561065f57600080fd5b50610668611843565b6040516106759190614655565b60405180910390f35b61069860048036038101906106939190613fdd565b6118d5565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613e2d565b611a6e565b005b3480156106cf57600080fd5b506106d8611be6565b6040516106e59190614897565b60405180910390f35b3480156106fa57600080fd5b50610703611bec565b60405161071091906145e7565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190613daa565b611bf2565b005b34801561074e57600080fd5b50610757611c6e565b6040516107649190614655565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613fdd565b611cfc565b6040516107a19190614655565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613fdd565b611d9b565b005b3480156107df57600080fd5b506107e8611e72565b6040516107f59190614897565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190614093565b611e78565b005b34801561083357600080fd5b5061083c611f57565b005b34801561084a57600080fd5b50610853612172565b6040516108609190614897565b60405180910390f35b34801561087557600080fd5b5061087e612178565b60405161088b9190614897565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b69190613d17565b61217e565b6040516108c891906145cc565b60405180910390f35b3480156108dd57600080fd5b506108e6612212565b6040516108f391906145cc565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e9190613cea565b612225565b005b34801561093157600080fd5b5061094c60048036038101906109479190613fdd565b61231d565b005b34801561095a57600080fd5b5061097560048036038101906109709190613fdd565b612407565b6040516109829190614897565b60405180910390f35b6109a560048036038101906109a09190613ead565b61242b565b005b3480156109b357600080fd5b506109bc6126f6565b6040516109c99190614897565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad5750610aac826126fc565b5b9050919050565b606060028054610ac390614baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef90614baf565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182612766565b610b87576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60115481565b6000610bd38261158b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5a6127b4565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c8c5750610c8a81610c856127b4565b61217e565b155b15610cc3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cce8383836127bc565b505050565b610cdb6127b4565b73ffffffffffffffffffffffffffffffffffffffff16610cf9611819565b73ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690614837565b60405180910390fd5b6000600f8054610d5e90614baf565b905014610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614737565b60405180910390fd5b80600f9080519060200190610db692919061399d565b5050565b6000610dc461286e565b6001546000540303905090565b610dd96127b4565b73ffffffffffffffffffffffffffffffffffffffff16610df7611819565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4490614837565b60405180910390fd5b600060105414610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614717565b60405180910390fd5b600060115414610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614677565b60405180910390fd5b6000600f8054610ee690614baf565b905011610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f906147b7565b60405180910390fd5b6013544244604051602001610f3e929190614510565b6040516020818303038152906040528051906020012060001c610f619190614c93565b6010819055506001601181905550565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102357337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161101a929190614557565b60405180910390fd5b61102d8282612873565b5050565b6110396127b4565b73ffffffffffffffffffffffffffffffffffffffff16611057611819565b73ffffffffffffffffffffffffffffffffffffffff16146110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490614837565b60405180910390fd5b6013546110cb60326110bd610dba565b6128a690919063ffffffff16565b111561110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110390614817565b60405180910390fd5b611139601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660326128bc565b565b6111468383836128da565b505050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111d957506111aa611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614797565b60405180910390fd5b8060128190555050565b61122a6127b4565b73ffffffffffffffffffffffffffffffffffffffff16611248611819565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590614837565b60405180910390fd5b601960149054906101000a900460ff1615601960146101000a81548160ff021916908315150217905550565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113585750611329611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90614797565b60405180910390fd5b600047116113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906146d7565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61143e610fa0611430607d47612d9090919063ffffffff16565b612da690919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611469573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114d2573d6000803e3d6000fd5b50565b6114f083838360405180602001604052806000815250611bf2565b505050565b6114fd6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661151b611819565b73ffffffffffffffffffffffffffffffffffffffff1614611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890614837565b60405180910390fd5b80600e908051906020019061158792919061399d565b5050565b600061159682612dbc565b600001519050919050565b601a5481565b600e80546115b490614baf565b80601f01602080910402602001604051908101604052809291908181526020018280546115e090614baf565b801561162d5780601f106116025761010080835404028352916020019161162d565b820191906000526020600020905b81548152906001019060200180831161161057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61170d6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661172b611819565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614837565b60405180910390fd5b61178b600061304b565b565b60125481565b61179b6127b4565b73ffffffffffffffffffffffffffffffffffffffff166117b9611819565b73ffffffffffffffffffffffffffffffffffffffff161461180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690614837565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461185290614baf565b80601f016020809104026020016040519081016040528092919081815260200182805461187e90614baf565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b5050505050905090565b601960149054906101000a900460ff16611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90614877565b60405180910390fd5b60008111611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e906146f7565b60405180910390fd5b6012548111156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390614777565b60405180910390fd5b6013546119c9826119bb610dba565b6128a690919063ffffffff16565b1115611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614817565b60405180910390fd5b34611a2082601a54612d9090919063ffffffff16565b1115611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614757565b60405180910390fd5b611a6b33826128bc565b50565b611a766127b4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611adb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ae86127b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b956127b4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bda91906145cc565b60405180910390a35050565b60155481565b60165481565b611bfd8484846128da565b611c1c8373ffffffffffffffffffffffffffffffffffffffff16613111565b8015611c315750611c2f84848484613124565b155b15611c68576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600f8054611c7b90614baf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790614baf565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b6060611d0782612766565b611d3d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d47613284565b9050600081511415611d685760405180602001604052806000815250611d93565b80611d7284613316565b604051602001611d839291906144e1565b6040516020818303038152906040525b915050919050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e295750611dfa611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614797565b60405180910390fd5b8060148190555050565b60105481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f065750611ed7611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90614797565b60405180910390fd5b81601581905550806014819055505050565b611f5f6127b4565b73ffffffffffffffffffffffffffffffffffffffff16611f7d611819565b73ffffffffffffffffffffffffffffffffffffffff1614611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90614837565b60405180910390fd5b600060105414612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f90614717565b60405180910390fd5b6000600f805461202790614baf565b905011612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906147b7565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600a54600960149054906101000a900467ffffffffffffffff16600b60049054906101000a900461ffff16600b60009054906101000a900463ffffffff16600b60069054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401612118959493929190614602565b602060405180830381600087803b15801561213257600080fd5b505af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a919061400a565b600d81905550565b60135481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601960149054906101000a900460ff1681565b61222d6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661224b611819565b73ffffffffffffffffffffffffffffffffffffffff16146122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890614837565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612308906146b7565b60405180910390fd5b61231a8161304b565b50565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123ab575061237c611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e190614797565b60405180910390fd5b67016345785d8a0000816123fe9190614a2f565b601a8190555050565b600c818154811061241757600080fd5b906000526020600020016000915090505481565b601960149054906101000a900460ff161561247b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612472906147f7565b60405180910390fd5b612486838333613477565b6124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90614697565b60405180910390fd5b60008111612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff906146f7565b60405180910390fd5b60155481111561254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254490614857565b60405180910390fd5b60145481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461259b91906149a8565b11156125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d3906147d7565b60405180910390fd5b6013546125f9826125eb610dba565b6128a690919063ffffffff16565b111561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263190614817565b60405180910390fd5b3461265082601a54612d9090919063ffffffff16565b1115612691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268890614757565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e091906149a8565b925050819055506126f133826128bc565b505050565b60145481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161277161286e565b11158015612780575060005482105b80156127ad575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6013548160008151811061288a57612889614d51565b5b602002602001015161289c9190614c93565b6010819055505050565b600081836128b491906149a8565b905092915050565b6128d68282604051806020016040528060008152506134fb565b5050565b60006128e582612dbc565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612950576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129716127b4565b73ffffffffffffffffffffffffffffffffffffffff1614806129a0575061299f8561299a6127b4565b61217e565b5b806129e557506129ae6127b4565b73ffffffffffffffffffffffffffffffffffffffff166129cd84610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a1e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a85576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a92858585600161350d565b612a9e600084876127bc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d1e576000548214612d1d57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d898585856001613513565b5050505050565b60008183612d9e9190614a2f565b905092915050565b60008183612db491906149fe565b905092915050565b612dc4613a23565b600082905080612dd261286e565b11158015612de1575060005481105b15613014576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161301257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ef6578092505050613046565b5b60011561301157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461300c578092505050613046565b612ef7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261314a6127b4565b8786866040518563ffffffff1660e01b815260040161316c9493929190614580565b602060405180830381600087803b15801561318657600080fd5b505af19250505080156131b757506040513d601f19601f820116820180604052508101906131b49190613f67565b60015b613231573d80600081146131e7576040519150601f19603f3d011682016040523d82523d6000602084013e6131ec565b606091505b50600081511415613229576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e805461329390614baf565b80601f01602080910402602001604051908101604052809291908181526020018280546132bf90614baf565b801561330c5780601f106132e15761010080835404028352916020019161330c565b820191906000526020600020905b8154815290600101906020018083116132ef57829003601f168201915b5050505050905090565b6060600082141561335e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613472565b600082905060005b6000821461339057808061337990614c12565b915050600a8261338991906149fe565b9150613366565b60008167ffffffffffffffff8111156133ac576133ab614d80565b5b6040519080825280601f01601f1916602001820160405280156133de5781602001600182028036833780820191505090505b5090505b6000851461346b576001826133f79190614a89565b9150600a856134069190614c93565b603061341291906149a8565b60f81b81838151811061342857613427614d51565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561346491906149fe565b94506133e2565b8093505050505b919050565b6000808260405160200161348b919061449a565b6040516020818303038152906040528051906020012090506134f1858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483613519565b9150509392505050565b61350883838360016135cf565b505050565b50505050565b50505050565b60008082905060005b85518110156135c15760008682815181106135405761353f614d51565b5b602002602001015190508083116135815782816040516020016135649291906144b5565b6040516020818303038152906040528051906020012092506135ad565b80836040516020016135949291906144b5565b6040516020818303038152906040528051906020012092505b5080806135b990614c12565b915050613522565b508381149150509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561363c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613677576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613684600086838761350d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561384e575061384d8773ffffffffffffffffffffffffffffffffffffffff16613111565b5b15613914575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138c36000888480600101955088613124565b6138f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561385457826000541461390f57600080fd5b613980565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613915575b8160008190555050506139966000868387613513565b5050505050565b8280546139a990614baf565b90600052602060002090601f0160209004810192826139cb5760008555613a12565b82601f106139e457805160ff1916838001178555613a12565b82800160010185558215613a12579182015b82811115613a115782518255916020019190600101906139f6565b5b509050613a1f9190613a66565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613a7f576000816000905550600101613a67565b5090565b6000613a96613a91846148d7565b6148b2565b90508083825260208201905082856020860282011115613ab957613ab8614db9565b5b60005b85811015613ae95781613acf8882613cc0565b845260208401935060208301925050600181019050613abc565b5050509392505050565b6000613b06613b0184614903565b6148b2565b905082815260208101848484011115613b2257613b21614dbe565b5b613b2d848285614b6d565b509392505050565b6000613b48613b4384614934565b6148b2565b905082815260208101848484011115613b6457613b63614dbe565b5b613b6f848285614b6d565b509392505050565b600081359050613b86816151d7565b92915050565b60008083601f840112613ba257613ba1614db4565b5b8235905067ffffffffffffffff811115613bbf57613bbe614daf565b5b602083019150836020820283011115613bdb57613bda614db9565b5b9250929050565b600082601f830112613bf757613bf6614db4565b5b8135613c07848260208601613a83565b91505092915050565b600081359050613c1f816151ee565b92915050565b600081359050613c3481615205565b92915050565b600081359050613c498161521c565b92915050565b600081519050613c5e8161521c565b92915050565b600082601f830112613c7957613c78614db4565b5b8135613c89848260208601613af3565b91505092915050565b600082601f830112613ca757613ca6614db4565b5b8135613cb7848260208601613b35565b91505092915050565b600081359050613ccf81615233565b92915050565b600081519050613ce481615233565b92915050565b600060208284031215613d0057613cff614dc8565b5b6000613d0e84828501613b77565b91505092915050565b60008060408385031215613d2e57613d2d614dc8565b5b6000613d3c85828601613b77565b9250506020613d4d85828601613b77565b9150509250929050565b600080600060608486031215613d7057613d6f614dc8565b5b6000613d7e86828701613b77565b9350506020613d8f86828701613b77565b9250506040613da086828701613cc0565b9150509250925092565b60008060008060808587031215613dc457613dc3614dc8565b5b6000613dd287828801613b77565b9450506020613de387828801613b77565b9350506040613df487828801613cc0565b925050606085013567ffffffffffffffff811115613e1557613e14614dc3565b5b613e2187828801613c64565b91505092959194509250565b60008060408385031215613e4457613e43614dc8565b5b6000613e5285828601613b77565b9250506020613e6385828601613c10565b9150509250929050565b60008060408385031215613e8457613e83614dc8565b5b6000613e9285828601613b77565b9250506020613ea385828601613cc0565b9150509250929050565b600080600060408486031215613ec657613ec5614dc8565b5b600084013567ffffffffffffffff811115613ee457613ee3614dc3565b5b613ef086828701613b8c565b93509350506020613f0386828701613cc0565b9150509250925092565b600060208284031215613f2357613f22614dc8565b5b6000613f3184828501613c25565b91505092915050565b600060208284031215613f5057613f4f614dc8565b5b6000613f5e84828501613c3a565b91505092915050565b600060208284031215613f7d57613f7c614dc8565b5b6000613f8b84828501613c4f565b91505092915050565b600060208284031215613faa57613fa9614dc8565b5b600082013567ffffffffffffffff811115613fc857613fc7614dc3565b5b613fd484828501613c92565b91505092915050565b600060208284031215613ff357613ff2614dc8565b5b600061400184828501613cc0565b91505092915050565b6000602082840312156140205761401f614dc8565b5b600061402e84828501613cd5565b91505092915050565b6000806040838503121561404e5761404d614dc8565b5b600061405c85828601613cc0565b925050602083013567ffffffffffffffff81111561407d5761407c614dc3565b5b61408985828601613be2565b9150509250929050565b600080604083850312156140aa576140a9614dc8565b5b60006140b885828601613cc0565b92505060206140c985828601613cc0565b9150509250929050565b6140dc81614abd565b82525050565b6140f36140ee82614abd565b614c5b565b82525050565b61410281614acf565b82525050565b61411181614adb565b82525050565b61412861412382614adb565b614c6d565b82525050565b600061413982614965565b614143818561497b565b9350614153818560208601614b7c565b61415c81614dcd565b840191505092915050565b600061417282614970565b61417c818561498c565b935061418c818560208601614b7c565b61419581614dcd565b840191505092915050565b60006141ab82614970565b6141b5818561499d565b93506141c5818560208601614b7c565b80840191505092915050565b60006141de602e8361498c565b91506141e982614deb565b604082019050919050565b6000614201601c8361498c565b915061420c82614e3a565b602082019050919050565b600061422460268361498c565b915061422f82614e63565b604082019050919050565b6000614247601c8361498c565b915061425282614eb2565b602082019050919050565b600061426a601a8361498c565b915061427582614edb565b602082019050919050565b600061428d601a8361498c565b915061429882614f04565b602082019050919050565b60006142b060248361498c565b91506142bb82614f2d565b604082019050919050565b60006142d3601f8361498c565b91506142de82614f7c565b602082019050919050565b60006142f6601c8361498c565b915061430182614fa5565b602082019050919050565b600061431960258361498c565b915061432482614fce565b604082019050919050565b600061433c60188361498c565b91506143478261501d565b602082019050919050565b600061435f60288361498c565b915061436a82615046565b604082019050919050565b600061438260178361498c565b915061438d82615095565b602082019050919050565b60006143a5602a8361498c565b91506143b0826150be565b604082019050919050565b60006143c860058361499d565b91506143d38261510d565b600582019050919050565b60006143eb60208361498c565b91506143f682615136565b602082019050919050565b600061440e602f8361498c565b91506144198261515f565b604082019050919050565b6000614431601c8361498c565b915061443c826151ae565b602082019050919050565b61445081614b11565b82525050565b61445f81614b3f565b82525050565b61447661447182614b3f565b614c89565b82525050565b61448581614b49565b82525050565b61449481614b59565b82525050565b60006144a682846140e2565b60148201915081905092915050565b60006144c18285614117565b6020820191506144d18284614117565b6020820191508190509392505050565b60006144ed82856141a0565b91506144f982846141a0565b9150614504826143bb565b91508190509392505050565b600061451c8285614465565b60208201915061452c8284614465565b6020820191508190509392505050565b600060208201905061455160008301846140d3565b92915050565b600060408201905061456c60008301856140d3565b61457960208301846140d3565b9392505050565b600060808201905061459560008301876140d3565b6145a260208301866140d3565b6145af6040830185614456565b81810360608301526145c1818461412e565b905095945050505050565b60006020820190506145e160008301846140f9565b92915050565b60006020820190506145fc6000830184614108565b92915050565b600060a0820190506146176000830188614108565b614624602083018761448b565b6146316040830186614447565b61463e606083018561447c565b61464b608083018461447c565b9695505050505050565b6000602082019050818103600083015261466f8184614167565b905092915050565b60006020820190508181036000830152614690816141d1565b9050919050565b600060208201905081810360008301526146b0816141f4565b9050919050565b600060208201905081810360008301526146d081614217565b9050919050565b600060208201905081810360008301526146f08161423a565b9050919050565b600060208201905081810360008301526147108161425d565b9050919050565b6000602082019050818103600083015261473081614280565b9050919050565b60006020820190508181036000830152614750816142a3565b9050919050565b60006020820190508181036000830152614770816142c6565b9050919050565b60006020820190508181036000830152614790816142e9565b9050919050565b600060208201905081810360008301526147b08161430c565b9050919050565b600060208201905081810360008301526147d08161432f565b9050919050565b600060208201905081810360008301526147f081614352565b9050919050565b6000602082019050818103600083015261481081614375565b9050919050565b6000602082019050818103600083015261483081614398565b9050919050565b60006020820190508181036000830152614850816143de565b9050919050565b6000602082019050818103600083015261487081614401565b9050919050565b6000602082019050818103600083015261489081614424565b9050919050565b60006020820190506148ac6000830184614456565b92915050565b60006148bc6148cd565b90506148c88282614be1565b919050565b6000604051905090565b600067ffffffffffffffff8211156148f2576148f1614d80565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561491e5761491d614d80565b5b61492782614dcd565b9050602081019050919050565b600067ffffffffffffffff82111561494f5761494e614d80565b5b61495882614dcd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149b382614b3f565b91506149be83614b3f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149f3576149f2614cc4565b5b828201905092915050565b6000614a0982614b3f565b9150614a1483614b3f565b925082614a2457614a23614cf3565b5b828204905092915050565b6000614a3a82614b3f565b9150614a4583614b3f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7e57614a7d614cc4565b5b828202905092915050565b6000614a9482614b3f565b9150614a9f83614b3f565b925082821015614ab257614ab1614cc4565b5b828203905092915050565b6000614ac882614b1f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614b9a578082015181840152602081019050614b7f565b83811115614ba9576000848401525b50505050565b60006002820490506001821680614bc757607f821691505b60208210811415614bdb57614bda614d22565b5b50919050565b614bea82614dcd565b810181811067ffffffffffffffff82111715614c0957614c08614d80565b5b80604052505050565b6000614c1d82614b3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5057614c4f614cc4565b5b600182019050919050565b6000614c6682614c77565b9050919050565b6000819050919050565b6000614c8282614dde565b9050919050565b6000819050919050565b6000614c9e82614b3f565b9150614ca983614b3f565b925082614cb957614cb8614cf3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456d657267656e6379205374617274696e6720496e6465782048617320416c7260008201527f65616479204265656e2055736564000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652077686974656c69737400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6e747261637420686173206e6f2062616c616e636500000000600082015250565b7f4d757374206d696e74206174206c65617374203120746f6b656e000000000000600082015250565b7f5374617274696e6720496e64657820416c726561647920536574000000000000600082015250565b7f50726f76656e616e636520486173682048617320416c7265616479204265656e60008201527f2053657400000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f457863656564732074786e206d696e7420746f6b656e206c696d697400000000600082015250565b7f4f6e6c7920666f756e646572732063616e2063616c6c20746869732066756e6360008201527f74696f6e2e000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374205365742050726f76656e616e636520486173680000000000000000600082015250565b7f596f7520657863656564656420746865206d61782050726573616c65206d696e60008201527f74206c696d69742e000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206d696e7420697320636c6f7365642e000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752065786365656465642074686520616c6c6f7765642070726573616c6560008201527f2074786e206d696e74206c696d69740000000000000000000000000000000000602082015250565b7f596f752063616e6e6f74206d696e7420617420746869732074696d6500000000600082015250565b6151e081614abd565b81146151eb57600080fd5b50565b6151f781614acf565b811461520257600080fd5b50565b61520e81614adb565b811461521957600080fd5b50565b61522581614ae5565b811461523057600080fd5b50565b61523c81614b3f565b811461524757600080fd5b5056fea2646970667358221220860385a08b83c11aeb63ed339c72420516e47302c0b017f1236d5706f6af0b7264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000140000000000000000000000003cd72da9c21bbd8bc343f6a5b4bda7b662090857000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef0000000000000000000000000000000000000000000000000000000000000094

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637cb647591161014f578063cb774d47116100c1578063eb8d24441161007a578063eb8d2444146108d1578063f2fde38b146108fc578063f4a0a52814610925578063f6eaffc81461094e578063fde5f5481461098b578063fffe312f146109a757610272565b8063cb774d47146107d3578063cd8bffff146107fe578063e0c8628914610827578063e83157421461083e578063e89e106a14610869578063e985e9c51461089457610272565b8063b14363bb11610113578063b14363bb146106c3578063b6c7ecf5146106ee578063b88d4fde14610719578063c6ab67a314610742578063c87b56dd1461076d578063cadf6af8146107aa57610272565b80637cb64759146105ff5780638da5cb5b1461062857806395d89b4114610653578063a0712d681461067e578063a22cb4651461069a57610272565b8063270ab52c116101e85780636352211e116101ac5780636352211e146104ed5780636817c76c1461052a5780636c0360eb1461055557806370a0823114610580578063715018a6146105bd5780637501f741146105d457610272565b8063270ab52c1461044457806334918dfd1461046d5780633ccfd60b1461048457806342842e0e1461049b57806355f804b3146104c457610272565b8063109695231161023a578063109695231461037057806318160ddd146103995780631ec0c2b1146103c45780631fe543e3146103db57806321c8d6761461040457806323b872dd1461041b57610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df57806308ebd8b21461031c578063095ea7b314610347575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613f3a565b6109d2565b6040516102ab91906145cc565b60405180910390f35b3480156102c057600080fd5b506102c9610ab4565b6040516102d69190614655565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613fdd565b610b46565b604051610313919061453c565b60405180910390f35b34801561032857600080fd5b50610331610bc2565b60405161033e9190614897565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613e6d565b610bc8565b005b34801561037c57600080fd5b5061039760048036038101906103929190613f94565b610cd3565b005b3480156103a557600080fd5b506103ae610dba565b6040516103bb9190614897565b60405180910390f35b3480156103d057600080fd5b506103d9610dd1565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614037565b610f71565b005b34801561041057600080fd5b50610419611031565b005b34801561042757600080fd5b50610442600480360381019061043d9190613d57565b61113b565b005b34801561045057600080fd5b5061046b60048036038101906104669190613fdd565b61114b565b005b34801561047957600080fd5b50610482611222565b005b34801561049057600080fd5b506104996112ca565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613d57565b6114d5565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613f94565b6114f5565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613fdd565b61158b565b604051610521919061453c565b60405180910390f35b34801561053657600080fd5b5061053f6115a1565b60405161054c9190614897565b60405180910390f35b34801561056157600080fd5b5061056a6115a7565b6040516105779190614655565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613cea565b611635565b6040516105b49190614897565b60405180910390f35b3480156105c957600080fd5b506105d2611705565b005b3480156105e057600080fd5b506105e961178d565b6040516105f69190614897565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613f0d565b611793565b005b34801561063457600080fd5b5061063d611819565b60405161064a919061453c565b60405180910390f35b34801561065f57600080fd5b50610668611843565b6040516106759190614655565b60405180910390f35b61069860048036038101906106939190613fdd565b6118d5565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613e2d565b611a6e565b005b3480156106cf57600080fd5b506106d8611be6565b6040516106e59190614897565b60405180910390f35b3480156106fa57600080fd5b50610703611bec565b60405161071091906145e7565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190613daa565b611bf2565b005b34801561074e57600080fd5b50610757611c6e565b6040516107649190614655565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613fdd565b611cfc565b6040516107a19190614655565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613fdd565b611d9b565b005b3480156107df57600080fd5b506107e8611e72565b6040516107f59190614897565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190614093565b611e78565b005b34801561083357600080fd5b5061083c611f57565b005b34801561084a57600080fd5b50610853612172565b6040516108609190614897565b60405180910390f35b34801561087557600080fd5b5061087e612178565b60405161088b9190614897565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b69190613d17565b61217e565b6040516108c891906145cc565b60405180910390f35b3480156108dd57600080fd5b506108e6612212565b6040516108f391906145cc565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e9190613cea565b612225565b005b34801561093157600080fd5b5061094c60048036038101906109479190613fdd565b61231d565b005b34801561095a57600080fd5b5061097560048036038101906109709190613fdd565b612407565b6040516109829190614897565b60405180910390f35b6109a560048036038101906109a09190613ead565b61242b565b005b3480156109b357600080fd5b506109bc6126f6565b6040516109c99190614897565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad5750610aac826126fc565b5b9050919050565b606060028054610ac390614baf565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef90614baf565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182612766565b610b87576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60115481565b6000610bd38261158b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5a6127b4565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c8c5750610c8a81610c856127b4565b61217e565b155b15610cc3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cce8383836127bc565b505050565b610cdb6127b4565b73ffffffffffffffffffffffffffffffffffffffff16610cf9611819565b73ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690614837565b60405180910390fd5b6000600f8054610d5e90614baf565b905014610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614737565b60405180910390fd5b80600f9080519060200190610db692919061399d565b5050565b6000610dc461286e565b6001546000540303905090565b610dd96127b4565b73ffffffffffffffffffffffffffffffffffffffff16610df7611819565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4490614837565b60405180910390fd5b600060105414610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614717565b60405180910390fd5b600060115414610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90614677565b60405180910390fd5b6000600f8054610ee690614baf565b905011610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f906147b7565b60405180910390fd5b6013544244604051602001610f3e929190614510565b6040516020818303038152906040528051906020012060001c610f619190614c93565b6010819055506001601181905550565b7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102357337f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161101a929190614557565b60405180910390fd5b61102d8282612873565b5050565b6110396127b4565b73ffffffffffffffffffffffffffffffffffffffff16611057611819565b73ffffffffffffffffffffffffffffffffffffffff16146110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490614837565b60405180910390fd5b6013546110cb60326110bd610dba565b6128a690919063ffffffff16565b111561110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110390614817565b60405180910390fd5b611139601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660326128bc565b565b6111468383836128da565b505050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111d957506111aa611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614797565b60405180910390fd5b8060128190555050565b61122a6127b4565b73ffffffffffffffffffffffffffffffffffffffff16611248611819565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590614837565b60405180910390fd5b601960149054906101000a900460ff1615601960146101000a81548160ff021916908315150217905550565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113585750611329611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90614797565b60405180910390fd5b600047116113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906146d7565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61143e610fa0611430607d47612d9090919063ffffffff16565b612da690919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611469573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114d2573d6000803e3d6000fd5b50565b6114f083838360405180602001604052806000815250611bf2565b505050565b6114fd6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661151b611819565b73ffffffffffffffffffffffffffffffffffffffff1614611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890614837565b60405180910390fd5b80600e908051906020019061158792919061399d565b5050565b600061159682612dbc565b600001519050919050565b601a5481565b600e80546115b490614baf565b80601f01602080910402602001604051908101604052809291908181526020018280546115e090614baf565b801561162d5780601f106116025761010080835404028352916020019161162d565b820191906000526020600020905b81548152906001019060200180831161161057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61170d6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661172b611819565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614837565b60405180910390fd5b61178b600061304b565b565b60125481565b61179b6127b4565b73ffffffffffffffffffffffffffffffffffffffff166117b9611819565b73ffffffffffffffffffffffffffffffffffffffff161461180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690614837565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461185290614baf565b80601f016020809104026020016040519081016040528092919081815260200182805461187e90614baf565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b5050505050905090565b601960149054906101000a900460ff16611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90614877565b60405180910390fd5b60008111611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e906146f7565b60405180910390fd5b6012548111156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390614777565b60405180910390fd5b6013546119c9826119bb610dba565b6128a690919063ffffffff16565b1115611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614817565b60405180910390fd5b34611a2082601a54612d9090919063ffffffff16565b1115611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614757565b60405180910390fd5b611a6b33826128bc565b50565b611a766127b4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611adb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ae86127b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b956127b4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bda91906145cc565b60405180910390a35050565b60155481565b60165481565b611bfd8484846128da565b611c1c8373ffffffffffffffffffffffffffffffffffffffff16613111565b8015611c315750611c2f84848484613124565b155b15611c68576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600f8054611c7b90614baf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca790614baf565b8015611cf45780601f10611cc957610100808354040283529160200191611cf4565b820191906000526020600020905b815481529060010190602001808311611cd757829003601f168201915b505050505081565b6060611d0782612766565b611d3d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d47613284565b9050600081511415611d685760405180602001604052806000815250611d93565b80611d7284613316565b604051602001611d839291906144e1565b6040516020818303038152906040525b915050919050565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e295750611dfa611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614797565b60405180910390fd5b8060148190555050565b60105481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f065750611ed7611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90614797565b60405180910390fd5b81601581905550806014819055505050565b611f5f6127b4565b73ffffffffffffffffffffffffffffffffffffffff16611f7d611819565b73ffffffffffffffffffffffffffffffffffffffff1614611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90614837565b60405180910390fd5b600060105414612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f90614717565b60405180910390fd5b6000600f805461202790614baf565b905011612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906147b7565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600a54600960149054906101000a900467ffffffffffffffff16600b60049054906101000a900461ffff16600b60009054906101000a900463ffffffff16600b60069054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401612118959493929190614602565b602060405180830381600087803b15801561213257600080fd5b505af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a919061400a565b600d81905550565b60135481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601960149054906101000a900460ff1681565b61222d6127b4565b73ffffffffffffffffffffffffffffffffffffffff1661224b611819565b73ffffffffffffffffffffffffffffffffffffffff16146122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890614837565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612308906146b7565b60405180910390fd5b61231a8161304b565b50565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123ab575061237c611819565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e190614797565b60405180910390fd5b67016345785d8a0000816123fe9190614a2f565b601a8190555050565b600c818154811061241757600080fd5b906000526020600020016000915090505481565b601960149054906101000a900460ff161561247b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612472906147f7565b60405180910390fd5b612486838333613477565b6124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90614697565b60405180910390fd5b60008111612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff906146f7565b60405180910390fd5b60155481111561254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254490614857565b60405180910390fd5b60145481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461259b91906149a8565b11156125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d3906147d7565b60405180910390fd5b6013546125f9826125eb610dba565b6128a690919063ffffffff16565b111561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263190614817565b60405180910390fd5b3461265082601a54612d9090919063ffffffff16565b1115612691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268890614757565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e091906149a8565b925050819055506126f133826128bc565b505050565b60145481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161277161286e565b11158015612780575060005482105b80156127ad575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6013548160008151811061288a57612889614d51565b5b602002602001015161289c9190614c93565b6010819055505050565b600081836128b491906149a8565b905092915050565b6128d68282604051806020016040528060008152506134fb565b5050565b60006128e582612dbc565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612950576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129716127b4565b73ffffffffffffffffffffffffffffffffffffffff1614806129a0575061299f8561299a6127b4565b61217e565b5b806129e557506129ae6127b4565b73ffffffffffffffffffffffffffffffffffffffff166129cd84610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a1e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a85576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a92858585600161350d565b612a9e600084876127bc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d1e576000548214612d1d57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d898585856001613513565b5050505050565b60008183612d9e9190614a2f565b905092915050565b60008183612db491906149fe565b905092915050565b612dc4613a23565b600082905080612dd261286e565b11158015612de1575060005481105b15613014576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161301257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ef6578092505050613046565b5b60011561301157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461300c578092505050613046565b612ef7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261314a6127b4565b8786866040518563ffffffff1660e01b815260040161316c9493929190614580565b602060405180830381600087803b15801561318657600080fd5b505af19250505080156131b757506040513d601f19601f820116820180604052508101906131b49190613f67565b60015b613231573d80600081146131e7576040519150601f19603f3d011682016040523d82523d6000602084013e6131ec565b606091505b50600081511415613229576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e805461329390614baf565b80601f01602080910402602001604051908101604052809291908181526020018280546132bf90614baf565b801561330c5780601f106132e15761010080835404028352916020019161330c565b820191906000526020600020905b8154815290600101906020018083116132ef57829003601f168201915b5050505050905090565b6060600082141561335e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613472565b600082905060005b6000821461339057808061337990614c12565b915050600a8261338991906149fe565b9150613366565b60008167ffffffffffffffff8111156133ac576133ab614d80565b5b6040519080825280601f01601f1916602001820160405280156133de5781602001600182028036833780820191505090505b5090505b6000851461346b576001826133f79190614a89565b9150600a856134069190614c93565b603061341291906149a8565b60f81b81838151811061342857613427614d51565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561346491906149fe565b94506133e2565b8093505050505b919050565b6000808260405160200161348b919061449a565b6040516020818303038152906040528051906020012090506134f1858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483613519565b9150509392505050565b61350883838360016135cf565b505050565b50505050565b50505050565b60008082905060005b85518110156135c15760008682815181106135405761353f614d51565b5b602002602001015190508083116135815782816040516020016135649291906144b5565b6040516020818303038152906040528051906020012092506135ad565b80836040516020016135949291906144b5565b6040516020818303038152906040528051906020012092505b5080806135b990614c12565b915050613522565b508381149150509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561363c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613677576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613684600086838761350d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561384e575061384d8773ffffffffffffffffffffffffffffffffffffffff16613111565b5b15613914575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138c36000888480600101955088613124565b6138f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561385457826000541461390f57600080fd5b613980565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613915575b8160008190555050506139966000868387613513565b5050505050565b8280546139a990614baf565b90600052602060002090601f0160209004810192826139cb5760008555613a12565b82601f106139e457805160ff1916838001178555613a12565b82800160010185558215613a12579182015b82811115613a115782518255916020019190600101906139f6565b5b509050613a1f9190613a66565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613a7f576000816000905550600101613a67565b5090565b6000613a96613a91846148d7565b6148b2565b90508083825260208201905082856020860282011115613ab957613ab8614db9565b5b60005b85811015613ae95781613acf8882613cc0565b845260208401935060208301925050600181019050613abc565b5050509392505050565b6000613b06613b0184614903565b6148b2565b905082815260208101848484011115613b2257613b21614dbe565b5b613b2d848285614b6d565b509392505050565b6000613b48613b4384614934565b6148b2565b905082815260208101848484011115613b6457613b63614dbe565b5b613b6f848285614b6d565b509392505050565b600081359050613b86816151d7565b92915050565b60008083601f840112613ba257613ba1614db4565b5b8235905067ffffffffffffffff811115613bbf57613bbe614daf565b5b602083019150836020820283011115613bdb57613bda614db9565b5b9250929050565b600082601f830112613bf757613bf6614db4565b5b8135613c07848260208601613a83565b91505092915050565b600081359050613c1f816151ee565b92915050565b600081359050613c3481615205565b92915050565b600081359050613c498161521c565b92915050565b600081519050613c5e8161521c565b92915050565b600082601f830112613c7957613c78614db4565b5b8135613c89848260208601613af3565b91505092915050565b600082601f830112613ca757613ca6614db4565b5b8135613cb7848260208601613b35565b91505092915050565b600081359050613ccf81615233565b92915050565b600081519050613ce481615233565b92915050565b600060208284031215613d0057613cff614dc8565b5b6000613d0e84828501613b77565b91505092915050565b60008060408385031215613d2e57613d2d614dc8565b5b6000613d3c85828601613b77565b9250506020613d4d85828601613b77565b9150509250929050565b600080600060608486031215613d7057613d6f614dc8565b5b6000613d7e86828701613b77565b9350506020613d8f86828701613b77565b9250506040613da086828701613cc0565b9150509250925092565b60008060008060808587031215613dc457613dc3614dc8565b5b6000613dd287828801613b77565b9450506020613de387828801613b77565b9350506040613df487828801613cc0565b925050606085013567ffffffffffffffff811115613e1557613e14614dc3565b5b613e2187828801613c64565b91505092959194509250565b60008060408385031215613e4457613e43614dc8565b5b6000613e5285828601613b77565b9250506020613e6385828601613c10565b9150509250929050565b60008060408385031215613e8457613e83614dc8565b5b6000613e9285828601613b77565b9250506020613ea385828601613cc0565b9150509250929050565b600080600060408486031215613ec657613ec5614dc8565b5b600084013567ffffffffffffffff811115613ee457613ee3614dc3565b5b613ef086828701613b8c565b93509350506020613f0386828701613cc0565b9150509250925092565b600060208284031215613f2357613f22614dc8565b5b6000613f3184828501613c25565b91505092915050565b600060208284031215613f5057613f4f614dc8565b5b6000613f5e84828501613c3a565b91505092915050565b600060208284031215613f7d57613f7c614dc8565b5b6000613f8b84828501613c4f565b91505092915050565b600060208284031215613faa57613fa9614dc8565b5b600082013567ffffffffffffffff811115613fc857613fc7614dc3565b5b613fd484828501613c92565b91505092915050565b600060208284031215613ff357613ff2614dc8565b5b600061400184828501613cc0565b91505092915050565b6000602082840312156140205761401f614dc8565b5b600061402e84828501613cd5565b91505092915050565b6000806040838503121561404e5761404d614dc8565b5b600061405c85828601613cc0565b925050602083013567ffffffffffffffff81111561407d5761407c614dc3565b5b61408985828601613be2565b9150509250929050565b600080604083850312156140aa576140a9614dc8565b5b60006140b885828601613cc0565b92505060206140c985828601613cc0565b9150509250929050565b6140dc81614abd565b82525050565b6140f36140ee82614abd565b614c5b565b82525050565b61410281614acf565b82525050565b61411181614adb565b82525050565b61412861412382614adb565b614c6d565b82525050565b600061413982614965565b614143818561497b565b9350614153818560208601614b7c565b61415c81614dcd565b840191505092915050565b600061417282614970565b61417c818561498c565b935061418c818560208601614b7c565b61419581614dcd565b840191505092915050565b60006141ab82614970565b6141b5818561499d565b93506141c5818560208601614b7c565b80840191505092915050565b60006141de602e8361498c565b91506141e982614deb565b604082019050919050565b6000614201601c8361498c565b915061420c82614e3a565b602082019050919050565b600061422460268361498c565b915061422f82614e63565b604082019050919050565b6000614247601c8361498c565b915061425282614eb2565b602082019050919050565b600061426a601a8361498c565b915061427582614edb565b602082019050919050565b600061428d601a8361498c565b915061429882614f04565b602082019050919050565b60006142b060248361498c565b91506142bb82614f2d565b604082019050919050565b60006142d3601f8361498c565b91506142de82614f7c565b602082019050919050565b60006142f6601c8361498c565b915061430182614fa5565b602082019050919050565b600061431960258361498c565b915061432482614fce565b604082019050919050565b600061433c60188361498c565b91506143478261501d565b602082019050919050565b600061435f60288361498c565b915061436a82615046565b604082019050919050565b600061438260178361498c565b915061438d82615095565b602082019050919050565b60006143a5602a8361498c565b91506143b0826150be565b604082019050919050565b60006143c860058361499d565b91506143d38261510d565b600582019050919050565b60006143eb60208361498c565b91506143f682615136565b602082019050919050565b600061440e602f8361498c565b91506144198261515f565b604082019050919050565b6000614431601c8361498c565b915061443c826151ae565b602082019050919050565b61445081614b11565b82525050565b61445f81614b3f565b82525050565b61447661447182614b3f565b614c89565b82525050565b61448581614b49565b82525050565b61449481614b59565b82525050565b60006144a682846140e2565b60148201915081905092915050565b60006144c18285614117565b6020820191506144d18284614117565b6020820191508190509392505050565b60006144ed82856141a0565b91506144f982846141a0565b9150614504826143bb565b91508190509392505050565b600061451c8285614465565b60208201915061452c8284614465565b6020820191508190509392505050565b600060208201905061455160008301846140d3565b92915050565b600060408201905061456c60008301856140d3565b61457960208301846140d3565b9392505050565b600060808201905061459560008301876140d3565b6145a260208301866140d3565b6145af6040830185614456565b81810360608301526145c1818461412e565b905095945050505050565b60006020820190506145e160008301846140f9565b92915050565b60006020820190506145fc6000830184614108565b92915050565b600060a0820190506146176000830188614108565b614624602083018761448b565b6146316040830186614447565b61463e606083018561447c565b61464b608083018461447c565b9695505050505050565b6000602082019050818103600083015261466f8184614167565b905092915050565b60006020820190508181036000830152614690816141d1565b9050919050565b600060208201905081810360008301526146b0816141f4565b9050919050565b600060208201905081810360008301526146d081614217565b9050919050565b600060208201905081810360008301526146f08161423a565b9050919050565b600060208201905081810360008301526147108161425d565b9050919050565b6000602082019050818103600083015261473081614280565b9050919050565b60006020820190508181036000830152614750816142a3565b9050919050565b60006020820190508181036000830152614770816142c6565b9050919050565b60006020820190508181036000830152614790816142e9565b9050919050565b600060208201905081810360008301526147b08161430c565b9050919050565b600060208201905081810360008301526147d08161432f565b9050919050565b600060208201905081810360008301526147f081614352565b9050919050565b6000602082019050818103600083015261481081614375565b9050919050565b6000602082019050818103600083015261483081614398565b9050919050565b60006020820190508181036000830152614850816143de565b9050919050565b6000602082019050818103600083015261487081614401565b9050919050565b6000602082019050818103600083015261489081614424565b9050919050565b60006020820190506148ac6000830184614456565b92915050565b60006148bc6148cd565b90506148c88282614be1565b919050565b6000604051905090565b600067ffffffffffffffff8211156148f2576148f1614d80565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561491e5761491d614d80565b5b61492782614dcd565b9050602081019050919050565b600067ffffffffffffffff82111561494f5761494e614d80565b5b61495882614dcd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149b382614b3f565b91506149be83614b3f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149f3576149f2614cc4565b5b828201905092915050565b6000614a0982614b3f565b9150614a1483614b3f565b925082614a2457614a23614cf3565b5b828204905092915050565b6000614a3a82614b3f565b9150614a4583614b3f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7e57614a7d614cc4565b5b828202905092915050565b6000614a9482614b3f565b9150614a9f83614b3f565b925082821015614ab257614ab1614cc4565b5b828203905092915050565b6000614ac882614b1f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614b9a578082015181840152602081019050614b7f565b83811115614ba9576000848401525b50505050565b60006002820490506001821680614bc757607f821691505b60208210811415614bdb57614bda614d22565b5b50919050565b614bea82614dcd565b810181811067ffffffffffffffff82111715614c0957614c08614d80565b5b80604052505050565b6000614c1d82614b3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5057614c4f614cc4565b5b600182019050919050565b6000614c6682614c77565b9050919050565b6000819050919050565b6000614c8282614dde565b9050919050565b6000819050919050565b6000614c9e82614b3f565b9150614ca983614b3f565b925082614cb957614cb8614cf3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456d657267656e6379205374617274696e6720496e6465782048617320416c7260008201527f65616479204265656e2055736564000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652077686974656c69737400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6e747261637420686173206e6f2062616c616e636500000000600082015250565b7f4d757374206d696e74206174206c65617374203120746f6b656e000000000000600082015250565b7f5374617274696e6720496e64657820416c726561647920536574000000000000600082015250565b7f50726f76656e616e636520486173682048617320416c7265616479204265656e60008201527f2053657400000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f457863656564732074786e206d696e7420746f6b656e206c696d697400000000600082015250565b7f4f6e6c7920666f756e646572732063616e2063616c6c20746869732066756e6360008201527f74696f6e2e000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374205365742050726f76656e616e636520486173680000000000000000600082015250565b7f596f7520657863656564656420746865206d61782050726573616c65206d696e60008201527f74206c696d69742e000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206d696e7420697320636c6f7365642e000000000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752065786365656465642074686520616c6c6f7765642070726573616c6560008201527f2074786e206d696e74206c696d69740000000000000000000000000000000000602082015250565b7f596f752063616e6e6f74206d696e7420617420746869732074696d6500000000600082015250565b6151e081614abd565b81146151eb57600080fd5b50565b6151f781614acf565b811461520257600080fd5b50565b61520e81614adb565b811461521957600080fd5b50565b61522581614ae5565b811461523057600080fd5b50565b61523c81614b3f565b811461524757600080fd5b5056fea2646970667358221220860385a08b83c11aeb63ed339c72420516e47302c0b017f1236d5706f6af0b7264736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000140000000000000000000000003cd72da9c21bbd8bc343f6a5b4bda7b662090857000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef0000000000000000000000000000000000000000000000000000000000000094

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 10000
Arg [1] : maxTotalMints (uint256): 20
Arg [2] : founders (address): 0x3Cd72dA9c21BBD8Bc343F6A5B4BDa7b662090857
Arg [3] : vrfCoordinator (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [4] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [5] : subscriptionId (uint64): 148

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [2] : 0000000000000000000000003cd72da9c21bbd8bc343f6a5b4bda7b662090857
Arg [3] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [4] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000094


Deployed Bytecode Sourcemap

63979:6012:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23538:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26651:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28181:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64433:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27744:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65382:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22787:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69545:441;;;;;;;;;;;;;:::i;:::-;;63635:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66257:191;;;;;;;;;;;;;:::i;:::-;;29046:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68764:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68139:89;;;;;;;;;;;;;:::i;:::-;;65601:253;;;;;;;;;;;;;:::i;:::-;;29287:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65860:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26459:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64806:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64338:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23907:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42970:94;;;;;;;;;;;;;:::i;:::-;;64479:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68539:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42319:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26820:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66454:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28457:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64578:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64620:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29543:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64367:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26995:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68645:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64400:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67921:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68985:367;;;;;;;;;;;;;:::i;:::-;;64506:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64305:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28815:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64769:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43219:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68865:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64270:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67006:909;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64535:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23538:305;23640:4;23692:25;23677:40;;;:11;:40;;;;:105;;;;23749:33;23734:48;;;:11;:48;;;;23677:105;:158;;;;23799:36;23823:11;23799:23;:36::i;:::-;23677:158;23657:178;;23538:305;;;:::o;26651:100::-;26705:13;26738:5;26731:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26651:100;:::o;28181:204::-;28249:7;28274:16;28282:7;28274;:16::i;:::-;28269:64;;28299:34;;;;;;;;;;;;;;28269:64;28353:15;:24;28369:7;28353:24;;;;;;;;;;;;;;;;;;;;;28346:31;;28181:204;;;:::o;64433:41::-;;;;:::o;27744:371::-;27817:13;27833:24;27849:7;27833:15;:24::i;:::-;27817:40;;27878:5;27872:11;;:2;:11;;;27868:48;;;27892:24;;;;;;;;;;;;;;27868:48;27949:5;27933:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;27959:37;27976:5;27983:12;:10;:12::i;:::-;27959:16;:37::i;:::-;27958:38;27933:63;27929:138;;;28020:35;;;;;;;;;;;;;;27929:138;28079:28;28088:2;28092:7;28101:5;28079:8;:28::i;:::-;27806:309;27744:371;;:::o;65382:213::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65508:1:::1;65484:14;65478:28;;;;;:::i;:::-;;;:31;65470:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;65574:15;65557:14;:32;;;;;;;;;;;;:::i;:::-;;65382:213:::0;:::o;22787:303::-;22831:7;23056:15;:13;:15::i;:::-;23041:12;;23025:13;;:28;:46;23018:53;;22787:303;:::o;69545:441::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69633:1:::1;69616:13;;:18;69608:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69710:1;69680:26;;:31;69672:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;69806:1;69783:14;69777:28;;;;;:::i;:::-;;;:30;69769:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69930:9;;69891:15;69908:16;69874:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69864:62;;;;;;69859:68;;:80;;;;:::i;:::-;69843:13;:96;;;;69979:1;69950:26;:30;;;;69545:441::o:0;63635:261::-;63749:14;63735:28;;:10;:28;;;63731:111;;63807:10;63819:14;63781:53;;;;;;;;;;;;:::i;:::-;;;;;;;;63731:111;63848:42;63867:9;63878:11;63848:18;:42::i;:::-;63635:261;;:::o;66257:191::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66345:9:::1;;66320:21;66338:2;66320:13;:11;:13::i;:::-;:17;;:21;;;;:::i;:::-;:34;;66312:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;66414:28;66424:13;;;;;;;;;;;66439:2;66414:9;:28::i;:::-;66257:191::o:0;29046:170::-;29180:28;29190:4;29196:2;29200:7;29180:9;:28::i;:::-;29046:170;;;:::o;68764:95::-;66114:13;;;;;;;;;;;66100:27;;:10;:27;;;:52;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66100:52;66092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68846:7:::1;68836;:17;;;;68764:95:::0;:::o;68139:89::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68210:12:::1;;;;;;;;;;;68209:13;68194:12;;:28;;;;;;;;;;;;;;;;;;68139:89::o:0;65601:253::-;66114:13;;;;;;;;;;;66100:27;;:10;:27;;;:52;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66100:52;66092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;65686:1:::1;65662:21;:25;65654:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65733:10;;;;;;;;;;;:19;;:61;65753:40;65788:4;65753:30;65779:3;65753:21;:25;;:30;;;;:::i;:::-;:34;;:40;;;;:::i;:::-;65733:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65801:13;;;;;;;;;;;:22;;:45;65824:21;65801:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65601:253::o:0;29287:185::-;29425:39;29442:4;29448:2;29452:7;29425:39;;;;;;;;;;;;:16;:39::i;:::-;29287:185;;;:::o;65860:90::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65938:6:::1;65928:7;:16;;;;;;;;;;;;:::i;:::-;;65860:90:::0;:::o;26459:125::-;26523:7;26550:21;26563:7;26550:12;:21::i;:::-;:26;;;26543:33;;26459:125;;;:::o;64806:36::-;;;;:::o;64338:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23907:206::-;23971:7;24012:1;23995:19;;:5;:19;;;23991:60;;;24023:28;;;;;;;;;;;;;;23991:60;24077:12;:19;24090:5;24077:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24069:36;;24062:43;;23907:206;;;:::o;42970:94::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43035:21:::1;43053:1;43035:9;:21::i;:::-;42970:94::o:0;64479:22::-;;;;:::o;68539:100::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68622:11:::1;68609:10;:24;;;;68539:100:::0;:::o;42319:87::-;42365:7;42392:6;;;;;;;;;;;42385:13;;42319:87;:::o;26820:104::-;26876:13;26909:7;26902:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26820:104;:::o;66454:546::-;66518:12;;;;;;;;;;;66510:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66590:1;66579:8;:12;66571:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;66649:7;;66637:8;:19;;66629:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;66735:9;;66704:27;66722:8;66704:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:40;;66696:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;66833:9;66806:23;66820:8;66806:9;;:13;;:23;;;;:::i;:::-;:36;;66798:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;66963:31;66973:10;66985:8;66963:9;:31::i;:::-;66454:546;:::o;28457:287::-;28568:12;:10;:12::i;:::-;28556:24;;:8;:24;;;28552:54;;;28589:17;;;;;;;;;;;;;;28552:54;28664:8;28619:18;:32;28638:12;:10;:12::i;:::-;28619:32;;;;;;;;;;;;;;;:42;28652:8;28619:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28717:8;28688:48;;28703:12;:10;:12::i;:::-;28688:48;;;28727:8;28688:48;;;;;;:::i;:::-;;;;;;;;28457:287;;:::o;64578:37::-;;;;:::o;64620:25::-;;;;:::o;29543:369::-;29710:28;29720:4;29726:2;29730:7;29710:9;:28::i;:::-;29753:15;:2;:13;;;:15::i;:::-;:76;;;;;29773:56;29804:4;29810:2;29814:7;29823:5;29773:30;:56::i;:::-;29772:57;29753:76;29749:156;;;29853:40;;;;;;;;;;;;;;29749:156;29543:369;;;;:::o;64367:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26995:326::-;27068:13;27099:16;27107:7;27099;:16::i;:::-;27094:59;;27124:29;;;;;;;;;;;;;;27094:59;27166:21;27190:10;:8;:10::i;:::-;27166:34;;27243:1;27224:7;27218:21;:26;;:95;;;;;;;;;;;;;;;;;27271:7;27280:18;:7;:16;:18::i;:::-;27254:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27218:95;27211:102;;;26995:326;;;:::o;68645:113::-;66114:13;;;;;;;;;;;66100:27;;:10;:27;;;:52;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66100:52;66092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68745:7:::1;68723:19;:29;;;;68645:113:::0;:::o;64400:28::-;;;;:::o;67921:212::-;66114:13;;;;;;;;;;;66100:27;;:10;:27;;;:52;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66100:52;66092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68059:19:::1;68038:18;:40;;;;68107:20;68085:19;:42;;;;67921:212:::0;;:::o;68985:367::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69066:1:::1;69049:13;;:18;69041:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69142:1;69119:14;69113:28;;;;;:::i;:::-;;;:30;69105:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69195:11;;;;;;;;;;;:30;;;69234:7;;69250:16;;;;;;;;;;;69275:20;;;;;;;;;;;69304:16;;;;;;;;;;;69329:8;;;;;;;;;;;69195:149;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69181:11;:163;;;;68985:367::o:0;64506:24::-;;;;:::o;64305:26::-;;;;:::o;28815:164::-;28912:4;28936:18;:25;28955:5;28936:25;;;;;;;;;;;;;;;:35;28962:8;28936:35;;;;;;;;;;;;;;;;;;;;;;;;;28929:42;;28815:164;;;;:::o;64769:32::-;;;;;;;;;;;;;:::o;43219:192::-;42550:12;:10;:12::i;:::-;42539:23;;:7;:5;:7::i;:::-;:23;;;42531:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43328:1:::1;43308:22;;:8;:22;;;;43300:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43384:19;43394:8;43384:9;:19::i;:::-;43219:192:::0;:::o;68865:114::-;66114:13;;;;;;;;;;;66100:27;;:10;:27;;;:52;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66100:52;66092:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68966:6:::1;68951:12;:21;;;;:::i;:::-;68938:9;:35;;;;68865:114:::0;:::o;64270:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67006:909::-;67104:12;;;;;;;;;;;67103:13;67095:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;67159:44;67185:5;;67192:10;67159:25;:44::i;:::-;67151:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;67262:1;67251:8;:12;67243:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;67321:18;;67309:8;:30;;67301:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;67442:19;;67430:8;67406:9;:21;67416:10;67406:21;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;67398:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;67556:9;;67525:27;67543:8;67525:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:40;;67517:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67654:9;67627:23;67641:8;67627:9;;:13;;:23;;;;:::i;:::-;:36;;67619:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;67779:8;67754:9;:21;67764:10;67754:21;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;67876:31;67886:10;67898:8;67876:9;:31::i;:::-;67006:909;;;:::o;64535:38::-;;;;:::o;19106:157::-;19191:4;19230:25;19215:40;;;:11;:40;;;;19208:47;;19106:157;;;:::o;30167:187::-;30224:4;30267:7;30248:15;:13;:15::i;:::-;:26;;:53;;;;;30288:13;;30278:7;:23;30248:53;:98;;;;;30319:11;:20;30331:7;30319:20;;;;;;;;;;;:27;;;;;;;;;;;;30318:28;30248:98;30241:105;;30167:187;;;:::o;16026:98::-;16079:7;16106:10;16099:17;;16026:98;:::o;38337:196::-;38479:2;38452:15;:24;38468:7;38452:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38517:7;38513:2;38497:28;;38506:5;38497:28;;;;;;;;;;;;38337:196;;;:::o;22561:92::-;22617:7;22561:92;:::o;69360:179::-;69520:9;;69503:11;69515:1;69503:14;;;;;;;;:::i;:::-;;;;;;;;:26;;;;:::i;:::-;69487:13;:42;;;;69360:179;;:::o;46391:98::-;46449:7;46480:1;46476;:5;;;;:::i;:::-;46469:12;;46391:98;;;;:::o;30362:104::-;30431:27;30441:2;30445:8;30431:27;;;;;;;;;;;;:9;:27::i;:::-;30362:104;;:::o;33280:2130::-;33395:35;33433:21;33446:7;33433:12;:21::i;:::-;33395:59;;33493:4;33471:26;;:13;:18;;;:26;;;33467:67;;33506:28;;;;;;;;;;;;;;33467:67;33547:22;33589:4;33573:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;33610:36;33627:4;33633:12;:10;:12::i;:::-;33610:16;:36::i;:::-;33573:73;:126;;;;33687:12;:10;:12::i;:::-;33663:36;;:20;33675:7;33663:11;:20::i;:::-;:36;;;33573:126;33547:153;;33718:17;33713:66;;33744:35;;;;;;;;;;;;;;33713:66;33808:1;33794:16;;:2;:16;;;33790:52;;;33819:23;;;;;;;;;;;;;;33790:52;33855:43;33877:4;33883:2;33887:7;33896:1;33855:21;:43::i;:::-;33963:35;33980:1;33984:7;33993:4;33963:8;:35::i;:::-;34324:1;34294:12;:18;34307:4;34294:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34368:1;34340:12;:16;34353:2;34340:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34386:31;34420:11;:20;34432:7;34420:20;;;;;;;;;;;34386:54;;34471:2;34455:8;:13;;;:18;;;;;;;;;;;;;;;;;;34521:15;34488:8;:23;;;:49;;;;;;;;;;;;;;;;;;34789:19;34821:1;34811:7;:11;34789:33;;34837:31;34871:11;:24;34883:11;34871:24;;;;;;;;;;;34837:58;;34939:1;34914:27;;:8;:13;;;;;;;;;;;;:27;;;34910:384;;;35124:13;;35109:11;:28;35105:174;;35178:4;35162:8;:13;;;:20;;;;;;;;;;;;;;;;;;35231:13;:28;;;35205:8;:23;;;:54;;;;;;;;;;;;;;;;;;35105:174;34910:384;34269:1036;;;35341:7;35337:2;35322:27;;35331:4;35322:27;;;;;;;;;;;;35360:42;35381:4;35387:2;35391:7;35400:1;35360:20;:42::i;:::-;33384:2026;;33280:2130;;;:::o;47129:98::-;47187:7;47218:1;47214;:5;;;;:::i;:::-;47207:12;;47129:98;;;;:::o;47528:::-;47586:7;47617:1;47613;:5;;;;:::i;:::-;47606:12;;47528:98;;;;:::o;25288:1109::-;25350:21;;:::i;:::-;25384:12;25399:7;25384:22;;25467:4;25448:15;:13;:15::i;:::-;:23;;:47;;;;;25482:13;;25475:4;:20;25448:47;25444:886;;;25516:31;25550:11;:17;25562:4;25550:17;;;;;;;;;;;25516:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25591:9;:16;;;25586:729;;25662:1;25636:28;;:9;:14;;;:28;;;25632:101;;25700:9;25693:16;;;;;;25632:101;26035:261;26042:4;26035:261;;;26075:6;;;;;;;;26120:11;:17;26132:4;26120:17;;;;;;;;;;;26108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26194:1;26168:28;;:9;:14;;;:28;;;26164:109;;26236:9;26229:16;;;;;;26164:109;26035:261;;;25586:729;25497:833;25444:886;26358:31;;;;;;;;;;;;;;25288:1109;;;;:::o;43419:173::-;43475:16;43494:6;;;;;;;;;;;43475:25;;43520:8;43511:6;;:17;;;;;;;;;;;;;;;;;;43575:8;43544:40;;43565:8;43544:40;;;;;;;;;;;;43464:128;43419:173;:::o;8070:387::-;8130:4;8338:12;8405:7;8393:20;8385:28;;8448:1;8441:4;:8;8434:15;;;8070:387;;;:::o;39025:667::-;39188:4;39225:2;39209:36;;;39246:12;:10;:12::i;:::-;39260:4;39266:7;39275:5;39209:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39205:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39460:1;39443:6;:13;:18;39439:235;;;39489:40;;;;;;;;;;;;;;39439:235;39632:6;39626:13;39617:6;39613:2;39609:15;39602:38;39205:480;39338:45;;;39328:55;;;:6;:55;;;;39321:62;;;39025:667;;;;;;:::o;65957:94::-;66009:13;66038:7;66031:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65957:94;:::o;16551:723::-;16607:13;16837:1;16828:5;:10;16824:53;;;16855:10;;;;;;;;;;;;;;;;;;;;;16824:53;16887:12;16902:5;16887:20;;16918:14;16943:78;16958:1;16950:4;:9;16943:78;;16976:8;;;;;:::i;:::-;;;;17007:2;16999:10;;;;;:::i;:::-;;;16943:78;;;17031:19;17063:6;17053:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17031:39;;17081:154;17097:1;17088:5;:10;17081:154;;17125:1;17115:11;;;;;:::i;:::-;;;17192:2;17184:5;:10;;;;:::i;:::-;17171:2;:24;;;;:::i;:::-;17158:39;;17141:6;17148;17141:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17221:2;17212:11;;;;;:::i;:::-;;;17081:154;;;17259:6;17245:21;;;;;16551:723;;;;:::o;68234:299::-;68336:4;68418:12;68460:8;68443:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;68433:37;;;;;;68418:52;;68484:43;68503:5;;68484:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68510:10;;68522:4;68484:18;:43::i;:::-;68477:50;;;68234:299;;;;;:::o;30829:163::-;30952:32;30958:2;30962:8;30972:5;30979:4;30952:5;:32::i;:::-;30829:163;;;:::o;40340:159::-;;;;;:::o;41158:158::-;;;;;:::o;51393:830::-;51518:4;51535:20;51558:4;51535:27;;51580:9;51575:525;51599:5;:12;51595:1;:16;51575:525;;;51633:20;51656:5;51662:1;51656:8;;;;;;;;:::i;:::-;;;;;;;;51633:31;;51701:12;51685;:28;51681:408;;51855:12;51869;51838:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51828:55;;;;;;51813:70;;51681:408;;;52045:12;52059;52028:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52018:55;;;;;;52003:70;;51681:408;51618:482;51613:3;;;;;:::i;:::-;;;;51575:525;;;;52211:4;52195:12;:20;52188:27;;;51393:830;;;;;:::o;31251:1775::-;31390:20;31413:13;;31390:36;;31455:1;31441:16;;:2;:16;;;31437:48;;;31466:19;;;;;;;;;;;;;;31437:48;31512:1;31500:8;:13;31496:44;;;31522:18;;;;;;;;;;;;;;31496:44;31553:61;31583:1;31587:2;31591:12;31605:8;31553:21;:61::i;:::-;31926:8;31891:12;:16;31904:2;31891:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31990:8;31950:12;:16;31963:2;31950:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32049:2;32016:11;:25;32028:12;32016:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32116:15;32066:11;:25;32078:12;32066:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32149:20;32172:12;32149:35;;32199:11;32228:8;32213:12;:23;32199:37;;32257:4;:23;;;;;32265:15;:2;:13;;;:15::i;:::-;32257:23;32253:641;;;32301:314;32357:12;32353:2;32332:38;;32349:1;32332:38;;;;;;;;;;;;32398:69;32437:1;32441:2;32445:14;;;;;;32461:5;32398:30;:69::i;:::-;32393:174;;32503:40;;;;;;;;;;;;;;32393:174;32610:3;32594:12;:19;;32301:314;;32696:12;32679:13;;:29;32675:43;;32710:8;;;32675:43;32253:641;;;32759:120;32815:14;;;;;;32811:2;32790:40;;32807:1;32790:40;;;;;;;;;;;;32874:3;32858:12;:19;;32759:120;;32253:641;32924:12;32908:13;:28;;;;31866:1082;;32958:60;32987:1;32991:2;32995:12;33009:8;32958:20;:60::i;:::-;31379:1647;31251:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:143::-;4208:5;4239:6;4233:13;4224:22;;4255:33;4282:5;4255:33;:::i;:::-;4151:143;;;;:::o;4300:329::-;4359:6;4408:2;4396:9;4387:7;4383:23;4379:32;4376:119;;;4414:79;;:::i;:::-;4376:119;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4300:329;;;;:::o;4635:474::-;4703:6;4711;4760:2;4748:9;4739:7;4735:23;4731:32;4728:119;;;4766:79;;:::i;:::-;4728:119;4886:1;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4857:117;5013:2;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4984:118;4635:474;;;;;:::o;5115:619::-;5192:6;5200;5208;5257:2;5245:9;5236:7;5232:23;5228:32;5225:119;;;5263:79;;:::i;:::-;5225:119;5383:1;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5354:117;5510:2;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;:::i;:::-;5526:63;;5481:118;5638:2;5664:53;5709:7;5700:6;5689:9;5685:22;5664:53;:::i;:::-;5654:63;;5609:118;5115:619;;;;;:::o;5740:943::-;5835:6;5843;5851;5859;5908:3;5896:9;5887:7;5883:23;5879:33;5876:120;;;5915:79;;:::i;:::-;5876:120;6035:1;6060:53;6105:7;6096:6;6085:9;6081:22;6060:53;:::i;:::-;6050:63;;6006:117;6162:2;6188:53;6233:7;6224:6;6213:9;6209:22;6188:53;:::i;:::-;6178:63;;6133:118;6290:2;6316:53;6361:7;6352:6;6341:9;6337:22;6316:53;:::i;:::-;6306:63;;6261:118;6446:2;6435:9;6431:18;6418:32;6477:18;6469:6;6466:30;6463:117;;;6499:79;;:::i;:::-;6463:117;6604:62;6658:7;6649:6;6638:9;6634:22;6604:62;:::i;:::-;6594:72;;6389:287;5740:943;;;;;;;:::o;6689:468::-;6754:6;6762;6811:2;6799:9;6790:7;6786:23;6782:32;6779:119;;;6817:79;;:::i;:::-;6779:119;6937:1;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6908:117;7064:2;7090:50;7132:7;7123:6;7112:9;7108:22;7090:50;:::i;:::-;7080:60;;7035:115;6689:468;;;;;:::o;7163:474::-;7231:6;7239;7288:2;7276:9;7267:7;7263:23;7259:32;7256:119;;;7294:79;;:::i;:::-;7256:119;7414:1;7439:53;7484:7;7475:6;7464:9;7460:22;7439:53;:::i;:::-;7429:63;;7385:117;7541:2;7567:53;7612:7;7603:6;7592:9;7588:22;7567:53;:::i;:::-;7557:63;;7512:118;7163:474;;;;;:::o;7643:704::-;7738:6;7746;7754;7803:2;7791:9;7782:7;7778:23;7774:32;7771:119;;;7809:79;;:::i;:::-;7771:119;7957:1;7946:9;7942:17;7929:31;7987:18;7979:6;7976:30;7973:117;;;8009:79;;:::i;:::-;7973:117;8122:80;8194:7;8185:6;8174:9;8170:22;8122:80;:::i;:::-;8104:98;;;;7900:312;8251:2;8277:53;8322:7;8313:6;8302:9;8298:22;8277:53;:::i;:::-;8267:63;;8222:118;7643:704;;;;;:::o;8353:329::-;8412:6;8461:2;8449:9;8440:7;8436:23;8432:32;8429:119;;;8467:79;;:::i;:::-;8429:119;8587:1;8612:53;8657:7;8648:6;8637:9;8633:22;8612:53;:::i;:::-;8602:63;;8558:117;8353:329;;;;:::o;8688:327::-;8746:6;8795:2;8783:9;8774:7;8770:23;8766:32;8763:119;;;8801:79;;:::i;:::-;8763:119;8921:1;8946:52;8990:7;8981:6;8970:9;8966:22;8946:52;:::i;:::-;8936:62;;8892:116;8688:327;;;;:::o;9021:349::-;9090:6;9139:2;9127:9;9118:7;9114:23;9110:32;9107:119;;;9145:79;;:::i;:::-;9107:119;9265:1;9290:63;9345:7;9336:6;9325:9;9321:22;9290:63;:::i;:::-;9280:73;;9236:127;9021:349;;;;:::o;9376:509::-;9445:6;9494:2;9482:9;9473:7;9469:23;9465:32;9462:119;;;9500:79;;:::i;:::-;9462:119;9648:1;9637:9;9633:17;9620:31;9678:18;9670:6;9667:30;9664:117;;;9700:79;;:::i;:::-;9664:117;9805:63;9860:7;9851:6;9840:9;9836:22;9805:63;:::i;:::-;9795:73;;9591:287;9376:509;;;;:::o;9891:329::-;9950:6;9999:2;9987:9;9978:7;9974:23;9970:32;9967:119;;;10005:79;;:::i;:::-;9967:119;10125:1;10150:53;10195:7;10186:6;10175:9;10171:22;10150:53;:::i;:::-;10140:63;;10096:117;9891:329;;;;:::o;10226:351::-;10296:6;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:64;10552:7;10543:6;10532:9;10528:22;10496:64;:::i;:::-;10486:74;;10442:128;10226:351;;;;:::o;10583:684::-;10676:6;10684;10733:2;10721:9;10712:7;10708:23;10704:32;10701:119;;;10739:79;;:::i;:::-;10701:119;10859:1;10884:53;10929:7;10920:6;10909:9;10905:22;10884:53;:::i;:::-;10874:63;;10830:117;11014:2;11003:9;10999:18;10986:32;11045:18;11037:6;11034:30;11031:117;;;11067:79;;:::i;:::-;11031:117;11172:78;11242:7;11233:6;11222:9;11218:22;11172:78;:::i;:::-;11162:88;;10957:303;10583:684;;;;;:::o;11273:474::-;11341:6;11349;11398:2;11386:9;11377:7;11373:23;11369:32;11366:119;;;11404:79;;:::i;:::-;11366:119;11524:1;11549:53;11594:7;11585:6;11574:9;11570:22;11549:53;:::i;:::-;11539:63;;11495:117;11651:2;11677:53;11722:7;11713:6;11702:9;11698:22;11677:53;:::i;:::-;11667:63;;11622:118;11273:474;;;;;:::o;11753:118::-;11840:24;11858:5;11840:24;:::i;:::-;11835:3;11828:37;11753:118;;:::o;11877:157::-;11982:45;12002:24;12020:5;12002:24;:::i;:::-;11982:45;:::i;:::-;11977:3;11970:58;11877:157;;:::o;12040:109::-;12121:21;12136:5;12121:21;:::i;:::-;12116:3;12109:34;12040:109;;:::o;12155:118::-;12242:24;12260:5;12242:24;:::i;:::-;12237:3;12230:37;12155:118;;:::o;12279:157::-;12384:45;12404:24;12422:5;12404:24;:::i;:::-;12384:45;:::i;:::-;12379:3;12372:58;12279:157;;:::o;12442:360::-;12528:3;12556:38;12588:5;12556:38;:::i;:::-;12610:70;12673:6;12668:3;12610:70;:::i;:::-;12603:77;;12689:52;12734:6;12729:3;12722:4;12715:5;12711:16;12689:52;:::i;:::-;12766:29;12788:6;12766:29;:::i;:::-;12761:3;12757:39;12750:46;;12532:270;12442:360;;;;:::o;12808:364::-;12896:3;12924:39;12957:5;12924:39;:::i;:::-;12979:71;13043:6;13038:3;12979:71;:::i;:::-;12972:78;;13059:52;13104:6;13099:3;13092:4;13085:5;13081:16;13059:52;:::i;:::-;13136:29;13158:6;13136:29;:::i;:::-;13131:3;13127:39;13120:46;;12900:272;12808:364;;;;:::o;13178:377::-;13284:3;13312:39;13345:5;13312:39;:::i;:::-;13367:89;13449:6;13444:3;13367:89;:::i;:::-;13360:96;;13465:52;13510:6;13505:3;13498:4;13491:5;13487:16;13465:52;:::i;:::-;13542:6;13537:3;13533:16;13526:23;;13288:267;13178:377;;;;:::o;13561:366::-;13703:3;13724:67;13788:2;13783:3;13724:67;:::i;:::-;13717:74;;13800:93;13889:3;13800:93;:::i;:::-;13918:2;13913:3;13909:12;13902:19;;13561:366;;;:::o;13933:::-;14075:3;14096:67;14160:2;14155:3;14096:67;:::i;:::-;14089:74;;14172:93;14261:3;14172:93;:::i;:::-;14290:2;14285:3;14281:12;14274:19;;13933:366;;;:::o;14305:::-;14447:3;14468:67;14532:2;14527:3;14468:67;:::i;:::-;14461:74;;14544:93;14633:3;14544:93;:::i;:::-;14662:2;14657:3;14653:12;14646:19;;14305:366;;;:::o;14677:::-;14819:3;14840:67;14904:2;14899:3;14840:67;:::i;:::-;14833:74;;14916:93;15005:3;14916:93;:::i;:::-;15034:2;15029:3;15025:12;15018:19;;14677:366;;;:::o;15049:::-;15191:3;15212:67;15276:2;15271:3;15212:67;:::i;:::-;15205:74;;15288:93;15377:3;15288:93;:::i;:::-;15406:2;15401:3;15397:12;15390:19;;15049:366;;;:::o;15421:::-;15563:3;15584:67;15648:2;15643:3;15584:67;:::i;:::-;15577:74;;15660:93;15749:3;15660:93;:::i;:::-;15778:2;15773:3;15769:12;15762:19;;15421:366;;;:::o;15793:::-;15935:3;15956:67;16020:2;16015:3;15956:67;:::i;:::-;15949:74;;16032:93;16121:3;16032:93;:::i;:::-;16150:2;16145:3;16141:12;16134:19;;15793:366;;;:::o;16165:::-;16307:3;16328:67;16392:2;16387:3;16328:67;:::i;:::-;16321:74;;16404:93;16493:3;16404:93;:::i;:::-;16522:2;16517:3;16513:12;16506:19;;16165:366;;;:::o;16537:::-;16679:3;16700:67;16764:2;16759:3;16700:67;:::i;:::-;16693:74;;16776:93;16865:3;16776:93;:::i;:::-;16894:2;16889:3;16885:12;16878:19;;16537:366;;;:::o;16909:::-;17051:3;17072:67;17136:2;17131:3;17072:67;:::i;:::-;17065:74;;17148:93;17237:3;17148:93;:::i;:::-;17266:2;17261:3;17257:12;17250:19;;16909:366;;;:::o;17281:::-;17423:3;17444:67;17508:2;17503:3;17444:67;:::i;:::-;17437:74;;17520:93;17609:3;17520:93;:::i;:::-;17638:2;17633:3;17629:12;17622:19;;17281:366;;;:::o;17653:::-;17795:3;17816:67;17880:2;17875:3;17816:67;:::i;:::-;17809:74;;17892:93;17981:3;17892:93;:::i;:::-;18010:2;18005:3;18001:12;17994:19;;17653:366;;;:::o;18025:::-;18167:3;18188:67;18252:2;18247:3;18188:67;:::i;:::-;18181:74;;18264:93;18353:3;18264:93;:::i;:::-;18382:2;18377:3;18373:12;18366:19;;18025:366;;;:::o;18397:::-;18539:3;18560:67;18624:2;18619:3;18560:67;:::i;:::-;18553:74;;18636:93;18725:3;18636:93;:::i;:::-;18754:2;18749:3;18745:12;18738:19;;18397:366;;;:::o;18769:400::-;18929:3;18950:84;19032:1;19027:3;18950:84;:::i;:::-;18943:91;;19043:93;19132:3;19043:93;:::i;:::-;19161:1;19156:3;19152:11;19145:18;;18769:400;;;:::o;19175:366::-;19317:3;19338:67;19402:2;19397:3;19338:67;:::i;:::-;19331:74;;19414:93;19503:3;19414:93;:::i;:::-;19532:2;19527:3;19523:12;19516:19;;19175:366;;;:::o;19547:::-;19689:3;19710:67;19774:2;19769:3;19710:67;:::i;:::-;19703:74;;19786:93;19875:3;19786:93;:::i;:::-;19904:2;19899:3;19895:12;19888:19;;19547:366;;;:::o;19919:::-;20061:3;20082:67;20146:2;20141:3;20082:67;:::i;:::-;20075:74;;20158:93;20247:3;20158:93;:::i;:::-;20276:2;20271:3;20267:12;20260:19;;19919:366;;;:::o;20291:115::-;20376:23;20393:5;20376:23;:::i;:::-;20371:3;20364:36;20291:115;;:::o;20412:118::-;20499:24;20517:5;20499:24;:::i;:::-;20494:3;20487:37;20412:118;;:::o;20536:157::-;20641:45;20661:24;20679:5;20661:24;:::i;:::-;20641:45;:::i;:::-;20636:3;20629:58;20536:157;;:::o;20699:115::-;20784:23;20801:5;20784:23;:::i;:::-;20779:3;20772:36;20699:115;;:::o;20820:::-;20905:23;20922:5;20905:23;:::i;:::-;20900:3;20893:36;20820:115;;:::o;20941:256::-;21053:3;21068:75;21139:3;21130:6;21068:75;:::i;:::-;21168:2;21163:3;21159:12;21152:19;;21188:3;21181:10;;20941:256;;;;:::o;21203:397::-;21343:3;21358:75;21429:3;21420:6;21358:75;:::i;:::-;21458:2;21453:3;21449:12;21442:19;;21471:75;21542:3;21533:6;21471:75;:::i;:::-;21571:2;21566:3;21562:12;21555:19;;21591:3;21584:10;;21203:397;;;;;:::o;21606:701::-;21887:3;21909:95;22000:3;21991:6;21909:95;:::i;:::-;21902:102;;22021:95;22112:3;22103:6;22021:95;:::i;:::-;22014:102;;22133:148;22277:3;22133:148;:::i;:::-;22126:155;;22298:3;22291:10;;21606:701;;;;;:::o;22313:397::-;22453:3;22468:75;22539:3;22530:6;22468:75;:::i;:::-;22568:2;22563:3;22559:12;22552:19;;22581:75;22652:3;22643:6;22581:75;:::i;:::-;22681:2;22676:3;22672:12;22665:19;;22701:3;22694:10;;22313:397;;;;;:::o;22716:222::-;22809:4;22847:2;22836:9;22832:18;22824:26;;22860:71;22928:1;22917:9;22913:17;22904:6;22860:71;:::i;:::-;22716:222;;;;:::o;22944:332::-;23065:4;23103:2;23092:9;23088:18;23080:26;;23116:71;23184:1;23173:9;23169:17;23160:6;23116:71;:::i;:::-;23197:72;23265:2;23254:9;23250:18;23241:6;23197:72;:::i;:::-;22944:332;;;;;:::o;23282:640::-;23477:4;23515:3;23504:9;23500:19;23492:27;;23529:71;23597:1;23586:9;23582:17;23573:6;23529:71;:::i;:::-;23610:72;23678:2;23667:9;23663:18;23654:6;23610:72;:::i;:::-;23692;23760:2;23749:9;23745:18;23736:6;23692:72;:::i;:::-;23811:9;23805:4;23801:20;23796:2;23785:9;23781:18;23774:48;23839:76;23910:4;23901:6;23839:76;:::i;:::-;23831:84;;23282:640;;;;;;;:::o;23928:210::-;24015:4;24053:2;24042:9;24038:18;24030:26;;24066:65;24128:1;24117:9;24113:17;24104:6;24066:65;:::i;:::-;23928:210;;;;:::o;24144:222::-;24237:4;24275:2;24264:9;24260:18;24252:26;;24288:71;24356:1;24345:9;24341:17;24332:6;24288:71;:::i;:::-;24144:222;;;;:::o;24372:648::-;24569:4;24607:3;24596:9;24592:19;24584:27;;24621:71;24689:1;24678:9;24674:17;24665:6;24621:71;:::i;:::-;24702:70;24768:2;24757:9;24753:18;24744:6;24702:70;:::i;:::-;24782;24848:2;24837:9;24833:18;24824:6;24782:70;:::i;:::-;24862;24928:2;24917:9;24913:18;24904:6;24862:70;:::i;:::-;24942:71;25008:3;24997:9;24993:19;24984:6;24942:71;:::i;:::-;24372:648;;;;;;;;:::o;25026:313::-;25139:4;25177:2;25166:9;25162:18;25154:26;;25226:9;25220:4;25216:20;25212:1;25201:9;25197:17;25190:47;25254:78;25327:4;25318:6;25254:78;:::i;:::-;25246:86;;25026:313;;;;:::o;25345:419::-;25511:4;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25345:419;;;:::o;25770:::-;25936:4;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25770:419;;;:::o;26195:::-;26361:4;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26195:419;;;:::o;26620:::-;26786:4;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26620:419;;;:::o;27045:::-;27211:4;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27045:419;;;:::o;27470:::-;27636:4;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27470:419;;;:::o;27895:::-;28061:4;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;27895:419;;;:::o;28320:::-;28486:4;28524:2;28513:9;28509:18;28501:26;;28573:9;28567:4;28563:20;28559:1;28548:9;28544:17;28537:47;28601:131;28727:4;28601:131;:::i;:::-;28593:139;;28320:419;;;:::o;28745:::-;28911:4;28949:2;28938:9;28934:18;28926:26;;28998:9;28992:4;28988:20;28984:1;28973:9;28969:17;28962:47;29026:131;29152:4;29026:131;:::i;:::-;29018:139;;28745:419;;;:::o;29170:::-;29336:4;29374:2;29363:9;29359:18;29351:26;;29423:9;29417:4;29413:20;29409:1;29398:9;29394:17;29387:47;29451:131;29577:4;29451:131;:::i;:::-;29443:139;;29170:419;;;:::o;29595:::-;29761:4;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:131;30002:4;29876:131;:::i;:::-;29868:139;;29595:419;;;:::o;30020:::-;30186:4;30224:2;30213:9;30209:18;30201:26;;30273:9;30267:4;30263:20;30259:1;30248:9;30244:17;30237:47;30301:131;30427:4;30301:131;:::i;:::-;30293:139;;30020:419;;;:::o;30445:::-;30611:4;30649:2;30638:9;30634:18;30626:26;;30698:9;30692:4;30688:20;30684:1;30673:9;30669:17;30662:47;30726:131;30852:4;30726:131;:::i;:::-;30718:139;;30445:419;;;:::o;30870:::-;31036:4;31074:2;31063:9;31059:18;31051:26;;31123:9;31117:4;31113:20;31109:1;31098:9;31094:17;31087:47;31151:131;31277:4;31151:131;:::i;:::-;31143:139;;30870:419;;;:::o;31295:::-;31461:4;31499:2;31488:9;31484:18;31476:26;;31548:9;31542:4;31538:20;31534:1;31523:9;31519:17;31512:47;31576:131;31702:4;31576:131;:::i;:::-;31568:139;;31295:419;;;:::o;31720:::-;31886:4;31924:2;31913:9;31909:18;31901:26;;31973:9;31967:4;31963:20;31959:1;31948:9;31944:17;31937:47;32001:131;32127:4;32001:131;:::i;:::-;31993:139;;31720:419;;;:::o;32145:::-;32311:4;32349:2;32338:9;32334:18;32326:26;;32398:9;32392:4;32388:20;32384:1;32373:9;32369:17;32362:47;32426:131;32552:4;32426:131;:::i;:::-;32418:139;;32145:419;;;:::o;32570:222::-;32663:4;32701:2;32690:9;32686:18;32678:26;;32714:71;32782:1;32771:9;32767:17;32758:6;32714:71;:::i;:::-;32570:222;;;;:::o;32798:129::-;32832:6;32859:20;;:::i;:::-;32849:30;;32888:33;32916:4;32908:6;32888:33;:::i;:::-;32798:129;;;:::o;32933:75::-;32966:6;32999:2;32993:9;32983:19;;32933:75;:::o;33014:311::-;33091:4;33181:18;33173:6;33170:30;33167:56;;;33203:18;;:::i;:::-;33167:56;33253:4;33245:6;33241:17;33233:25;;33313:4;33307;33303:15;33295:23;;33014:311;;;:::o;33331:307::-;33392:4;33482:18;33474:6;33471:30;33468:56;;;33504:18;;:::i;:::-;33468:56;33542:29;33564:6;33542:29;:::i;:::-;33534:37;;33626:4;33620;33616:15;33608:23;;33331:307;;;:::o;33644:308::-;33706:4;33796:18;33788:6;33785:30;33782:56;;;33818:18;;:::i;:::-;33782:56;33856:29;33878:6;33856:29;:::i;:::-;33848:37;;33940:4;33934;33930:15;33922:23;;33644:308;;;:::o;33958:98::-;34009:6;34043:5;34037:12;34027:22;;33958:98;;;:::o;34062:99::-;34114:6;34148:5;34142:12;34132:22;;34062:99;;;:::o;34167:168::-;34250:11;34284:6;34279:3;34272:19;34324:4;34319:3;34315:14;34300:29;;34167:168;;;;:::o;34341:169::-;34425:11;34459:6;34454:3;34447:19;34499:4;34494:3;34490:14;34475:29;;34341:169;;;;:::o;34516:148::-;34618:11;34655:3;34640:18;;34516:148;;;;:::o;34670:305::-;34710:3;34729:20;34747:1;34729:20;:::i;:::-;34724:25;;34763:20;34781:1;34763:20;:::i;:::-;34758:25;;34917:1;34849:66;34845:74;34842:1;34839:81;34836:107;;;34923:18;;:::i;:::-;34836:107;34967:1;34964;34960:9;34953:16;;34670:305;;;;:::o;34981:185::-;35021:1;35038:20;35056:1;35038:20;:::i;:::-;35033:25;;35072:20;35090:1;35072:20;:::i;:::-;35067:25;;35111:1;35101:35;;35116:18;;:::i;:::-;35101:35;35158:1;35155;35151:9;35146:14;;34981:185;;;;:::o;35172:348::-;35212:7;35235:20;35253:1;35235:20;:::i;:::-;35230:25;;35269:20;35287:1;35269:20;:::i;:::-;35264:25;;35457:1;35389:66;35385:74;35382:1;35379:81;35374:1;35367:9;35360:17;35356:105;35353:131;;;35464:18;;:::i;:::-;35353:131;35512:1;35509;35505:9;35494:20;;35172:348;;;;:::o;35526:191::-;35566:4;35586:20;35604:1;35586:20;:::i;:::-;35581:25;;35620:20;35638:1;35620:20;:::i;:::-;35615:25;;35659:1;35656;35653:8;35650:34;;;35664:18;;:::i;:::-;35650:34;35709:1;35706;35702:9;35694:17;;35526:191;;;;:::o;35723:96::-;35760:7;35789:24;35807:5;35789:24;:::i;:::-;35778:35;;35723:96;;;:::o;35825:90::-;35859:7;35902:5;35895:13;35888:21;35877:32;;35825:90;;;:::o;35921:77::-;35958:7;35987:5;35976:16;;35921:77;;;:::o;36004:149::-;36040:7;36080:66;36073:5;36069:78;36058:89;;36004:149;;;:::o;36159:89::-;36195:7;36235:6;36228:5;36224:18;36213:29;;36159:89;;;:::o;36254:126::-;36291:7;36331:42;36324:5;36320:54;36309:65;;36254:126;;;:::o;36386:77::-;36423:7;36452:5;36441:16;;36386:77;;;:::o;36469:93::-;36505:7;36545:10;36538:5;36534:22;36523:33;;36469:93;;;:::o;36568:101::-;36604:7;36644:18;36637:5;36633:30;36622:41;;36568:101;;;:::o;36675:154::-;36759:6;36754:3;36749;36736:30;36821:1;36812:6;36807:3;36803:16;36796:27;36675:154;;;:::o;36835:307::-;36903:1;36913:113;36927:6;36924:1;36921:13;36913:113;;;37012:1;37007:3;37003:11;36997:18;36993:1;36988:3;36984:11;36977:39;36949:2;36946:1;36942:10;36937:15;;36913:113;;;37044:6;37041:1;37038:13;37035:101;;;37124:1;37115:6;37110:3;37106:16;37099:27;37035:101;36884:258;36835:307;;;:::o;37148:320::-;37192:6;37229:1;37223:4;37219:12;37209:22;;37276:1;37270:4;37266:12;37297:18;37287:81;;37353:4;37345:6;37341:17;37331:27;;37287:81;37415:2;37407:6;37404:14;37384:18;37381:38;37378:84;;;37434:18;;:::i;:::-;37378:84;37199:269;37148:320;;;:::o;37474:281::-;37557:27;37579:4;37557:27;:::i;:::-;37549:6;37545:40;37687:6;37675:10;37672:22;37651:18;37639:10;37636:34;37633:62;37630:88;;;37698:18;;:::i;:::-;37630:88;37738:10;37734:2;37727:22;37517:238;37474:281;;:::o;37761:233::-;37800:3;37823:24;37841:5;37823:24;:::i;:::-;37814:33;;37869:66;37862:5;37859:77;37856:103;;;37939:18;;:::i;:::-;37856:103;37986:1;37979:5;37975:13;37968:20;;37761:233;;;:::o;38000:100::-;38039:7;38068:26;38088:5;38068:26;:::i;:::-;38057:37;;38000:100;;;:::o;38106:79::-;38145:7;38174:5;38163:16;;38106:79;;;:::o;38191:94::-;38230:7;38259:20;38273:5;38259:20;:::i;:::-;38248:31;;38191:94;;;:::o;38291:79::-;38330:7;38359:5;38348:16;;38291:79;;;:::o;38376:176::-;38408:1;38425:20;38443:1;38425:20;:::i;:::-;38420:25;;38459:20;38477:1;38459:20;:::i;:::-;38454:25;;38498:1;38488:35;;38503:18;;:::i;:::-;38488:35;38544:1;38541;38537:9;38532:14;;38376:176;;;;:::o;38558:180::-;38606:77;38603:1;38596:88;38703:4;38700:1;38693:15;38727:4;38724:1;38717:15;38744:180;38792:77;38789:1;38782:88;38889:4;38886:1;38879:15;38913:4;38910:1;38903:15;38930:180;38978:77;38975:1;38968:88;39075:4;39072:1;39065:15;39099:4;39096:1;39089:15;39116:180;39164:77;39161:1;39154:88;39261:4;39258:1;39251:15;39285:4;39282:1;39275:15;39302:180;39350:77;39347:1;39340:88;39447:4;39444:1;39437:15;39471:4;39468:1;39461:15;39488:117;39597:1;39594;39587:12;39611:117;39720:1;39717;39710:12;39734:117;39843:1;39840;39833:12;39857:117;39966:1;39963;39956:12;39980:117;40089:1;40086;40079:12;40103:117;40212:1;40209;40202:12;40226:102;40267:6;40318:2;40314:7;40309:2;40302:5;40298:14;40294:28;40284:38;;40226:102;;;:::o;40334:94::-;40367:8;40415:5;40411:2;40407:14;40386:35;;40334:94;;;:::o;40434:233::-;40574:34;40570:1;40562:6;40558:14;40551:58;40643:16;40638:2;40630:6;40626:15;40619:41;40434:233;:::o;40673:178::-;40813:30;40809:1;40801:6;40797:14;40790:54;40673:178;:::o;40857:225::-;40997:34;40993:1;40985:6;40981:14;40974:58;41066:8;41061:2;41053:6;41049:15;41042:33;40857:225;:::o;41088:178::-;41228:30;41224:1;41216:6;41212:14;41205:54;41088:178;:::o;41272:176::-;41412:28;41408:1;41400:6;41396:14;41389:52;41272:176;:::o;41454:::-;41594:28;41590:1;41582:6;41578:14;41571:52;41454:176;:::o;41636:223::-;41776:34;41772:1;41764:6;41760:14;41753:58;41845:6;41840:2;41832:6;41828:15;41821:31;41636:223;:::o;41865:181::-;42005:33;42001:1;41993:6;41989:14;41982:57;41865:181;:::o;42052:178::-;42192:30;42188:1;42180:6;42176:14;42169:54;42052:178;:::o;42236:224::-;42376:34;42372:1;42364:6;42360:14;42353:58;42445:7;42440:2;42432:6;42428:15;42421:32;42236:224;:::o;42466:174::-;42606:26;42602:1;42594:6;42590:14;42583:50;42466:174;:::o;42646:227::-;42786:34;42782:1;42774:6;42770:14;42763:58;42855:10;42850:2;42842:6;42838:15;42831:35;42646:227;:::o;42879:173::-;43019:25;43015:1;43007:6;43003:14;42996:49;42879:173;:::o;43058:229::-;43198:34;43194:1;43186:6;43182:14;43175:58;43267:12;43262:2;43254:6;43250:15;43243:37;43058:229;:::o;43293:155::-;43433:7;43429:1;43421:6;43417:14;43410:31;43293:155;:::o;43454:182::-;43594:34;43590:1;43582:6;43578:14;43571:58;43454:182;:::o;43642:234::-;43782:34;43778:1;43770:6;43766:14;43759:58;43851:17;43846:2;43838:6;43834:15;43827:42;43642:234;:::o;43882:178::-;44022:30;44018:1;44010:6;44006:14;43999:54;43882:178;:::o;44066:122::-;44139:24;44157:5;44139:24;:::i;:::-;44132:5;44129:35;44119:63;;44178:1;44175;44168:12;44119:63;44066:122;:::o;44194:116::-;44264:21;44279:5;44264:21;:::i;:::-;44257:5;44254:32;44244:60;;44300:1;44297;44290:12;44244:60;44194:116;:::o;44316:122::-;44389:24;44407:5;44389:24;:::i;:::-;44382:5;44379:35;44369:63;;44428:1;44425;44418:12;44369:63;44316:122;:::o;44444:120::-;44516:23;44533:5;44516:23;:::i;:::-;44509:5;44506:34;44496:62;;44554:1;44551;44544:12;44496:62;44444:120;:::o;44570:122::-;44643:24;44661:5;44643:24;:::i;:::-;44636:5;44633:35;44623:63;;44682:1;44679;44672:12;44623:63;44570:122;:::o

Swarm Source

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