ETH Price: $3,282.82 (+1.09%)
Gas: 1 Gwei

Token

little wicked (LW)
 

Overview

Max Total Supply

1,346 LW

Holders

179

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 LW
0xb1708258b9cd32cbe8c15691cb82d3aacd109828
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:
LwNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

}

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

pragma solidity ^0.8.0;

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

pragma solidity ^0.8.0;


contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

pragma solidity ^0.8.0;

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;

    address proxyRegistryAddress;
    uint256 private _currentTokenId = 0;

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _initializeEIP712(_name);
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function mintTo(address _to) public onlyOwner {
        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _incrementTokenId();
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        _currentTokenId++;
    }

    function baseTokenURI() virtual public view returns (string memory);

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }
}

pragma solidity >=0.7.0 <0.9.0;

contract LwNFT is ERC721Tradable {
    string _baseTokenURI;
    string _baseContractURI;

    constructor(address _proxyRegistryAddress, string memory _contractUri)
        ERC721Tradable("little wicked", "LW", _proxyRegistryAddress)
    {
        _baseContractURI = _contractUri;
        emit Transfer(address(0), msg.sender, 0);
    }

    function setBaseTokenURI(string memory _uri) external onlyOwner {
        _baseTokenURI = _uri;
    }

    function baseTokenURI() public view override returns (string memory) {
        return _baseTokenURI;
    }

    function contractURI() public view returns (string memory) {
        return _baseContractURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_contractUri","type":"string"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600f553480156200003157600080fd5b5060405162004eb138038062004eb18339818101604052810190620000579190620005d0565b6040518060400160405280600d81526020017f6c6974746c65207769636b6564000000000000000000000000000000000000008152506040518060400160405280600281526020017f4c570000000000000000000000000000000000000000000000000000000000008152508382828160009080519060200190620000de9291906200048b565b508060019080519060200190620000f79291906200048b565b50505060006200010c6200027e60201b60201c565b905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001fd836200029a60201b60201c565b5050508060119080519060200190620002189291906200048b565b5060003373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505062000914565b6000620002956200031c60201b620018d01760201c565b905090565b600a60009054906101000a900460ff1615620002ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e490620006dc565b60405180910390fd5b620002fe81620003cf60201b60201c565b6001600a60006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620003c857600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050620003cc565b3390505b90565b6040518060800160405280604f815260200162004e62604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620004466200047e60201b60201c565b60001b6040516020016200045f9594939291906200067f565b60405160208183030381529060405280519060200120600b8190555050565b6000804690508091505090565b8280546200049990620007e2565b90600052602060002090601f016020900481019282620004bd576000855562000509565b82601f10620004d857805160ff191683800117855562000509565b8280016001018555821562000509579182015b8281111562000508578251825591602001919060010190620004eb565b5b5090506200051891906200051c565b5090565b5b80821115620005375760008160009055506001016200051d565b5090565b6000620005526200054c8462000727565b620006fe565b905082815260208101848484011115620005715762000570620008b1565b5b6200057e848285620007ac565b509392505050565b6000815190506200059781620008fa565b92915050565b600082601f830112620005b557620005b4620008ac565b5b8151620005c78482602086016200053b565b91505092915050565b60008060408385031215620005ea57620005e9620008bb565b5b6000620005fa8582860162000586565b925050602083015167ffffffffffffffff8111156200061e576200061d620008b6565b5b6200062c858286016200059d565b9150509250929050565b62000641816200076e565b82525050565b620006528162000782565b82525050565b600062000667600e836200075d565b91506200067482620008d1565b602082019050919050565b600060a08201905062000696600083018862000647565b620006a5602083018762000647565b620006b4604083018662000647565b620006c3606083018562000636565b620006d2608083018462000647565b9695505050505050565b60006020820190508181036000830152620006f78162000658565b9050919050565b60006200070a6200071d565b905062000718828262000818565b919050565b6000604051905090565b600067ffffffffffffffff8211156200074557620007446200087d565b5b6200075082620008c0565b9050602081019050919050565b600082825260208201905092915050565b60006200077b826200078c565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620007cc578082015181840152602081019050620007af565b83811115620007dc576000848401525b50505050565b60006002820490506001821680620007fb57607f821691505b602082108114156200081257620008116200084e565b5b50919050565b6200082382620008c0565b810181811067ffffffffffffffff821117156200084557620008446200087d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b62000905816200076e565b81146200091157600080fd5b50565b61453e80620009246000396000f3fe6080604052600436106101b75760003560e01c80634f6ccce7116100ec578063a22cb4651161008a578063d547cfb711610064578063d547cfb714610637578063e8a3d48514610662578063e985e9c51461068d578063f2fde38b146106ca576101b7565b8063a22cb465146105a8578063b88d4fde146105d1578063c87b56dd146105fa576101b7565b8063715018a6116100c6578063715018a614610512578063755edd17146105295780638da5cb5b1461055257806395d89b411461057d576101b7565b80634f6ccce71461045b5780636352211e1461049857806370a08231146104d5576101b7565b806320379ee5116101595780632f745c59116101335780632f745c59146103a157806330176e13146103de5780633408e4701461040757806342842e0e14610432576101b7565b806320379ee51461031057806323b872dd1461033b5780632d0335ab14610364576101b7565b8063095ea7b311610195578063095ea7b3146102615780630c53c51c1461028a5780630f7e5970146102ba57806318160ddd146102e5576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612f9f565b6106f3565b6040516101f09190613616565b60405180910390f35b34801561020557600080fd5b5061020e61076d565b60405161021b91906136f8565b60405180910390f35b34801561023057600080fd5b5061024b6004803603810190610246919061306f565b6107ff565b6040516102589190613571565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612f5f565b610884565b005b6102a4600480360381019061029f9190612ec8565b61099c565b6040516102b191906136d6565b60405180910390f35b3480156102c657600080fd5b506102cf610c0e565b6040516102dc91906136f8565b60405180910390f35b3480156102f157600080fd5b506102fa610c47565b604051610307919061399a565b60405180910390f35b34801561031c57600080fd5b50610325610c54565b6040516103329190613631565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190612db2565b610c5e565b005b34801561037057600080fd5b5061038b60048036038101906103869190612d45565b610cbe565b604051610398919061399a565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612f5f565b610d07565b6040516103d5919061399a565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190613026565b610dac565b005b34801561041357600080fd5b5061041c610e42565b604051610429919061399a565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612db2565b610e4f565b005b34801561046757600080fd5b50610482600480360381019061047d919061306f565b610e6f565b60405161048f919061399a565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061306f565b610ee0565b6040516104cc9190613571565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f79190612d45565b610f92565b604051610509919061399a565b60405180910390f35b34801561051e57600080fd5b5061052761104a565b005b34801561053557600080fd5b50610550600480360381019061054b9190612d45565b611187565b005b34801561055e57600080fd5b50610567611225565b6040516105749190613571565b60405180910390f35b34801561058957600080fd5b5061059261124f565b60405161059f91906136f8565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190612e88565b6112e1565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190612e05565b611462565b005b34801561060657600080fd5b50610621600480360381019061061c919061306f565b6114c4565b60405161062e91906136f8565b60405180910390f35b34801561064357600080fd5b5061064c6114fe565b60405161065991906136f8565b60405180910390f35b34801561066e57600080fd5b50610677611590565b60405161068491906136f8565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190612d72565b611622565b6040516106c19190613616565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612d45565b611724565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610766575061076582611981565b5b9050919050565b60606000805461077c90613c36565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890613c36565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b600061080a82611a63565b610849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610840906138ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82610ee0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f79061393a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f611acf565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d81610948611acf565b611622565b5b61098d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109849061383a565b60405180910390fd5b6109978383611ade565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a1f8782878787611b97565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a559061391a565b60405180910390fd5b610ab16001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ca090919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b279392919061358c565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610b5c9291906134ee565b604051602081830303815290604052604051610b7891906134d7565b6000604051808303816000865af19150503d8060008114610bb5576040519150601f19603f3d011682016040523d82523d6000602084013e610bba565b606091505b509150915081610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf69061377a565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610c6f610c69611acf565b82611cb6565b610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca59061395a565b60405180910390fd5b610cb9838383611d94565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d1283610f92565b8210610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a9061371a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db4611acf565b73ffffffffffffffffffffffffffffffffffffffff16610dd2611225565b73ffffffffffffffffffffffffffffffffffffffff1614610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906138da565b60405180910390fd5b8060109080519060200190610e3e929190612b1a565b5050565b6000804690508091505090565b610e6a83838360405180602001604052806000815250611462565b505050565b6000610e79610c47565b8210610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb19061397a565b60405180910390fd5b60088281548110610ece57610ecd613dfd565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f809061387a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa9061385a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611052611acf565b73ffffffffffffffffffffffffffffffffffffffff16611070611225565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd906138da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61118f611acf565b73ffffffffffffffffffffffffffffffffffffffff166111ad611225565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906138da565b60405180910390fd5b600061120d611ff0565b9050611219828261200d565b6112216121db565b5050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461125e90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461128a90613c36565b80156112d75780601f106112ac576101008083540402835291602001916112d7565b820191906000526020600020905b8154815290600101906020018083116112ba57829003601f168201915b5050505050905090565b6112e9611acf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e906137da565b60405180910390fd5b8060056000611364611acf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611411611acf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114569190613616565b60405180910390a35050565b61147361146d611acf565b83611cb6565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a99061395a565b60405180910390fd5b6114be848484846121f5565b50505050565b60606114ce6114fe565b6114d783612251565b6040516020016114e8929190613516565b6040516020818303038152906040529050919050565b60606010805461150d90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461153990613c36565b80156115865780601f1061155b57610100808354040283529160200191611586565b820191906000526020600020905b81548152906001019060200180831161156957829003601f168201915b5050505050905090565b60606011805461159f90613c36565b80601f01602080910402602001604051908101604052809291908181526020018280546115cb90613c36565b80156116185780601f106115ed57610100808354040283529160200191611618565b820191906000526020600020905b8154815290600101906020018083116115fb57829003601f168201915b5050505050905090565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161169a9190613571565b60206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea9190612ff9565b73ffffffffffffffffffffffffffffffffffffffff16141561171057600191505061171e565b61171a84846123b2565b9150505b92915050565b61172c611acf565b73ffffffffffffffffffffffffffffffffffffffff1661174a611225565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611797906138da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118079061375a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561197a57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061197e565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a5c5750611a5b82612446565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611ad96118d0565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610ee0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff9061381a565b60405180910390fd5b6001611c1b611c16876124b0565b612518565b83868660405160008152602001604052604051611c3b9493929190613691565b6020604051602081039080840390855afa158015611c5d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611cae9190613a8a565b905092915050565b6000611cc182611a63565b611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906137fa565b60405180910390fd5b6000611d0b83610ee0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d7a57508373ffffffffffffffffffffffffffffffffffffffff16611d62846107ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d8b5750611d8a8185611622565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611db482610ee0565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906138fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906137ba565b60405180910390fd5b611e85838383612551565b611e90600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee09190613b11565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f379190613a8a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120086001600f54611ca090919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120749061389a565b60405180910390fd5b61208681611a63565b156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd9061379a565b60405180910390fd5b6120d260008383612551565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121229190613a8a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600f60008154809291906121ee90613c99565b9190505550565b612200848484611d94565b61220c84848484612665565b61224b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122429061373a565b60405180910390fd5b50505050565b60606000821415612299576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ad565b600082905060005b600082146122cb5780806122b490613c99565b915050600a826122c49190613ae0565b91506122a1565b60008167ffffffffffffffff8111156122e7576122e6613e2c565b5b6040519080825280601f01601f1916602001820160405280156123195781602001600182028036833780820191505090505b5090505b600085146123a6576001826123329190613b11565b9150600a856123419190613d10565b603061234d9190613a8a565b60f81b81838151811061236357612362613dfd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561239f9190613ae0565b945061231d565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016144c66043913980519060200120826000015183602001518460400151805190602001206040516020016124fb949392919061364c565b604051602081830303815290604052805190602001209050919050565b6000612522610c54565b8260405160200161253492919061353a565b604051602081830303815290604052805190602001209050919050565b61255c8383836127fc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561259f5761259a81612801565b6125de565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125dd576125dc838261284a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126215761261c816129b7565b612660565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461265f5761265e8282612a88565b5b5b505050565b60006126868473ffffffffffffffffffffffffffffffffffffffff16612b07565b156127ef578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126af611acf565b8786866040518563ffffffff1660e01b81526004016126d194939291906135ca565b602060405180830381600087803b1580156126eb57600080fd5b505af192505050801561271c57506040513d601f19601f820116820180604052508101906127199190612fcc565b60015b61279f573d806000811461274c576040519150601f19603f3d011682016040523d82523d6000602084013e612751565b606091505b50600081511415612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e9061373a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161285784610f92565b6128619190613b11565b9050600060076000848152602001908152602001600020549050818114612946576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129cb9190613b11565b90506000600960008481526020019081526020016000205490506000600883815481106129fb576129fa613dfd565b5b906000526020600020015490508060088381548110612a1d57612a1c613dfd565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a6c57612a6b613dce565b5b6001900381819060005260206000200160009055905550505050565b6000612a9383610f92565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b2690613c36565b90600052602060002090601f016020900481019282612b485760008555612b8f565b82601f10612b6157805160ff1916838001178555612b8f565b82800160010185558215612b8f579182015b82811115612b8e578251825591602001919060010190612b73565b5b509050612b9c9190612ba0565b5090565b5b80821115612bb9576000816000905550600101612ba1565b5090565b6000612bd0612bcb846139da565b6139b5565b905082815260208101848484011115612bec57612beb613e60565b5b612bf7848285613bf4565b509392505050565b6000612c12612c0d84613a0b565b6139b5565b905082815260208101848484011115612c2e57612c2d613e60565b5b612c39848285613bf4565b509392505050565b600081359050612c5081614424565b92915050565b600081359050612c658161443b565b92915050565b600081359050612c7a81614452565b92915050565b600081359050612c8f81614469565b92915050565b600081519050612ca481614469565b92915050565b600082601f830112612cbf57612cbe613e5b565b5b8135612ccf848260208601612bbd565b91505092915050565b600081519050612ce781614480565b92915050565b600082601f830112612d0257612d01613e5b565b5b8135612d12848260208601612bff565b91505092915050565b600081359050612d2a81614497565b92915050565b600081359050612d3f816144ae565b92915050565b600060208284031215612d5b57612d5a613e6a565b5b6000612d6984828501612c41565b91505092915050565b60008060408385031215612d8957612d88613e6a565b5b6000612d9785828601612c41565b9250506020612da885828601612c41565b9150509250929050565b600080600060608486031215612dcb57612dca613e6a565b5b6000612dd986828701612c41565b9350506020612dea86828701612c41565b9250506040612dfb86828701612d1b565b9150509250925092565b60008060008060808587031215612e1f57612e1e613e6a565b5b6000612e2d87828801612c41565b9450506020612e3e87828801612c41565b9350506040612e4f87828801612d1b565b925050606085013567ffffffffffffffff811115612e7057612e6f613e65565b5b612e7c87828801612caa565b91505092959194509250565b60008060408385031215612e9f57612e9e613e6a565b5b6000612ead85828601612c41565b9250506020612ebe85828601612c56565b9150509250929050565b600080600080600060a08688031215612ee457612ee3613e6a565b5b6000612ef288828901612c41565b955050602086013567ffffffffffffffff811115612f1357612f12613e65565b5b612f1f88828901612caa565b9450506040612f3088828901612c6b565b9350506060612f4188828901612c6b565b9250506080612f5288828901612d30565b9150509295509295909350565b60008060408385031215612f7657612f75613e6a565b5b6000612f8485828601612c41565b9250506020612f9585828601612d1b565b9150509250929050565b600060208284031215612fb557612fb4613e6a565b5b6000612fc384828501612c80565b91505092915050565b600060208284031215612fe257612fe1613e6a565b5b6000612ff084828501612c95565b91505092915050565b60006020828403121561300f5761300e613e6a565b5b600061301d84828501612cd8565b91505092915050565b60006020828403121561303c5761303b613e6a565b5b600082013567ffffffffffffffff81111561305a57613059613e65565b5b61306684828501612ced565b91505092915050565b60006020828403121561308557613084613e6a565b5b600061309384828501612d1b565b91505092915050565b6130a581613b57565b82525050565b6130b481613b45565b82525050565b6130cb6130c682613b45565b613ce2565b82525050565b6130da81613b69565b82525050565b6130e981613b75565b82525050565b6131006130fb82613b75565b613cf4565b82525050565b600061311182613a3c565b61311b8185613a52565b935061312b818560208601613c03565b61313481613e6f565b840191505092915050565b600061314a82613a3c565b6131548185613a63565b9350613164818560208601613c03565b80840191505092915050565b600061317b82613a47565b6131858185613a6e565b9350613195818560208601613c03565b61319e81613e6f565b840191505092915050565b60006131b482613a47565b6131be8185613a7f565b93506131ce818560208601613c03565b80840191505092915050565b60006131e7602b83613a6e565b91506131f282613e8d565b604082019050919050565b600061320a603283613a6e565b915061321582613edc565b604082019050919050565b600061322d602683613a6e565b915061323882613f2b565b604082019050919050565b6000613250601c83613a6e565b915061325b82613f7a565b602082019050919050565b6000613273601c83613a6e565b915061327e82613fa3565b602082019050919050565b6000613296600283613a7f565b91506132a182613fcc565b600282019050919050565b60006132b9602483613a6e565b91506132c482613ff5565b604082019050919050565b60006132dc601983613a6e565b91506132e782614044565b602082019050919050565b60006132ff602c83613a6e565b915061330a8261406d565b604082019050919050565b6000613322602583613a6e565b915061332d826140bc565b604082019050919050565b6000613345603883613a6e565b91506133508261410b565b604082019050919050565b6000613368602a83613a6e565b91506133738261415a565b604082019050919050565b600061338b602983613a6e565b9150613396826141a9565b604082019050919050565b60006133ae602083613a6e565b91506133b9826141f8565b602082019050919050565b60006133d1602c83613a6e565b91506133dc82614221565b604082019050919050565b60006133f4602083613a6e565b91506133ff82614270565b602082019050919050565b6000613417602983613a6e565b915061342282614299565b604082019050919050565b600061343a602183613a6e565b9150613445826142e8565b604082019050919050565b600061345d602183613a6e565b915061346882614337565b604082019050919050565b6000613480603183613a6e565b915061348b82614386565b604082019050919050565b60006134a3602c83613a6e565b91506134ae826143d5565b604082019050919050565b6134c281613bdd565b82525050565b6134d181613be7565b82525050565b60006134e3828461313f565b915081905092915050565b60006134fa828561313f565b915061350682846130ba565b6014820191508190509392505050565b600061352282856131a9565b915061352e82846131a9565b91508190509392505050565b600061354582613289565b915061355182856130ef565b60208201915061356182846130ef565b6020820191508190509392505050565b600060208201905061358660008301846130ab565b92915050565b60006060820190506135a160008301866130ab565b6135ae602083018561309c565b81810360408301526135c08184613106565b9050949350505050565b60006080820190506135df60008301876130ab565b6135ec60208301866130ab565b6135f960408301856134b9565b818103606083015261360b8184613106565b905095945050505050565b600060208201905061362b60008301846130d1565b92915050565b600060208201905061364660008301846130e0565b92915050565b600060808201905061366160008301876130e0565b61366e60208301866134b9565b61367b60408301856130ab565b61368860608301846130e0565b95945050505050565b60006080820190506136a660008301876130e0565b6136b360208301866134c8565b6136c060408301856130e0565b6136cd60608301846130e0565b95945050505050565b600060208201905081810360008301526136f08184613106565b905092915050565b600060208201905081810360008301526137128184613170565b905092915050565b60006020820190508181036000830152613733816131da565b9050919050565b60006020820190508181036000830152613753816131fd565b9050919050565b6000602082019050818103600083015261377381613220565b9050919050565b6000602082019050818103600083015261379381613243565b9050919050565b600060208201905081810360008301526137b381613266565b9050919050565b600060208201905081810360008301526137d3816132ac565b9050919050565b600060208201905081810360008301526137f3816132cf565b9050919050565b60006020820190508181036000830152613813816132f2565b9050919050565b6000602082019050818103600083015261383381613315565b9050919050565b6000602082019050818103600083015261385381613338565b9050919050565b600060208201905081810360008301526138738161335b565b9050919050565b600060208201905081810360008301526138938161337e565b9050919050565b600060208201905081810360008301526138b3816133a1565b9050919050565b600060208201905081810360008301526138d3816133c4565b9050919050565b600060208201905081810360008301526138f3816133e7565b9050919050565b600060208201905081810360008301526139138161340a565b9050919050565b600060208201905081810360008301526139338161342d565b9050919050565b6000602082019050818103600083015261395381613450565b9050919050565b6000602082019050818103600083015261397381613473565b9050919050565b6000602082019050818103600083015261399381613496565b9050919050565b60006020820190506139af60008301846134b9565b92915050565b60006139bf6139d0565b90506139cb8282613c68565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f5576139f4613e2c565b5b6139fe82613e6f565b9050602081019050919050565b600067ffffffffffffffff821115613a2657613a25613e2c565b5b613a2f82613e6f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9582613bdd565b9150613aa083613bdd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad557613ad4613d41565b5b828201905092915050565b6000613aeb82613bdd565b9150613af683613bdd565b925082613b0657613b05613d70565b5b828204905092915050565b6000613b1c82613bdd565b9150613b2783613bdd565b925082821015613b3a57613b39613d41565b5b828203905092915050565b6000613b5082613bbd565b9050919050565b6000613b6282613bbd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613bb682613b45565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613c21578082015181840152602081019050613c06565b83811115613c30576000848401525b50505050565b60006002820490506001821680613c4e57607f821691505b60208210811415613c6257613c61613d9f565b5b50919050565b613c7182613e6f565b810181811067ffffffffffffffff82111715613c9057613c8f613e2c565b5b80604052505050565b6000613ca482613bdd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cd757613cd6613d41565b5b600182019050919050565b6000613ced82613cfe565b9050919050565b6000819050919050565b6000613d0982613e80565b9050919050565b6000613d1b82613bdd565b9150613d2683613bdd565b925082613d3657613d35613d70565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61442d81613b45565b811461443857600080fd5b50565b61444481613b69565b811461444f57600080fd5b50565b61445b81613b75565b811461446657600080fd5b50565b61447281613b7f565b811461447d57600080fd5b50565b61448981613bab565b811461449457600080fd5b50565b6144a081613bdd565b81146144ab57600080fd5b50565b6144b781613be7565b81146144c257600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212204f6d111c0f73fe5cea718eb07a75dedc4c9d0c257f423a52b2add9338f95b8e364736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000b55776ec08aaf4ad1339562205edf037905d3f160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004a68747470733a2f2f697066732e696e667572612e696f2f697066732f516d54714363716b656f765a6d5054716368523731364b35614c6e6a664c376d576b58766d654e4b54613635785700000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80634f6ccce7116100ec578063a22cb4651161008a578063d547cfb711610064578063d547cfb714610637578063e8a3d48514610662578063e985e9c51461068d578063f2fde38b146106ca576101b7565b8063a22cb465146105a8578063b88d4fde146105d1578063c87b56dd146105fa576101b7565b8063715018a6116100c6578063715018a614610512578063755edd17146105295780638da5cb5b1461055257806395d89b411461057d576101b7565b80634f6ccce71461045b5780636352211e1461049857806370a08231146104d5576101b7565b806320379ee5116101595780632f745c59116101335780632f745c59146103a157806330176e13146103de5780633408e4701461040757806342842e0e14610432576101b7565b806320379ee51461031057806323b872dd1461033b5780632d0335ab14610364576101b7565b8063095ea7b311610195578063095ea7b3146102615780630c53c51c1461028a5780630f7e5970146102ba57806318160ddd146102e5576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612f9f565b6106f3565b6040516101f09190613616565b60405180910390f35b34801561020557600080fd5b5061020e61076d565b60405161021b91906136f8565b60405180910390f35b34801561023057600080fd5b5061024b6004803603810190610246919061306f565b6107ff565b6040516102589190613571565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612f5f565b610884565b005b6102a4600480360381019061029f9190612ec8565b61099c565b6040516102b191906136d6565b60405180910390f35b3480156102c657600080fd5b506102cf610c0e565b6040516102dc91906136f8565b60405180910390f35b3480156102f157600080fd5b506102fa610c47565b604051610307919061399a565b60405180910390f35b34801561031c57600080fd5b50610325610c54565b6040516103329190613631565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190612db2565b610c5e565b005b34801561037057600080fd5b5061038b60048036038101906103869190612d45565b610cbe565b604051610398919061399a565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612f5f565b610d07565b6040516103d5919061399a565b60405180910390f35b3480156103ea57600080fd5b5061040560048036038101906104009190613026565b610dac565b005b34801561041357600080fd5b5061041c610e42565b604051610429919061399a565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612db2565b610e4f565b005b34801561046757600080fd5b50610482600480360381019061047d919061306f565b610e6f565b60405161048f919061399a565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061306f565b610ee0565b6040516104cc9190613571565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f79190612d45565b610f92565b604051610509919061399a565b60405180910390f35b34801561051e57600080fd5b5061052761104a565b005b34801561053557600080fd5b50610550600480360381019061054b9190612d45565b611187565b005b34801561055e57600080fd5b50610567611225565b6040516105749190613571565b60405180910390f35b34801561058957600080fd5b5061059261124f565b60405161059f91906136f8565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190612e88565b6112e1565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190612e05565b611462565b005b34801561060657600080fd5b50610621600480360381019061061c919061306f565b6114c4565b60405161062e91906136f8565b60405180910390f35b34801561064357600080fd5b5061064c6114fe565b60405161065991906136f8565b60405180910390f35b34801561066e57600080fd5b50610677611590565b60405161068491906136f8565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190612d72565b611622565b6040516106c19190613616565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612d45565b611724565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610766575061076582611981565b5b9050919050565b60606000805461077c90613c36565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890613c36565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b600061080a82611a63565b610849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610840906138ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82610ee0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f79061393a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f611acf565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d81610948611acf565b611622565b5b61098d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109849061383a565b60405180910390fd5b6109978383611ade565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a1f8782878787611b97565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a559061391a565b60405180910390fd5b610ab16001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ca090919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b279392919061358c565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610b5c9291906134ee565b604051602081830303815290604052604051610b7891906134d7565b6000604051808303816000865af19150503d8060008114610bb5576040519150601f19603f3d011682016040523d82523d6000602084013e610bba565b606091505b509150915081610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf69061377a565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610c6f610c69611acf565b82611cb6565b610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca59061395a565b60405180910390fd5b610cb9838383611d94565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d1283610f92565b8210610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a9061371a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610db4611acf565b73ffffffffffffffffffffffffffffffffffffffff16610dd2611225565b73ffffffffffffffffffffffffffffffffffffffff1614610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906138da565b60405180910390fd5b8060109080519060200190610e3e929190612b1a565b5050565b6000804690508091505090565b610e6a83838360405180602001604052806000815250611462565b505050565b6000610e79610c47565b8210610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb19061397a565b60405180910390fd5b60088281548110610ece57610ecd613dfd565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f809061387a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa9061385a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611052611acf565b73ffffffffffffffffffffffffffffffffffffffff16611070611225565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd906138da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61118f611acf565b73ffffffffffffffffffffffffffffffffffffffff166111ad611225565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906138da565b60405180910390fd5b600061120d611ff0565b9050611219828261200d565b6112216121db565b5050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461125e90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461128a90613c36565b80156112d75780601f106112ac576101008083540402835291602001916112d7565b820191906000526020600020905b8154815290600101906020018083116112ba57829003601f168201915b5050505050905090565b6112e9611acf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e906137da565b60405180910390fd5b8060056000611364611acf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611411611acf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114569190613616565b60405180910390a35050565b61147361146d611acf565b83611cb6565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a99061395a565b60405180910390fd5b6114be848484846121f5565b50505050565b60606114ce6114fe565b6114d783612251565b6040516020016114e8929190613516565b6040516020818303038152906040529050919050565b60606010805461150d90613c36565b80601f016020809104026020016040519081016040528092919081815260200182805461153990613c36565b80156115865780601f1061155b57610100808354040283529160200191611586565b820191906000526020600020905b81548152906001019060200180831161156957829003601f168201915b5050505050905090565b60606011805461159f90613c36565b80601f01602080910402602001604051908101604052809291908181526020018280546115cb90613c36565b80156116185780601f106115ed57610100808354040283529160200191611618565b820191906000526020600020905b8154815290600101906020018083116115fb57829003601f168201915b5050505050905090565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161169a9190613571565b60206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea9190612ff9565b73ffffffffffffffffffffffffffffffffffffffff16141561171057600191505061171e565b61171a84846123b2565b9150505b92915050565b61172c611acf565b73ffffffffffffffffffffffffffffffffffffffff1661174a611225565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611797906138da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118079061375a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561197a57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061197e565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a5c5750611a5b82612446565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611ad96118d0565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610ee0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff9061381a565b60405180910390fd5b6001611c1b611c16876124b0565b612518565b83868660405160008152602001604052604051611c3b9493929190613691565b6020604051602081039080840390855afa158015611c5d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611cae9190613a8a565b905092915050565b6000611cc182611a63565b611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906137fa565b60405180910390fd5b6000611d0b83610ee0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d7a57508373ffffffffffffffffffffffffffffffffffffffff16611d62846107ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d8b5750611d8a8185611622565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611db482610ee0565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906138fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906137ba565b60405180910390fd5b611e85838383612551565b611e90600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee09190613b11565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f379190613a8a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120086001600f54611ca090919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120749061389a565b60405180910390fd5b61208681611a63565b156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd9061379a565b60405180910390fd5b6120d260008383612551565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121229190613a8a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600f60008154809291906121ee90613c99565b9190505550565b612200848484611d94565b61220c84848484612665565b61224b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122429061373a565b60405180910390fd5b50505050565b60606000821415612299576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ad565b600082905060005b600082146122cb5780806122b490613c99565b915050600a826122c49190613ae0565b91506122a1565b60008167ffffffffffffffff8111156122e7576122e6613e2c565b5b6040519080825280601f01601f1916602001820160405280156123195781602001600182028036833780820191505090505b5090505b600085146123a6576001826123329190613b11565b9150600a856123419190613d10565b603061234d9190613a8a565b60f81b81838151811061236357612362613dfd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561239f9190613ae0565b945061231d565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016144c66043913980519060200120826000015183602001518460400151805190602001206040516020016124fb949392919061364c565b604051602081830303815290604052805190602001209050919050565b6000612522610c54565b8260405160200161253492919061353a565b604051602081830303815290604052805190602001209050919050565b61255c8383836127fc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561259f5761259a81612801565b6125de565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125dd576125dc838261284a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126215761261c816129b7565b612660565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461265f5761265e8282612a88565b5b5b505050565b60006126868473ffffffffffffffffffffffffffffffffffffffff16612b07565b156127ef578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126af611acf565b8786866040518563ffffffff1660e01b81526004016126d194939291906135ca565b602060405180830381600087803b1580156126eb57600080fd5b505af192505050801561271c57506040513d601f19601f820116820180604052508101906127199190612fcc565b60015b61279f573d806000811461274c576040519150601f19603f3d011682016040523d82523d6000602084013e612751565b606091505b50600081511415612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e9061373a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161285784610f92565b6128619190613b11565b9050600060076000848152602001908152602001600020549050818114612946576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129cb9190613b11565b90506000600960008481526020019081526020016000205490506000600883815481106129fb576129fa613dfd565b5b906000526020600020015490508060088381548110612a1d57612a1c613dfd565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a6c57612a6b613dce565b5b6001900381819060005260206000200160009055905550505050565b6000612a9383610f92565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b2690613c36565b90600052602060002090601f016020900481019282612b485760008555612b8f565b82601f10612b6157805160ff1916838001178555612b8f565b82800160010185558215612b8f579182015b82811115612b8e578251825591602001919060010190612b73565b5b509050612b9c9190612ba0565b5090565b5b80821115612bb9576000816000905550600101612ba1565b5090565b6000612bd0612bcb846139da565b6139b5565b905082815260208101848484011115612bec57612beb613e60565b5b612bf7848285613bf4565b509392505050565b6000612c12612c0d84613a0b565b6139b5565b905082815260208101848484011115612c2e57612c2d613e60565b5b612c39848285613bf4565b509392505050565b600081359050612c5081614424565b92915050565b600081359050612c658161443b565b92915050565b600081359050612c7a81614452565b92915050565b600081359050612c8f81614469565b92915050565b600081519050612ca481614469565b92915050565b600082601f830112612cbf57612cbe613e5b565b5b8135612ccf848260208601612bbd565b91505092915050565b600081519050612ce781614480565b92915050565b600082601f830112612d0257612d01613e5b565b5b8135612d12848260208601612bff565b91505092915050565b600081359050612d2a81614497565b92915050565b600081359050612d3f816144ae565b92915050565b600060208284031215612d5b57612d5a613e6a565b5b6000612d6984828501612c41565b91505092915050565b60008060408385031215612d8957612d88613e6a565b5b6000612d9785828601612c41565b9250506020612da885828601612c41565b9150509250929050565b600080600060608486031215612dcb57612dca613e6a565b5b6000612dd986828701612c41565b9350506020612dea86828701612c41565b9250506040612dfb86828701612d1b565b9150509250925092565b60008060008060808587031215612e1f57612e1e613e6a565b5b6000612e2d87828801612c41565b9450506020612e3e87828801612c41565b9350506040612e4f87828801612d1b565b925050606085013567ffffffffffffffff811115612e7057612e6f613e65565b5b612e7c87828801612caa565b91505092959194509250565b60008060408385031215612e9f57612e9e613e6a565b5b6000612ead85828601612c41565b9250506020612ebe85828601612c56565b9150509250929050565b600080600080600060a08688031215612ee457612ee3613e6a565b5b6000612ef288828901612c41565b955050602086013567ffffffffffffffff811115612f1357612f12613e65565b5b612f1f88828901612caa565b9450506040612f3088828901612c6b565b9350506060612f4188828901612c6b565b9250506080612f5288828901612d30565b9150509295509295909350565b60008060408385031215612f7657612f75613e6a565b5b6000612f8485828601612c41565b9250506020612f9585828601612d1b565b9150509250929050565b600060208284031215612fb557612fb4613e6a565b5b6000612fc384828501612c80565b91505092915050565b600060208284031215612fe257612fe1613e6a565b5b6000612ff084828501612c95565b91505092915050565b60006020828403121561300f5761300e613e6a565b5b600061301d84828501612cd8565b91505092915050565b60006020828403121561303c5761303b613e6a565b5b600082013567ffffffffffffffff81111561305a57613059613e65565b5b61306684828501612ced565b91505092915050565b60006020828403121561308557613084613e6a565b5b600061309384828501612d1b565b91505092915050565b6130a581613b57565b82525050565b6130b481613b45565b82525050565b6130cb6130c682613b45565b613ce2565b82525050565b6130da81613b69565b82525050565b6130e981613b75565b82525050565b6131006130fb82613b75565b613cf4565b82525050565b600061311182613a3c565b61311b8185613a52565b935061312b818560208601613c03565b61313481613e6f565b840191505092915050565b600061314a82613a3c565b6131548185613a63565b9350613164818560208601613c03565b80840191505092915050565b600061317b82613a47565b6131858185613a6e565b9350613195818560208601613c03565b61319e81613e6f565b840191505092915050565b60006131b482613a47565b6131be8185613a7f565b93506131ce818560208601613c03565b80840191505092915050565b60006131e7602b83613a6e565b91506131f282613e8d565b604082019050919050565b600061320a603283613a6e565b915061321582613edc565b604082019050919050565b600061322d602683613a6e565b915061323882613f2b565b604082019050919050565b6000613250601c83613a6e565b915061325b82613f7a565b602082019050919050565b6000613273601c83613a6e565b915061327e82613fa3565b602082019050919050565b6000613296600283613a7f565b91506132a182613fcc565b600282019050919050565b60006132b9602483613a6e565b91506132c482613ff5565b604082019050919050565b60006132dc601983613a6e565b91506132e782614044565b602082019050919050565b60006132ff602c83613a6e565b915061330a8261406d565b604082019050919050565b6000613322602583613a6e565b915061332d826140bc565b604082019050919050565b6000613345603883613a6e565b91506133508261410b565b604082019050919050565b6000613368602a83613a6e565b91506133738261415a565b604082019050919050565b600061338b602983613a6e565b9150613396826141a9565b604082019050919050565b60006133ae602083613a6e565b91506133b9826141f8565b602082019050919050565b60006133d1602c83613a6e565b91506133dc82614221565b604082019050919050565b60006133f4602083613a6e565b91506133ff82614270565b602082019050919050565b6000613417602983613a6e565b915061342282614299565b604082019050919050565b600061343a602183613a6e565b9150613445826142e8565b604082019050919050565b600061345d602183613a6e565b915061346882614337565b604082019050919050565b6000613480603183613a6e565b915061348b82614386565b604082019050919050565b60006134a3602c83613a6e565b91506134ae826143d5565b604082019050919050565b6134c281613bdd565b82525050565b6134d181613be7565b82525050565b60006134e3828461313f565b915081905092915050565b60006134fa828561313f565b915061350682846130ba565b6014820191508190509392505050565b600061352282856131a9565b915061352e82846131a9565b91508190509392505050565b600061354582613289565b915061355182856130ef565b60208201915061356182846130ef565b6020820191508190509392505050565b600060208201905061358660008301846130ab565b92915050565b60006060820190506135a160008301866130ab565b6135ae602083018561309c565b81810360408301526135c08184613106565b9050949350505050565b60006080820190506135df60008301876130ab565b6135ec60208301866130ab565b6135f960408301856134b9565b818103606083015261360b8184613106565b905095945050505050565b600060208201905061362b60008301846130d1565b92915050565b600060208201905061364660008301846130e0565b92915050565b600060808201905061366160008301876130e0565b61366e60208301866134b9565b61367b60408301856130ab565b61368860608301846130e0565b95945050505050565b60006080820190506136a660008301876130e0565b6136b360208301866134c8565b6136c060408301856130e0565b6136cd60608301846130e0565b95945050505050565b600060208201905081810360008301526136f08184613106565b905092915050565b600060208201905081810360008301526137128184613170565b905092915050565b60006020820190508181036000830152613733816131da565b9050919050565b60006020820190508181036000830152613753816131fd565b9050919050565b6000602082019050818103600083015261377381613220565b9050919050565b6000602082019050818103600083015261379381613243565b9050919050565b600060208201905081810360008301526137b381613266565b9050919050565b600060208201905081810360008301526137d3816132ac565b9050919050565b600060208201905081810360008301526137f3816132cf565b9050919050565b60006020820190508181036000830152613813816132f2565b9050919050565b6000602082019050818103600083015261383381613315565b9050919050565b6000602082019050818103600083015261385381613338565b9050919050565b600060208201905081810360008301526138738161335b565b9050919050565b600060208201905081810360008301526138938161337e565b9050919050565b600060208201905081810360008301526138b3816133a1565b9050919050565b600060208201905081810360008301526138d3816133c4565b9050919050565b600060208201905081810360008301526138f3816133e7565b9050919050565b600060208201905081810360008301526139138161340a565b9050919050565b600060208201905081810360008301526139338161342d565b9050919050565b6000602082019050818103600083015261395381613450565b9050919050565b6000602082019050818103600083015261397381613473565b9050919050565b6000602082019050818103600083015261399381613496565b9050919050565b60006020820190506139af60008301846134b9565b92915050565b60006139bf6139d0565b90506139cb8282613c68565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f5576139f4613e2c565b5b6139fe82613e6f565b9050602081019050919050565b600067ffffffffffffffff821115613a2657613a25613e2c565b5b613a2f82613e6f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9582613bdd565b9150613aa083613bdd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad557613ad4613d41565b5b828201905092915050565b6000613aeb82613bdd565b9150613af683613bdd565b925082613b0657613b05613d70565b5b828204905092915050565b6000613b1c82613bdd565b9150613b2783613bdd565b925082821015613b3a57613b39613d41565b5b828203905092915050565b6000613b5082613bbd565b9050919050565b6000613b6282613bbd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613bb682613b45565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613c21578082015181840152602081019050613c06565b83811115613c30576000848401525b50505050565b60006002820490506001821680613c4e57607f821691505b60208210811415613c6257613c61613d9f565b5b50919050565b613c7182613e6f565b810181811067ffffffffffffffff82111715613c9057613c8f613e2c565b5b80604052505050565b6000613ca482613bdd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cd757613cd6613d41565b5b600182019050919050565b6000613ced82613cfe565b9050919050565b6000819050919050565b6000613d0982613e80565b9050919050565b6000613d1b82613bdd565b9150613d2683613bdd565b925082613d3657613d35613d70565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61442d81613b45565b811461443857600080fd5b50565b61444481613b69565b811461444f57600080fd5b50565b61445b81613b75565b811461446657600080fd5b50565b61447281613b7f565b811461447d57600080fd5b50565b61448981613bab565b811461449457600080fd5b50565b6144a081613bdd565b81146144ab57600080fd5b50565b6144b781613be7565b81146144c257600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212204f6d111c0f73fe5cea718eb07a75dedc4c9d0c257f423a52b2add9338f95b8e364736f6c63430008070033

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

000000000000000000000000b55776ec08aaf4ad1339562205edf037905d3f160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004a68747470733a2f2f697066732e696e667572612e696f2f697066732f516d54714363716b656f765a6d5054716368523731364b35614c6e6a664c376d576b58766d654e4b54613635785700000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xB55776ec08aaf4aD1339562205edF037905d3f16
Arg [1] : _contractUri (string): https://ipfs.infura.io/ipfs/QmTqCcqkeovZmPTqchR716K5aLnjfL7mWkXvmeNKTa65xW

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b55776ec08aaf4ad1339562205edf037905d3f16
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 000000000000000000000000000000000000000000000000000000000000004a
Arg [3] : 68747470733a2f2f697066732e696e667572612e696f2f697066732f516d5471
Arg [4] : 4363716b656f765a6d5054716368523731364b35614c6e6a664c376d576b5876
Arg [5] : 6d654e4b54613635785700000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57663:685:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33534:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20914:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22374:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21911:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52822:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50058:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34187:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51067:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23264:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54399:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33855:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58017:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51176:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23640:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34377:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20608:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20338:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41347:148;;;;;;;;;;;;;:::i;:::-;;55908:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40696:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21083:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22667:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23862:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56564:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58128:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58244:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56871:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41650:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33534:237;33636:4;33675:35;33660:50;;;:11;:50;;;;:103;;;;33727:36;33751:11;33727:23;:36::i;:::-;33660:103;33653:110;;33534:237;;;:::o;20914:100::-;20968:13;21001:5;20994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20914:100;:::o;22374:221::-;22450:7;22478:16;22486:7;22478;:16::i;:::-;22470:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22563:15;:24;22579:7;22563:24;;;;;;;;;;;;;;;;;;;;;22556:31;;22374:221;;;:::o;21911:397::-;21992:13;22008:23;22023:7;22008:14;:23::i;:::-;21992:39;;22056:5;22050:11;;:2;:11;;;;22042:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22136:5;22120:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22145:37;22162:5;22169:12;:10;:12::i;:::-;22145:16;:37::i;:::-;22120:62;22112:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22288:2;22292:7;22279:8;:21::i;:::-;21981:327;21911:397;;:::o;52822:1151::-;53023:12;53048:29;53080:152;;;;;;;;53118:6;:19;53125:11;53118:19;;;;;;;;;;;;;;;;53080:152;;;;53158:11;53080:152;;;;;;53203:17;53080:152;;;53048:184;;53267:45;53274:11;53287:6;53295:4;53301;53307;53267:6;:45::i;:::-;53245:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;53462:26;53486:1;53462:6;:19;53469:11;53462:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;53440:6;:19;53447:11;53440:19;;;;;;;;;;;;;;;:48;;;;53506:126;53544:11;53578:10;53604:17;53506:126;;;;;;;;:::i;:::-;;;;;;;;53743:12;53757:23;53792:4;53784:18;;53834:17;53853:11;53817:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53784:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53742:134;;;;53895:7;53887:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53955:10;53948:17;;;;;52822:1151;;;;;;;:::o;50058:43::-;;;;;;;;;;;;;;;;;;;:::o;34187:113::-;34248:7;34275:10;:17;;;;34268:24;;34187:113;:::o;51067:101::-;51118:7;51145:15;;51138:22;;51067:101;:::o;23264:305::-;23425:41;23444:12;:10;:12::i;:::-;23458:7;23425:18;:41::i;:::-;23417:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23533:28;23543:4;23549:2;23553:7;23533:9;:28::i;:::-;23264:305;;;:::o;54399:107::-;54452:13;54486:6;:12;54493:4;54486:12;;;;;;;;;;;;;;;;54478:20;;54399:107;;;:::o;33855:256::-;33952:7;33988:23;34005:5;33988:16;:23::i;:::-;33980:5;:31;33972:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34077:12;:19;34090:5;34077:19;;;;;;;;;;;;;;;:26;34097:5;34077:26;;;;;;;;;;;;34070:33;;33855:256;;;;:::o;58017:103::-;40927:12;:10;:12::i;:::-;40916:23;;:7;:5;:7::i;:::-;:23;;;40908:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58108:4:::1;58092:13;:20;;;;;;;;;;;;:::i;:::-;;58017:103:::0;:::o;51176:161::-;51219:7;51239:10;51290:9;51284:15;;51327:2;51320:9;;;51176:161;:::o;23640:151::-;23744:39;23761:4;23767:2;23771:7;23744:39;;;;;;;;;;;;:16;:39::i;:::-;23640:151;;;:::o;34377:233::-;34452:7;34488:30;:28;:30::i;:::-;34480:5;:38;34472:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34585:10;34596:5;34585:17;;;;;;;;:::i;:::-;;;;;;;;;;34578:24;;34377:233;;;:::o;20608:239::-;20680:7;20700:13;20716:7;:16;20724:7;20716:16;;;;;;;;;;;;;;;;;;;;;20700:32;;20768:1;20751:19;;:5;:19;;;;20743:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20834:5;20827:12;;;20608:239;;;:::o;20338:208::-;20410:7;20455:1;20438:19;;:5;:19;;;;20430:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20522:9;:16;20532:5;20522:16;;;;;;;;;;;;;;;;20515:23;;20338:208;;;:::o;41347:148::-;40927:12;:10;:12::i;:::-;40916:23;;:7;:5;:7::i;:::-;:23;;;40908:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41454:1:::1;41417:40;;41438:6;;;;;;;;;;;41417:40;;;;;;;;;;;;41485:1;41468:6;;:19;;;;;;;;;;;;;;;;;;41347:148::o:0;55908:166::-;40927:12;:10;:12::i;:::-;40916:23;;:7;:5;:7::i;:::-;:23;;;40908:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55965:18:::1;55986:17;:15;:17::i;:::-;55965:38;;56014:22;56020:3;56025:10;56014:5;:22::i;:::-;56047:19;:17;:19::i;:::-;55954:120;55908:166:::0;:::o;40696:87::-;40742:7;40769:6;;;;;;;;;;;40762:13;;40696:87;:::o;21083:104::-;21139:13;21172:7;21165:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21083:104;:::o;22667:295::-;22782:12;:10;:12::i;:::-;22770:24;;:8;:24;;;;22762:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22882:8;22837:18;:32;22856:12;:10;:12::i;:::-;22837:32;;;;;;;;;;;;;;;:42;22870:8;22837:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22935:8;22906:48;;22921:12;:10;:12::i;:::-;22906:48;;;22945:8;22906:48;;;;;;:::i;:::-;;;;;;;;22667:295;;:::o;23862:285::-;23994:41;24013:12;:10;:12::i;:::-;24027:7;23994:18;:41::i;:::-;23986:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24100:39;24114:4;24120:2;24124:7;24133:5;24100:13;:39::i;:::-;23862:285;;;;:::o;56564:175::-;56630:13;56687:14;:12;:14::i;:::-;56703:26;56720:8;56703:16;:26::i;:::-;56670:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56656:75;;56564:175;;;:::o;58128:108::-;58182:13;58215;58208:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58128:108;:::o;58244:101::-;58288:13;58321:16;58314:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58244:101;:::o;56871:445::-;56996:4;57081:27;57125:20;;;;;;;;;;;57081:65;;57202:8;57161:49;;57169:13;:21;;;57191:5;57169:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57161:49;;;57157:93;;;57234:4;57227:11;;;;;57157:93;57269:39;57292:5;57299:8;57269:22;:39::i;:::-;57262:46;;;56871:445;;;;;:::o;41650:244::-;40927:12;:10;:12::i;:::-;40916:23;;:7;:5;:7::i;:::-;:23;;;40908:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41759:1:::1;41739:22;;:8;:22;;;;41731:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41849:8;41820:38;;41841:6;;;;;;;;;;;41820:38;;;;;;;;;;;;41878:8;41869:6;;:17;;;;;;;;;;;;;;;;;;41650:244:::0;:::o;48984:650::-;49055:22;49121:4;49099:27;;:10;:27;;;49095:508;;;49143:18;49164:8;;49143:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49187:13;49203:8;;:15;;49187:31;;49455:42;49425:5;49418;49414:17;49408:24;49382:134;49372:144;;49242:289;;49095:508;;;49580:10;49563:28;;49095:508;48984:650;:::o;19982:292::-;20084:4;20123:25;20108:40;;;:11;:40;;;;:105;;;;20180:33;20165:48;;;:11;:48;;;;20108:105;:158;;;;20230:36;20254:11;20230:23;:36::i;:::-;20108:158;20101:165;;19982:292;;;:::o;25614:127::-;25679:4;25731:1;25703:30;;:7;:16;25711:7;25703:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25696:37;;25614:127;;;:::o;57460:161::-;57550:14;57589:24;:22;:24::i;:::-;57582:31;;57460:161;:::o;29491:174::-;29593:2;29566:15;:24;29582:7;29566:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29649:7;29645:2;29611:46;;29620:23;29635:7;29620:14;:23::i;:::-;29611:46;;;;;;;;;;;;29491:174;;:::o;54514:486::-;54692:4;54735:1;54717:20;;:6;:20;;;;54709:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54833:159;54861:47;54880:27;54900:6;54880:19;:27::i;:::-;54861:18;:47::i;:::-;54927:4;54950;54973;54833:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54810:182;;:6;:182;;;54790:202;;54514:486;;;;;;;:::o;44629:98::-;44687:7;44718:1;44714;:5;;;;:::i;:::-;44707:12;;44629:98;;;;:::o;25908:348::-;26001:4;26026:16;26034:7;26026;:16::i;:::-;26018:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26102:13;26118:23;26133:7;26118:14;:23::i;:::-;26102:39;;26171:5;26160:16;;:7;:16;;;:51;;;;26204:7;26180:31;;:20;26192:7;26180:11;:20::i;:::-;:31;;;26160:51;:87;;;;26215:32;26232:5;26239:7;26215:16;:32::i;:::-;26160:87;26152:96;;;25908:348;;;;:::o;28829:544::-;28954:4;28927:31;;:23;28942:7;28927:14;:23::i;:::-;:31;;;28919:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29037:1;29023:16;;:2;:16;;;;29015:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29093:39;29114:4;29120:2;29124:7;29093:20;:39::i;:::-;29197:29;29214:1;29218:7;29197:8;:29::i;:::-;29258:1;29239:9;:15;29249:4;29239:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29287:1;29270:9;:13;29280:2;29270:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29318:2;29299:7;:16;29307:7;29299:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29357:7;29353:2;29338:27;;29347:4;29338:27;;;;;;;;;;;;28829:544;;;:::o;56222:106::-;56271:7;56298:22;56318:1;56298:15;;:19;;:22;;;;:::i;:::-;56291:29;;56222:106;:::o;27521:382::-;27615:1;27601:16;;:2;:16;;;;27593:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27674:16;27682:7;27674;:16::i;:::-;27673:17;27665:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27736:45;27765:1;27769:2;27773:7;27736:20;:45::i;:::-;27811:1;27794:9;:13;27804:2;27794:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27842:2;27823:7;:16;27831:7;27823:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27887:7;27883:2;27862:33;;27879:1;27862:33;;;;;;;;;;;;27521:382;;:::o;56407:73::-;56455:15;;:17;;;;;;;;;:::i;:::-;;;;;;56407:73::o;25029:272::-;25143:28;25153:4;25159:2;25163:7;25143:9;:28::i;:::-;25190:48;25213:4;25219:2;25223:7;25232:5;25190:22;:48::i;:::-;25182:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25029:272;;;;:::o;16076:723::-;16132:13;16362:1;16353:5;:10;16349:53;;;16380:10;;;;;;;;;;;;;;;;;;;;;16349:53;16412:12;16427:5;16412:20;;16443:14;16468:78;16483:1;16475:4;:9;16468:78;;16501:8;;;;;:::i;:::-;;;;16532:2;16524:10;;;;;:::i;:::-;;;16468:78;;;16556:19;16588:6;16578:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16556:39;;16606:154;16622:1;16613:5;:10;16606:154;;16650:1;16640:11;;;;;:::i;:::-;;;16717:2;16709:5;:10;;;;:::i;:::-;16696:2;:24;;;;:::i;:::-;16683:39;;16666:6;16673;16666:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16746:2;16737:11;;;;;:::i;:::-;;;16606:154;;;16784:6;16770:21;;;;;16076:723;;;;:::o;23033:164::-;23130:4;23154:18;:25;23173:5;23154:25;;;;;;;;;;;;;;;:35;23180:8;23154:35;;;;;;;;;;;;;;;;;;;;;;;;;23147:42;;23033:164;;;;:::o;18558:157::-;18643:4;18682:25;18667:40;;;:11;:40;;;;18660:47;;18558:157;;;:::o;53981:410::-;54091:7;52158:100;;;;;;;;;;;;;;;;;52138:127;;;;;;54245:6;:12;;;54280:6;:11;;;54324:6;:24;;;54314:35;;;;;;54164:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54136:247;;;;;;54116:267;;53981:410;;;:::o;51706:258::-;51805:7;51907:20;:18;:20::i;:::-;51929:11;51878:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51850:106;;;;;;51830:126;;51706:258;;;:::o;35223:555::-;35333:45;35360:4;35366:2;35370:7;35333:26;:45::i;:::-;35411:1;35395:18;;:4;:18;;;35391:187;;;35430:40;35462:7;35430:31;:40::i;:::-;35391:187;;;35500:2;35492:10;;:4;:10;;;35488:90;;35519:47;35552:4;35558:7;35519:32;:47::i;:::-;35488:90;35391:187;35606:1;35592:16;;:2;:16;;;35588:183;;;35625:45;35662:7;35625:36;:45::i;:::-;35588:183;;;35698:4;35692:10;;:2;:10;;;35688:83;;35719:40;35747:2;35751:7;35719:27;:40::i;:::-;35688:83;35588:183;35223:555;;;:::o;30230:843::-;30351:4;30377:15;:2;:13;;;:15::i;:::-;30373:693;;;30429:2;30413:36;;;30450:12;:10;:12::i;:::-;30464:4;30470:7;30479:5;30413:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30409:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30676:1;30659:6;:13;:18;30655:341;;;30702:60;;;;;;;;;;:::i;:::-;;;;;;;;30655:341;30946:6;30940:13;30931:6;30927:2;30923:15;30916:38;30409:602;30546:45;;;30536:55;;;:6;:55;;;;30529:62;;;;;30373:693;31050:4;31043:11;;30230:843;;;;;;;:::o;31686:93::-;;;;:::o;36501:164::-;36605:10;:17;;;;36578:15;:24;36594:7;36578:24;;;;;;;;;;;:44;;;;36633:10;36649:7;36633:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36501:164;:::o;37292:988::-;37558:22;37608:1;37583:22;37600:4;37583:16;:22::i;:::-;:26;;;;:::i;:::-;37558:51;;37620:18;37641:17;:26;37659:7;37641:26;;;;;;;;;;;;37620:47;;37788:14;37774:10;:28;37770:328;;37819:19;37841:12;:18;37854:4;37841:18;;;;;;;;;;;;;;;:34;37860:14;37841:34;;;;;;;;;;;;37819:56;;37925:11;37892:12;:18;37905:4;37892:18;;;;;;;;;;;;;;;:30;37911:10;37892:30;;;;;;;;;;;:44;;;;38042:10;38009:17;:30;38027:11;38009:30;;;;;;;;;;;:43;;;;37804:294;37770:328;38194:17;:26;38212:7;38194:26;;;;;;;;;;;38187:33;;;38238:12;:18;38251:4;38238:18;;;;;;;;;;;;;;;:34;38257:14;38238:34;;;;;;;;;;;38231:41;;;37373:907;;37292:988;;:::o;38575:1079::-;38828:22;38873:1;38853:10;:17;;;;:21;;;;:::i;:::-;38828:46;;38885:18;38906:15;:24;38922:7;38906:24;;;;;;;;;;;;38885:45;;39257:19;39279:10;39290:14;39279:26;;;;;;;;:::i;:::-;;;;;;;;;;39257:48;;39343:11;39318:10;39329;39318:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39454:10;39423:15;:28;39439:11;39423:28;;;;;;;;;;;:41;;;;39595:15;:24;39611:7;39595:24;;;;;;;;;;;39588:31;;;39630:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38646:1008;;;38575:1079;:::o;36079:221::-;36164:14;36181:20;36198:2;36181:16;:20::i;:::-;36164:37;;36239:7;36212:12;:16;36225:2;36212:16;;;;;;;;;;;;;;;:24;36229:6;36212:24;;;;;;;;;;;:34;;;;36286:6;36257:17;:26;36275:7;36257:26;;;;;;;;;;;:35;;;;36153:147;36079:221;;:::o;7654:422::-;7714:4;7922:12;8033:7;8021:20;8013:28;;8067:1;8060:4;:8;8053:15;;;7654:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1917:201::-;2003:5;2034:6;2028:13;2019:22;;2050:62;2106:5;2050:62;:::i;:::-;1917:201;;;;:::o;2138:340::-;2194:5;2243:3;2236:4;2228:6;2224:17;2220:27;2210:122;;2251:79;;:::i;:::-;2210:122;2368:6;2355:20;2393:79;2468:3;2460:6;2453:4;2445:6;2441:17;2393:79;:::i;:::-;2384:88;;2200:278;2138:340;;;;:::o;2484:139::-;2530:5;2568:6;2555:20;2546:29;;2584:33;2611:5;2584:33;:::i;:::-;2484:139;;;;:::o;2629:135::-;2673:5;2711:6;2698:20;2689:29;;2727:31;2752:5;2727:31;:::i;:::-;2629:135;;;;:::o;2770:329::-;2829:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;2770:329;;;;:::o;3105:474::-;3173:6;3181;3230:2;3218:9;3209:7;3205:23;3201:32;3198:119;;;3236:79;;:::i;:::-;3198:119;3356:1;3381:53;3426:7;3417:6;3406:9;3402:22;3381:53;:::i;:::-;3371:63;;3327:117;3483:2;3509:53;3554:7;3545:6;3534:9;3530:22;3509:53;:::i;:::-;3499:63;;3454:118;3105:474;;;;;:::o;3585:619::-;3662:6;3670;3678;3727:2;3715:9;3706:7;3702:23;3698:32;3695:119;;;3733:79;;:::i;:::-;3695:119;3853:1;3878:53;3923:7;3914:6;3903:9;3899:22;3878:53;:::i;:::-;3868:63;;3824:117;3980:2;4006:53;4051:7;4042:6;4031:9;4027:22;4006:53;:::i;:::-;3996:63;;3951:118;4108:2;4134:53;4179:7;4170:6;4159:9;4155:22;4134:53;:::i;:::-;4124:63;;4079:118;3585:619;;;;;:::o;4210:943::-;4305:6;4313;4321;4329;4378:3;4366:9;4357:7;4353:23;4349:33;4346:120;;;4385:79;;:::i;:::-;4346:120;4505:1;4530:53;4575:7;4566:6;4555:9;4551:22;4530:53;:::i;:::-;4520:63;;4476:117;4632:2;4658:53;4703:7;4694:6;4683:9;4679:22;4658:53;:::i;:::-;4648:63;;4603:118;4760:2;4786:53;4831:7;4822:6;4811:9;4807:22;4786:53;:::i;:::-;4776:63;;4731:118;4916:2;4905:9;4901:18;4888:32;4947:18;4939:6;4936:30;4933:117;;;4969:79;;:::i;:::-;4933:117;5074:62;5128:7;5119:6;5108:9;5104:22;5074:62;:::i;:::-;5064:72;;4859:287;4210:943;;;;;;;:::o;5159:468::-;5224:6;5232;5281:2;5269:9;5260:7;5256:23;5252:32;5249:119;;;5287:79;;:::i;:::-;5249:119;5407:1;5432:53;5477:7;5468:6;5457:9;5453:22;5432:53;:::i;:::-;5422:63;;5378:117;5534:2;5560:50;5602:7;5593:6;5582:9;5578:22;5560:50;:::i;:::-;5550:60;;5505:115;5159:468;;;;;:::o;5633:1085::-;5735:6;5743;5751;5759;5767;5816:3;5804:9;5795:7;5791:23;5787:33;5784:120;;;5823:79;;:::i;:::-;5784:120;5943:1;5968:53;6013:7;6004:6;5993:9;5989:22;5968:53;:::i;:::-;5958:63;;5914:117;6098:2;6087:9;6083:18;6070:32;6129:18;6121:6;6118:30;6115:117;;;6151:79;;:::i;:::-;6115:117;6256:62;6310:7;6301:6;6290:9;6286:22;6256:62;:::i;:::-;6246:72;;6041:287;6367:2;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6338:118;6495:2;6521:53;6566:7;6557:6;6546:9;6542:22;6521:53;:::i;:::-;6511:63;;6466:118;6623:3;6650:51;6693:7;6684:6;6673:9;6669:22;6650:51;:::i;:::-;6640:61;;6594:117;5633:1085;;;;;;;;:::o;6724:474::-;6792:6;6800;6849:2;6837:9;6828:7;6824:23;6820:32;6817:119;;;6855:79;;:::i;:::-;6817:119;6975:1;7000:53;7045:7;7036:6;7025:9;7021:22;7000:53;:::i;:::-;6990:63;;6946:117;7102:2;7128:53;7173:7;7164:6;7153:9;7149:22;7128:53;:::i;:::-;7118:63;;7073:118;6724:474;;;;;:::o;7204:327::-;7262:6;7311:2;7299:9;7290:7;7286:23;7282:32;7279:119;;;7317:79;;:::i;:::-;7279:119;7437:1;7462:52;7506:7;7497:6;7486:9;7482:22;7462:52;:::i;:::-;7452:62;;7408:116;7204:327;;;;:::o;7537:349::-;7606:6;7655:2;7643:9;7634:7;7630:23;7626:32;7623:119;;;7661:79;;:::i;:::-;7623:119;7781:1;7806:63;7861:7;7852:6;7841:9;7837:22;7806:63;:::i;:::-;7796:73;;7752:127;7537:349;;;;:::o;7892:409::-;7991:6;8040:2;8028:9;8019:7;8015:23;8011:32;8008:119;;;8046:79;;:::i;:::-;8008:119;8166:1;8191:93;8276:7;8267:6;8256:9;8252:22;8191:93;:::i;:::-;8181:103;;8137:157;7892:409;;;;:::o;8307:509::-;8376:6;8425:2;8413:9;8404:7;8400:23;8396:32;8393:119;;;8431:79;;:::i;:::-;8393:119;8579:1;8568:9;8564:17;8551:31;8609:18;8601:6;8598:30;8595:117;;;8631:79;;:::i;:::-;8595:117;8736:63;8791:7;8782:6;8771:9;8767:22;8736:63;:::i;:::-;8726:73;;8522:287;8307:509;;;;:::o;8822:329::-;8881:6;8930:2;8918:9;8909:7;8905:23;8901:32;8898:119;;;8936:79;;:::i;:::-;8898:119;9056:1;9081:53;9126:7;9117:6;9106:9;9102:22;9081:53;:::i;:::-;9071:63;;9027:117;8822:329;;;;:::o;9157:142::-;9260:32;9286:5;9260:32;:::i;:::-;9255:3;9248:45;9157:142;;:::o;9305:118::-;9392:24;9410:5;9392:24;:::i;:::-;9387:3;9380:37;9305:118;;:::o;9429:157::-;9534:45;9554:24;9572:5;9554:24;:::i;:::-;9534:45;:::i;:::-;9529:3;9522:58;9429:157;;:::o;9592:109::-;9673:21;9688:5;9673:21;:::i;:::-;9668:3;9661:34;9592:109;;:::o;9707:118::-;9794:24;9812:5;9794:24;:::i;:::-;9789:3;9782:37;9707:118;;:::o;9831:157::-;9936:45;9956:24;9974:5;9956:24;:::i;:::-;9936:45;:::i;:::-;9931:3;9924:58;9831:157;;:::o;9994:360::-;10080:3;10108:38;10140:5;10108:38;:::i;:::-;10162:70;10225:6;10220:3;10162:70;:::i;:::-;10155:77;;10241:52;10286:6;10281:3;10274:4;10267:5;10263:16;10241:52;:::i;:::-;10318:29;10340:6;10318:29;:::i;:::-;10313:3;10309:39;10302:46;;10084:270;9994:360;;;;:::o;10360:373::-;10464:3;10492:38;10524:5;10492:38;:::i;:::-;10546:88;10627:6;10622:3;10546:88;:::i;:::-;10539:95;;10643:52;10688:6;10683:3;10676:4;10669:5;10665:16;10643:52;:::i;:::-;10720:6;10715:3;10711:16;10704:23;;10468:265;10360:373;;;;:::o;10739:364::-;10827:3;10855:39;10888:5;10855:39;:::i;:::-;10910:71;10974:6;10969:3;10910:71;:::i;:::-;10903:78;;10990:52;11035:6;11030:3;11023:4;11016:5;11012:16;10990:52;:::i;:::-;11067:29;11089:6;11067:29;:::i;:::-;11062:3;11058:39;11051:46;;10831:272;10739:364;;;;:::o;11109:377::-;11215:3;11243:39;11276:5;11243:39;:::i;:::-;11298:89;11380:6;11375:3;11298:89;:::i;:::-;11291:96;;11396:52;11441:6;11436:3;11429:4;11422:5;11418:16;11396:52;:::i;:::-;11473:6;11468:3;11464:16;11457:23;;11219:267;11109:377;;;;:::o;11492:366::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:400::-;13512:3;13533:84;13615:1;13610:3;13533:84;:::i;:::-;13526:91;;13626:93;13715:3;13626:93;:::i;:::-;13744:1;13739:3;13735:11;13728:18;;13352:400;;;:::o;13758:366::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14130:366;;;:::o;14502:::-;14644:3;14665:67;14729:2;14724:3;14665:67;:::i;:::-;14658:74;;14741:93;14830:3;14741:93;:::i;:::-;14859:2;14854:3;14850:12;14843:19;;14502:366;;;:::o;14874:::-;15016:3;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15113:93;15202:3;15113:93;:::i;:::-;15231:2;15226:3;15222:12;15215:19;;14874:366;;;:::o;15246:::-;15388:3;15409:67;15473:2;15468:3;15409:67;:::i;:::-;15402:74;;15485:93;15574:3;15485:93;:::i;:::-;15603:2;15598:3;15594:12;15587:19;;15246:366;;;:::o;15618:::-;15760:3;15781:67;15845:2;15840:3;15781:67;:::i;:::-;15774:74;;15857:93;15946:3;15857:93;:::i;:::-;15975:2;15970:3;15966:12;15959:19;;15618:366;;;:::o;15990:::-;16132:3;16153:67;16217:2;16212:3;16153:67;:::i;:::-;16146:74;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;15990:366;;;:::o;16362:::-;16504:3;16525:67;16589:2;16584:3;16525:67;:::i;:::-;16518:74;;16601:93;16690:3;16601:93;:::i;:::-;16719:2;16714:3;16710:12;16703:19;;16362:366;;;:::o;16734:::-;16876:3;16897:67;16961:2;16956:3;16897:67;:::i;:::-;16890:74;;16973:93;17062:3;16973:93;:::i;:::-;17091:2;17086:3;17082:12;17075:19;;16734:366;;;:::o;17106:::-;17248:3;17269:67;17333:2;17328:3;17269:67;:::i;:::-;17262:74;;17345:93;17434:3;17345:93;:::i;:::-;17463:2;17458:3;17454:12;17447:19;;17106:366;;;:::o;17478:::-;17620:3;17641:67;17705:2;17700:3;17641:67;:::i;:::-;17634:74;;17717:93;17806:3;17717:93;:::i;:::-;17835:2;17830:3;17826:12;17819:19;;17478:366;;;:::o;17850:::-;17992:3;18013:67;18077:2;18072:3;18013:67;:::i;:::-;18006:74;;18089:93;18178:3;18089:93;:::i;:::-;18207:2;18202:3;18198:12;18191:19;;17850:366;;;:::o;18222:::-;18364:3;18385:67;18449:2;18444:3;18385:67;:::i;:::-;18378:74;;18461:93;18550:3;18461:93;:::i;:::-;18579:2;18574:3;18570:12;18563:19;;18222:366;;;:::o;18594:::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:118::-;19425:24;19443:5;19425:24;:::i;:::-;19420:3;19413:37;19338:118;;:::o;19462:112::-;19545:22;19561:5;19545:22;:::i;:::-;19540:3;19533:35;19462:112;;:::o;19580:271::-;19710:3;19732:93;19821:3;19812:6;19732:93;:::i;:::-;19725:100;;19842:3;19835:10;;19580:271;;;;:::o;19857:412::-;20015:3;20037:93;20126:3;20117:6;20037:93;:::i;:::-;20030:100;;20140:75;20211:3;20202:6;20140:75;:::i;:::-;20240:2;20235:3;20231:12;20224:19;;20260:3;20253:10;;19857:412;;;;;:::o;20275:435::-;20455:3;20477:95;20568:3;20559:6;20477:95;:::i;:::-;20470:102;;20589:95;20680:3;20671:6;20589:95;:::i;:::-;20582:102;;20701:3;20694:10;;20275:435;;;;;:::o;20716:663::-;20957:3;20979:148;21123:3;20979:148;:::i;:::-;20972:155;;21137:75;21208:3;21199:6;21137:75;:::i;:::-;21237:2;21232:3;21228:12;21221:19;;21250:75;21321:3;21312:6;21250:75;:::i;:::-;21350:2;21345:3;21341:12;21334:19;;21370:3;21363:10;;20716:663;;;;;:::o;21385:222::-;21478:4;21516:2;21505:9;21501:18;21493:26;;21529:71;21597:1;21586:9;21582:17;21573:6;21529:71;:::i;:::-;21385:222;;;;:::o;21613:561::-;21796:4;21834:2;21823:9;21819:18;21811:26;;21847:71;21915:1;21904:9;21900:17;21891:6;21847:71;:::i;:::-;21928:88;22012:2;22001:9;21997:18;21988:6;21928:88;:::i;:::-;22063:9;22057:4;22053:20;22048:2;22037:9;22033:18;22026:48;22091:76;22162:4;22153:6;22091:76;:::i;:::-;22083:84;;21613:561;;;;;;:::o;22180:640::-;22375:4;22413:3;22402:9;22398:19;22390:27;;22427:71;22495:1;22484:9;22480:17;22471:6;22427:71;:::i;:::-;22508:72;22576:2;22565:9;22561:18;22552:6;22508:72;:::i;:::-;22590;22658:2;22647:9;22643:18;22634:6;22590:72;:::i;:::-;22709:9;22703:4;22699:20;22694:2;22683:9;22679:18;22672:48;22737:76;22808:4;22799:6;22737:76;:::i;:::-;22729:84;;22180:640;;;;;;;:::o;22826:210::-;22913:4;22951:2;22940:9;22936:18;22928:26;;22964:65;23026:1;23015:9;23011:17;23002:6;22964:65;:::i;:::-;22826:210;;;;:::o;23042:222::-;23135:4;23173:2;23162:9;23158:18;23150:26;;23186:71;23254:1;23243:9;23239:17;23230:6;23186:71;:::i;:::-;23042:222;;;;:::o;23270:553::-;23447:4;23485:3;23474:9;23470:19;23462:27;;23499:71;23567:1;23556:9;23552:17;23543:6;23499:71;:::i;:::-;23580:72;23648:2;23637:9;23633:18;23624:6;23580:72;:::i;:::-;23662;23730:2;23719:9;23715:18;23706:6;23662:72;:::i;:::-;23744;23812:2;23801:9;23797:18;23788:6;23744:72;:::i;:::-;23270:553;;;;;;;:::o;23829:545::-;24002:4;24040:3;24029:9;24025:19;24017:27;;24054:71;24122:1;24111:9;24107:17;24098:6;24054:71;:::i;:::-;24135:68;24199:2;24188:9;24184:18;24175:6;24135:68;:::i;:::-;24213:72;24281:2;24270:9;24266:18;24257:6;24213:72;:::i;:::-;24295;24363:2;24352:9;24348:18;24339:6;24295:72;:::i;:::-;23829:545;;;;;;;:::o;24380:309::-;24491:4;24529:2;24518:9;24514:18;24506:26;;24578:9;24572:4;24568:20;24564:1;24553:9;24549:17;24542:47;24606:76;24677:4;24668:6;24606:76;:::i;:::-;24598:84;;24380:309;;;;:::o;24695:313::-;24808:4;24846:2;24835:9;24831:18;24823:26;;24895:9;24889:4;24885:20;24881:1;24870:9;24866:17;24859:47;24923:78;24996:4;24987:6;24923:78;:::i;:::-;24915:86;;24695:313;;;;:::o;25014:419::-;25180:4;25218:2;25207:9;25203:18;25195:26;;25267:9;25261:4;25257:20;25253:1;25242:9;25238:17;25231:47;25295:131;25421:4;25295:131;:::i;:::-;25287:139;;25014:419;;;:::o;25439:::-;25605:4;25643:2;25632:9;25628:18;25620:26;;25692:9;25686:4;25682:20;25678:1;25667:9;25663:17;25656:47;25720:131;25846:4;25720:131;:::i;:::-;25712:139;;25439:419;;;:::o;25864:::-;26030:4;26068:2;26057:9;26053:18;26045:26;;26117:9;26111:4;26107:20;26103:1;26092:9;26088:17;26081:47;26145:131;26271:4;26145:131;:::i;:::-;26137:139;;25864:419;;;:::o;26289:::-;26455:4;26493:2;26482:9;26478:18;26470:26;;26542:9;26536:4;26532:20;26528:1;26517:9;26513:17;26506:47;26570:131;26696:4;26570:131;:::i;:::-;26562:139;;26289:419;;;:::o;26714:::-;26880:4;26918:2;26907:9;26903:18;26895:26;;26967:9;26961:4;26957:20;26953:1;26942:9;26938:17;26931:47;26995:131;27121:4;26995:131;:::i;:::-;26987:139;;26714:419;;;:::o;27139:::-;27305:4;27343:2;27332:9;27328:18;27320:26;;27392:9;27386:4;27382:20;27378:1;27367:9;27363:17;27356:47;27420:131;27546:4;27420:131;:::i;:::-;27412:139;;27139:419;;;:::o;27564:::-;27730:4;27768:2;27757:9;27753:18;27745:26;;27817:9;27811:4;27807:20;27803:1;27792:9;27788:17;27781:47;27845:131;27971:4;27845:131;:::i;:::-;27837:139;;27564:419;;;:::o;27989:::-;28155:4;28193:2;28182:9;28178:18;28170:26;;28242:9;28236:4;28232:20;28228:1;28217:9;28213:17;28206:47;28270:131;28396:4;28270:131;:::i;:::-;28262:139;;27989:419;;;:::o;28414:::-;28580:4;28618:2;28607:9;28603:18;28595:26;;28667:9;28661:4;28657:20;28653:1;28642:9;28638:17;28631:47;28695:131;28821:4;28695:131;:::i;:::-;28687:139;;28414:419;;;:::o;28839:::-;29005:4;29043:2;29032:9;29028:18;29020:26;;29092:9;29086:4;29082:20;29078:1;29067:9;29063:17;29056:47;29120:131;29246:4;29120:131;:::i;:::-;29112:139;;28839:419;;;:::o;29264:::-;29430:4;29468:2;29457:9;29453:18;29445:26;;29517:9;29511:4;29507:20;29503:1;29492:9;29488:17;29481:47;29545:131;29671:4;29545:131;:::i;:::-;29537:139;;29264:419;;;:::o;29689:::-;29855:4;29893:2;29882:9;29878:18;29870:26;;29942:9;29936:4;29932:20;29928:1;29917:9;29913:17;29906:47;29970:131;30096:4;29970:131;:::i;:::-;29962:139;;29689:419;;;:::o;30114:::-;30280:4;30318:2;30307:9;30303:18;30295:26;;30367:9;30361:4;30357:20;30353:1;30342:9;30338:17;30331:47;30395:131;30521:4;30395:131;:::i;:::-;30387:139;;30114:419;;;:::o;30539:::-;30705:4;30743:2;30732:9;30728:18;30720:26;;30792:9;30786:4;30782:20;30778:1;30767:9;30763:17;30756:47;30820:131;30946:4;30820:131;:::i;:::-;30812:139;;30539:419;;;:::o;30964:::-;31130:4;31168:2;31157:9;31153:18;31145:26;;31217:9;31211:4;31207:20;31203:1;31192:9;31188:17;31181:47;31245:131;31371:4;31245:131;:::i;:::-;31237:139;;30964:419;;;:::o;31389:::-;31555:4;31593:2;31582:9;31578:18;31570:26;;31642:9;31636:4;31632:20;31628:1;31617:9;31613:17;31606:47;31670:131;31796:4;31670:131;:::i;:::-;31662:139;;31389:419;;;:::o;31814:::-;31980:4;32018:2;32007:9;32003:18;31995:26;;32067:9;32061:4;32057:20;32053:1;32042:9;32038:17;32031:47;32095:131;32221:4;32095:131;:::i;:::-;32087:139;;31814:419;;;:::o;32239:::-;32405:4;32443:2;32432:9;32428:18;32420:26;;32492:9;32486:4;32482:20;32478:1;32467:9;32463:17;32456:47;32520:131;32646:4;32520:131;:::i;:::-;32512:139;;32239:419;;;:::o;32664:::-;32830:4;32868:2;32857:9;32853:18;32845:26;;32917:9;32911:4;32907:20;32903:1;32892:9;32888:17;32881:47;32945:131;33071:4;32945:131;:::i;:::-;32937:139;;32664:419;;;:::o;33089:::-;33255:4;33293:2;33282:9;33278:18;33270:26;;33342:9;33336:4;33332:20;33328:1;33317:9;33313:17;33306:47;33370:131;33496:4;33370:131;:::i;:::-;33362:139;;33089:419;;;:::o;33514:222::-;33607:4;33645:2;33634:9;33630:18;33622:26;;33658:71;33726:1;33715:9;33711:17;33702:6;33658:71;:::i;:::-;33514:222;;;;:::o;33742:129::-;33776:6;33803:20;;:::i;:::-;33793:30;;33832:33;33860:4;33852:6;33832:33;:::i;:::-;33742:129;;;:::o;33877:75::-;33910:6;33943:2;33937:9;33927:19;;33877:75;:::o;33958:307::-;34019:4;34109:18;34101:6;34098:30;34095:56;;;34131:18;;:::i;:::-;34095:56;34169:29;34191:6;34169:29;:::i;:::-;34161:37;;34253:4;34247;34243:15;34235:23;;33958:307;;;:::o;34271:308::-;34333:4;34423:18;34415:6;34412:30;34409:56;;;34445:18;;:::i;:::-;34409:56;34483:29;34505:6;34483:29;:::i;:::-;34475:37;;34567:4;34561;34557:15;34549:23;;34271:308;;;:::o;34585:98::-;34636:6;34670:5;34664:12;34654:22;;34585:98;;;:::o;34689:99::-;34741:6;34775:5;34769:12;34759:22;;34689:99;;;:::o;34794:168::-;34877:11;34911:6;34906:3;34899:19;34951:4;34946:3;34942:14;34927:29;;34794:168;;;;:::o;34968:147::-;35069:11;35106:3;35091:18;;34968:147;;;;:::o;35121:169::-;35205:11;35239:6;35234:3;35227:19;35279:4;35274:3;35270:14;35255:29;;35121:169;;;;:::o;35296:148::-;35398:11;35435:3;35420:18;;35296:148;;;;:::o;35450:305::-;35490:3;35509:20;35527:1;35509:20;:::i;:::-;35504:25;;35543:20;35561:1;35543:20;:::i;:::-;35538:25;;35697:1;35629:66;35625:74;35622:1;35619:81;35616:107;;;35703:18;;:::i;:::-;35616:107;35747:1;35744;35740:9;35733:16;;35450:305;;;;:::o;35761:185::-;35801:1;35818:20;35836:1;35818:20;:::i;:::-;35813:25;;35852:20;35870:1;35852:20;:::i;:::-;35847:25;;35891:1;35881:35;;35896:18;;:::i;:::-;35881:35;35938:1;35935;35931:9;35926:14;;35761:185;;;;:::o;35952:191::-;35992:4;36012:20;36030:1;36012:20;:::i;:::-;36007:25;;36046:20;36064:1;36046:20;:::i;:::-;36041:25;;36085:1;36082;36079:8;36076:34;;;36090:18;;:::i;:::-;36076:34;36135:1;36132;36128:9;36120:17;;35952:191;;;;:::o;36149:96::-;36186:7;36215:24;36233:5;36215:24;:::i;:::-;36204:35;;36149:96;;;:::o;36251:104::-;36296:7;36325:24;36343:5;36325:24;:::i;:::-;36314:35;;36251:104;;;:::o;36361:90::-;36395:7;36438:5;36431:13;36424:21;36413:32;;36361:90;;;:::o;36457:77::-;36494:7;36523:5;36512:16;;36457:77;;;:::o;36540:149::-;36576:7;36616:66;36609:5;36605:78;36594:89;;36540:149;;;:::o;36695:125::-;36761:7;36790:24;36808:5;36790:24;:::i;:::-;36779:35;;36695:125;;;:::o;36826:126::-;36863:7;36903:42;36896:5;36892:54;36881:65;;36826:126;;;:::o;36958:77::-;36995:7;37024:5;37013:16;;36958:77;;;:::o;37041:86::-;37076:7;37116:4;37109:5;37105:16;37094:27;;37041:86;;;:::o;37133:154::-;37217:6;37212:3;37207;37194:30;37279:1;37270:6;37265:3;37261:16;37254:27;37133:154;;;:::o;37293:307::-;37361:1;37371:113;37385:6;37382:1;37379:13;37371:113;;;37470:1;37465:3;37461:11;37455:18;37451:1;37446:3;37442:11;37435:39;37407:2;37404:1;37400:10;37395:15;;37371:113;;;37502:6;37499:1;37496:13;37493:101;;;37582:1;37573:6;37568:3;37564:16;37557:27;37493:101;37342:258;37293:307;;;:::o;37606:320::-;37650:6;37687:1;37681:4;37677:12;37667:22;;37734:1;37728:4;37724:12;37755:18;37745:81;;37811:4;37803:6;37799:17;37789:27;;37745:81;37873:2;37865:6;37862:14;37842:18;37839:38;37836:84;;;37892:18;;:::i;:::-;37836:84;37657:269;37606:320;;;:::o;37932:281::-;38015:27;38037:4;38015:27;:::i;:::-;38007:6;38003:40;38145:6;38133:10;38130:22;38109:18;38097:10;38094:34;38091:62;38088:88;;;38156:18;;:::i;:::-;38088:88;38196:10;38192:2;38185:22;37975:238;37932:281;;:::o;38219:233::-;38258:3;38281:24;38299:5;38281:24;:::i;:::-;38272:33;;38327:66;38320:5;38317:77;38314:103;;;38397:18;;:::i;:::-;38314:103;38444:1;38437:5;38433:13;38426:20;;38219:233;;;:::o;38458:100::-;38497:7;38526:26;38546:5;38526:26;:::i;:::-;38515:37;;38458:100;;;:::o;38564:79::-;38603:7;38632:5;38621:16;;38564:79;;;:::o;38649:94::-;38688:7;38717:20;38731:5;38717:20;:::i;:::-;38706:31;;38649:94;;;:::o;38749:176::-;38781:1;38798:20;38816:1;38798:20;:::i;:::-;38793:25;;38832:20;38850:1;38832:20;:::i;:::-;38827:25;;38871:1;38861:35;;38876:18;;:::i;:::-;38861:35;38917:1;38914;38910:9;38905:14;;38749:176;;;;:::o;38931:180::-;38979:77;38976:1;38969:88;39076:4;39073:1;39066:15;39100:4;39097:1;39090:15;39117:180;39165:77;39162:1;39155:88;39262:4;39259:1;39252:15;39286:4;39283:1;39276:15;39303:180;39351:77;39348:1;39341:88;39448:4;39445:1;39438:15;39472:4;39469:1;39462:15;39489:180;39537:77;39534:1;39527:88;39634:4;39631:1;39624:15;39658:4;39655:1;39648:15;39675:180;39723:77;39720:1;39713:88;39820:4;39817:1;39810:15;39844:4;39841:1;39834:15;39861:180;39909:77;39906:1;39899:88;40006:4;40003:1;39996:15;40030:4;40027:1;40020:15;40047:117;40156:1;40153;40146:12;40170:117;40279:1;40276;40269:12;40293:117;40402:1;40399;40392:12;40416:117;40525:1;40522;40515:12;40539:102;40580:6;40631:2;40627:7;40622:2;40615:5;40611:14;40607:28;40597:38;;40539:102;;;:::o;40647:94::-;40680:8;40728:5;40724:2;40720:14;40699:35;;40647:94;;;:::o;40747:230::-;40887:34;40883:1;40875:6;40871:14;40864:58;40956:13;40951:2;40943:6;40939:15;40932:38;40747:230;:::o;40983:237::-;41123:34;41119:1;41111:6;41107:14;41100:58;41192:20;41187:2;41179:6;41175:15;41168:45;40983:237;:::o;41226:225::-;41366:34;41362:1;41354:6;41350:14;41343:58;41435:8;41430:2;41422:6;41418:15;41411:33;41226:225;:::o;41457:178::-;41597:30;41593:1;41585:6;41581:14;41574:54;41457:178;:::o;41641:::-;41781:30;41777:1;41769:6;41765:14;41758:54;41641:178;:::o;41825:214::-;41965:66;41961:1;41953:6;41949:14;41942:90;41825:214;:::o;42045:223::-;42185:34;42181:1;42173:6;42169:14;42162:58;42254:6;42249:2;42241:6;42237:15;42230:31;42045:223;:::o;42274:175::-;42414:27;42410:1;42402:6;42398:14;42391:51;42274:175;:::o;42455:231::-;42595:34;42591:1;42583:6;42579:14;42572:58;42664:14;42659:2;42651:6;42647:15;42640:39;42455:231;:::o;42692:224::-;42832:34;42828:1;42820:6;42816:14;42809:58;42901:7;42896:2;42888:6;42884:15;42877:32;42692:224;:::o;42922:243::-;43062:34;43058:1;43050:6;43046:14;43039:58;43131:26;43126:2;43118:6;43114:15;43107:51;42922:243;:::o;43171:229::-;43311:34;43307:1;43299:6;43295:14;43288:58;43380:12;43375:2;43367:6;43363:15;43356:37;43171:229;:::o;43406:228::-;43546:34;43542:1;43534:6;43530:14;43523:58;43615:11;43610:2;43602:6;43598:15;43591:36;43406:228;:::o;43640:182::-;43780:34;43776:1;43768:6;43764:14;43757:58;43640:182;:::o;43828:231::-;43968:34;43964:1;43956:6;43952:14;43945:58;44037:14;44032:2;44024:6;44020:15;44013:39;43828:231;:::o;44065:182::-;44205:34;44201:1;44193:6;44189:14;44182:58;44065:182;:::o;44253:228::-;44393:34;44389:1;44381:6;44377:14;44370:58;44462:11;44457:2;44449:6;44445:15;44438:36;44253:228;:::o;44487:220::-;44627:34;44623:1;44615:6;44611:14;44604:58;44696:3;44691:2;44683:6;44679:15;44672:28;44487:220;:::o;44713:::-;44853:34;44849:1;44841:6;44837:14;44830:58;44922:3;44917:2;44909:6;44905:15;44898:28;44713:220;:::o;44939:236::-;45079:34;45075:1;45067:6;45063:14;45056:58;45148:19;45143:2;45135:6;45131:15;45124:44;44939:236;:::o;45181:231::-;45321:34;45317:1;45309:6;45305:14;45298:58;45390:14;45385:2;45377:6;45373:15;45366:39;45181:231;:::o;45418:122::-;45491:24;45509:5;45491:24;:::i;:::-;45484:5;45481:35;45471:63;;45530:1;45527;45520:12;45471:63;45418:122;:::o;45546:116::-;45616:21;45631:5;45616:21;:::i;:::-;45609:5;45606:32;45596:60;;45652:1;45649;45642:12;45596:60;45546:116;:::o;45668:122::-;45741:24;45759:5;45741:24;:::i;:::-;45734:5;45731:35;45721:63;;45780:1;45777;45770:12;45721:63;45668:122;:::o;45796:120::-;45868:23;45885:5;45868:23;:::i;:::-;45861:5;45858:34;45848:62;;45906:1;45903;45896:12;45848:62;45796:120;:::o;45922:180::-;46024:53;46071:5;46024:53;:::i;:::-;46017:5;46014:64;46004:92;;46092:1;46089;46082:12;46004:92;45922:180;:::o;46108:122::-;46181:24;46199:5;46181:24;:::i;:::-;46174:5;46171:35;46161:63;;46220:1;46217;46210:12;46161:63;46108:122;:::o;46236:118::-;46307:22;46323:5;46307:22;:::i;:::-;46300:5;46297:33;46287:61;;46344:1;46341;46334:12;46287:61;46236:118;:::o

Swarm Source

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