ETH Price: $3,484.96 (+5.27%)

Token

EQLZ (EQLZ)
 

Overview

Max Total Supply

777 EQLZ

Holders

362

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
domingob.eth
Balance
1 EQLZ
0x7200ef22d5e2052f8336dcff51dd08119aface87
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:
EQLZ

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


// OpenZeppelin Contracts v4.4.1 (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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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: contracts/ERC721R.sol



pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension. This does random batch minting.
 */
contract ERC721r is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // BaseURI
    string public baseURI = "";
    
    mapping(uint => uint) private _availableTokens;
    uint256 private _numAvailableTokens;
    uint256 immutable _maxSupply;
    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_, uint maxSupply_) {
        _name = name_;
        _symbol = symbol_;
        _maxSupply = maxSupply_;
        _numAvailableTokens = maxSupply_;
    }
    
    /**
     * @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);
    }
    
    function totalSupply() public view virtual returns (uint256) {
        return _maxSupply - _numAvailableTokens;
    }
    
    function maxSupply() public view virtual returns (uint256) {
        return _maxSupply;
    }

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private {
        
        _owners[tokenId] = to;
        
        emit Transfer(address(0), to, tokenId);
        
        _afterTokenTransfer(address(0), to, tokenId);
    }

    function _mintRandom(address to, uint _numToMint) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numToMint > 0, "ERC721r: need to mint at least one token");
        
        // TODO: Probably don't need this as it will underflow and revert automatically in this case
        require(_numAvailableTokens >= _numToMint, "ERC721r: minting more tokens than available");

        uint updatedNumAvailableTokens = _numAvailableTokens;
        uint256[] memory tokenIds = new uint256[](_numToMint);

        // gather all tokenIds in array
        for (uint256 i; i < _numToMint; ++i) { // Do this ++ unchecked?
            uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
            tokenIds[i] = tokenId;
            --updatedNumAvailableTokens;
        }

        _beforeTokenTransfer(address(0), to, tokenIds); // 0 placeholder for tokenId param

        // iterate through all tokenIds and mint
        for (uint256 i; i < _numToMint; ++i) { // using _numToMint to avoid length() function call
             _mintIdWithoutBalanceUpdate(to, tokenIds[i]);
        }
        
        _numAvailableTokens = updatedNumAvailableTokens;
        _balances[to] += _numToMint;
    }
        
    function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    to,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    blockhash(block.number - 1),
                    address(this),
                    updatedNumAvailableTokens
                )
            )
        );
        uint256 randomIndex = randomNum % updatedNumAvailableTokens;
        return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
    }

    // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2
    function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 valAtIndex = _availableTokens[indexToUse];
        uint256 result;
        if (valAtIndex == 0) {
            // This means the index itself is still an available token
            result = indexToUse;
        } else {
            // This means the index itself is not an available token, but the val at that index is.
            result = valAtIndex;
        }

        uint256 lastIndex = updatedNumAvailableTokens - 1;
        if (indexToUse != lastIndex) {
            // Replace the value at indexToUse, now that it's been used.
            // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
            uint256 lastValInArray = _availableTokens[lastIndex];
            if (lastValInArray == 0) {
                // This means the index itself is still an available token
                _availableTokens[indexToUse] = lastIndex;
            } else {
                // This means the index itself is not an available token, but the val at that index is.
                _availableTokens[indexToUse] = lastValInArray;
                // Gas refund courtsey of @dievardump
                delete _availableTokens[lastIndex];
            }
        }
        
        return result;
    }
    
    // Not as good as minting a specific tokenId, but will behave the same at the start
    // allowing you to explicitly mint some tokens at launch.
    function _mintAtIndex(address to, uint index) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numAvailableTokens >= 1, "ERC721r: minting more tokens than available");
        
        uint tokenId = getAvailableTokenAtIndex(index, _numAvailableTokens);
        --_numAvailableTokens;
        
        uint256[] memory tokenIds = new uint256[](1);
        tokenIds[0] = tokenId;

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

        _mintIdWithoutBalanceUpdate(to, tokenId);
        
        _balances[to] += 1;
    }

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

        uint256[] memory tokenIds = new uint256[](1);
        tokenIds[0] = tokenId;

        _beforeTokenTransfer(from, to, tokenIds);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: contracts/ERC721REnumerable.sol


// Inspired by OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
// Modified by alpereira7

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721rEnumerable is ERC721r, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

        super._beforeTokenTransfer(from, to, tokenIds);

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

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

        for( uint i=0; i<tokenIds.length; ++i){
            _ownedTokens[to][length+i] = tokenIds[i];
            _ownedTokensIndex[tokenIds[i]] = length+i;
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (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() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: contracts/EQLZ.sol



pragma solidity ^0.8.0;




contract EQLZ is ERC721r, ERC721rEnumerable, Ownable {     

    address payable client;
    struct Product {
        uint id;
        string name;
        uint openWindow;
        uint closeWindow;
    }    
    string public provenanceHash;
    mapping (uint => Product) public products;
    uint public productCount;
    uint maxTotalMints = 1;    
    bytes32 merkleroot;
    bool public saleIsActive = false;

    constructor(string memory name_, string memory symbol_, uint maxSupply_, address payable _client) ERC721r(name_, symbol_, maxSupply_) {
        client = _client;
    }

    function _beforeTokenTransfer(address from, address to, uint256[] memory tokenIdxs)    
        internal
        virtual
        override(ERC721r, ERC721rEnumerable)
    {
        super._beforeTokenTransfer(from, to, tokenIdxs);
    }

    function totalSupply()
        public 
        view        
        override(ERC721r, ERC721rEnumerable)
        returns (uint256)
    {
        return super.totalSupply();
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721r, ERC721rEnumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }    

    modifier onlyClient(){
        require(msg.sender == client);
        _;
    }

    modifier maxMintLimit(uint quantity){
        require(balanceOf(msg.sender) + quantity <= maxTotalMints, "Mint would exceed total allowance per wallet!");
        _;
    }

    function withdraw() external onlyClient {    
        require(address(this).balance > 0, "This contract has no balance");

        client.transfer(address(this).balance);
    }

    function updateClient(address payable _client) external onlyOwner {
        client = _client;
    }

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

    function setMerkleroot(bytes32 _merkleroot) external onlyClient {
        merkleroot = _merkleroot;
    }

    function setBaseURI( string calldata _baseURI) external onlyClient {
        baseURI = _baseURI;
    }

    function setMaxTotalMints( uint _maxTotalMints) external onlyClient {
        maxTotalMints = _maxTotalMints;
    }

    function toggleSaleIsActive() external onlyClient {
        saleIsActive = !saleIsActive;
    }

     function verifyWhitelistMembership(bytes32[] calldata proof, address _address) internal view returns (bool){        
        bytes32 leaf = keccak256(abi.encodePacked(_address));        
        return MerkleProof.verify(proof, merkleroot, leaf);
    }

    function reserveMint(uint quantity) external onlyClient {
        _mintRandom(msg.sender, quantity);
    }

    function publicMint(uint quantity) public maxMintLimit(quantity){  
        require(saleIsActive, "Mint is closed.");      
        _mintRandom(msg.sender, quantity);
    }

    function presaleMint(bytes32[] calldata proof, uint quantity) public maxMintLimit(quantity){ 
        require(!saleIsActive, "Presale mint is closed.");
        require(verifyWhitelistMembership(proof, msg.sender), "You are not on the whitelist");               
        _mintRandom(msg.sender, quantity);
    }

    function addNewProduct( string calldata _name, uint _openWindow, uint _closeWindow) external onlyClient  {        
        products[productCount] = Product(productCount, _name, _openWindow, _closeWindow);
        productCount++;
    }

    function updateProductRedemptionWindows( string memory _name, uint _openWindow, uint _closeWindow ) external onlyClient {        
        for(uint i=0; i<productCount; ++i){
            string memory name = products[i].name;
            if( (keccak256(abi.encodePacked((name))) == keccak256(abi.encodePacked((_name))))){                
                products[i].openWindow = _openWindow;
                products[i].closeWindow = _closeWindow;      
            }
        }        
    }

    function getProductRedemptions() external view returns (Product[] memory){
        Product[] memory lProducts = new Product[](productCount);
        for (uint i = 0; i < productCount; i++) {
          Product storage lProduct = products[i];
          lProducts[i] = lProduct;
      }
      return lProducts;
    }

    function getAllTokensOfOwner(address _address) external view returns(uint256[] memory){
        uint numTokens = balanceOf(_address);
        uint256[] memory tokenIds = new uint256[](numTokens);
        for(uint i=0; i<numTokens; ++i){
            tokenIds[i] = tokenOfOwnerByIndex(_address, i);
        }
        return tokenIds;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"address payable","name":"_client","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_openWindow","type":"uint256"},{"internalType":"uint256","name":"_closeWindow","type":"uint256"}],"name":"addNewProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAllTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProductRedemptions","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"openWindow","type":"uint256"},{"internalType":"uint256","name":"closeWindow","type":"uint256"}],"internalType":"struct EQLZ.Product[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"nonpayable","type":"function"},{"inputs":[],"name":"productCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"products","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"openWindow","type":"uint256"},{"internalType":"uint256","name":"closeWindow","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTotalMints","type":"uint256"}],"name":"setMaxTotalMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleroot","type":"bytes32"}],"name":"setMerkleroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_client","type":"address"}],"name":"updateClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_openWindow","type":"uint256"},{"internalType":"uint256","name":"_closeWindow","type":"uint256"}],"name":"updateProductRedemptionWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260405180602001604052806000815250600290805190602001906200002b929190620001ff565b5060016012556000601460006101000a81548160ff0219169083151502179055503480156200005957600080fd5b5060405162005dc338038062005dc383398181016040528101906200007f91906200034f565b83838382600090805190602001906200009a929190620001ff565b508160019080519060200190620000b3929190620001ff565b50806080818152505080600481905550505050620000e6620000da6200013160201b60201c565b6200013960201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050620005cf565b600033905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020d90620004c0565b90600052602060002090601f0160209004810192826200023157600085556200027d565b82601f106200024c57805160ff19168380011785556200027d565b828001600101855582156200027d579182015b828111156200027c5782518255916020019190600101906200025f565b5b5090506200028c919062000290565b5090565b5b80821115620002ab57600081600090555060010162000291565b5090565b6000620002c6620002c08462000416565b620003ed565b905082815260208101848484011115620002df57600080fd5b620002ec8482856200048a565b509392505050565b60008151905062000305816200059b565b92915050565b600082601f8301126200031d57600080fd5b81516200032f848260208601620002af565b91505092915050565b6000815190506200034981620005b5565b92915050565b600080600080608085870312156200036657600080fd5b600085015167ffffffffffffffff8111156200038157600080fd5b6200038f878288016200030b565b945050602085015167ffffffffffffffff811115620003ad57600080fd5b620003bb878288016200030b565b9350506040620003ce8782880162000338565b9250506060620003e187828801620002f4565b91505092959194509250565b6000620003f96200040c565b9050620004078282620004f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156200043457620004336200055b565b5b6200043f826200058a565b9050602081019050919050565b6000620004598262000460565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620004aa5780820151818401526020810190506200048d565b83811115620004ba576000848401525b50505050565b60006002820490506001821680620004d957607f821691505b60208210811415620004f057620004ef6200052c565b5b50919050565b62000501826200058a565b810181811067ffffffffffffffff821117156200052357620005226200055b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620005a6816200044c565b8114620005b257600080fd5b50565b620005c08162000480565b8114620005cc57600080fd5b50565b6080516157d8620005eb6000396000611aa701526157d86000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063715018a61161013b578063c6ab67a3116100b8578063e0f6ef871161007c578063e0f6ef871461068b578063e985e9c5146106a9578063eb8d2444146106d9578063f2fde38b146106f7578063fde5f548146107135761023d565b8063c6ab67a3146105e5578063c87b56dd14610603578063c9e6feda14610633578063d402a9e51461064f578063d5abeb011461066d5761023d565b806395d89b41116100ff57806395d89b4114610555578063a11d122614610573578063a22cb4651461057d578063b88d4fde14610599578063c55e59e5146105b55761023d565b8063715018a6146104c25780637acc0b20146104cc5780638bcd6229146104ff5780638da5cb5b1461051b57806392f6c439146105395761023d565b80632db11544116101c95780634f6ccce71161018d5780634f6ccce7146103f857806355f804b3146104285780636352211e146104445780636c0360eb1461047457806370a08231146104925761023d565b80632db115441461036a5780632f745c5914610386578063394bcb49146103b65780633ccfd60b146103d257806342842e0e146103dc5761023d565b80630a5bd44b116102105780630a5bd44b146102dc57806310969523146102f85780631342ff4c1461031457806318160ddd1461033057806323b872dd1461034e5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c60048036038101906102579190613da7565b61072f565b6040516102699190614756565b60405180910390f35b61027a610741565b6040516102879190614771565b60405180910390f35b6102aa60048036038101906102a59190613f52565b6107d3565b6040516102b7919061462d565b60405180910390f35b6102da60048036038101906102d59190613cea565b610858565b005b6102f660048036038101906102f19190613e3e565b610970565b005b610312600480360381019061030d9190613eaa565b610aa2565b005b61032e60048036038101906103299190613f52565b610b15565b005b610338610b7c565b6040516103459190614ad3565b60405180910390f35b61036860048036038101906103639190613be4565b610b8b565b005b610384600480360381019061037f9190613f52565b610beb565b005b6103a0600480360381019061039b9190613cea565b610ca1565b6040516103ad9190614ad3565b60405180910390f35b6103d060048036038101906103cb9190613b7f565b610d46565b005b6103da610d92565b005b6103f660048036038101906103f19190613be4565b610e9a565b005b610412600480360381019061040d9190613f52565b610eba565b60405161041f9190614ad3565b60405180910390f35b610442600480360381019061043d9190613df9565b610f51565b005b61045e60048036038101906104599190613f52565b610fc1565b60405161046b919061462d565b60405180910390f35b61047c611073565b6040516104899190614771565b60405180910390f35b6104ac60048036038101906104a79190613b56565b611101565b6040516104b99190614ad3565b60405180910390f35b6104ca6111b9565b005b6104e660048036038101906104e19190613f52565b6111cd565b6040516104f69493929190614aee565b60405180910390f35b61051960048036038101906105149190613f52565b611285565b005b6105236112e9565b604051610530919061462d565b60405180910390f35b610553600480360381019061054e9190613d7e565b611313565b005b61055d611377565b60405161056a9190614771565b60405180910390f35b61057b611409565b005b61059760048036038101906105929190613cae565b61148f565b005b6105b360048036038101906105ae9190613c33565b6114a5565b005b6105cf60048036038101906105ca9190613b56565b611507565b6040516105dc9190614734565b60405180910390f35b6105ed6115ff565b6040516105fa9190614771565b60405180910390f35b61061d60048036038101906106189190613f52565b61168d565b60405161062a9190614771565b60405180910390f35b61064d60048036038101906106489190613eeb565b611734565b005b6106576118e1565b6040516106649190614712565b60405180910390f35b610675611aa3565b6040516106829190614ad3565b60405180910390f35b610693611acb565b6040516106a09190614ad3565b60405180910390f35b6106c360048036038101906106be9190613ba8565b611ad1565b6040516106d09190614756565b60405180910390f35b6106e1611b65565b6040516106ee9190614756565b60405180910390f35b610711600480360381019061070c9190613b56565b611b78565b005b61072d60048036038101906107289190613d26565b611bfc565b005b600061073a82611cff565b9050919050565b60606000805461075090614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461077c90614e3e565b80156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b5050505050905090565b60006107de82611d79565b61081d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610814906149f3565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086382610fc1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb90614a53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f3611de5565b73ffffffffffffffffffffffffffffffffffffffff16148061092257506109218161091c611de5565b611ad1565b5b610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095890614913565b60405180910390fd5b61096b8383611ded565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ca57600080fd5b6040518060800160405280601154815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200182815250601060006011548152602001908152602001600020600082015181600001556020820151816001019080519060200190610a6c92919061380e565b50604082015181600201556060820151816003015590505060116000815480929190610a9790614ea1565b919050555050505050565b610aaa611ea6565b6000600f8054610ab990614e3e565b905014610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af290614893565b60405180910390fd5b80600f9080519060200190610b1192919061380e565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b6f57600080fd5b610b793382611f24565b50565b6000610b8661225f565b905090565b610b9c610b96611de5565b8261226c565b610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614a93565b60405180910390fd5b610be683838361234a565b505050565b8060125481610bf933611101565b610c039190614c87565b1115610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906147b3565b60405180910390fd5b601460009054906101000a900460ff16610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90614993565b60405180910390fd5b610c9d3383611f24565b5050565b6000610cac83611101565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce4906147d3565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d4e611ea6565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dec57600080fd5b60004711610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690614853565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e97573d6000803e3d6000fd5b50565b610eb5838383604051806020016040528060008152506114a5565b505050565b6000610ec4610b7c565b8210610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90614ab3565b60405180910390fd5b600b8281548110610f3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fab57600080fd5b818160029190610fbc929190613894565b505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614973565b60405180910390fd5b80915050919050565b6002805461108090614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90614e3e565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614933565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c1611ea6565b6111cb600061266d565b565b60106020528060005260406000206000915090508060000154908060010180546111f690614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461122290614e3e565b801561126f5780601f106112445761010080835404028352916020019161126f565b820191906000526020600020905b81548152906001019060200180831161125257829003601f168201915b5050505050908060020154908060030154905084565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112df57600080fd5b8060128190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136d57600080fd5b8060138190555050565b60606001805461138690614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546113b290614e3e565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461146357600080fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b6114a161149a611de5565b8383612733565b5050565b6114b66114b0611de5565b8361226c565b6114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614a93565b60405180910390fd5b611501848484846128a0565b50505050565b6060600061151483611101565b905060008167ffffffffffffffff811115611558577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115865781602001602082028036833780820191505090505b50905060005b828110156115f45761159e8582610ca1565b8282815181106115d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806115ed90614ea1565b905061158c565b508092505050919050565b600f805461160c90614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461163890614e3e565b80156116855780601f1061165a57610100808354040283529160200191611685565b820191906000526020600020905b81548152906001019060200180831161166857829003601f168201915b505050505081565b606061169882611d79565b6116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce90614a33565b60405180910390fd5b60006116e16128fc565b90506000815111611701576040518060200160405280600081525061172c565b8061170b8461298e565b60405160200161171c9291906145fe565b6040516020818303038152906040525b915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178e57600080fd5b60005b6011548110156118db5760006010600083815260200190815260200160002060010180546117be90614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614e3e565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b505050505090508460405160200161184f91906145e7565b604051602081830303815290604052805190602001208160405160200161187691906145e7565b6040516020818303038152906040528051906020012014156118c9578360106000848152602001908152602001600020600201819055508260106000848152602001908152602001600020600301819055505b50806118d490614ea1565b9050611791565b50505050565b6060600060115467ffffffffffffffff811115611927577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561196057816020015b61194d61391a565b8152602001906001900390816119455790505b50905060005b601154811015611a9b57600060106000838152602001908152602001600020905080604051806080016040529081600082015481526020016001820180546119ad90614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546119d990614e3e565b8015611a265780601f106119fb57610100808354040283529160200191611a26565b820191906000526020600020905b815481529060010190602001808311611a0957829003601f168201915b5050505050815260200160028201548152602001600382015481525050838381518110611a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250508080611a9390614ea1565b915050611966565b508091505090565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b60115481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601460009054906101000a900460ff1681565b611b80611ea6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790614813565b60405180910390fd5b611bf98161266d565b50565b8060125481611c0a33611101565b611c149190614c87565b1115611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c906147b3565b60405180910390fd5b601460009054906101000a900460ff1615611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614953565b60405180910390fd5b611cb0848433612b3b565b611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614793565b60405180910390fd5b611cf93383611f24565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d725750611d7182612bbf565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e6083610fc1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611eae611de5565b73ffffffffffffffffffffffffffffffffffffffff16611ecc6112e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614a13565b60405180910390fd5b565b3273ffffffffffffffffffffffffffffffffffffffff16611f43611de5565b73ffffffffffffffffffffffffffffffffffffffff1614611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612000906149b3565b60405180910390fd5b6000811161204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614a73565b60405180910390fd5b806004541015612091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612088906149d3565b60405180910390fd5b6000600454905060008267ffffffffffffffff8111156120da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156121085781602001602082028036833780820191505090505b50905060005b838110156121885760006121228685612ca1565b90508083838151811061215e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508361217490614e14565b9350508061218190614ea1565b905061210e565b5061219560008583612d0f565b60005b838110156121fb576121ea858383815181106121dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612d1f565b806121f490614ea1565b9050612198565b508160048190555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122529190614c87565b9250508190555050505050565b6000600b80549050905090565b600061227782611d79565b6122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad906148f3565b60405180910390fd5b60006122c183610fc1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233057508373ffffffffffffffffffffffffffffffffffffffff16612318846107d3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234157506123408185611ad1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661236a82610fc1565b73ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790614833565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612427906148b3565b60405180910390fd5b6000600167ffffffffffffffff811115612473577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124a15781602001602082028036833780820191505090505b50905081816000815181106124df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506124f6848483612d0f565b612501600083611ded565b6001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125519190614d0e565b925050819055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a89190614c87565b92505081905550826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612667848484612ddd565b50505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906148d3565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128939190614756565b60405180910390a3505050565b6128ab84848461234a565b6128b784848484612de2565b6128f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ed906147f3565b60405180910390fd5b50505050565b60606002805461290b90614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461293790614e3e565b80156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050905090565b606060008214156129d6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b36565b600082905060005b60008214612a085780806129f190614ea1565b915050600a82612a019190614cdd565b91506129de565b60008167ffffffffffffffff811115612a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a7c5781602001600182028036833780820191505090505b5090505b60008514612b2f57600182612a959190614d0e565b9150600a85612aa49190614f0e565b6030612ab09190614c87565b60f81b818381518110612aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b289190614cdd565b9450612a80565b8093505050505b919050565b60008082604051602001612b4f91906145cc565b604051602081830303815290604052805190602001209050612bb5858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060135483612f79565b9150509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c9a5750612c9982612f90565b5b9050919050565b600080833a434244600143612cb69190614d0e565b403089604051602001612cd0989796959493929190614694565b6040516020818303038152906040528051906020012060001c905060008382612cf99190614f0e565b9050612d058185612ffa565b9250505092915050565b612d1a8383836130bd565b505050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd960008383612ddd565b5050565b505050565b6000612e038473ffffffffffffffffffffffffffffffffffffffff16613253565b15612f6c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e2c611de5565b8786866040518563ffffffff1660e01b8152600401612e4e9493929190614648565b602060405180830381600087803b158015612e6857600080fd5b505af1925050508015612e9957506040513d601f19601f82011682018060405250810190612e969190613dd0565b60015b612f1c573d8060008114612ec9576040519150601f19603f3d011682016040523d82523d6000602084013e612ece565b606091505b50600081511415612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b906147f3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f71565b600190505b949350505050565b600082612f868584613276565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806003600085815260200190815260200160002054905060008082141561302557849050613029565b8190505b60006001856130389190614d0e565b90508086146130b157600060036000838152602001908152602001600020549050600081141561307f578160036000898152602001908152602001600020819055506130af565b80600360008981526020019081526020016000208190555060036000838152602001908152602001600020600090555b505b81935050505092915050565b6130c88383836132f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310b57613106816132f7565b61318b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318a57613189838260008151811061317c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516133e9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320f5761320a816000815181106131fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613556565b61324e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324d5761324c8282613699565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156132e7576132d2828683815181106132c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516137cc565b915080806132df90614ea1565b91505061327f565b508091505092915050565b505050565b60005b81518110156133e55780600b805490506133149190614c87565b600c6000848481518110613351577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550600b8282815181106133a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915055806133de90614ea1565b90506132fa565b5050565b600060016133f684611101565b6134009190614d0e565b90506000600a60008481526020019081526020016000205490508181146134e5576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b8054905061356a9190614d0e565b90506000600c60008481526020019081526020016000205490506000600b83815481106135c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600b8381548110613608577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b80548061367d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006136a483611101565b905060005b82518110156137c6578281815181106136eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083856137409190614c87565b815260200190815260200160002081905550808261375e9190614c87565b600a600085848151811061379b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550806137bf90614ea1565b90506136a9565b50505050565b60008183106137e4576137df82846137f7565b6137ef565b6137ee83836137f7565b5b905092915050565b600082600052816020526040600020905092915050565b82805461381a90614e3e565b90600052602060002090601f01602090048101928261383c5760008555613883565b82601f1061385557805160ff1916838001178555613883565b82800160010185558215613883579182015b82811115613882578251825591602001919060010190613867565b5b5090506138909190613942565b5090565b8280546138a090614e3e565b90600052602060002090601f0160209004810192826138c25760008555613909565b82601f106138db57803560ff1916838001178555613909565b82800160010185558215613909579182015b828111156139085782358255916020019190600101906138ed565b5b5090506139169190613942565b5090565b6040518060800160405280600081526020016060815260200160008152602001600081525090565b5b8082111561395b576000816000905550600101613943565b5090565b600061397261396d84614b5f565b614b3a565b90508281526020810184848401111561398a57600080fd5b613995848285614dd2565b509392505050565b60006139b06139ab84614b90565b614b3a565b9050828152602081018484840111156139c857600080fd5b6139d3848285614dd2565b509392505050565b6000813590506139ea81615718565b92915050565b6000813590506139ff8161572f565b92915050565b60008083601f840112613a1757600080fd5b8235905067ffffffffffffffff811115613a3057600080fd5b602083019150836020820283011115613a4857600080fd5b9250929050565b600081359050613a5e81615746565b92915050565b600081359050613a738161575d565b92915050565b600081359050613a8881615774565b92915050565b600081519050613a9d81615774565b92915050565b600082601f830112613ab457600080fd5b8135613ac484826020860161395f565b91505092915050565b60008083601f840112613adf57600080fd5b8235905067ffffffffffffffff811115613af857600080fd5b602083019150836001820283011115613b1057600080fd5b9250929050565b600082601f830112613b2857600080fd5b8135613b3884826020860161399d565b91505092915050565b600081359050613b508161578b565b92915050565b600060208284031215613b6857600080fd5b6000613b76848285016139db565b91505092915050565b600060208284031215613b9157600080fd5b6000613b9f848285016139f0565b91505092915050565b60008060408385031215613bbb57600080fd5b6000613bc9858286016139db565b9250506020613bda858286016139db565b9150509250929050565b600080600060608486031215613bf957600080fd5b6000613c07868287016139db565b9350506020613c18868287016139db565b9250506040613c2986828701613b41565b9150509250925092565b60008060008060808587031215613c4957600080fd5b6000613c57878288016139db565b9450506020613c68878288016139db565b9350506040613c7987828801613b41565b925050606085013567ffffffffffffffff811115613c9657600080fd5b613ca287828801613aa3565b91505092959194509250565b60008060408385031215613cc157600080fd5b6000613ccf858286016139db565b9250506020613ce085828601613a4f565b9150509250929050565b60008060408385031215613cfd57600080fd5b6000613d0b858286016139db565b9250506020613d1c85828601613b41565b9150509250929050565b600080600060408486031215613d3b57600080fd5b600084013567ffffffffffffffff811115613d5557600080fd5b613d6186828701613a05565b93509350506020613d7486828701613b41565b9150509250925092565b600060208284031215613d9057600080fd5b6000613d9e84828501613a64565b91505092915050565b600060208284031215613db957600080fd5b6000613dc784828501613a79565b91505092915050565b600060208284031215613de257600080fd5b6000613df084828501613a8e565b91505092915050565b60008060208385031215613e0c57600080fd5b600083013567ffffffffffffffff811115613e2657600080fd5b613e3285828601613acd565b92509250509250929050565b60008060008060608587031215613e5457600080fd5b600085013567ffffffffffffffff811115613e6e57600080fd5b613e7a87828801613acd565b94509450506020613e8d87828801613b41565b9250506040613e9e87828801613b41565b91505092959194509250565b600060208284031215613ebc57600080fd5b600082013567ffffffffffffffff811115613ed657600080fd5b613ee284828501613b17565b91505092915050565b600080600060608486031215613f0057600080fd5b600084013567ffffffffffffffff811115613f1a57600080fd5b613f2686828701613b17565b9350506020613f3786828701613b41565b9250506040613f4886828701613b41565b9150509250925092565b600060208284031215613f6457600080fd5b6000613f7284828501613b41565b91505092915050565b6000613f87838361454b565b905092915050565b6000613f9b83836145ae565b60208301905092915050565b613fb081614d42565b82525050565b613fc7613fc282614d42565b614eea565b82525050565b6000613fd882614be1565b613fe28185614c27565b935083602082028501613ff485614bc1565b8060005b8581101561403057848403895281516140118582613f7b565b945061401c83614c0d565b925060208a01995050600181019050613ff8565b50829750879550505050505092915050565b600061404d82614bec565b6140578185614c38565b935061406283614bd1565b8060005b8381101561409357815161407a8882613f8f565b975061408583614c1a565b925050600181019050614066565b5085935050505092915050565b6140a981614d66565b82525050565b6140b881614d72565b82525050565b60006140c982614bf7565b6140d38185614c49565b93506140e3818560208601614de1565b6140ec81614ffb565b840191505092915050565b600061410282614c02565b61410c8185614c5a565b935061411c818560208601614de1565b61412581614ffb565b840191505092915050565b600061413b82614c02565b6141458185614c6b565b9350614155818560208601614de1565b61415e81614ffb565b840191505092915050565b600061417482614c02565b61417e8185614c7c565b935061418e818560208601614de1565b80840191505092915050565b60006141a7601c83614c6b565b91506141b282615019565b602082019050919050565b60006141ca602d83614c6b565b91506141d582615042565b604082019050919050565b60006141ed602b83614c6b565b91506141f882615091565b604082019050919050565b6000614210603283614c6b565b915061421b826150e0565b604082019050919050565b6000614233602683614c6b565b915061423e8261512f565b604082019050919050565b6000614256602583614c6b565b91506142618261517e565b604082019050919050565b6000614279601c83614c6b565b9150614284826151cd565b602082019050919050565b600061429c601583614c6b565b91506142a7826151f6565b602082019050919050565b60006142bf602483614c6b565b91506142ca8261521f565b604082019050919050565b60006142e2602483614c6b565b91506142ed8261526e565b604082019050919050565b6000614305601983614c6b565b9150614310826152bd565b602082019050919050565b6000614328602c83614c6b565b9150614333826152e6565b604082019050919050565b600061434b603883614c6b565b915061435682615335565b604082019050919050565b600061436e602a83614c6b565b915061437982615384565b604082019050919050565b6000614391601783614c6b565b915061439c826153d3565b602082019050919050565b60006143b4602983614c6b565b91506143bf826153fc565b604082019050919050565b60006143d7600f83614c6b565b91506143e28261544b565b602082019050919050565b60006143fa602083614c6b565b915061440582615474565b602082019050919050565b600061441d602b83614c6b565b91506144288261549d565b604082019050919050565b6000614440602c83614c6b565b915061444b826154ec565b604082019050919050565b6000614463602083614c6b565b915061446e8261553b565b602082019050919050565b6000614486602f83614c6b565b915061449182615564565b604082019050919050565b60006144a9602183614c6b565b91506144b4826155b3565b604082019050919050565b60006144cc602883614c6b565b91506144d782615602565b604082019050919050565b60006144ef603183614c6b565b91506144fa82615651565b604082019050919050565b6000614512602c83614c6b565b915061451d826156a0565b604082019050919050565b6000614535600183614c7c565b9150614540826156ef565b600182019050919050565b600060808301600083015161456360008601826145ae565b506020830151848203602086015261457b82826140f7565b915050604083015161459060408601826145ae565b5060608301516145a360608601826145ae565b508091505092915050565b6145b781614dc8565b82525050565b6145c681614dc8565b82525050565b60006145d88284613fb6565b60148201915081905092915050565b60006145f38284614169565b915081905092915050565b600061460a8285614169565b915061461582614528565b91506146218284614169565b91508190509392505050565b60006020820190506146426000830184613fa7565b92915050565b600060808201905061465d6000830187613fa7565b61466a6020830186613fa7565b61467760408301856145bd565b818103606083015261468981846140be565b905095945050505050565b6000610100820190506146aa600083018b613fa7565b6146b7602083018a6145bd565b6146c460408301896145bd565b6146d160608301886145bd565b6146de60808301876145bd565b6146eb60a08301866140af565b6146f860c0830185613fa7565b61470560e08301846145bd565b9998505050505050505050565b6000602082019050818103600083015261472c8184613fcd565b905092915050565b6000602082019050818103600083015261474e8184614042565b905092915050565b600060208201905061476b60008301846140a0565b92915050565b6000602082019050818103600083015261478b8184614130565b905092915050565b600060208201905081810360008301526147ac8161419a565b9050919050565b600060208201905081810360008301526147cc816141bd565b9050919050565b600060208201905081810360008301526147ec816141e0565b9050919050565b6000602082019050818103600083015261480c81614203565b9050919050565b6000602082019050818103600083015261482c81614226565b9050919050565b6000602082019050818103600083015261484c81614249565b9050919050565b6000602082019050818103600083015261486c8161426c565b9050919050565b6000602082019050818103600083015261488c8161428f565b9050919050565b600060208201905081810360008301526148ac816142b2565b9050919050565b600060208201905081810360008301526148cc816142d5565b9050919050565b600060208201905081810360008301526148ec816142f8565b9050919050565b6000602082019050818103600083015261490c8161431b565b9050919050565b6000602082019050818103600083015261492c8161433e565b9050919050565b6000602082019050818103600083015261494c81614361565b9050919050565b6000602082019050818103600083015261496c81614384565b9050919050565b6000602082019050818103600083015261498c816143a7565b9050919050565b600060208201905081810360008301526149ac816143ca565b9050919050565b600060208201905081810360008301526149cc816143ed565b9050919050565b600060208201905081810360008301526149ec81614410565b9050919050565b60006020820190508181036000830152614a0c81614433565b9050919050565b60006020820190508181036000830152614a2c81614456565b9050919050565b60006020820190508181036000830152614a4c81614479565b9050919050565b60006020820190508181036000830152614a6c8161449c565b9050919050565b60006020820190508181036000830152614a8c816144bf565b9050919050565b60006020820190508181036000830152614aac816144e2565b9050919050565b60006020820190508181036000830152614acc81614505565b9050919050565b6000602082019050614ae860008301846145bd565b92915050565b6000608082019050614b0360008301876145bd565b8181036020830152614b158186614130565b9050614b2460408301856145bd565b614b3160608301846145bd565b95945050505050565b6000614b44614b55565b9050614b508282614e70565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7a57614b79614fcc565b5b614b8382614ffb565b9050602081019050919050565b600067ffffffffffffffff821115614bab57614baa614fcc565b5b614bb482614ffb565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9282614dc8565b9150614c9d83614dc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cd257614cd1614f3f565b5b828201905092915050565b6000614ce882614dc8565b9150614cf383614dc8565b925082614d0357614d02614f6e565b5b828204905092915050565b6000614d1982614dc8565b9150614d2483614dc8565b925082821015614d3757614d36614f3f565b5b828203905092915050565b6000614d4d82614da8565b9050919050565b6000614d5f82614da8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614dff578082015181840152602081019050614de4565b83811115614e0e576000848401525b50505050565b6000614e1f82614dc8565b91506000821415614e3357614e32614f3f565b5b600182039050919050565b60006002820490506001821680614e5657607f821691505b60208210811415614e6a57614e69614f9d565b5b50919050565b614e7982614ffb565b810181811067ffffffffffffffff82111715614e9857614e97614fcc565b5b80604052505050565b6000614eac82614dc8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614edf57614ede614f3f565b5b600182019050919050565b6000614ef582614efc565b9050919050565b6000614f078261500c565b9050919050565b6000614f1982614dc8565b9150614f2483614dc8565b925082614f3457614f33614f6e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f7520617265206e6f74206f6e207468652077686974656c69737400000000600082015250565b7f4d696e7420776f756c642065786365656420746f74616c20616c6c6f77616e6360008201527f65207065722077616c6c65742100000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6e747261637420686173206e6f2062616c616e636500000000600082015250565b7f436f6e7472616374732063616e6e6f74206d696e740000000000000000000000600082015250565b7f50726f76656e616e636520486173682048617320416c7265616479204265656e60008201527f2053657400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f50726573616c65206d696e7420697320636c6f7365642e000000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e7420697320636c6f7365642e0000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160008201527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231723a206e65656420746f206d696e74206174206c65617374206f60008201527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61572181614d42565b811461572c57600080fd5b50565b61573881614d54565b811461574357600080fd5b50565b61574f81614d66565b811461575a57600080fd5b50565b61576681614d72565b811461577157600080fd5b50565b61577d81614d7c565b811461578857600080fd5b50565b61579481614dc8565b811461579f57600080fd5b5056fea26469706673582212201b078a24e91d4cf9fd1043e9ffbba1f943b6809ece2f67dbbdae7405dd445c7964736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000309000000000000000000000000089c8e678e4db12971f78db08f86fe69b85454d0000000000000000000000000000000000000000000000000000000000000000445514c5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445514c5a00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c8063715018a61161013b578063c6ab67a3116100b8578063e0f6ef871161007c578063e0f6ef871461068b578063e985e9c5146106a9578063eb8d2444146106d9578063f2fde38b146106f7578063fde5f548146107135761023d565b8063c6ab67a3146105e5578063c87b56dd14610603578063c9e6feda14610633578063d402a9e51461064f578063d5abeb011461066d5761023d565b806395d89b41116100ff57806395d89b4114610555578063a11d122614610573578063a22cb4651461057d578063b88d4fde14610599578063c55e59e5146105b55761023d565b8063715018a6146104c25780637acc0b20146104cc5780638bcd6229146104ff5780638da5cb5b1461051b57806392f6c439146105395761023d565b80632db11544116101c95780634f6ccce71161018d5780634f6ccce7146103f857806355f804b3146104285780636352211e146104445780636c0360eb1461047457806370a08231146104925761023d565b80632db115441461036a5780632f745c5914610386578063394bcb49146103b65780633ccfd60b146103d257806342842e0e146103dc5761023d565b80630a5bd44b116102105780630a5bd44b146102dc57806310969523146102f85780631342ff4c1461031457806318160ddd1461033057806323b872dd1461034e5761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c60048036038101906102579190613da7565b61072f565b6040516102699190614756565b60405180910390f35b61027a610741565b6040516102879190614771565b60405180910390f35b6102aa60048036038101906102a59190613f52565b6107d3565b6040516102b7919061462d565b60405180910390f35b6102da60048036038101906102d59190613cea565b610858565b005b6102f660048036038101906102f19190613e3e565b610970565b005b610312600480360381019061030d9190613eaa565b610aa2565b005b61032e60048036038101906103299190613f52565b610b15565b005b610338610b7c565b6040516103459190614ad3565b60405180910390f35b61036860048036038101906103639190613be4565b610b8b565b005b610384600480360381019061037f9190613f52565b610beb565b005b6103a0600480360381019061039b9190613cea565b610ca1565b6040516103ad9190614ad3565b60405180910390f35b6103d060048036038101906103cb9190613b7f565b610d46565b005b6103da610d92565b005b6103f660048036038101906103f19190613be4565b610e9a565b005b610412600480360381019061040d9190613f52565b610eba565b60405161041f9190614ad3565b60405180910390f35b610442600480360381019061043d9190613df9565b610f51565b005b61045e60048036038101906104599190613f52565b610fc1565b60405161046b919061462d565b60405180910390f35b61047c611073565b6040516104899190614771565b60405180910390f35b6104ac60048036038101906104a79190613b56565b611101565b6040516104b99190614ad3565b60405180910390f35b6104ca6111b9565b005b6104e660048036038101906104e19190613f52565b6111cd565b6040516104f69493929190614aee565b60405180910390f35b61051960048036038101906105149190613f52565b611285565b005b6105236112e9565b604051610530919061462d565b60405180910390f35b610553600480360381019061054e9190613d7e565b611313565b005b61055d611377565b60405161056a9190614771565b60405180910390f35b61057b611409565b005b61059760048036038101906105929190613cae565b61148f565b005b6105b360048036038101906105ae9190613c33565b6114a5565b005b6105cf60048036038101906105ca9190613b56565b611507565b6040516105dc9190614734565b60405180910390f35b6105ed6115ff565b6040516105fa9190614771565b60405180910390f35b61061d60048036038101906106189190613f52565b61168d565b60405161062a9190614771565b60405180910390f35b61064d60048036038101906106489190613eeb565b611734565b005b6106576118e1565b6040516106649190614712565b60405180910390f35b610675611aa3565b6040516106829190614ad3565b60405180910390f35b610693611acb565b6040516106a09190614ad3565b60405180910390f35b6106c360048036038101906106be9190613ba8565b611ad1565b6040516106d09190614756565b60405180910390f35b6106e1611b65565b6040516106ee9190614756565b60405180910390f35b610711600480360381019061070c9190613b56565b611b78565b005b61072d60048036038101906107289190613d26565b611bfc565b005b600061073a82611cff565b9050919050565b60606000805461075090614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461077c90614e3e565b80156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b5050505050905090565b60006107de82611d79565b61081d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610814906149f3565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086382610fc1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb90614a53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f3611de5565b73ffffffffffffffffffffffffffffffffffffffff16148061092257506109218161091c611de5565b611ad1565b5b610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095890614913565b60405180910390fd5b61096b8383611ded565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ca57600080fd5b6040518060800160405280601154815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200182815250601060006011548152602001908152602001600020600082015181600001556020820151816001019080519060200190610a6c92919061380e565b50604082015181600201556060820151816003015590505060116000815480929190610a9790614ea1565b919050555050505050565b610aaa611ea6565b6000600f8054610ab990614e3e565b905014610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af290614893565b60405180910390fd5b80600f9080519060200190610b1192919061380e565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b6f57600080fd5b610b793382611f24565b50565b6000610b8661225f565b905090565b610b9c610b96611de5565b8261226c565b610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290614a93565b60405180910390fd5b610be683838361234a565b505050565b8060125481610bf933611101565b610c039190614c87565b1115610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906147b3565b60405180910390fd5b601460009054906101000a900460ff16610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90614993565b60405180910390fd5b610c9d3383611f24565b5050565b6000610cac83611101565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce4906147d3565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d4e611ea6565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dec57600080fd5b60004711610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690614853565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e97573d6000803e3d6000fd5b50565b610eb5838383604051806020016040528060008152506114a5565b505050565b6000610ec4610b7c565b8210610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90614ab3565b60405180910390fd5b600b8281548110610f3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fab57600080fd5b818160029190610fbc929190613894565b505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614973565b60405180910390fd5b80915050919050565b6002805461108090614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90614e3e565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614933565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111c1611ea6565b6111cb600061266d565b565b60106020528060005260406000206000915090508060000154908060010180546111f690614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461122290614e3e565b801561126f5780601f106112445761010080835404028352916020019161126f565b820191906000526020600020905b81548152906001019060200180831161125257829003601f168201915b5050505050908060020154908060030154905084565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112df57600080fd5b8060128190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136d57600080fd5b8060138190555050565b60606001805461138690614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546113b290614e3e565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461146357600080fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b6114a161149a611de5565b8383612733565b5050565b6114b66114b0611de5565b8361226c565b6114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614a93565b60405180910390fd5b611501848484846128a0565b50505050565b6060600061151483611101565b905060008167ffffffffffffffff811115611558577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115865781602001602082028036833780820191505090505b50905060005b828110156115f45761159e8582610ca1565b8282815181106115d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806115ed90614ea1565b905061158c565b508092505050919050565b600f805461160c90614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461163890614e3e565b80156116855780601f1061165a57610100808354040283529160200191611685565b820191906000526020600020905b81548152906001019060200180831161166857829003601f168201915b505050505081565b606061169882611d79565b6116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce90614a33565b60405180910390fd5b60006116e16128fc565b90506000815111611701576040518060200160405280600081525061172c565b8061170b8461298e565b60405160200161171c9291906145fe565b6040516020818303038152906040525b915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178e57600080fd5b60005b6011548110156118db5760006010600083815260200190815260200160002060010180546117be90614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614e3e565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b505050505090508460405160200161184f91906145e7565b604051602081830303815290604052805190602001208160405160200161187691906145e7565b6040516020818303038152906040528051906020012014156118c9578360106000848152602001908152602001600020600201819055508260106000848152602001908152602001600020600301819055505b50806118d490614ea1565b9050611791565b50505050565b6060600060115467ffffffffffffffff811115611927577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561196057816020015b61194d61391a565b8152602001906001900390816119455790505b50905060005b601154811015611a9b57600060106000838152602001908152602001600020905080604051806080016040529081600082015481526020016001820180546119ad90614e3e565b80601f01602080910402602001604051908101604052809291908181526020018280546119d990614e3e565b8015611a265780601f106119fb57610100808354040283529160200191611a26565b820191906000526020600020905b815481529060010190602001808311611a0957829003601f168201915b5050505050815260200160028201548152602001600382015481525050838381518110611a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250508080611a9390614ea1565b915050611966565b508091505090565b60007f0000000000000000000000000000000000000000000000000000000000000309905090565b60115481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601460009054906101000a900460ff1681565b611b80611ea6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790614813565b60405180910390fd5b611bf98161266d565b50565b8060125481611c0a33611101565b611c149190614c87565b1115611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c906147b3565b60405180910390fd5b601460009054906101000a900460ff1615611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614953565b60405180910390fd5b611cb0848433612b3b565b611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614793565b60405180910390fd5b611cf93383611f24565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d725750611d7182612bbf565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e6083610fc1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611eae611de5565b73ffffffffffffffffffffffffffffffffffffffff16611ecc6112e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614a13565b60405180910390fd5b565b3273ffffffffffffffffffffffffffffffffffffffff16611f43611de5565b73ffffffffffffffffffffffffffffffffffffffff1614611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612000906149b3565b60405180910390fd5b6000811161204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614a73565b60405180910390fd5b806004541015612091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612088906149d3565b60405180910390fd5b6000600454905060008267ffffffffffffffff8111156120da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156121085781602001602082028036833780820191505090505b50905060005b838110156121885760006121228685612ca1565b90508083838151811061215e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508361217490614e14565b9350508061218190614ea1565b905061210e565b5061219560008583612d0f565b60005b838110156121fb576121ea858383815181106121dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612d1f565b806121f490614ea1565b9050612198565b508160048190555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122529190614c87565b9250508190555050505050565b6000600b80549050905090565b600061227782611d79565b6122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad906148f3565b60405180910390fd5b60006122c183610fc1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233057508373ffffffffffffffffffffffffffffffffffffffff16612318846107d3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234157506123408185611ad1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661236a82610fc1565b73ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790614833565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612427906148b3565b60405180910390fd5b6000600167ffffffffffffffff811115612473577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124a15781602001602082028036833780820191505090505b50905081816000815181106124df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506124f6848483612d0f565b612501600083611ded565b6001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125519190614d0e565b925050819055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a89190614c87565b92505081905550826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612667848484612ddd565b50505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906148d3565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128939190614756565b60405180910390a3505050565b6128ab84848461234a565b6128b784848484612de2565b6128f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ed906147f3565b60405180910390fd5b50505050565b60606002805461290b90614e3e565b80601f016020809104026020016040519081016040528092919081815260200182805461293790614e3e565b80156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050905090565b606060008214156129d6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b36565b600082905060005b60008214612a085780806129f190614ea1565b915050600a82612a019190614cdd565b91506129de565b60008167ffffffffffffffff811115612a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a7c5781602001600182028036833780820191505090505b5090505b60008514612b2f57600182612a959190614d0e565b9150600a85612aa49190614f0e565b6030612ab09190614c87565b60f81b818381518110612aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b289190614cdd565b9450612a80565b8093505050505b919050565b60008082604051602001612b4f91906145cc565b604051602081830303815290604052805190602001209050612bb5858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060135483612f79565b9150509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c9a5750612c9982612f90565b5b9050919050565b600080833a434244600143612cb69190614d0e565b403089604051602001612cd0989796959493929190614694565b6040516020818303038152906040528051906020012060001c905060008382612cf99190614f0e565b9050612d058185612ffa565b9250505092915050565b612d1a8383836130bd565b505050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd960008383612ddd565b5050565b505050565b6000612e038473ffffffffffffffffffffffffffffffffffffffff16613253565b15612f6c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e2c611de5565b8786866040518563ffffffff1660e01b8152600401612e4e9493929190614648565b602060405180830381600087803b158015612e6857600080fd5b505af1925050508015612e9957506040513d601f19601f82011682018060405250810190612e969190613dd0565b60015b612f1c573d8060008114612ec9576040519150601f19603f3d011682016040523d82523d6000602084013e612ece565b606091505b50600081511415612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b906147f3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f71565b600190505b949350505050565b600082612f868584613276565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806003600085815260200190815260200160002054905060008082141561302557849050613029565b8190505b60006001856130389190614d0e565b90508086146130b157600060036000838152602001908152602001600020549050600081141561307f578160036000898152602001908152602001600020819055506130af565b80600360008981526020019081526020016000208190555060036000838152602001908152602001600020600090555b505b81935050505092915050565b6130c88383836132f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310b57613106816132f7565b61318b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318a57613189838260008151811061317c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516133e9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320f5761320a816000815181106131fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613556565b61324e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324d5761324c8282613699565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156132e7576132d2828683815181106132c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516137cc565b915080806132df90614ea1565b91505061327f565b508091505092915050565b505050565b60005b81518110156133e55780600b805490506133149190614c87565b600c6000848481518110613351577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550600b8282815181106133a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915055806133de90614ea1565b90506132fa565b5050565b600060016133f684611101565b6134009190614d0e565b90506000600a60008481526020019081526020016000205490508181146134e5576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b8054905061356a9190614d0e565b90506000600c60008481526020019081526020016000205490506000600b83815481106135c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600b8381548110613608577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b80548061367d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006136a483611101565b905060005b82518110156137c6578281815181106136eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083856137409190614c87565b815260200190815260200160002081905550808261375e9190614c87565b600a600085848151811061379b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550806137bf90614ea1565b90506136a9565b50505050565b60008183106137e4576137df82846137f7565b6137ef565b6137ee83836137f7565b5b905092915050565b600082600052816020526040600020905092915050565b82805461381a90614e3e565b90600052602060002090601f01602090048101928261383c5760008555613883565b82601f1061385557805160ff1916838001178555613883565b82800160010185558215613883579182015b82811115613882578251825591602001919060010190613867565b5b5090506138909190613942565b5090565b8280546138a090614e3e565b90600052602060002090601f0160209004810192826138c25760008555613909565b82601f106138db57803560ff1916838001178555613909565b82800160010185558215613909579182015b828111156139085782358255916020019190600101906138ed565b5b5090506139169190613942565b5090565b6040518060800160405280600081526020016060815260200160008152602001600081525090565b5b8082111561395b576000816000905550600101613943565b5090565b600061397261396d84614b5f565b614b3a565b90508281526020810184848401111561398a57600080fd5b613995848285614dd2565b509392505050565b60006139b06139ab84614b90565b614b3a565b9050828152602081018484840111156139c857600080fd5b6139d3848285614dd2565b509392505050565b6000813590506139ea81615718565b92915050565b6000813590506139ff8161572f565b92915050565b60008083601f840112613a1757600080fd5b8235905067ffffffffffffffff811115613a3057600080fd5b602083019150836020820283011115613a4857600080fd5b9250929050565b600081359050613a5e81615746565b92915050565b600081359050613a738161575d565b92915050565b600081359050613a8881615774565b92915050565b600081519050613a9d81615774565b92915050565b600082601f830112613ab457600080fd5b8135613ac484826020860161395f565b91505092915050565b60008083601f840112613adf57600080fd5b8235905067ffffffffffffffff811115613af857600080fd5b602083019150836001820283011115613b1057600080fd5b9250929050565b600082601f830112613b2857600080fd5b8135613b3884826020860161399d565b91505092915050565b600081359050613b508161578b565b92915050565b600060208284031215613b6857600080fd5b6000613b76848285016139db565b91505092915050565b600060208284031215613b9157600080fd5b6000613b9f848285016139f0565b91505092915050565b60008060408385031215613bbb57600080fd5b6000613bc9858286016139db565b9250506020613bda858286016139db565b9150509250929050565b600080600060608486031215613bf957600080fd5b6000613c07868287016139db565b9350506020613c18868287016139db565b9250506040613c2986828701613b41565b9150509250925092565b60008060008060808587031215613c4957600080fd5b6000613c57878288016139db565b9450506020613c68878288016139db565b9350506040613c7987828801613b41565b925050606085013567ffffffffffffffff811115613c9657600080fd5b613ca287828801613aa3565b91505092959194509250565b60008060408385031215613cc157600080fd5b6000613ccf858286016139db565b9250506020613ce085828601613a4f565b9150509250929050565b60008060408385031215613cfd57600080fd5b6000613d0b858286016139db565b9250506020613d1c85828601613b41565b9150509250929050565b600080600060408486031215613d3b57600080fd5b600084013567ffffffffffffffff811115613d5557600080fd5b613d6186828701613a05565b93509350506020613d7486828701613b41565b9150509250925092565b600060208284031215613d9057600080fd5b6000613d9e84828501613a64565b91505092915050565b600060208284031215613db957600080fd5b6000613dc784828501613a79565b91505092915050565b600060208284031215613de257600080fd5b6000613df084828501613a8e565b91505092915050565b60008060208385031215613e0c57600080fd5b600083013567ffffffffffffffff811115613e2657600080fd5b613e3285828601613acd565b92509250509250929050565b60008060008060608587031215613e5457600080fd5b600085013567ffffffffffffffff811115613e6e57600080fd5b613e7a87828801613acd565b94509450506020613e8d87828801613b41565b9250506040613e9e87828801613b41565b91505092959194509250565b600060208284031215613ebc57600080fd5b600082013567ffffffffffffffff811115613ed657600080fd5b613ee284828501613b17565b91505092915050565b600080600060608486031215613f0057600080fd5b600084013567ffffffffffffffff811115613f1a57600080fd5b613f2686828701613b17565b9350506020613f3786828701613b41565b9250506040613f4886828701613b41565b9150509250925092565b600060208284031215613f6457600080fd5b6000613f7284828501613b41565b91505092915050565b6000613f87838361454b565b905092915050565b6000613f9b83836145ae565b60208301905092915050565b613fb081614d42565b82525050565b613fc7613fc282614d42565b614eea565b82525050565b6000613fd882614be1565b613fe28185614c27565b935083602082028501613ff485614bc1565b8060005b8581101561403057848403895281516140118582613f7b565b945061401c83614c0d565b925060208a01995050600181019050613ff8565b50829750879550505050505092915050565b600061404d82614bec565b6140578185614c38565b935061406283614bd1565b8060005b8381101561409357815161407a8882613f8f565b975061408583614c1a565b925050600181019050614066565b5085935050505092915050565b6140a981614d66565b82525050565b6140b881614d72565b82525050565b60006140c982614bf7565b6140d38185614c49565b93506140e3818560208601614de1565b6140ec81614ffb565b840191505092915050565b600061410282614c02565b61410c8185614c5a565b935061411c818560208601614de1565b61412581614ffb565b840191505092915050565b600061413b82614c02565b6141458185614c6b565b9350614155818560208601614de1565b61415e81614ffb565b840191505092915050565b600061417482614c02565b61417e8185614c7c565b935061418e818560208601614de1565b80840191505092915050565b60006141a7601c83614c6b565b91506141b282615019565b602082019050919050565b60006141ca602d83614c6b565b91506141d582615042565b604082019050919050565b60006141ed602b83614c6b565b91506141f882615091565b604082019050919050565b6000614210603283614c6b565b915061421b826150e0565b604082019050919050565b6000614233602683614c6b565b915061423e8261512f565b604082019050919050565b6000614256602583614c6b565b91506142618261517e565b604082019050919050565b6000614279601c83614c6b565b9150614284826151cd565b602082019050919050565b600061429c601583614c6b565b91506142a7826151f6565b602082019050919050565b60006142bf602483614c6b565b91506142ca8261521f565b604082019050919050565b60006142e2602483614c6b565b91506142ed8261526e565b604082019050919050565b6000614305601983614c6b565b9150614310826152bd565b602082019050919050565b6000614328602c83614c6b565b9150614333826152e6565b604082019050919050565b600061434b603883614c6b565b915061435682615335565b604082019050919050565b600061436e602a83614c6b565b915061437982615384565b604082019050919050565b6000614391601783614c6b565b915061439c826153d3565b602082019050919050565b60006143b4602983614c6b565b91506143bf826153fc565b604082019050919050565b60006143d7600f83614c6b565b91506143e28261544b565b602082019050919050565b60006143fa602083614c6b565b915061440582615474565b602082019050919050565b600061441d602b83614c6b565b91506144288261549d565b604082019050919050565b6000614440602c83614c6b565b915061444b826154ec565b604082019050919050565b6000614463602083614c6b565b915061446e8261553b565b602082019050919050565b6000614486602f83614c6b565b915061449182615564565b604082019050919050565b60006144a9602183614c6b565b91506144b4826155b3565b604082019050919050565b60006144cc602883614c6b565b91506144d782615602565b604082019050919050565b60006144ef603183614c6b565b91506144fa82615651565b604082019050919050565b6000614512602c83614c6b565b915061451d826156a0565b604082019050919050565b6000614535600183614c7c565b9150614540826156ef565b600182019050919050565b600060808301600083015161456360008601826145ae565b506020830151848203602086015261457b82826140f7565b915050604083015161459060408601826145ae565b5060608301516145a360608601826145ae565b508091505092915050565b6145b781614dc8565b82525050565b6145c681614dc8565b82525050565b60006145d88284613fb6565b60148201915081905092915050565b60006145f38284614169565b915081905092915050565b600061460a8285614169565b915061461582614528565b91506146218284614169565b91508190509392505050565b60006020820190506146426000830184613fa7565b92915050565b600060808201905061465d6000830187613fa7565b61466a6020830186613fa7565b61467760408301856145bd565b818103606083015261468981846140be565b905095945050505050565b6000610100820190506146aa600083018b613fa7565b6146b7602083018a6145bd565b6146c460408301896145bd565b6146d160608301886145bd565b6146de60808301876145bd565b6146eb60a08301866140af565b6146f860c0830185613fa7565b61470560e08301846145bd565b9998505050505050505050565b6000602082019050818103600083015261472c8184613fcd565b905092915050565b6000602082019050818103600083015261474e8184614042565b905092915050565b600060208201905061476b60008301846140a0565b92915050565b6000602082019050818103600083015261478b8184614130565b905092915050565b600060208201905081810360008301526147ac8161419a565b9050919050565b600060208201905081810360008301526147cc816141bd565b9050919050565b600060208201905081810360008301526147ec816141e0565b9050919050565b6000602082019050818103600083015261480c81614203565b9050919050565b6000602082019050818103600083015261482c81614226565b9050919050565b6000602082019050818103600083015261484c81614249565b9050919050565b6000602082019050818103600083015261486c8161426c565b9050919050565b6000602082019050818103600083015261488c8161428f565b9050919050565b600060208201905081810360008301526148ac816142b2565b9050919050565b600060208201905081810360008301526148cc816142d5565b9050919050565b600060208201905081810360008301526148ec816142f8565b9050919050565b6000602082019050818103600083015261490c8161431b565b9050919050565b6000602082019050818103600083015261492c8161433e565b9050919050565b6000602082019050818103600083015261494c81614361565b9050919050565b6000602082019050818103600083015261496c81614384565b9050919050565b6000602082019050818103600083015261498c816143a7565b9050919050565b600060208201905081810360008301526149ac816143ca565b9050919050565b600060208201905081810360008301526149cc816143ed565b9050919050565b600060208201905081810360008301526149ec81614410565b9050919050565b60006020820190508181036000830152614a0c81614433565b9050919050565b60006020820190508181036000830152614a2c81614456565b9050919050565b60006020820190508181036000830152614a4c81614479565b9050919050565b60006020820190508181036000830152614a6c8161449c565b9050919050565b60006020820190508181036000830152614a8c816144bf565b9050919050565b60006020820190508181036000830152614aac816144e2565b9050919050565b60006020820190508181036000830152614acc81614505565b9050919050565b6000602082019050614ae860008301846145bd565b92915050565b6000608082019050614b0360008301876145bd565b8181036020830152614b158186614130565b9050614b2460408301856145bd565b614b3160608301846145bd565b95945050505050565b6000614b44614b55565b9050614b508282614e70565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7a57614b79614fcc565b5b614b8382614ffb565b9050602081019050919050565b600067ffffffffffffffff821115614bab57614baa614fcc565b5b614bb482614ffb565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9282614dc8565b9150614c9d83614dc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cd257614cd1614f3f565b5b828201905092915050565b6000614ce882614dc8565b9150614cf383614dc8565b925082614d0357614d02614f6e565b5b828204905092915050565b6000614d1982614dc8565b9150614d2483614dc8565b925082821015614d3757614d36614f3f565b5b828203905092915050565b6000614d4d82614da8565b9050919050565b6000614d5f82614da8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614dff578082015181840152602081019050614de4565b83811115614e0e576000848401525b50505050565b6000614e1f82614dc8565b91506000821415614e3357614e32614f3f565b5b600182039050919050565b60006002820490506001821680614e5657607f821691505b60208210811415614e6a57614e69614f9d565b5b50919050565b614e7982614ffb565b810181811067ffffffffffffffff82111715614e9857614e97614fcc565b5b80604052505050565b6000614eac82614dc8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614edf57614ede614f3f565b5b600182019050919050565b6000614ef582614efc565b9050919050565b6000614f078261500c565b9050919050565b6000614f1982614dc8565b9150614f2483614dc8565b925082614f3457614f33614f6e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f7520617265206e6f74206f6e207468652077686974656c69737400000000600082015250565b7f4d696e7420776f756c642065786365656420746f74616c20616c6c6f77616e6360008201527f65207065722077616c6c65742100000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6e747261637420686173206e6f2062616c616e636500000000600082015250565b7f436f6e7472616374732063616e6e6f74206d696e740000000000000000000000600082015250565b7f50726f76656e616e636520486173682048617320416c7265616479204265656e60008201527f2053657400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f50726573616c65206d696e7420697320636c6f7365642e000000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e7420697320636c6f7365642e0000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160008201527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231723a206e65656420746f206d696e74206174206c65617374206f60008201527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61572181614d42565b811461572c57600080fd5b50565b61573881614d54565b811461574357600080fd5b50565b61574f81614d66565b811461575a57600080fd5b50565b61576681614d72565b811461577157600080fd5b50565b61577d81614d7c565b811461578857600080fd5b50565b61579481614dc8565b811461579f57600080fd5b5056fea26469706673582212201b078a24e91d4cf9fd1043e9ffbba1f943b6809ece2f67dbbdae7405dd445c7964736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000309000000000000000000000000089c8e678e4db12971f78db08f86fe69b85454d0000000000000000000000000000000000000000000000000000000000000000445514c5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445514c5a00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): EQLZ
Arg [1] : symbol_ (string): EQLZ
Arg [2] : maxSupply_ (uint256): 777
Arg [3] : _client (address): 0x089C8e678E4db12971f78dB08f86fE69b85454d0

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000309
Arg [3] : 000000000000000000000000089c8e678e4db12971f78db08f86fe69b85454d0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 45514c5a00000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 45514c5a00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57973:4845:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59026:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23407:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24966:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24488:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61390:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59820:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60768:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58833:185;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25716:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60884:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40413:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59711:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59523:180;;;:::i;:::-;;26126:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40964:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60162:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23101:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21212:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22831:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57088:103;;;:::i;:::-;;58230:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;60274:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56440:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60047:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23576:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60399:97;;;:::i;:::-;;25259:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26382:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62469:344;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58195:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23751:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61635:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62141:320;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22672:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58278:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25485:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58367:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57346:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61067:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59026:214;59167:4;59196:36;59220:11;59196:23;:36::i;:::-;59189:43;;59026:214;;;:::o;23407:100::-;23461:13;23494:5;23487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23407:100;:::o;24966:221::-;25042:7;25070:16;25078:7;25070;:16::i;:::-;25062:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25155:15;:24;25171:7;25155:24;;;;;;;;;;;;;;;;;;;;;25148:31;;24966:221;;;:::o;24488:412::-;24569:13;24585:24;24601:7;24585:15;:24::i;:::-;24569:40;;24634:5;24628:11;;:2;:11;;;;24620:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24728:5;24712:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24737:37;24754:5;24761:12;:10;:12::i;:::-;24737:16;:37::i;:::-;24712:62;24690:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24871:21;24880:2;24884:7;24871:8;:21::i;:::-;24488:412;;;:::o;61390:237::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;61539:55:::1;;;;;;;;61547:12;;61539:55;;;;61561:5;;61539:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61568:11;61539:55;;;;61581:12;61539:55;;::::0;61514:8:::1;:22;61523:12;;61514:22;;;;;;;;;;;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;61605:12;;:14;;;;;;;;;:::i;:::-;;;;;;61390:237:::0;;;;:::o;59820:219::-;56326:13;:11;:13::i;:::-;59946:1:::1;59922:14;59916:28;;;;;:::i;:::-;;;:31;59908:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;60016:15;59999:14;:32;;;;;;;;;;;;:::i;:::-;;59820:219:::0;:::o;60768:108::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;60835:33:::1;60847:10;60859:8;60835:11;:33::i;:::-;60768:108:::0;:::o;58833:185::-;58959:7;58991:19;:17;:19::i;:::-;58984:26;;58833:185;:::o;25716:339::-;25911:41;25930:12;:10;:12::i;:::-;25944:7;25911:18;:41::i;:::-;25903:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26019:28;26029:4;26035:2;26039:7;26019:9;:28::i;:::-;25716:339;;;:::o;60884:175::-;60939:8;59432:13;;59420:8;59396:21;59406:10;59396:9;:21::i;:::-;:32;;;;:::i;:::-;:49;;59388:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;60969:12:::1;;;;;;;;;;;60961:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;61018:33;61030:10;61042:8;61018:11;:33::i;:::-;60884:175:::0;;:::o;40413:257::-;40510:7;40546:24;40564:5;40546:17;:24::i;:::-;40538:5;:32;40530:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;40636:12;:19;40649:5;40636:19;;;;;;;;;;;;;;;:26;40656:5;40636:26;;;;;;;;;;;;40629:33;;40413:257;;;;:::o;59711:101::-;56326:13;:11;:13::i;:::-;59797:7:::1;59788:6;;:16;;;;;;;;;;;;;;;;;;59711:101:::0;:::o;59523:180::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;59610:1:::1;59586:21;:25;59578:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59657:6;;;;;;;;;;;:15;;:38;59673:21;59657:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59523:180::o:0;26126:185::-;26264:39;26281:4;26287:2;26291:7;26264:39;;;;;;;;;;;;:16;:39::i;:::-;26126:185;;;:::o;40964:216::-;41039:7;41075:13;:11;:13::i;:::-;41067:5;:21;41059:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41155:10;41166:5;41155:17;;;;;;;;;;;;;;;;;;;;;;;;41148:24;;40964:216;;;:::o;60162:104::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;60250:8:::1;;60240:7;:18;;;;;;;:::i;:::-;;60162:104:::0;;:::o;23101:239::-;23173:7;23193:13;23209:7;:16;23217:7;23209:16;;;;;;;;;;;;;;;;;;;;;23193:32;;23261:1;23244:19;;:5;:19;;;;23236:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23327:5;23320:12;;;23101:239;;;:::o;21212:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22831:208::-;22903:7;22948:1;22931:19;;:5;:19;;;;22923:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23015:9;:16;23025:5;23015:16;;;;;;;;;;;;;;;;23008:23;;22831:208;;;:::o;57088:103::-;56326:13;:11;:13::i;:::-;57153:30:::1;57180:1;57153:18;:30::i;:::-;57088:103::o:0;58230:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60274:117::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;60369:14:::1;60353:13;:30;;;;60274:117:::0;:::o;56440:87::-;56486:7;56513:6;;;;;;;;;;;56506:13;;56440:87;:::o;60047:107::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;60135:11:::1;60122:10;:24;;;;60047:107:::0;:::o;23576:104::-;23632:13;23665:7;23658:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23576:104;:::o;60399:97::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;60476:12:::1;;;;;;;;;;;60475:13;60460:12;;:28;;;;;;;;;;;;;;;;;;60399:97::o:0;25259:155::-;25354:52;25373:12;:10;:12::i;:::-;25387:8;25397;25354:18;:52::i;:::-;25259:155;;:::o;26382:328::-;26557:41;26576:12;:10;:12::i;:::-;26590:7;26557:18;:41::i;:::-;26549:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26663:39;26677:4;26683:2;26687:7;26696:5;26663:13;:39::i;:::-;26382:328;;;;:::o;62469:344::-;62538:16;62566:14;62583:19;62593:8;62583:9;:19::i;:::-;62566:36;;62613:25;62655:9;62641:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62613:52;;62680:6;62676:104;62692:9;62690:1;:11;62676:104;;;62736:32;62756:8;62766:1;62736:19;:32::i;:::-;62722:8;62731:1;62722:11;;;;;;;;;;;;;;;;;;;;;:46;;;;;62703:3;;;;:::i;:::-;;;62676:104;;;;62797:8;62790:15;;;;62469:344;;;:::o;58195:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23751:327::-;23824:13;23858:16;23866:7;23858;:16::i;:::-;23850:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23939:17;23959:10;:8;:10::i;:::-;23939:30;;24007:1;23993:3;23987:17;:21;:83;;;;;;;;;;;;;;;;;24035:3;24045:18;:7;:16;:18::i;:::-;24018:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23987:83;23980:90;;;23751:327;;;:::o;61635:498::-;59306:6;;;;;;;;;;;59292:20;;:10;:20;;;59284:29;;;;;;61778:6:::1;61774:344;61790:12;;61788:1;:14;61774:344;;;61823:18;61844:8;:11;61853:1;61844:11;;;;;;;;;;;:16;;61823:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61947:5;61929:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;61919:36;;;;;;61908:4;61890:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;61880:35;;;;;;:75;61875:232;;;62017:11;61992:8;:11;62001:1;61992:11;;;;;;;;;;;:22;;:36;;;;62073:12;62047:8;:11;62056:1;62047:11;;;;;;;;;;;:23;;:38;;;;61875:232;61774:344;61804:3;;;;:::i;:::-;;;61774:344;;;;61635:498:::0;;;:::o;62141:320::-;62197:16;62225:26;62268:12;;62254:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;62225:56;;62297:6;62292:137;62313:12;;62309:1;:16;62292:137;;;62345:24;62372:8;:11;62381:1;62372:11;;;;;;;;;;;62345:38;;62411:8;62396:23;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;62406:1;62396:12;;;;;;;;;;;;;;;;;;;;;:23;;;;62292:137;62327:3;;;;;:::i;:::-;;;;62292:137;;;;62444:9;62437:16;;;62141:320;:::o;22672:95::-;22722:7;22749:10;22742:17;;22672:95;:::o;58278:24::-;;;;:::o;25485:164::-;25582:4;25606:18;:25;25625:5;25606:25;;;;;;;;;;;;;;;:35;25632:8;25606:35;;;;;;;;;;;;;;;;;;;;;;;;;25599:42;;25485:164;;;;:::o;58367:32::-;;;;;;;;;;;;;:::o;57346:201::-;56326:13;:11;:13::i;:::-;57455:1:::1;57435:22;;:8;:22;;;;57427:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57511:28;57530:8;57511:18;:28::i;:::-;57346:201:::0;:::o;61067:315::-;61149:8;59432:13;;59420:8;59396:21;59406:10;59396:9;:21::i;:::-;:32;;;;:::i;:::-;:49;;59388:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;61179:12:::1;;;;;;;;;;;61178:13;61170:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61238:44;61264:5;;61271:10;61238:25;:44::i;:::-;61230:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61341:33;61353:10;61365:8;61341:11;:33::i;:::-;61067:315:::0;;;;:::o;40104:225::-;40207:4;40246:35;40231:50;;;:11;:50;;;;:90;;;;40285:36;40309:11;40285:23;:36::i;:::-;40231:90;40224:97;;40104:225;;;:::o;28220:127::-;28285:4;28337:1;28309:30;;:7;:16;28317:7;28309:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28302:37;;28220:127;;;:::o;16919:98::-;16972:7;16999:10;16992:17;;16919:98;:::o;34792:175::-;34894:2;34867:15;:24;34883:7;34867:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34951:7;34947:2;34912:47;;34921:24;34937:7;34921:15;:24::i;:::-;34912:47;;;;;;;;;;;;34792:175;;:::o;56605:132::-;56680:12;:10;:12::i;:::-;56669:23;;:7;:5;:7::i;:::-;:23;;;56661:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56605:132::o;29127:1353::-;29229:9;29213:25;;:12;:10;:12::i;:::-;:25;;;29205:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;29297:1;29283:16;;:2;:16;;;;29275:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29368:1;29355:10;:14;29347:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29568:10;29545:19;;:33;;29537:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;29639:30;29672:19;;29639:52;;29702:25;29744:10;29730:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29702:53;;29814:9;29809:241;29829:10;29825:1;:14;29809:241;;;29886:15;29904:56;29930:2;29934:25;29904;:56::i;:::-;29886:74;;29989:7;29975:8;29984:1;29975:11;;;;;;;;;;;;;;;;;;;;;:21;;;;;30011:27;;;;:::i;:::-;;;29809:241;29841:3;;;;:::i;:::-;;;29809:241;;;;30062:46;30091:1;30095:2;30099:8;30062:20;:46::i;:::-;30211:9;30206:161;30226:10;30222:1;:14;30206:161;;;30311:44;30339:2;30343:8;30352:1;30343:11;;;;;;;;;;;;;;;;;;;;;;30311:27;:44::i;:::-;30238:3;;;;:::i;:::-;;;30206:161;;;;30409:25;30387:19;:47;;;;30462:10;30445:9;:13;30455:2;30445:13;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29127:1353;;;;:::o;40746:141::-;40835:7;40862:10;:17;;;;40855:24;;40746:141;:::o;28514:349::-;28607:4;28632:16;28640:7;28632;:16::i;:::-;28624:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28708:13;28724:24;28740:7;28724:15;:24::i;:::-;28708:40;;28778:5;28767:16;;:7;:16;;;:51;;;;28811:7;28787:31;;:20;28799:7;28787:11;:20::i;:::-;:31;;;28767:51;:87;;;;28822:32;28839:5;28846:7;28822:16;:32::i;:::-;28767:87;28759:96;;;28514:349;;;;:::o;33958:716::-;34118:4;34090:32;;:24;34106:7;34090:15;:24::i;:::-;:32;;;34082:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;34197:1;34183:16;;:2;:16;;;;34175:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34253:25;34295:1;34281:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34253:44;;34322:7;34308:8;34317:1;34308:11;;;;;;;;;;;;;;;;;;;;;:21;;;;;34342:40;34363:4;34369:2;34373:8;34342:20;:40::i;:::-;34447:29;34464:1;34468:7;34447:8;:29::i;:::-;34508:1;34489:9;:15;34499:4;34489:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34537:1;34520:9;:13;34530:2;34520:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34568:2;34549:7;:16;34557:7;34549:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34607:7;34603:2;34588:27;;34597:4;34588:27;;;;;;;;;;;;34628:38;34648:4;34654:2;34658:7;34628:19;:38::i;:::-;33958:716;;;;:::o;57707:191::-;57781:16;57800:6;;;;;;;;;;;57781:25;;57826:8;57817:6;;:17;;;;;;;;;;;;;;;;;;57881:8;57850:40;;57871:8;57850:40;;;;;;;;;;;;57707:191;;:::o;35109:315::-;35264:8;35255:17;;:5;:17;;;;35247:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35351:8;35313:18;:25;35332:5;35313:25;;;;;;;;;;;;;;;:35;35339:8;35313:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35397:8;35375:41;;35390:5;35375:41;;;35407:8;35375:41;;;;;;:::i;:::-;;;;;;;;35109:315;;;:::o;27592:::-;27749:28;27759:4;27765:2;27769:7;27749:9;:28::i;:::-;27796:48;27819:4;27825:2;27829:7;27838:5;27796:22;:48::i;:::-;27788:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27592:315;;;;:::o;24327:99::-;24378:13;24411:7;24404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24327:99;:::o;17563:723::-;17619:13;17849:1;17840:5;:10;17836:53;;;17867:10;;;;;;;;;;;;;;;;;;;;;17836:53;17899:12;17914:5;17899:20;;17930:14;17955:78;17970:1;17962:4;:9;17955:78;;17988:8;;;;;:::i;:::-;;;;18019:2;18011:10;;;;;:::i;:::-;;;17955:78;;;18043:19;18075:6;18065:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18043:39;;18093:154;18109:1;18100:5;:10;18093:154;;18137:1;18127:11;;;;;:::i;:::-;;;18204:2;18196:5;:10;;;;:::i;:::-;18183:2;:24;;;;:::i;:::-;18170:39;;18153:6;18160;18153:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18233:2;18224:11;;;;;:::i;:::-;;;18093:154;;;18271:6;18257:21;;;;;17563:723;;;;:::o;60505:255::-;60607:4;60631:12;60673:8;60656:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;60646:37;;;;;;60631:52;;60709:43;60728:5;;60709:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60735:10;;60747:4;60709:18;:43::i;:::-;60702:50;;;60505:255;;;;;:::o;22224:305::-;22326:4;22378:25;22363:40;;;:11;:40;;;;:105;;;;22435:33;22420:48;;;:11;:48;;;;22363:105;:158;;;;22485:36;22509:11;22485:23;:36::i;:::-;22363:158;22343:178;;22224:305;;;:::o;30496:730::-;30611:7;30636:17;30739:2;30764:11;30798:12;30833:15;30871:16;30935:1;30920:12;:16;;;;:::i;:::-;30910:27;30968:4;30996:25;30706:334;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30678:377;;;;;;30656:410;;30636:430;;31077:19;31111:25;31099:9;:37;;;;:::i;:::-;31077:59;;31154:64;31179:11;31192:25;31154:24;:64::i;:::-;31147:71;;;;30496:730;;;;:::o;58585:240::-;58770:47;58797:4;58803:2;58807:9;58770:26;:47::i;:::-;58585:240;;;:::o;28871:248::-;28985:2;28966:7;:16;28974:7;28966:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29038:7;29034:2;29013:33;;29030:1;29013:33;;;;;;;;;;;;29067:44;29095:1;29099:2;29103:7;29067:19;:44::i;:::-;28871:248;;:::o;37881:125::-;;;;:::o;35989:799::-;36144:4;36165:15;:2;:13;;;:15::i;:::-;36161:620;;;36217:2;36201:36;;;36238:12;:10;:12::i;:::-;36252:4;36258:7;36267:5;36201:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36197:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36460:1;36443:6;:13;:18;36439:272;;;36486:60;;;;;;;;;;:::i;:::-;;;;;;;;36439:272;36661:6;36655:13;36646:6;36642:2;36638:15;36631:38;36197:529;36334:41;;;36324:51;;;:6;:51;;;;36317:58;;;;;36161:620;36765:4;36758:11;;35989:799;;;;;;;:::o;47701:190::-;47826:4;47879;47850:25;47863:5;47870:4;47850:12;:25::i;:::-;:33;47843:40;;47701:190;;;;;:::o;20493:157::-;20578:4;20617:25;20602:40;;;:11;:40;;;;20595:47;;20493:157;;;:::o;31344:1441::-;31466:7;31491:18;31512:16;:28;31529:10;31512:28;;;;;;;;;;;;31491:49;;31551:14;31594:1;31580:10;:15;31576:292;;;31693:10;31684:19;;31576:292;;;31846:10;31837:19;;31576:292;31880:17;31928:1;31900:25;:29;;;;:::i;:::-;31880:49;;31958:9;31944:10;:23;31940:804;;32191:22;32216:16;:27;32233:9;32216:27;;;;;;;;;;;;32191:52;;32280:1;32262:14;:19;32258:475;;;32409:9;32378:16;:28;32395:10;32378:28;;;;;;;;;;;:40;;;;32258:475;;;32595:14;32564:16;:28;32581:10;32564:28;;;;;;;;;;;:45;;;;32690:16;:27;32707:9;32690:27;;;;;;;;;;;32683:34;;;32258:475;31940:804;;32771:6;32764:13;;;;;31344:1441;;;;:::o;41793:612::-;41949:46;41976:4;41982:2;41986:8;41949:26;:46::i;:::-;42028:1;42012:18;;:4;:18;;;42008:192;;;42047:41;42079:8;42047:31;:41::i;:::-;42008:192;;;42118:2;42110:10;;:4;:10;;;42106:94;;42137:51;42170:4;42176:8;42185:1;42176:11;;;;;;;;;;;;;;;;;;;;;;42137:32;:51::i;:::-;42106:94;42008:192;42228:1;42214:16;;:2;:16;;;42210:188;;;42247:49;42284:8;42293:1;42284:11;;;;;;;;;;;;;;;;;;;;;;42247:36;:49::i;:::-;42210:188;;;42324:4;42318:10;;:2;:10;;;42314:84;;42345:41;42373:2;42377:8;42345:27;:41::i;:::-;42314:84;42210:188;41793:612;;;:::o;8920:326::-;8980:4;9237:1;9215:7;:19;;;:23;9208:30;;8920:326;;;:::o;48568:296::-;48651:7;48671:20;48694:4;48671:27;;48714:9;48709:118;48733:5;:12;48729:1;:16;48709:118;;;48782:33;48792:12;48806:5;48812:1;48806:8;;;;;;;;;;;;;;;;;;;;;;48782:9;:33::i;:::-;48767:48;;48747:3;;;;;:::i;:::-;;;;48709:118;;;;48844:12;48837:19;;;48568:296;;;;:::o;37360:136::-;;;;:::o;43225:260::-;43317:6;43312:158;43329:8;:15;43327:1;:17;43312:158;;;43414:1;43396:10;:17;;;;:19;;;;:::i;:::-;43365:15;:28;43381:8;43390:1;43381:11;;;;;;;;;;;;;;;;;;;;;;43365:28;;;;;;;;;;;:50;;;;43430:10;43446:8;43455:1;43446:11;;;;;;;;;;;;;;;;;;;;;;43430:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43346:3;;;;:::i;:::-;;;43312:158;;;;43225:260;:::o;44112:989::-;44378:22;44429:1;44403:23;44421:4;44403:17;:23::i;:::-;:27;;;;:::i;:::-;44378:52;;44441:18;44462:17;:26;44480:7;44462:26;;;;;;;;;;;;44441:47;;44609:14;44595:10;:28;44591:328;;44640:19;44662:12;:18;44675:4;44662:18;;;;;;;;;;;;;;;:34;44681:14;44662:34;;;;;;;;;;;;44640:56;;44746:11;44713:12;:18;44726:4;44713:18;;;;;;;;;;;;;;;:30;44732:10;44713:30;;;;;;;;;;;:44;;;;44863:10;44830:17;:30;44848:11;44830:30;;;;;;;;;;;:43;;;;44591:328;;45015:17;:26;45033:7;45015:26;;;;;;;;;;;45008:33;;;45059:12;:18;45072:4;45059:18;;;;;;;;;;;;;;;:34;45078:14;45059:34;;;;;;;;;;;45052:41;;;44112:989;;;;:::o;45396:1079::-;45649:22;45694:1;45674:10;:17;;;;:21;;;;:::i;:::-;45649:46;;45706:18;45727:15;:24;45743:7;45727:24;;;;;;;;;;;;45706:45;;46078:19;46100:10;46111:14;46100:26;;;;;;;;;;;;;;;;;;;;;;;;46078:48;;46164:11;46139:10;46150;46139:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46275:10;46244:15;:28;46260:11;46244:28;;;;;;;;;;;:41;;;;46416:15;:24;46432:7;46416:24;;;;;;;;;;;46409:31;;;46451:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45396:1079;;;;:::o;42707:316::-;42804:14;42821:21;42839:2;42821:17;:21::i;:::-;42804:38;;42860:6;42855:161;42872:8;:15;42870:1;:17;42855:161;;;42937:8;42946:1;42937:11;;;;;;;;;;;;;;;;;;;;;;42908:12;:16;42921:2;42908:16;;;;;;;;;;;;;;;:26;42932:1;42925:6;:8;;;;:::i;:::-;42908:26;;;;;;;;;;;:40;;;;43003:1;42996:6;:8;;;;:::i;:::-;42963:17;:30;42981:8;42990:1;42981:11;;;;;;;;;;;;;;;;;;;;;;42963:30;;;;;;;;;;;:41;;;;42889:3;;;;:::i;:::-;;;42855:161;;;;42707:316;;;:::o;54775:149::-;54838:7;54869:1;54865;:5;:51;;54896:20;54911:1;54914;54896:14;:20::i;:::-;54865:51;;;54873:20;54888:1;54891;54873:14;:20::i;:::-;54865:51;54858:58;;54775:149;;;;:::o;54932:268::-;55000:13;55107:1;55101:4;55094:15;55136:1;55130:4;55123:15;55177:4;55171;55161:21;55152:30;;55079:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:155::-;906:5;944:6;931:20;922:29;;960:41;995:5;960:41;:::i;:::-;912:95;;;;:::o;1030:367::-;1103:8;1113:6;1163:3;1156:4;1148:6;1144:17;1140:27;1130:2;;1181:1;1178;1171:12;1130:2;1217:6;1204:20;1194:30;;1247:18;1239:6;1236:30;1233:2;;;1279:1;1276;1269:12;1233:2;1316:4;1308:6;1304:17;1292:29;;1370:3;1362:4;1354:6;1350:17;1340:8;1336:32;1333:41;1330:2;;;1387:1;1384;1377:12;1330:2;1120:277;;;;;:::o;1403:133::-;1446:5;1484:6;1471:20;1462:29;;1500:30;1524:5;1500:30;:::i;:::-;1452:84;;;;:::o;1542:139::-;1588:5;1626:6;1613:20;1604:29;;1642:33;1669:5;1642:33;:::i;:::-;1594:87;;;;:::o;1687:137::-;1732:5;1770:6;1757:20;1748:29;;1786:32;1812:5;1786:32;:::i;:::-;1738:86;;;;:::o;1830:141::-;1886:5;1917:6;1911:13;1902:22;;1933:32;1959:5;1933:32;:::i;:::-;1892:79;;;;:::o;1990:271::-;2045:5;2094:3;2087:4;2079:6;2075:17;2071:27;2061:2;;2112:1;2109;2102:12;2061:2;2152:6;2139:20;2177:78;2251:3;2243:6;2236:4;2228:6;2224:17;2177:78;:::i;:::-;2168:87;;2051:210;;;;;:::o;2281:352::-;2339:8;2349:6;2399:3;2392:4;2384:6;2380:17;2376:27;2366:2;;2417:1;2414;2407:12;2366:2;2453:6;2440:20;2430:30;;2483:18;2475:6;2472:30;2469:2;;;2515:1;2512;2505:12;2469:2;2552:4;2544:6;2540:17;2528:29;;2606:3;2598:4;2590:6;2586:17;2576:8;2572:32;2569:41;2566:2;;;2623:1;2620;2613:12;2566:2;2356:277;;;;;:::o;2653:273::-;2709:5;2758:3;2751:4;2743:6;2739:17;2735:27;2725:2;;2776:1;2773;2766:12;2725:2;2816:6;2803:20;2841:79;2916:3;2908:6;2901:4;2893:6;2889:17;2841:79;:::i;:::-;2832:88;;2715:211;;;;;:::o;2932:139::-;2978:5;3016:6;3003:20;2994:29;;3032:33;3059:5;3032:33;:::i;:::-;2984:87;;;;:::o;3077:262::-;3136:6;3185:2;3173:9;3164:7;3160:23;3156:32;3153:2;;;3201:1;3198;3191:12;3153:2;3244:1;3269:53;3314:7;3305:6;3294:9;3290:22;3269:53;:::i;:::-;3259:63;;3215:117;3143:196;;;;:::o;3345:278::-;3412:6;3461:2;3449:9;3440:7;3436:23;3432:32;3429:2;;;3477:1;3474;3467:12;3429:2;3520:1;3545:61;3598:7;3589:6;3578:9;3574:22;3545:61;:::i;:::-;3535:71;;3491:125;3419:204;;;;:::o;3629:407::-;3697:6;3705;3754:2;3742:9;3733:7;3729:23;3725:32;3722:2;;;3770:1;3767;3760:12;3722:2;3813:1;3838:53;3883:7;3874:6;3863:9;3859:22;3838:53;:::i;:::-;3828:63;;3784:117;3940:2;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3911:118;3712:324;;;;;:::o;4042:552::-;4119:6;4127;4135;4184:2;4172:9;4163:7;4159:23;4155:32;4152:2;;;4200:1;4197;4190:12;4152:2;4243:1;4268:53;4313:7;4304:6;4293:9;4289:22;4268:53;:::i;:::-;4258:63;;4214:117;4370:2;4396:53;4441:7;4432:6;4421:9;4417:22;4396:53;:::i;:::-;4386:63;;4341:118;4498:2;4524:53;4569:7;4560:6;4549:9;4545:22;4524:53;:::i;:::-;4514:63;;4469:118;4142:452;;;;;:::o;4600:809::-;4695:6;4703;4711;4719;4768:3;4756:9;4747:7;4743:23;4739:33;4736:2;;;4785:1;4782;4775:12;4736:2;4828:1;4853:53;4898:7;4889:6;4878:9;4874:22;4853:53;:::i;:::-;4843:63;;4799:117;4955:2;4981:53;5026:7;5017:6;5006:9;5002:22;4981:53;:::i;:::-;4971:63;;4926:118;5083:2;5109:53;5154:7;5145:6;5134:9;5130:22;5109:53;:::i;:::-;5099:63;;5054:118;5239:2;5228:9;5224:18;5211:32;5270:18;5262:6;5259:30;5256:2;;;5302:1;5299;5292:12;5256:2;5330:62;5384:7;5375:6;5364:9;5360:22;5330:62;:::i;:::-;5320:72;;5182:220;4726:683;;;;;;;:::o;5415:401::-;5480:6;5488;5537:2;5525:9;5516:7;5512:23;5508:32;5505:2;;;5553:1;5550;5543:12;5505:2;5596:1;5621:53;5666:7;5657:6;5646:9;5642:22;5621:53;:::i;:::-;5611:63;;5567:117;5723:2;5749:50;5791:7;5782:6;5771:9;5767:22;5749:50;:::i;:::-;5739:60;;5694:115;5495:321;;;;;:::o;5822:407::-;5890:6;5898;5947:2;5935:9;5926:7;5922:23;5918:32;5915:2;;;5963:1;5960;5953:12;5915:2;6006:1;6031:53;6076:7;6067:6;6056:9;6052:22;6031:53;:::i;:::-;6021:63;;5977:117;6133:2;6159:53;6204:7;6195:6;6184:9;6180:22;6159:53;:::i;:::-;6149:63;;6104:118;5905:324;;;;;:::o;6235:570::-;6330:6;6338;6346;6395:2;6383:9;6374:7;6370:23;6366:32;6363:2;;;6411:1;6408;6401:12;6363:2;6482:1;6471:9;6467:17;6454:31;6512:18;6504:6;6501:30;6498:2;;;6544:1;6541;6534:12;6498:2;6580:80;6652:7;6643:6;6632:9;6628:22;6580:80;:::i;:::-;6562:98;;;;6425:245;6709:2;6735:53;6780:7;6771:6;6760:9;6756:22;6735:53;:::i;:::-;6725:63;;6680:118;6353:452;;;;;:::o;6811:262::-;6870:6;6919:2;6907:9;6898:7;6894:23;6890:32;6887:2;;;6935:1;6932;6925:12;6887:2;6978:1;7003:53;7048:7;7039:6;7028:9;7024:22;7003:53;:::i;:::-;6993:63;;6949:117;6877:196;;;;:::o;7079:260::-;7137:6;7186:2;7174:9;7165:7;7161:23;7157:32;7154:2;;;7202:1;7199;7192:12;7154:2;7245:1;7270:52;7314:7;7305:6;7294:9;7290:22;7270:52;:::i;:::-;7260:62;;7216:116;7144:195;;;;:::o;7345:282::-;7414:6;7463:2;7451:9;7442:7;7438:23;7434:32;7431:2;;;7479:1;7476;7469:12;7431:2;7522:1;7547:63;7602:7;7593:6;7582:9;7578:22;7547:63;:::i;:::-;7537:73;;7493:127;7421:206;;;;:::o;7633:395::-;7704:6;7712;7761:2;7749:9;7740:7;7736:23;7732:32;7729:2;;;7777:1;7774;7767:12;7729:2;7848:1;7837:9;7833:17;7820:31;7878:18;7870:6;7867:30;7864:2;;;7910:1;7907;7900:12;7864:2;7946:65;8003:7;7994:6;7983:9;7979:22;7946:65;:::i;:::-;7928:83;;;;7791:230;7719:309;;;;;:::o;8034:685::-;8123:6;8131;8139;8147;8196:2;8184:9;8175:7;8171:23;8167:32;8164:2;;;8212:1;8209;8202:12;8164:2;8283:1;8272:9;8268:17;8255:31;8313:18;8305:6;8302:30;8299:2;;;8345:1;8342;8335:12;8299:2;8381:65;8438:7;8429:6;8418:9;8414:22;8381:65;:::i;:::-;8363:83;;;;8226:230;8495:2;8521:53;8566:7;8557:6;8546:9;8542:22;8521:53;:::i;:::-;8511:63;;8466:118;8623:2;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8594:118;8154:565;;;;;;;:::o;8725:375::-;8794:6;8843:2;8831:9;8822:7;8818:23;8814:32;8811:2;;;8859:1;8856;8849:12;8811:2;8930:1;8919:9;8915:17;8902:31;8960:18;8952:6;8949:30;8946:2;;;8992:1;8989;8982:12;8946:2;9020:63;9075:7;9066:6;9055:9;9051:22;9020:63;:::i;:::-;9010:73;;8873:220;8801:299;;;;:::o;9106:665::-;9193:6;9201;9209;9258:2;9246:9;9237:7;9233:23;9229:32;9226:2;;;9274:1;9271;9264:12;9226:2;9345:1;9334:9;9330:17;9317:31;9375:18;9367:6;9364:30;9361:2;;;9407:1;9404;9397:12;9361:2;9435:63;9490:7;9481:6;9470:9;9466:22;9435:63;:::i;:::-;9425:73;;9288:220;9547:2;9573:53;9618:7;9609:6;9598:9;9594:22;9573:53;:::i;:::-;9563:63;;9518:118;9675:2;9701:53;9746:7;9737:6;9726:9;9722:22;9701:53;:::i;:::-;9691:63;;9646:118;9216:555;;;;;:::o;9777:262::-;9836:6;9885:2;9873:9;9864:7;9860:23;9856:32;9853:2;;;9901:1;9898;9891:12;9853:2;9944:1;9969:53;10014:7;10005:6;9994:9;9990:22;9969:53;:::i;:::-;9959:63;;9915:117;9843:196;;;;:::o;10045:256::-;10164:10;10199:96;10291:3;10283:6;10199:96;:::i;:::-;10185:110;;10175:126;;;;:::o;10307:179::-;10376:10;10397:46;10439:3;10431:6;10397:46;:::i;:::-;10475:4;10470:3;10466:14;10452:28;;10387:99;;;;:::o;10492:118::-;10579:24;10597:5;10579:24;:::i;:::-;10574:3;10567:37;10557:53;;:::o;10616:157::-;10721:45;10741:24;10759:5;10741:24;:::i;:::-;10721:45;:::i;:::-;10716:3;10709:58;10699:74;;:::o;10833:1111::-;11002:3;11031:79;11104:5;11031:79;:::i;:::-;11126:111;11230:6;11225:3;11126:111;:::i;:::-;11119:118;;11263:3;11308:4;11300:6;11296:17;11291:3;11287:27;11338:81;11413:5;11338:81;:::i;:::-;11442:7;11473:1;11458:441;11483:6;11480:1;11477:13;11458:441;;;11554:9;11548:4;11544:20;11539:3;11532:33;11605:6;11599:13;11633:114;11742:4;11727:13;11633:114;:::i;:::-;11625:122;;11770:85;11848:6;11770:85;:::i;:::-;11760:95;;11884:4;11879:3;11875:14;11868:21;;11518:381;11505:1;11502;11498:9;11493:14;;11458:441;;;11462:14;11915:4;11908:11;;11935:3;11928:10;;11007:937;;;;;;;;;:::o;11980:732::-;12099:3;12128:54;12176:5;12128:54;:::i;:::-;12198:86;12277:6;12272:3;12198:86;:::i;:::-;12191:93;;12308:56;12358:5;12308:56;:::i;:::-;12387:7;12418:1;12403:284;12428:6;12425:1;12422:13;12403:284;;;12504:6;12498:13;12531:63;12590:3;12575:13;12531:63;:::i;:::-;12524:70;;12617:60;12670:6;12617:60;:::i;:::-;12607:70;;12463:224;12450:1;12447;12443:9;12438:14;;12403:284;;;12407:14;12703:3;12696:10;;12104:608;;;;;;;:::o;12718:109::-;12799:21;12814:5;12799:21;:::i;:::-;12794:3;12787:34;12777:50;;:::o;12833:118::-;12920:24;12938:5;12920:24;:::i;:::-;12915:3;12908:37;12898:53;;:::o;12957:360::-;13043:3;13071:38;13103:5;13071:38;:::i;:::-;13125:70;13188:6;13183:3;13125:70;:::i;:::-;13118:77;;13204:52;13249:6;13244:3;13237:4;13230:5;13226:16;13204:52;:::i;:::-;13281:29;13303:6;13281:29;:::i;:::-;13276:3;13272:39;13265:46;;13047:270;;;;;:::o;13323:344::-;13401:3;13429:39;13462:5;13429:39;:::i;:::-;13484:61;13538:6;13533:3;13484:61;:::i;:::-;13477:68;;13554:52;13599:6;13594:3;13587:4;13580:5;13576:16;13554:52;:::i;:::-;13631:29;13653:6;13631:29;:::i;:::-;13626:3;13622:39;13615:46;;13405:262;;;;;:::o;13673:364::-;13761:3;13789:39;13822:5;13789:39;:::i;:::-;13844:71;13908:6;13903:3;13844:71;:::i;:::-;13837:78;;13924:52;13969:6;13964:3;13957:4;13950:5;13946:16;13924:52;:::i;:::-;14001:29;14023:6;14001:29;:::i;:::-;13996:3;13992:39;13985:46;;13765:272;;;;;:::o;14043:377::-;14149:3;14177:39;14210:5;14177:39;:::i;:::-;14232:89;14314:6;14309:3;14232:89;:::i;:::-;14225:96;;14330:52;14375:6;14370:3;14363:4;14356:5;14352:16;14330:52;:::i;:::-;14407:6;14402:3;14398:16;14391:23;;14153:267;;;;;:::o;14426:366::-;14568:3;14589:67;14653:2;14648:3;14589:67;:::i;:::-;14582:74;;14665:93;14754:3;14665:93;:::i;:::-;14783:2;14778:3;14774:12;14767:19;;14572:220;;;:::o;14798:366::-;14940:3;14961:67;15025:2;15020:3;14961:67;:::i;:::-;14954:74;;15037:93;15126:3;15037:93;:::i;:::-;15155:2;15150:3;15146:12;15139:19;;14944:220;;;:::o;15170:366::-;15312:3;15333:67;15397:2;15392:3;15333:67;:::i;:::-;15326:74;;15409:93;15498:3;15409:93;:::i;:::-;15527:2;15522:3;15518:12;15511:19;;15316:220;;;:::o;15542:366::-;15684:3;15705:67;15769:2;15764:3;15705:67;:::i;:::-;15698:74;;15781:93;15870:3;15781:93;:::i;:::-;15899:2;15894:3;15890:12;15883:19;;15688:220;;;:::o;15914:366::-;16056:3;16077:67;16141:2;16136:3;16077:67;:::i;:::-;16070:74;;16153:93;16242:3;16153:93;:::i;:::-;16271:2;16266:3;16262:12;16255:19;;16060:220;;;:::o;16286:366::-;16428:3;16449:67;16513:2;16508:3;16449:67;:::i;:::-;16442:74;;16525:93;16614:3;16525:93;:::i;:::-;16643:2;16638:3;16634:12;16627:19;;16432:220;;;:::o;16658:366::-;16800:3;16821:67;16885:2;16880:3;16821:67;:::i;:::-;16814:74;;16897:93;16986:3;16897:93;:::i;:::-;17015:2;17010:3;17006:12;16999:19;;16804:220;;;:::o;17030:366::-;17172:3;17193:67;17257:2;17252:3;17193:67;:::i;:::-;17186:74;;17269:93;17358:3;17269:93;:::i;:::-;17387:2;17382:3;17378:12;17371:19;;17176:220;;;:::o;17402:366::-;17544:3;17565:67;17629:2;17624:3;17565:67;:::i;:::-;17558:74;;17641:93;17730:3;17641:93;:::i;:::-;17759:2;17754:3;17750:12;17743:19;;17548:220;;;:::o;17774:366::-;17916:3;17937:67;18001:2;17996:3;17937:67;:::i;:::-;17930:74;;18013:93;18102:3;18013:93;:::i;:::-;18131:2;18126:3;18122:12;18115:19;;17920:220;;;:::o;18146:366::-;18288:3;18309:67;18373:2;18368:3;18309:67;:::i;:::-;18302:74;;18385:93;18474:3;18385:93;:::i;:::-;18503:2;18498:3;18494:12;18487:19;;18292:220;;;:::o;18518:366::-;18660:3;18681:67;18745:2;18740:3;18681:67;:::i;:::-;18674:74;;18757:93;18846:3;18757:93;:::i;:::-;18875:2;18870:3;18866:12;18859:19;;18664:220;;;:::o;18890:366::-;19032:3;19053:67;19117:2;19112:3;19053:67;:::i;:::-;19046:74;;19129:93;19218:3;19129:93;:::i;:::-;19247:2;19242:3;19238:12;19231:19;;19036:220;;;:::o;19262:366::-;19404:3;19425:67;19489:2;19484:3;19425:67;:::i;:::-;19418:74;;19501:93;19590:3;19501:93;:::i;:::-;19619:2;19614:3;19610:12;19603:19;;19408:220;;;:::o;19634:366::-;19776:3;19797:67;19861:2;19856:3;19797:67;:::i;:::-;19790:74;;19873:93;19962:3;19873:93;:::i;:::-;19991:2;19986:3;19982:12;19975:19;;19780:220;;;:::o;20006:366::-;20148:3;20169:67;20233:2;20228:3;20169:67;:::i;:::-;20162:74;;20245:93;20334:3;20245:93;:::i;:::-;20363:2;20358:3;20354:12;20347:19;;20152:220;;;:::o;20378:366::-;20520:3;20541:67;20605:2;20600:3;20541:67;:::i;:::-;20534:74;;20617:93;20706:3;20617:93;:::i;:::-;20735:2;20730:3;20726:12;20719:19;;20524:220;;;:::o;20750:366::-;20892:3;20913:67;20977:2;20972:3;20913:67;:::i;:::-;20906:74;;20989:93;21078:3;20989:93;:::i;:::-;21107:2;21102:3;21098:12;21091:19;;20896:220;;;:::o;21122:366::-;21264:3;21285:67;21349:2;21344:3;21285:67;:::i;:::-;21278:74;;21361:93;21450:3;21361:93;:::i;:::-;21479:2;21474:3;21470:12;21463:19;;21268:220;;;:::o;21494:366::-;21636:3;21657:67;21721:2;21716:3;21657:67;:::i;:::-;21650:74;;21733:93;21822:3;21733:93;:::i;:::-;21851:2;21846:3;21842:12;21835:19;;21640:220;;;:::o;21866:366::-;22008:3;22029:67;22093:2;22088:3;22029:67;:::i;:::-;22022:74;;22105:93;22194:3;22105:93;:::i;:::-;22223:2;22218:3;22214:12;22207:19;;22012:220;;;:::o;22238:366::-;22380:3;22401:67;22465:2;22460:3;22401:67;:::i;:::-;22394:74;;22477:93;22566:3;22477:93;:::i;:::-;22595:2;22590:3;22586:12;22579:19;;22384:220;;;:::o;22610:366::-;22752:3;22773:67;22837:2;22832:3;22773:67;:::i;:::-;22766:74;;22849:93;22938:3;22849:93;:::i;:::-;22967:2;22962:3;22958:12;22951:19;;22756:220;;;:::o;22982:366::-;23124:3;23145:67;23209:2;23204:3;23145:67;:::i;:::-;23138:74;;23221:93;23310:3;23221:93;:::i;:::-;23339:2;23334:3;23330:12;23323:19;;23128:220;;;:::o;23354:366::-;23496:3;23517:67;23581:2;23576:3;23517:67;:::i;:::-;23510:74;;23593:93;23682:3;23593:93;:::i;:::-;23711:2;23706:3;23702:12;23695:19;;23500:220;;;:::o;23726:366::-;23868:3;23889:67;23953:2;23948:3;23889:67;:::i;:::-;23882:74;;23965:93;24054:3;23965:93;:::i;:::-;24083:2;24078:3;24074:12;24067:19;;23872:220;;;:::o;24098:400::-;24258:3;24279:84;24361:1;24356:3;24279:84;:::i;:::-;24272:91;;24372:93;24461:3;24372:93;:::i;:::-;24490:1;24485:3;24481:11;24474:18;;24262:236;;;:::o;24554:955::-;24663:3;24699:4;24694:3;24690:14;24784:4;24777:5;24773:16;24767:23;24803:63;24860:4;24855:3;24851:14;24837:12;24803:63;:::i;:::-;24714:162;24958:4;24951:5;24947:16;24941:23;25011:3;25005:4;25001:14;24994:4;24989:3;24985:14;24978:38;25037:73;25105:4;25091:12;25037:73;:::i;:::-;25029:81;;24886:235;25209:4;25202:5;25198:16;25192:23;25228:63;25285:4;25280:3;25276:14;25262:12;25228:63;:::i;:::-;25131:170;25390:4;25383:5;25379:16;25373:23;25409:63;25466:4;25461:3;25457:14;25443:12;25409:63;:::i;:::-;25311:171;25499:4;25492:11;;24668:841;;;;;:::o;25515:108::-;25592:24;25610:5;25592:24;:::i;:::-;25587:3;25580:37;25570:53;;:::o;25629:118::-;25716:24;25734:5;25716:24;:::i;:::-;25711:3;25704:37;25694:53;;:::o;25753:256::-;25865:3;25880:75;25951:3;25942:6;25880:75;:::i;:::-;25980:2;25975:3;25971:12;25964:19;;26000:3;25993:10;;25869:140;;;;:::o;26015:275::-;26147:3;26169:95;26260:3;26251:6;26169:95;:::i;:::-;26162:102;;26281:3;26274:10;;26151:139;;;;:::o;26296:701::-;26577:3;26599:95;26690:3;26681:6;26599:95;:::i;:::-;26592:102;;26711:148;26855:3;26711:148;:::i;:::-;26704:155;;26876:95;26967:3;26958:6;26876:95;:::i;:::-;26869:102;;26988:3;26981:10;;26581:416;;;;;:::o;27003:222::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27147:71;27215:1;27204:9;27200:17;27191:6;27147:71;:::i;:::-;27101:124;;;;:::o;27231:640::-;27426:4;27464:3;27453:9;27449:19;27441:27;;27478:71;27546:1;27535:9;27531:17;27522:6;27478:71;:::i;:::-;27559:72;27627:2;27616:9;27612:18;27603:6;27559:72;:::i;:::-;27641;27709:2;27698:9;27694:18;27685:6;27641:72;:::i;:::-;27760:9;27754:4;27750:20;27745:2;27734:9;27730:18;27723:48;27788:76;27859:4;27850:6;27788:76;:::i;:::-;27780:84;;27431:440;;;;;;;:::o;27877:997::-;28166:4;28204:3;28193:9;28189:19;28181:27;;28218:71;28286:1;28275:9;28271:17;28262:6;28218:71;:::i;:::-;28299:72;28367:2;28356:9;28352:18;28343:6;28299:72;:::i;:::-;28381;28449:2;28438:9;28434:18;28425:6;28381:72;:::i;:::-;28463;28531:2;28520:9;28516:18;28507:6;28463:72;:::i;:::-;28545:73;28613:3;28602:9;28598:19;28589:6;28545:73;:::i;:::-;28628;28696:3;28685:9;28681:19;28672:6;28628:73;:::i;:::-;28711;28779:3;28768:9;28764:19;28755:6;28711:73;:::i;:::-;28794;28862:3;28851:9;28847:19;28838:6;28794:73;:::i;:::-;28171:703;;;;;;;;;;;:::o;28880:473::-;29073:4;29111:2;29100:9;29096:18;29088:26;;29160:9;29154:4;29150:20;29146:1;29135:9;29131:17;29124:47;29188:158;29341:4;29332:6;29188:158;:::i;:::-;29180:166;;29078:275;;;;:::o;29359:373::-;29502:4;29540:2;29529:9;29525:18;29517:26;;29589:9;29583:4;29579:20;29575:1;29564:9;29560:17;29553:47;29617:108;29720:4;29711:6;29617:108;:::i;:::-;29609:116;;29507:225;;;;:::o;29738:210::-;29825:4;29863:2;29852:9;29848:18;29840:26;;29876:65;29938:1;29927:9;29923:17;29914:6;29876:65;:::i;:::-;29830:118;;;;:::o;29954:313::-;30067:4;30105:2;30094:9;30090:18;30082:26;;30154:9;30148:4;30144:20;30140:1;30129:9;30125:17;30118:47;30182:78;30255:4;30246:6;30182:78;:::i;:::-;30174:86;;30072:195;;;;:::o;30273:419::-;30439:4;30477:2;30466:9;30462:18;30454:26;;30526:9;30520:4;30516:20;30512:1;30501:9;30497:17;30490:47;30554:131;30680:4;30554:131;:::i;:::-;30546:139;;30444:248;;;:::o;30698:419::-;30864:4;30902:2;30891:9;30887:18;30879:26;;30951:9;30945:4;30941:20;30937:1;30926:9;30922:17;30915:47;30979:131;31105:4;30979:131;:::i;:::-;30971:139;;30869:248;;;:::o;31123:419::-;31289:4;31327:2;31316:9;31312:18;31304:26;;31376:9;31370:4;31366:20;31362:1;31351:9;31347:17;31340:47;31404:131;31530:4;31404:131;:::i;:::-;31396:139;;31294:248;;;:::o;31548:419::-;31714:4;31752:2;31741:9;31737:18;31729:26;;31801:9;31795:4;31791:20;31787:1;31776:9;31772:17;31765:47;31829:131;31955:4;31829:131;:::i;:::-;31821:139;;31719:248;;;:::o;31973:419::-;32139:4;32177:2;32166:9;32162:18;32154:26;;32226:9;32220:4;32216:20;32212:1;32201:9;32197:17;32190:47;32254:131;32380:4;32254:131;:::i;:::-;32246:139;;32144:248;;;:::o;32398:419::-;32564:4;32602:2;32591:9;32587:18;32579:26;;32651:9;32645:4;32641:20;32637:1;32626:9;32622:17;32615:47;32679:131;32805:4;32679:131;:::i;:::-;32671:139;;32569:248;;;:::o;32823:419::-;32989:4;33027:2;33016:9;33012:18;33004:26;;33076:9;33070:4;33066:20;33062:1;33051:9;33047:17;33040:47;33104:131;33230:4;33104:131;:::i;:::-;33096:139;;32994:248;;;:::o;33248:419::-;33414:4;33452:2;33441:9;33437:18;33429:26;;33501:9;33495:4;33491:20;33487:1;33476:9;33472:17;33465:47;33529:131;33655:4;33529:131;:::i;:::-;33521:139;;33419:248;;;:::o;33673:419::-;33839:4;33877:2;33866:9;33862:18;33854:26;;33926:9;33920:4;33916:20;33912:1;33901:9;33897:17;33890:47;33954:131;34080:4;33954:131;:::i;:::-;33946:139;;33844:248;;;:::o;34098:419::-;34264:4;34302:2;34291:9;34287:18;34279:26;;34351:9;34345:4;34341:20;34337:1;34326:9;34322:17;34315:47;34379:131;34505:4;34379:131;:::i;:::-;34371:139;;34269:248;;;:::o;34523:419::-;34689:4;34727:2;34716:9;34712:18;34704:26;;34776:9;34770:4;34766:20;34762:1;34751:9;34747:17;34740:47;34804:131;34930:4;34804:131;:::i;:::-;34796:139;;34694:248;;;:::o;34948:419::-;35114:4;35152:2;35141:9;35137:18;35129:26;;35201:9;35195:4;35191:20;35187:1;35176:9;35172:17;35165:47;35229:131;35355:4;35229:131;:::i;:::-;35221:139;;35119:248;;;:::o;35373:419::-;35539:4;35577:2;35566:9;35562:18;35554:26;;35626:9;35620:4;35616:20;35612:1;35601:9;35597:17;35590:47;35654:131;35780:4;35654:131;:::i;:::-;35646:139;;35544:248;;;:::o;35798:419::-;35964:4;36002:2;35991:9;35987:18;35979:26;;36051:9;36045:4;36041:20;36037:1;36026:9;36022:17;36015:47;36079:131;36205:4;36079:131;:::i;:::-;36071:139;;35969:248;;;:::o;36223:419::-;36389:4;36427:2;36416:9;36412:18;36404:26;;36476:9;36470:4;36466:20;36462:1;36451:9;36447:17;36440:47;36504:131;36630:4;36504:131;:::i;:::-;36496:139;;36394:248;;;:::o;36648:419::-;36814:4;36852:2;36841:9;36837:18;36829:26;;36901:9;36895:4;36891:20;36887:1;36876:9;36872:17;36865:47;36929:131;37055:4;36929:131;:::i;:::-;36921:139;;36819:248;;;:::o;37073:419::-;37239:4;37277:2;37266:9;37262:18;37254:26;;37326:9;37320:4;37316:20;37312:1;37301:9;37297:17;37290:47;37354:131;37480:4;37354:131;:::i;:::-;37346:139;;37244:248;;;:::o;37498:419::-;37664:4;37702:2;37691:9;37687:18;37679:26;;37751:9;37745:4;37741:20;37737:1;37726:9;37722:17;37715:47;37779:131;37905:4;37779:131;:::i;:::-;37771:139;;37669:248;;;:::o;37923:419::-;38089:4;38127:2;38116:9;38112:18;38104:26;;38176:9;38170:4;38166:20;38162:1;38151:9;38147:17;38140:47;38204:131;38330:4;38204:131;:::i;:::-;38196:139;;38094:248;;;:::o;38348:419::-;38514:4;38552:2;38541:9;38537:18;38529:26;;38601:9;38595:4;38591:20;38587:1;38576:9;38572:17;38565:47;38629:131;38755:4;38629:131;:::i;:::-;38621:139;;38519:248;;;:::o;38773:419::-;38939:4;38977:2;38966:9;38962:18;38954:26;;39026:9;39020:4;39016:20;39012:1;39001:9;38997:17;38990:47;39054:131;39180:4;39054:131;:::i;:::-;39046:139;;38944:248;;;:::o;39198:419::-;39364:4;39402:2;39391:9;39387:18;39379:26;;39451:9;39445:4;39441:20;39437:1;39426:9;39422:17;39415:47;39479:131;39605:4;39479:131;:::i;:::-;39471:139;;39369:248;;;:::o;39623:419::-;39789:4;39827:2;39816:9;39812:18;39804:26;;39876:9;39870:4;39866:20;39862:1;39851:9;39847:17;39840:47;39904:131;40030:4;39904:131;:::i;:::-;39896:139;;39794:248;;;:::o;40048:419::-;40214:4;40252:2;40241:9;40237:18;40229:26;;40301:9;40295:4;40291:20;40287:1;40276:9;40272:17;40265:47;40329:131;40455:4;40329:131;:::i;:::-;40321:139;;40219:248;;;:::o;40473:419::-;40639:4;40677:2;40666:9;40662:18;40654:26;;40726:9;40720:4;40716:20;40712:1;40701:9;40697:17;40690:47;40754:131;40880:4;40754:131;:::i;:::-;40746:139;;40644:248;;;:::o;40898:419::-;41064:4;41102:2;41091:9;41087:18;41079:26;;41151:9;41145:4;41141:20;41137:1;41126:9;41122:17;41115:47;41179:131;41305:4;41179:131;:::i;:::-;41171:139;;41069:248;;;:::o;41323:222::-;41416:4;41454:2;41443:9;41439:18;41431:26;;41467:71;41535:1;41524:9;41520:17;41511:6;41467:71;:::i;:::-;41421:124;;;;:::o;41551:644::-;41748:4;41786:3;41775:9;41771:19;41763:27;;41800:71;41868:1;41857:9;41853:17;41844:6;41800:71;:::i;:::-;41918:9;41912:4;41908:20;41903:2;41892:9;41888:18;41881:48;41946:78;42019:4;42010:6;41946:78;:::i;:::-;41938:86;;42034:72;42102:2;42091:9;42087:18;42078:6;42034:72;:::i;:::-;42116;42184:2;42173:9;42169:18;42160:6;42116:72;:::i;:::-;41753:442;;;;;;;:::o;42201:129::-;42235:6;42262:20;;:::i;:::-;42252:30;;42291:33;42319:4;42311:6;42291:33;:::i;:::-;42242:88;;;:::o;42336:75::-;42369:6;42402:2;42396:9;42386:19;;42376:35;:::o;42417:307::-;42478:4;42568:18;42560:6;42557:30;42554:2;;;42590:18;;:::i;:::-;42554:2;42628:29;42650:6;42628:29;:::i;:::-;42620:37;;42712:4;42706;42702:15;42694:23;;42483:241;;;:::o;42730:308::-;42792:4;42882:18;42874:6;42871:30;42868:2;;;42904:18;;:::i;:::-;42868:2;42942:29;42964:6;42942:29;:::i;:::-;42934:37;;43026:4;43020;43016:15;43008:23;;42797:241;;;:::o;43044:157::-;43136:4;43159:3;43151:11;;43189:4;43184:3;43180:14;43172:22;;43141:60;;;:::o;43207:132::-;43274:4;43297:3;43289:11;;43327:4;43322:3;43318:14;43310:22;;43279:60;;;:::o;43345:139::-;43437:6;43471:5;43465:12;43455:22;;43444:40;;;:::o;43490:114::-;43557:6;43591:5;43585:12;43575:22;;43564:40;;;:::o;43610:98::-;43661:6;43695:5;43689:12;43679:22;;43668:40;;;:::o;43714:99::-;43766:6;43800:5;43794:12;43784:22;;43773:40;;;:::o;43819:138::-;43914:4;43946;43941:3;43937:14;43929:22;;43919:38;;;:::o;43963:113::-;44033:4;44065;44060:3;44056:14;44048:22;;44038:38;;;:::o;44082:209::-;44206:11;44240:6;44235:3;44228:19;44280:4;44275:3;44271:14;44256:29;;44218:73;;;;:::o;44297:184::-;44396:11;44430:6;44425:3;44418:19;44470:4;44465:3;44461:14;44446:29;;44408:73;;;;:::o;44487:168::-;44570:11;44604:6;44599:3;44592:19;44644:4;44639:3;44635:14;44620:29;;44582:73;;;;:::o;44661:159::-;44735:11;44769:6;44764:3;44757:19;44809:4;44804:3;44800:14;44785:29;;44747:73;;;;:::o;44826:169::-;44910:11;44944:6;44939:3;44932:19;44984:4;44979:3;44975:14;44960:29;;44922:73;;;;:::o;45001:148::-;45103:11;45140:3;45125:18;;45115:34;;;;:::o;45155:305::-;45195:3;45214:20;45232:1;45214:20;:::i;:::-;45209:25;;45248:20;45266:1;45248:20;:::i;:::-;45243:25;;45402:1;45334:66;45330:74;45327:1;45324:81;45321:2;;;45408:18;;:::i;:::-;45321:2;45452:1;45449;45445:9;45438:16;;45199:261;;;;:::o;45466:185::-;45506:1;45523:20;45541:1;45523:20;:::i;:::-;45518:25;;45557:20;45575:1;45557:20;:::i;:::-;45552:25;;45596:1;45586:2;;45601:18;;:::i;:::-;45586:2;45643:1;45640;45636:9;45631:14;;45508:143;;;;:::o;45657:191::-;45697:4;45717:20;45735:1;45717:20;:::i;:::-;45712:25;;45751:20;45769:1;45751:20;:::i;:::-;45746:25;;45790:1;45787;45784:8;45781:2;;;45795:18;;:::i;:::-;45781:2;45840:1;45837;45833:9;45825:17;;45702:146;;;;:::o;45854:96::-;45891:7;45920:24;45938:5;45920:24;:::i;:::-;45909:35;;45899:51;;;:::o;45956:104::-;46001:7;46030:24;46048:5;46030:24;:::i;:::-;46019:35;;46009:51;;;:::o;46066:90::-;46100:7;46143:5;46136:13;46129:21;46118:32;;46108:48;;;:::o;46162:77::-;46199:7;46228:5;46217:16;;46207:32;;;:::o;46245:149::-;46281:7;46321:66;46314:5;46310:78;46299:89;;46289:105;;;:::o;46400:126::-;46437:7;46477:42;46470:5;46466:54;46455:65;;46445:81;;;:::o;46532:77::-;46569:7;46598:5;46587:16;;46577:32;;;:::o;46615:154::-;46699:6;46694:3;46689;46676:30;46761:1;46752:6;46747:3;46743:16;46736:27;46666:103;;;:::o;46775:307::-;46843:1;46853:113;46867:6;46864:1;46861:13;46853:113;;;46952:1;46947:3;46943:11;46937:18;46933:1;46928:3;46924:11;46917:39;46889:2;46886:1;46882:10;46877:15;;46853:113;;;46984:6;46981:1;46978:13;46975:2;;;47064:1;47055:6;47050:3;47046:16;47039:27;46975:2;46824:258;;;;:::o;47088:171::-;47127:3;47150:24;47168:5;47150:24;:::i;:::-;47141:33;;47196:4;47189:5;47186:15;47183:2;;;47204:18;;:::i;:::-;47183:2;47251:1;47244:5;47240:13;47233:20;;47131:128;;;:::o;47265:320::-;47309:6;47346:1;47340:4;47336:12;47326:22;;47393:1;47387:4;47383:12;47414:18;47404:2;;47470:4;47462:6;47458:17;47448:27;;47404:2;47532;47524:6;47521:14;47501:18;47498:38;47495:2;;;47551:18;;:::i;:::-;47495:2;47316:269;;;;:::o;47591:281::-;47674:27;47696:4;47674:27;:::i;:::-;47666:6;47662:40;47804:6;47792:10;47789:22;47768:18;47756:10;47753:34;47750:62;47747:2;;;47815:18;;:::i;:::-;47747:2;47855:10;47851:2;47844:22;47634:238;;;:::o;47878:233::-;47917:3;47940:24;47958:5;47940:24;:::i;:::-;47931:33;;47986:66;47979:5;47976:77;47973:2;;;48056:18;;:::i;:::-;47973:2;48103:1;48096:5;48092:13;48085:20;;47921:190;;;:::o;48117:100::-;48156:7;48185:26;48205:5;48185:26;:::i;:::-;48174:37;;48164:53;;;:::o;48223:94::-;48262:7;48291:20;48305:5;48291:20;:::i;:::-;48280:31;;48270:47;;;:::o;48323:176::-;48355:1;48372:20;48390:1;48372:20;:::i;:::-;48367:25;;48406:20;48424:1;48406:20;:::i;:::-;48401:25;;48445:1;48435:2;;48450:18;;:::i;:::-;48435:2;48491:1;48488;48484:9;48479:14;;48357:142;;;;:::o;48505:180::-;48553:77;48550:1;48543:88;48650:4;48647:1;48640:15;48674:4;48671:1;48664:15;48691:180;48739:77;48736:1;48729:88;48836:4;48833:1;48826:15;48860:4;48857:1;48850:15;48877:180;48925:77;48922:1;48915:88;49022:4;49019:1;49012:15;49046:4;49043:1;49036:15;49063:180;49111:77;49108:1;49101:88;49208:4;49205:1;49198:15;49232:4;49229:1;49222:15;49249:102;49290:6;49341:2;49337:7;49332:2;49325:5;49321:14;49317:28;49307:38;;49297:54;;;:::o;49357:94::-;49390:8;49438:5;49434:2;49430:14;49409:35;;49399:52;;;:::o;49457:178::-;49597:30;49593:1;49585:6;49581:14;49574:54;49563:72;:::o;49641:232::-;49781:34;49777:1;49769:6;49765:14;49758:58;49850:15;49845:2;49837:6;49833:15;49826:40;49747:126;:::o;49879:230::-;50019:34;50015:1;50007:6;50003:14;49996:58;50088:13;50083:2;50075:6;50071:15;50064:38;49985:124;:::o;50115:237::-;50255:34;50251:1;50243:6;50239:14;50232:58;50324:20;50319:2;50311:6;50307:15;50300:45;50221:131;:::o;50358:225::-;50498:34;50494:1;50486:6;50482:14;50475:58;50567:8;50562:2;50554:6;50550:15;50543:33;50464:119;:::o;50589:224::-;50729:34;50725:1;50717:6;50713:14;50706:58;50798:7;50793:2;50785:6;50781:15;50774:32;50695:118;:::o;50819:178::-;50959:30;50955:1;50947:6;50943:14;50936:54;50925:72;:::o;51003:171::-;51143:23;51139:1;51131:6;51127:14;51120:47;51109:65;:::o;51180:223::-;51320:34;51316:1;51308:6;51304:14;51297:58;51389:6;51384:2;51376:6;51372:15;51365:31;51286:117;:::o;51409:223::-;51549:34;51545:1;51537:6;51533:14;51526:58;51618:6;51613:2;51605:6;51601:15;51594:31;51515:117;:::o;51638:175::-;51778:27;51774:1;51766:6;51762:14;51755:51;51744:69;:::o;51819:231::-;51959:34;51955:1;51947:6;51943:14;51936:58;52028:14;52023:2;52015:6;52011:15;52004:39;51925:125;:::o;52056:243::-;52196:34;52192:1;52184:6;52180:14;52173:58;52265:26;52260:2;52252:6;52248:15;52241:51;52162:137;:::o;52305:229::-;52445:34;52441:1;52433:6;52429:14;52422:58;52514:12;52509:2;52501:6;52497:15;52490:37;52411:123;:::o;52540:173::-;52680:25;52676:1;52668:6;52664:14;52657:49;52646:67;:::o;52719:228::-;52859:34;52855:1;52847:6;52843:14;52836:58;52928:11;52923:2;52915:6;52911:15;52904:36;52825:122;:::o;52953:165::-;53093:17;53089:1;53081:6;53077:14;53070:41;53059:59;:::o;53124:182::-;53264:34;53260:1;53252:6;53248:14;53241:58;53230:76;:::o;53312:230::-;53452:34;53448:1;53440:6;53436:14;53429:58;53521:13;53516:2;53508:6;53504:15;53497:38;53418:124;:::o;53548:231::-;53688:34;53684:1;53676:6;53672:14;53665:58;53757:14;53752:2;53744:6;53740:15;53733:39;53654:125;:::o;53785:182::-;53925:34;53921:1;53913:6;53909:14;53902:58;53891:76;:::o;53973:234::-;54113:34;54109:1;54101:6;54097:14;54090:58;54182:17;54177:2;54169:6;54165:15;54158:42;54079:128;:::o;54213:220::-;54353:34;54349:1;54341:6;54337:14;54330:58;54422:3;54417:2;54409:6;54405:15;54398:28;54319:114;:::o;54439:227::-;54579:34;54575:1;54567:6;54563:14;54556:58;54648:10;54643:2;54635:6;54631:15;54624:35;54545:121;:::o;54672:236::-;54812:34;54808:1;54800:6;54796:14;54789:58;54881:19;54876:2;54868:6;54864:15;54857:44;54778:130;:::o;54914:231::-;55054:34;55050:1;55042:6;55038:14;55031:58;55123:14;55118:2;55110:6;55106:15;55099:39;55020:125;:::o;55151:151::-;55291:3;55287:1;55279:6;55275:14;55268:27;55257:45;:::o;55308:122::-;55381:24;55399:5;55381:24;:::i;:::-;55374:5;55371:35;55361:2;;55420:1;55417;55410:12;55361:2;55351:79;:::o;55436:138::-;55517:32;55543:5;55517:32;:::i;:::-;55510:5;55507:43;55497:2;;55564:1;55561;55554:12;55497:2;55487:87;:::o;55580:116::-;55650:21;55665:5;55650:21;:::i;:::-;55643:5;55640:32;55630:2;;55686:1;55683;55676:12;55630:2;55620:76;:::o;55702:122::-;55775:24;55793:5;55775:24;:::i;:::-;55768:5;55765:35;55755:2;;55814:1;55811;55804:12;55755:2;55745:79;:::o;55830:120::-;55902:23;55919:5;55902:23;:::i;:::-;55895:5;55892:34;55882:2;;55940:1;55937;55930:12;55882:2;55872:78;:::o;55956:122::-;56029:24;56047:5;56029:24;:::i;:::-;56022:5;56019:35;56009:2;;56068:1;56065;56058:12;56009:2;55999:79;:::o

Swarm Source

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