ETH Price: $3,832.55 (+5.04%)

Token

Ethrunes (ERS)
 

Overview

Max Total Supply

0 ERS

Holders

8,642

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
62541.eth
0xe52D8fbFDBCe4438B3839fcB4630aE2696cFFC1E
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:
Ethrunes

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-07
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}


// File @openzeppelin/contracts/security/[email protected]

// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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


// File contracts/IEthrunesURI.sol

pragma solidity ^0.8.17;

interface IEthrunesURI {
	function uri(uint256 id) external view returns(string memory);
}


// File contracts/StringUtils.sol

pragma solidity ^0.8.17;

library StringUtils {
  function strLen(string memory s) internal pure returns (uint256) {
    uint256 len;
    uint256 i = 0;
    uint256 bytelength = bytes(s).length;
    for (len = 0; i < bytelength; len++) {
      bytes1 b = bytes(s)[i];
      if (b < 0x80) {
          i += 1;
      } else if (b < 0xE0) {
          i += 2;
      } else if (b < 0xF0) {
          i += 3;
      } else if (b < 0xF8) {
          i += 4;
      } else if (b < 0xFC) {
          i += 5;
      } else {
          i += 6;
      }
    }
    return len;
  }

  function toLower(string memory s) internal pure returns (string memory) {
    bytes memory _bytes = bytes(s);
    for (uint i = 0; i < _bytes.length; i++) {
      if (uint8(_bytes[i]) >= 65 && uint8(_bytes[i]) <= 90) {
        _bytes[i] = bytes1(uint8(_bytes[i]) + 32);
      }
    }
    return string(_bytes);
  }
}


// File contracts/TransferHelper.sol

pragma solidity >=0.6.0;

library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'STE');
    }
}


// File contracts/Ethrunes.sol

pragma solidity ^0.8.17;






contract Ethrunes is ERC1155Supply, ReentrancyGuard {
	struct Token {
		uint160 id;
		uint8 decimals;
		uint256 supply;
		uint256 limit;
		string tick;
	}
	
	string public constant name = "Ethrunes";
	string public constant symbol = "ERS";

	address dev;
	IEthrunesURI public ethrunesURI;
	// No length limit if is 0
	uint256 public tickMaxLength = 4;

	uint160[] public allTokenIds;
	mapping (uint160 => Token) public tokens;

	event Deploy(uint8 typ, Token token);
	event Wrap(address sender, address erc20, uint256 amount);
	event Unwrap(address sender, address erc20, uint256 amount);

	constructor() ERC1155("") {
		dev = msg.sender;
	}

	modifier onlyEOA() { 
		require(msg.sender == tx.origin, "Only EOA"); 
		_; 
	}

	modifier checkTickLength(string memory tick) { 
		uint tickLen = StringUtils.strLen(tick);
		if(tickLen == 0) {
			revert("Tick is empty");
		}
		if(tickMaxLength > 0 && tickLen > tickMaxLength) {
			revert("Tick too long");
		}
		_;
	}
	
	function setDev(address _dev) external {
		require(msg.sender == dev);
		dev = _dev;
	}

	function setEthrunesURI(address _uri) external {
		require(msg.sender == dev);
		ethrunesURI = IEthrunesURI(_uri);
	}

	function setTickMaxLength(uint256 _len) external {
		require(msg.sender == dev);
		tickMaxLength = _len;
	}
	
	function _idOf(string memory tick) internal view returns(uint160) {
		return uint160(uint256(keccak256(abi.encodePacked("ethrunes:", block.chainid, ":", StringUtils.toLower(tick)))));
	}

	function deploy(
		string calldata tick,
		uint8 decimals,
		uint256 supply,
		uint256 limit
	) external checkTickLength(tick) {
		require(limit > 0 && limit <= supply, "Invalid deploy args");
		uint160 id = _idOf(tick);
		require(tokens[id].supply == 0, "Deployed");
		require(totalSupply(id) == 0, "Token id occupied");

		Token memory token = Token({
			id: id,
			decimals: decimals,
			supply: supply,
			limit: limit,
			tick: tick
		});

		tokens[id] = token;
		allTokenIds.push(id);
		emit Deploy(1, token);
	}

	function deploy2(
		string calldata tick,
		uint8 decimals,
		uint256 supply,
		address to
	) external payable checkTickLength(tick) {
		require(supply > 0, "Supply is 0");
		uint160 id = _idOf(tick);
		require(tokens[id].supply == 0, "Deployed");
		require(totalSupply(id) == 0, "Token id occupied");

		Token memory token = Token({
			id: id,
			decimals: decimals,
			supply: supply,
			limit: supply,
			tick: tick
		});
		
		tokens[id] = token;
		allTokenIds.push(id);
		_mint(to, id, supply, "");
		emit Deploy(2, token);
	}

	function mint(string calldata tick) external onlyEOA {
		uint160 id = _idOf(tick);
		Token memory token = tokens[id];
		require(token.supply != 0, "Token not exists");
		require(totalSupply(token.id) + token.limit <= token.supply, "Exceeded maxSupply");
		_mint(msg.sender, token.id, token.limit, "");
	}

	function wrapERC20(IERC20 erc20, uint256 amount) external nonReentrant {
		uint160 id = uint160(address(erc20));
		require(tokens[id].supply == 0, "Failed to wrap, token id deployed");
		uint256 balanceBefore = erc20.balanceOf(address(this));
		TransferHelper.safeTransferFrom(address(erc20), msg.sender, address(this), amount);
		uint256 balanceAfter = erc20.balanceOf(address(this));
		require(balanceAfter - balanceBefore == amount, "Invalid amount");
		_mint(msg.sender, id, amount, "");

		emit Wrap(msg.sender, address(erc20), amount);
	}

	function unwrapERC20(IERC20 erc20, uint256 amount) external {
		uint256 id = uint160(address(erc20));
		require(balanceOf(msg.sender, id) >= amount, "Insufficient balance");
		_burn(msg.sender, id, amount);
		TransferHelper.safeTransfer(address(erc20), msg.sender, amount);
		emit Unwrap(msg.sender, address(erc20), amount);
	}

	function symbolOf(uint160 id) public view returns(string memory) {
		if(tokens[id].supply > 0) {
			return tokens[id].tick;	
		} else {
			bytes memory data = abi.encodeWithSelector(bytes4(keccak256("symbol()")));
			(bool success, bytes memory returnData) = address(id).staticcall(data);
			require(success, "call symbol() failed");
			if(returnData.length == 32) {
				return string(abi.encodePacked(returnData));
			} else {
				return abi.decode(returnData, (string));
			}
		}
	}

	function decimalsOf(uint160 id) public view returns(uint8) {
		if(tokens[id].supply > 0) {
			return tokens[id].decimals;
		} else {
			bytes memory data = abi.encodeWithSelector(bytes4(keccak256("decimals()")));
			(bool success, bytes memory returnData) = address(id).staticcall(data);
			require(success, "call decimals() failed");
			return abi.decode(returnData, (uint8));
		}
	}

	function allTokensCount() public view returns(uint256) {
		return allTokenIds.length;
	}

	function getTokens(uint256 from, uint256 to) public view returns(Token[] memory tokenArray) {
		if(allTokenIds.length == 0) {
			return tokenArray;
		}
		if(to > allTokenIds.length) {
			to = allTokenIds.length;
		}
		require(from < to, "Invalid range");
		tokenArray = new Token[](to - from);
		for(uint256 i = 0; i < tokenArray.length; i++) {
			tokenArray[i] = tokens[allTokenIds[i + from]];
		}
	}

	// disabled setApprovalForAll
	function setApprovalForAll(address, bool) public override {
		revert("setApprovalForAll is disabled");
	}

	function transfer(
		address to,
		uint256 id,
		uint256 amount,
		bytes memory data
	) external payable nonReentrant {
		if(msg.value > 0) {
  		TransferHelper.safeTransferETH(to, msg.value);	
  	}
		safeTransferFrom(msg.sender, to, id, amount, data);
	}

	function batchTransfer(
		address to,
		uint256[] memory ids,
		uint256[] memory amounts,
		bytes memory data
	) external payable nonReentrant {
		if(msg.value > 0) {
			TransferHelper.safeTransferETH(to, msg.value);	
		}
		safeBatchTransferFrom(msg.sender, to, ids, amounts, data);
	}

	function uri(uint256 id) public view override returns (string memory){
		return ethrunesURI.uri(id);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"uint8","name":"typ","type":"uint8"},{"components":[{"internalType":"uint160","name":"id","type":"uint160"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"string","name":"tick","type":"string"}],"indexed":false,"internalType":"struct Ethrunes.Token","name":"token","type":"tuple"}],"name":"Deploy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unwrap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Wrap","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allTokenIds","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"batchTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint160","name":"id","type":"uint160"}],"name":"decimalsOf","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tick","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"deploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tick","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deploy2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ethrunesURI","outputs":[{"internalType":"contract IEthrunesURI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getTokens","outputs":[{"components":[{"internalType":"uint160","name":"id","type":"uint160"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"string","name":"tick","type":"string"}],"internalType":"struct Ethrunes.Token[]","name":"tokenArray","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tick","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev","type":"address"}],"name":"setDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uri","type":"address"}],"name":"setEthrunesURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_len","type":"uint256"}],"name":"setTickMaxLength","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":"uint160","name":"id","type":"uint160"}],"name":"symbolOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickMaxLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"","type":"uint160"}],"name":"tokens","outputs":[{"internalType":"uint160","name":"id","type":"uint160"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"string","name":"tick","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrapERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrapERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260046007553480156200001657600080fd5b5060408051602081019091526000815262000031816200004f565b506001600455600580546001600160a01b03191633179055620001d2565b60026200005d828262000106565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200008c57607f821691505b602082108103620000ad57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200010157600081815260208120601f850160051c81016020861015620000dc5750805b601f850160051c820191505b81811015620000fd57828155600101620000e8565b5050505b505050565b81516001600160401b0381111562000122576200012262000061565b6200013a8162000133845462000077565b84620000b3565b602080601f831160018114620001725760008415620001595750858301515b600019600386901b1c1916600185901b178555620000fd565b600085815260208120601f198616915b82811015620001a35788860151825594840194600190910190840162000182565b5085821015620001c25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613a3280620001e26000396000f3fe6080604052600436106101cc5760003560e01c80637d07b2d2116100f7578063d85d3d2711610095578063e9c69edc11610064578063e9c69edc146105db578063f242432a146105fb578063f294630b1461061b578063fff336f81461062e57600080fd5b8063d85d3d271461052e578063dabd76e91461054e578063e658991214610561578063e985e9c51461059257600080fd5b80639a5e50c8116100d15780639a5e50c8146104a1578063a22cb465146104c1578063bd85b039146104e1578063d477f05f1461050e57600080fd5b80637d07b2d21461043257806394548dae1461045257806395d89b411461047257600080fd5b80632a90962b1161016f5780634e1273f41161013e5780634e1273f4146103965780634f558e79146103c35780635472a10f146103f25780635c2297551461041257600080fd5b80632a90962b146102df5780632eb2c2d614610311578063440331f814610331578063494cfc6c1461036957600080fd5b80630b6e862e116101ab5780630b6e862e146102755780630e89341c146102975780631c0c232e146102b75780631e82b867146102ca57600080fd5b8062fdd58e146101d157806301ffc9a71461020457806306fdde0314610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004612bd5565b610644565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004612c17565b6106dd565b60405190151581526020016101fb565b34801561024057600080fd5b506102686040518060400160405280600881526020016745746872756e657360c01b81525081565b6040516101fb9190612c8b565b34801561028157600080fd5b50610295610290366004612cf5565b61072d565b005b3480156102a357600080fd5b506102686102b2366004612d5b565b610aaf565b6102956102c5366004612d74565b610b21565b3480156102d657600080fd5b506008546101f1565b3480156102eb57600080fd5b506102ff6102fa366004612de7565b610e99565b60405160ff90911681526020016101fb565b34801561031d57600080fd5b5061029561032c366004612f5d565b610fcd565b34801561033d57600080fd5b50600654610351906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b34801561037557600080fd5b5061038961038436600461300a565b611019565b6040516101fb919061307c565b3480156103a257600080fd5b506103b66103b13660046130de565b611262565b6040516101fb91906131e5565b3480156103cf57600080fd5b506102246103de366004612d5b565b600090815260036020526040902054151590565b3480156103fe57600080fd5b5061029561040d366004612de7565b61138b565b34801561041e57600080fd5b5061026861042d366004612de7565b6113c4565b34801561043e57600080fd5b5061035161044d366004612d5b565b6115a8565b34801561045e57600080fd5b5061029561046d366004612bd5565b6115d2565b34801561047e57600080fd5b506102686040518060400160405280600381526020016245525360e81b81525081565b3480156104ad57600080fd5b506102956104bc366004612bd5565b6117fc565b3480156104cd57600080fd5b506102956104dc366004613206565b6118ba565b3480156104ed57600080fd5b506101f16104fc366004612d5b565b60009081526003602052604090205490565b34801561051a57600080fd5b50610295610529366004612de7565b611902565b34801561053a57600080fd5b5061029561054936600461323f565b61193b565b61029561055c366004613280565b611b96565b34801561056d57600080fd5b5061058161057c366004612de7565b611bc5565b6040516101fb9594939291906132e2565b34801561059e57600080fd5b506102246105ad366004613323565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156105e757600080fd5b506102956105f6366004612d5b565b611c8a565b34801561060757600080fd5b50610295610616366004613351565b611ca6565b6102956106293660046133b9565b611ceb565b34801561063a57600080fd5b506101f160075481565b60006001600160a01b0383166106b45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061070e57506001600160e01b031982166303a24d0760e21b145b806106d757506301ffc9a760e01b6001600160e01b03198316146106d7565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061076e9150839050611d10565b9050806000036107b05760405162461bcd60e51b815260206004820152600d60248201526c5469636b20697320656d70747960981b60448201526064016106ab565b60006007541180156107c3575060075481115b156108005760405162461bcd60e51b815260206004820152600d60248201526c5469636b20746f6f206c6f6e6760981b60448201526064016106ab565b6000831180156108105750838311155b6108525760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706c6f79206172677360681b60448201526064016106ab565b600061089388888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b038116600090815260096020526040902060010154909150156108ea5760405162461bcd60e51b815260206004820152600860248201526711195c1b1bde595960c21b60448201526064016106ab565b6001600160a01b038116600090815260036020526040902054156109445760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a59081bd8d8dd5c1a5959607a1b60448201526064016106ab565b60006040518060a00160405280836001600160a01b031681526020018860ff1681526020018781526020018681526020018a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506001600160a01b03808616825260096020908152604092839020855181549287015160ff16600160a01b026001600160a81b031990931693169290921717815590830151600182015560608301516002820155608083015192935083929091506003820190610a1c90826134c7565b505060088054600180820183556000929092527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386161790556040517f2644217c3c14efed5457f5a53e8a1350b8ab9471ab3674147a75b8df6b2559449250610a9c91908490613586565b60405180910390a1505050505050505050565b6006546040516303a24d0760e21b8152600481018390526060916001600160a01b031690630e89341c90602401600060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106d791908101906135a2565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250610b629150839050611d10565b905080600003610ba45760405162461bcd60e51b815260206004820152600d60248201526c5469636b20697320656d70747960981b60448201526064016106ab565b6000600754118015610bb7575060075481115b15610bf45760405162461bcd60e51b815260206004820152600d60248201526c5469636b20746f6f206c6f6e6760981b60448201526064016106ab565b60008411610c325760405162461bcd60e51b815260206004820152600b60248201526a0537570706c7920697320360ac1b60448201526064016106ab565b6000610c7388888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b03811660009081526009602052604090206001015490915015610cca5760405162461bcd60e51b815260206004820152600860248201526711195c1b1bde595960c21b60448201526064016106ab565b6001600160a01b03811660009081526003602052604090205415610d245760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a59081bd8d8dd5c1a5959607a1b60448201526064016106ab565b60006040518060a00160405280836001600160a01b031681526020018860ff1681526020018781526020018781526020018a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506001600160a01b03808616825260096020908152604092839020855181549287015160ff16600160a01b026001600160a81b031990931693169290921717815590830151600182015560608301516002820155608083015192935083929091506003820190610dfc90826134c7565b50506008805460018101825560009182527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386169081179091556040805160208101909152918252610e67925087918990611e4e565b7f2644217c3c14efed5457f5a53e8a1350b8ab9471ab3674147a75b8df6b255944600282604051610a9c929190613586565b6001600160a01b03811660009081526009602052604081206001015415610ee057506001600160a01b0316600090815260096020526040902054600160a01b900460ff1690565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009081906001600160a01b03861690610f25908590613623565b600060405180830381855afa9150503d8060008114610f60576040519150601f19603f3d011682016040523d82523d6000602084013e610f65565b606091505b509150915081610fb05760405162461bcd60e51b815260206004820152601660248201527518d85b1b08191958da5b585b1cca0a4819985a5b195960521b60448201526064016106ab565b80806020019051810190610fc4919061363f565b95945050505050565b6001600160a01b038516331480610fe95750610fe985336105ad565b6110055760405162461bcd60e51b81526004016106ab9061365c565b6110128585858585611f71565b5050505050565b600854606090156106d7576008548211156110345760085491505b8183106110735760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b60448201526064016106ab565b61107d83836136c0565b6001600160401b0381111561109457611094612e04565b60405190808252806020026020018201604052801561110357816020015b6110f06040518060a0016040528060006001600160a01b03168152602001600060ff1681526020016000815260200160008152602001606081525090565b8152602001906001900390816110b25790505b50905060005b815181101561125b5760096000600861112287856136d3565b81548110611132576111326136e6565b6000918252602080832091909101546001600160a01b039081168452838201949094526040928301909120825160a08101845281549485168152600160a01b90940460ff1691840191909152600181015491830191909152600281015460608301526003810180546080840191906111a990613447565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613447565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50505050508152505082828151811061123d5761123d6136e6565b60200260200101819052508080611253906136fc565b915050611109565b5092915050565b606081518351146112c75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106ab565b600083516001600160401b038111156112e2576112e2612e04565b60405190808252806020026020018201604052801561130b578160200160208202803683370190505b50905060005b84518110156113835761135685828151811061132f5761132f6136e6565b6020026020010151858381518110611349576113496136e6565b6020026020010151610644565b828281518110611368576113686136e6565b602090810291909101015261137c816136fc565b9050611311565b509392505050565b6005546001600160a01b031633146113a257600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604090206001015460609015611493576001600160a01b0382166000908152600960205260409020600301805461140e90613447565b80601f016020809104026020016040519081016040528092919081815260200182805461143a90613447565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b50505050509050919050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160009081906001600160a01b038616906114d8908590613623565b600060405180830381855afa9150503d8060008114611513576040519150601f19603f3d011682016040523d82523d6000602084013e611518565b606091505b5091509150816115615760405162461bcd60e51b815260206004820152601460248201527318d85b1b081cde5b589bdb0a0a4819985a5b195960621b60448201526064016106ab565b8051602003611594578060405160200161157b9190613623565b6040516020818303038152906040529350505050919050565b80806020019051810190610fc491906135a2565b600881815481106115b857600080fd5b6000918252602090912001546001600160a01b0316905081565b6115da61215c565b6001600160a01b03821660009081526009602052604090206001015482901561164f5760405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f20777261702c20746f6b656e206964206465706c6f79656044820152601960fa1b60648201526084016106ab565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190613715565b90506116c8843330866121b5565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190613715565b90508361174083836136c0565b1461177e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106ab565b6117a233846001600160a01b03168660405180602001604052806000815250611e4e565b604080513381526001600160a01b03871660208201529081018590527f32771713d1bc9f76444ca8b47f67bb9a592b559397cf27cfea344efa0fdb7d8b9060600160405180910390a15050506117f86001600455565b5050565b6001600160a01b038216816118113383610644565b10156118565760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106ab565b6118613382846122b7565b61186c833384612447565b604080513381526001600160a01b03851660208201529081018390527fbe8e6aacbb5d99c99f1992d91d807f570d0acacabee02374369ed42710dc66989060600160405180910390a1505050565b60405162461bcd60e51b815260206004820152601d60248201527f736574417070726f76616c466f72416c6c2069732064697361626c656400000060448201526064016106ab565b6005546001600160a01b0316331461191957600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b3332146119755760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106ab565b60006119b683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b038181166000908152600960209081526040808320815160a08101835281549586168152600160a01b90950460ff169285019290925260018201549084015260028101546060840152600381018054949550919390916080840191611a2190613447565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90613447565b8015611a9a5780601f10611a6f57610100808354040283529160200191611a9a565b820191906000526020600020905b815481529060010190602001808311611a7d57829003601f168201915b50505050508152505090508060400151600003611aec5760405162461bcd60e51b815260206004820152601060248201526f546f6b656e206e6f742065786973747360801b60448201526064016106ab565b604081015160608201518251611b17906001600160a01b031660009081526003602052604090205490565b611b2191906136d3565b1115611b645760405162461bcd60e51b81526020600482015260126024820152714578636565646564206d6178537570706c7960701b60448201526064016106ab565b611b903382600001516001600160a01b0316836060015160405180602001604052806000815250611e4e565b50505050565b611b9e61215c565b3415611bae57611bae8434612540565b611bbb3385858585611ca6565b611b906001600455565b60096020526000908152604090208054600182015460028301546003840180546001600160a01b03851695600160a01b90950460ff16949190611c0790613447565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3390613447565b8015611c805780601f10611c5557610100808354040283529160200191611c80565b820191906000526020600020905b815481529060010190602001808311611c6357829003601f168201915b5050505050905085565b6005546001600160a01b03163314611ca157600080fd5b600755565b6001600160a01b038516331480611cc25750611cc285336105ad565b611cde5760405162461bcd60e51b81526004016106ab9061365c565b61101285858585856125e8565b611cf361215c565b3415611d0357611d038434612540565b611bbb3385858585610fcd565b8051600090819081905b80821015611e0a576000858381518110611d3657611d366136e6565b01602001516001600160f81b0319169050600160ff1b811015611d6557611d5e6001846136d3565b9250611df7565b600760fd1b6001600160f81b031982161015611d8657611d5e6002846136d3565b600f60fc1b6001600160f81b031982161015611da757611d5e6003846136d3565b601f60fb1b6001600160f81b031982161015611dc857611d5e6004846136d3565b603f60fa1b6001600160f81b031982161015611de957611d5e6005846136d3565b611df46006846136d3565b92505b5082611e02816136fc565b935050611d1a565b50909392505050565b600046611e1f83612720565b604051602001611e3092919061372e565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b038416611eae5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106ab565b336000611eba856127e3565b90506000611ec7856127e3565b9050611ed88360008985858961282e565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611f089084906136d3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f68836000898989896129a7565b50505050505050565b8151835114611fd35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016106ab565b6001600160a01b038416611ff95760405162461bcd60e51b81526004016106ab90613770565b3361200881878787878761282e565b60005b84518110156120ee576000858281518110612028576120286136e6565b602002602001015190506000858381518110612046576120466136e6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156120965760405162461bcd60e51b81526004016106ab906137b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906120d39084906136d3565b92505081905550505050806120e7906136fc565b905061200b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161213e9291906137ff565b60405180910390a4612154818787878787612b02565b505050505050565b6002600454036121ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ab565b6002600455565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916122199190613623565b6000604051808303816000865af19150503d8060008114612256576040519150601f19603f3d011682016040523d82523d6000602084013e61225b565b606091505b50915091508180156122855750805115806122855750808060200190518101906122859190613824565b6121545760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b60448201526064016106ab565b6001600160a01b0383166123195760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016106ab565b336000612325846127e3565b90506000612332846127e3565b90506123528387600085856040518060200160405280600081525061282e565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156123cf5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016106ab565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611f68565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124a39190613623565b6000604051808303816000865af19150503d80600081146124e0576040519150601f19603f3d011682016040523d82523d6000602084013e6124e5565b606091505b509150915081801561250f57508051158061250f57508080602001905181019061250f9190613824565b6110125760405162461bcd60e51b815260206004820152600260248201526114d560f21b60448201526064016106ab565b604080516000808252602082019092526001600160a01b03841690839060405161256a9190613623565b60006040518083038185875af1925050503d80600081146125a7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ac565b606091505b50509050806125e35760405162461bcd60e51b815260206004820152600360248201526253544560e81b60448201526064016106ab565b505050565b6001600160a01b03841661260e5760405162461bcd60e51b81526004016106ab90613770565b33600061261a856127e3565b90506000612627856127e3565b905061263783898985858961282e565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156126785760405162461bcd60e51b81526004016106ab906137b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906126b59084906136d3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612715848a8a8a8a8a6129a7565b505050505050505050565b60608160005b815181101561125b576041828281518110612743576127436136e6565b016020015160f81c108015906127735750605a828281518110612768576127686136e6565b016020015160f81c11155b156127d15781818151811061278a5761278a6136e6565b602001015160f81c60f81b60f81c60206127a49190613841565b60f81b8282815181106127b9576127b96136e6565b60200101906001600160f81b031916908160001a9053505b806127db816136fc565b915050612726565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061281d5761281d6136e6565b602090810291909101015292915050565b6001600160a01b0385166128b55760005b83518110156128b35782818151811061285a5761285a6136e6565b602002602001015160036000868481518110612878576128786136e6565b60200260200101518152602001908152602001600020600082825461289d91906136d3565b909155506128ac9050816136fc565b905061283f565b505b6001600160a01b0384166121545760005b8351811015611f685760008482815181106128e3576128e36136e6565b602002602001015190506000848381518110612901576129016136e6565b60200260200101519050600060036000848152602001908152602001600020549050818110156129845760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016106ab565b600092835260036020526040909220910390556129a0816136fc565b90506128c6565b6001600160a01b0384163b156121545760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129eb908990899088908890889060040161385a565b6020604051808303816000875af1925050508015612a26575060408051601f3d908101601f19168201909252612a2391810190613894565b60015b612ad257612a326138b1565b806308c379a003612a6b5750612a466138cd565b80612a515750612a6d565b8060405162461bcd60e51b81526004016106ab9190612c8b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106ab565b6001600160e01b0319811663f23a6e6160e01b14611f685760405162461bcd60e51b81526004016106ab90613956565b6001600160a01b0384163b156121545760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b46908990899088908890889060040161399e565b6020604051808303816000875af1925050508015612b81575060408051601f3d908101601f19168201909252612b7e91810190613894565b60015b612b8d57612a326138b1565b6001600160e01b0319811663bc197c8160e01b14611f685760405162461bcd60e51b81526004016106ab90613956565b6001600160a01b0381168114612bd257600080fd5b50565b60008060408385031215612be857600080fd5b8235612bf381612bbd565b946020939093013593505050565b6001600160e01b031981168114612bd257600080fd5b600060208284031215612c2957600080fd5b8135612c3481612c01565b9392505050565b60005b83811015612c56578181015183820152602001612c3e565b50506000910152565b60008151808452612c77816020860160208601612c3b565b601f01601f19169290920160200192915050565b602081526000612c346020830184612c5f565b60008083601f840112612cb057600080fd5b5081356001600160401b03811115612cc757600080fd5b602083019150836020828501011115612cdf57600080fd5b9250929050565b60ff81168114612bd257600080fd5b600080600080600060808688031215612d0d57600080fd5b85356001600160401b03811115612d2357600080fd5b612d2f88828901612c9e565b9096509450506020860135612d4381612ce6565b94979396509394604081013594506060013592915050565b600060208284031215612d6d57600080fd5b5035919050565b600080600080600060808688031215612d8c57600080fd5b85356001600160401b03811115612da257600080fd5b612dae88828901612c9e565b9096509450506020860135612dc281612ce6565b9250604086013591506060860135612dd981612bbd565b809150509295509295909350565b600060208284031215612df957600080fd5b8135612c3481612bbd565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612e3f57612e3f612e04565b6040525050565b60006001600160401b03821115612e5f57612e5f612e04565b5060051b60200190565b600082601f830112612e7a57600080fd5b81356020612e8782612e46565b604051612e948282612e1a565b83815260059390931b8501820192828101915086841115612eb457600080fd5b8286015b84811015612ecf5780358352918301918301612eb8565b509695505050505050565b60006001600160401b03821115612ef357612ef3612e04565b50601f01601f191660200190565b600082601f830112612f1257600080fd5b8135612f1d81612eda565b604051612f2a8282612e1a565b828152856020848701011115612f3f57600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a08688031215612f7557600080fd5b8535612f8081612bbd565b94506020860135612f9081612bbd565b935060408601356001600160401b0380821115612fac57600080fd5b612fb889838a01612e69565b94506060880135915080821115612fce57600080fd5b612fda89838a01612e69565b93506080880135915080821115612ff057600080fd5b50612ffd88828901612f01565b9150509295509295909350565b6000806040838503121561301d57600080fd5b50508035926020909101359150565b60018060a01b03815116825260ff602082015116602083015260408101516040830152606081015160608301526000608082015160a0608085015261307460a0850182612c5f565b949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156130d157603f198886030184526130bf85835161302c565b945092850192908501906001016130a3565b5092979650505050505050565b600080604083850312156130f157600080fd5b82356001600160401b038082111561310857600080fd5b818501915085601f83011261311c57600080fd5b8135602061312982612e46565b6040516131368282612e1a565b83815260059390931b850182019282810191508984111561315657600080fd5b948201945b8386101561317d57853561316e81612bbd565b8252948201949082019061315b565b9650508601359250508082111561319357600080fd5b506131a085828601612e69565b9150509250929050565b600081518084526020808501945080840160005b838110156131da578151875295820195908201906001016131be565b509495945050505050565b602081526000612c3460208301846131aa565b8015158114612bd257600080fd5b6000806040838503121561321957600080fd5b823561322481612bbd565b91506020830135613234816131f8565b809150509250929050565b6000806020838503121561325257600080fd5b82356001600160401b0381111561326857600080fd5b61327485828601612c9e565b90969095509350505050565b6000806000806080858703121561329657600080fd5b84356132a181612bbd565b9350602085013592506040850135915060608501356001600160401b038111156132ca57600080fd5b6132d687828801612f01565b91505092959194509250565b60018060a01b038616815260ff8516602082015283604082015282606082015260a06080820152600061331860a0830184612c5f565b979650505050505050565b6000806040838503121561333657600080fd5b823561334181612bbd565b9150602083013561323481612bbd565b600080600080600060a0868803121561336957600080fd5b853561337481612bbd565b9450602086013561338481612bbd565b9350604086013592506060860135915060808601356001600160401b038111156133ad57600080fd5b612ffd88828901612f01565b600080600080608085870312156133cf57600080fd5b84356133da81612bbd565b935060208501356001600160401b03808211156133f657600080fd5b61340288838901612e69565b9450604087013591508082111561341857600080fd5b61342488838901612e69565b9350606087013591508082111561343a57600080fd5b506132d687828801612f01565b600181811c9082168061345b57607f821691505b60208210810361347b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156125e357600081815260208120601f850160051c810160208610156134a85750805b601f850160051c820191505b81811015612154578281556001016134b4565b81516001600160401b038111156134e0576134e0612e04565b6134f4816134ee8454613447565b84613481565b602080601f83116001811461352957600084156135115750858301515b600019600386901b1c1916600185901b178555612154565b600085815260208120601f198616915b8281101561355857888601518255948401946001909101908401613539565b50858210156135765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff83168152604060208201526000613074604083018461302c565b6000602082840312156135b457600080fd5b81516001600160401b038111156135ca57600080fd5b8201601f810184136135db57600080fd5b80516135e681612eda565b6040516135f38282612e1a565b82815286602084860101111561360857600080fd5b613619836020830160208701612c3b565b9695505050505050565b60008251613635818460208701612c3b565b9190910192915050565b60006020828403121561365157600080fd5b8151612c3481612ce6565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106d7576106d76136aa565b808201808211156106d7576106d76136aa565b634e487b7160e01b600052603260045260246000fd5b60006001820161370e5761370e6136aa565b5060010190565b60006020828403121561372757600080fd5b5051919050565b6832ba34393ab732b99d60b91b8152826009820152601d60f91b60298201526000825161376281602a850160208701612c3b565b91909101602a019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061381260408301856131aa565b8281036020840152610fc481856131aa565b60006020828403121561383657600080fd5b8151612c34816131f8565b60ff81811683821601908111156106d7576106d76136aa565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061331890830184612c5f565b6000602082840312156138a657600080fd5b8151612c3481612c01565b600060033d11156138ca5760046000803e5060005160e01c5b90565b600060443d10156138db5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561390a57505050505090565b82850191508151818111156139225750505050505090565b843d870101602082850101111561393c5750505050505090565b61394b60208286010187612e1a565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906139ca908301866131aa565b82810360608401526139dc81866131aa565b905082810360808401526139f08185612c5f565b9897505050505050505056fea26469706673582212205687264d6bc978c2d4d439da728163aa96b80c27e38fa5e062cd14de34df825764736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101cc5760003560e01c80637d07b2d2116100f7578063d85d3d2711610095578063e9c69edc11610064578063e9c69edc146105db578063f242432a146105fb578063f294630b1461061b578063fff336f81461062e57600080fd5b8063d85d3d271461052e578063dabd76e91461054e578063e658991214610561578063e985e9c51461059257600080fd5b80639a5e50c8116100d15780639a5e50c8146104a1578063a22cb465146104c1578063bd85b039146104e1578063d477f05f1461050e57600080fd5b80637d07b2d21461043257806394548dae1461045257806395d89b411461047257600080fd5b80632a90962b1161016f5780634e1273f41161013e5780634e1273f4146103965780634f558e79146103c35780635472a10f146103f25780635c2297551461041257600080fd5b80632a90962b146102df5780632eb2c2d614610311578063440331f814610331578063494cfc6c1461036957600080fd5b80630b6e862e116101ab5780630b6e862e146102755780630e89341c146102975780631c0c232e146102b75780631e82b867146102ca57600080fd5b8062fdd58e146101d157806301ffc9a71461020457806306fdde0314610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004612bd5565b610644565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004612c17565b6106dd565b60405190151581526020016101fb565b34801561024057600080fd5b506102686040518060400160405280600881526020016745746872756e657360c01b81525081565b6040516101fb9190612c8b565b34801561028157600080fd5b50610295610290366004612cf5565b61072d565b005b3480156102a357600080fd5b506102686102b2366004612d5b565b610aaf565b6102956102c5366004612d74565b610b21565b3480156102d657600080fd5b506008546101f1565b3480156102eb57600080fd5b506102ff6102fa366004612de7565b610e99565b60405160ff90911681526020016101fb565b34801561031d57600080fd5b5061029561032c366004612f5d565b610fcd565b34801561033d57600080fd5b50600654610351906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b34801561037557600080fd5b5061038961038436600461300a565b611019565b6040516101fb919061307c565b3480156103a257600080fd5b506103b66103b13660046130de565b611262565b6040516101fb91906131e5565b3480156103cf57600080fd5b506102246103de366004612d5b565b600090815260036020526040902054151590565b3480156103fe57600080fd5b5061029561040d366004612de7565b61138b565b34801561041e57600080fd5b5061026861042d366004612de7565b6113c4565b34801561043e57600080fd5b5061035161044d366004612d5b565b6115a8565b34801561045e57600080fd5b5061029561046d366004612bd5565b6115d2565b34801561047e57600080fd5b506102686040518060400160405280600381526020016245525360e81b81525081565b3480156104ad57600080fd5b506102956104bc366004612bd5565b6117fc565b3480156104cd57600080fd5b506102956104dc366004613206565b6118ba565b3480156104ed57600080fd5b506101f16104fc366004612d5b565b60009081526003602052604090205490565b34801561051a57600080fd5b50610295610529366004612de7565b611902565b34801561053a57600080fd5b5061029561054936600461323f565b61193b565b61029561055c366004613280565b611b96565b34801561056d57600080fd5b5061058161057c366004612de7565b611bc5565b6040516101fb9594939291906132e2565b34801561059e57600080fd5b506102246105ad366004613323565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156105e757600080fd5b506102956105f6366004612d5b565b611c8a565b34801561060757600080fd5b50610295610616366004613351565b611ca6565b6102956106293660046133b9565b611ceb565b34801561063a57600080fd5b506101f160075481565b60006001600160a01b0383166106b45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061070e57506001600160e01b031982166303a24d0760e21b145b806106d757506301ffc9a760e01b6001600160e01b03198316146106d7565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061076e9150839050611d10565b9050806000036107b05760405162461bcd60e51b815260206004820152600d60248201526c5469636b20697320656d70747960981b60448201526064016106ab565b60006007541180156107c3575060075481115b156108005760405162461bcd60e51b815260206004820152600d60248201526c5469636b20746f6f206c6f6e6760981b60448201526064016106ab565b6000831180156108105750838311155b6108525760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706c6f79206172677360681b60448201526064016106ab565b600061089388888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b038116600090815260096020526040902060010154909150156108ea5760405162461bcd60e51b815260206004820152600860248201526711195c1b1bde595960c21b60448201526064016106ab565b6001600160a01b038116600090815260036020526040902054156109445760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a59081bd8d8dd5c1a5959607a1b60448201526064016106ab565b60006040518060a00160405280836001600160a01b031681526020018860ff1681526020018781526020018681526020018a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506001600160a01b03808616825260096020908152604092839020855181549287015160ff16600160a01b026001600160a81b031990931693169290921717815590830151600182015560608301516002820155608083015192935083929091506003820190610a1c90826134c7565b505060088054600180820183556000929092527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386161790556040517f2644217c3c14efed5457f5a53e8a1350b8ab9471ab3674147a75b8df6b2559449250610a9c91908490613586565b60405180910390a1505050505050505050565b6006546040516303a24d0760e21b8152600481018390526060916001600160a01b031690630e89341c90602401600060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106d791908101906135a2565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250610b629150839050611d10565b905080600003610ba45760405162461bcd60e51b815260206004820152600d60248201526c5469636b20697320656d70747960981b60448201526064016106ab565b6000600754118015610bb7575060075481115b15610bf45760405162461bcd60e51b815260206004820152600d60248201526c5469636b20746f6f206c6f6e6760981b60448201526064016106ab565b60008411610c325760405162461bcd60e51b815260206004820152600b60248201526a0537570706c7920697320360ac1b60448201526064016106ab565b6000610c7388888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b03811660009081526009602052604090206001015490915015610cca5760405162461bcd60e51b815260206004820152600860248201526711195c1b1bde595960c21b60448201526064016106ab565b6001600160a01b03811660009081526003602052604090205415610d245760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a59081bd8d8dd5c1a5959607a1b60448201526064016106ab565b60006040518060a00160405280836001600160a01b031681526020018860ff1681526020018781526020018781526020018a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506001600160a01b03808616825260096020908152604092839020855181549287015160ff16600160a01b026001600160a81b031990931693169290921717815590830151600182015560608301516002820155608083015192935083929091506003820190610dfc90826134c7565b50506008805460018101825560009182527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386169081179091556040805160208101909152918252610e67925087918990611e4e565b7f2644217c3c14efed5457f5a53e8a1350b8ab9471ab3674147a75b8df6b255944600282604051610a9c929190613586565b6001600160a01b03811660009081526009602052604081206001015415610ee057506001600160a01b0316600090815260096020526040902054600160a01b900460ff1690565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009081906001600160a01b03861690610f25908590613623565b600060405180830381855afa9150503d8060008114610f60576040519150601f19603f3d011682016040523d82523d6000602084013e610f65565b606091505b509150915081610fb05760405162461bcd60e51b815260206004820152601660248201527518d85b1b08191958da5b585b1cca0a4819985a5b195960521b60448201526064016106ab565b80806020019051810190610fc4919061363f565b95945050505050565b6001600160a01b038516331480610fe95750610fe985336105ad565b6110055760405162461bcd60e51b81526004016106ab9061365c565b6110128585858585611f71565b5050505050565b600854606090156106d7576008548211156110345760085491505b8183106110735760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b60448201526064016106ab565b61107d83836136c0565b6001600160401b0381111561109457611094612e04565b60405190808252806020026020018201604052801561110357816020015b6110f06040518060a0016040528060006001600160a01b03168152602001600060ff1681526020016000815260200160008152602001606081525090565b8152602001906001900390816110b25790505b50905060005b815181101561125b5760096000600861112287856136d3565b81548110611132576111326136e6565b6000918252602080832091909101546001600160a01b039081168452838201949094526040928301909120825160a08101845281549485168152600160a01b90940460ff1691840191909152600181015491830191909152600281015460608301526003810180546080840191906111a990613447565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590613447565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50505050508152505082828151811061123d5761123d6136e6565b60200260200101819052508080611253906136fc565b915050611109565b5092915050565b606081518351146112c75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106ab565b600083516001600160401b038111156112e2576112e2612e04565b60405190808252806020026020018201604052801561130b578160200160208202803683370190505b50905060005b84518110156113835761135685828151811061132f5761132f6136e6565b6020026020010151858381518110611349576113496136e6565b6020026020010151610644565b828281518110611368576113686136e6565b602090810291909101015261137c816136fc565b9050611311565b509392505050565b6005546001600160a01b031633146113a257600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604090206001015460609015611493576001600160a01b0382166000908152600960205260409020600301805461140e90613447565b80601f016020809104026020016040519081016040528092919081815260200182805461143a90613447565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b50505050509050919050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160009081906001600160a01b038616906114d8908590613623565b600060405180830381855afa9150503d8060008114611513576040519150601f19603f3d011682016040523d82523d6000602084013e611518565b606091505b5091509150816115615760405162461bcd60e51b815260206004820152601460248201527318d85b1b081cde5b589bdb0a0a4819985a5b195960621b60448201526064016106ab565b8051602003611594578060405160200161157b9190613623565b6040516020818303038152906040529350505050919050565b80806020019051810190610fc491906135a2565b600881815481106115b857600080fd5b6000918252602090912001546001600160a01b0316905081565b6115da61215c565b6001600160a01b03821660009081526009602052604090206001015482901561164f5760405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f20777261702c20746f6b656e206964206465706c6f79656044820152601960fa1b60648201526084016106ab565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190613715565b90506116c8843330866121b5565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190613715565b90508361174083836136c0565b1461177e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106ab565b6117a233846001600160a01b03168660405180602001604052806000815250611e4e565b604080513381526001600160a01b03871660208201529081018590527f32771713d1bc9f76444ca8b47f67bb9a592b559397cf27cfea344efa0fdb7d8b9060600160405180910390a15050506117f86001600455565b5050565b6001600160a01b038216816118113383610644565b10156118565760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106ab565b6118613382846122b7565b61186c833384612447565b604080513381526001600160a01b03851660208201529081018390527fbe8e6aacbb5d99c99f1992d91d807f570d0acacabee02374369ed42710dc66989060600160405180910390a1505050565b60405162461bcd60e51b815260206004820152601d60248201527f736574417070726f76616c466f72416c6c2069732064697361626c656400000060448201526064016106ab565b6005546001600160a01b0316331461191957600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b3332146119755760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106ab565b60006119b683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e1392505050565b6001600160a01b038181166000908152600960209081526040808320815160a08101835281549586168152600160a01b90950460ff169285019290925260018201549084015260028101546060840152600381018054949550919390916080840191611a2190613447565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90613447565b8015611a9a5780601f10611a6f57610100808354040283529160200191611a9a565b820191906000526020600020905b815481529060010190602001808311611a7d57829003601f168201915b50505050508152505090508060400151600003611aec5760405162461bcd60e51b815260206004820152601060248201526f546f6b656e206e6f742065786973747360801b60448201526064016106ab565b604081015160608201518251611b17906001600160a01b031660009081526003602052604090205490565b611b2191906136d3565b1115611b645760405162461bcd60e51b81526020600482015260126024820152714578636565646564206d6178537570706c7960701b60448201526064016106ab565b611b903382600001516001600160a01b0316836060015160405180602001604052806000815250611e4e565b50505050565b611b9e61215c565b3415611bae57611bae8434612540565b611bbb3385858585611ca6565b611b906001600455565b60096020526000908152604090208054600182015460028301546003840180546001600160a01b03851695600160a01b90950460ff16949190611c0790613447565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3390613447565b8015611c805780601f10611c5557610100808354040283529160200191611c80565b820191906000526020600020905b815481529060010190602001808311611c6357829003601f168201915b5050505050905085565b6005546001600160a01b03163314611ca157600080fd5b600755565b6001600160a01b038516331480611cc25750611cc285336105ad565b611cde5760405162461bcd60e51b81526004016106ab9061365c565b61101285858585856125e8565b611cf361215c565b3415611d0357611d038434612540565b611bbb3385858585610fcd565b8051600090819081905b80821015611e0a576000858381518110611d3657611d366136e6565b01602001516001600160f81b0319169050600160ff1b811015611d6557611d5e6001846136d3565b9250611df7565b600760fd1b6001600160f81b031982161015611d8657611d5e6002846136d3565b600f60fc1b6001600160f81b031982161015611da757611d5e6003846136d3565b601f60fb1b6001600160f81b031982161015611dc857611d5e6004846136d3565b603f60fa1b6001600160f81b031982161015611de957611d5e6005846136d3565b611df46006846136d3565b92505b5082611e02816136fc565b935050611d1a565b50909392505050565b600046611e1f83612720565b604051602001611e3092919061372e565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b038416611eae5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106ab565b336000611eba856127e3565b90506000611ec7856127e3565b9050611ed88360008985858961282e565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611f089084906136d3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f68836000898989896129a7565b50505050505050565b8151835114611fd35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016106ab565b6001600160a01b038416611ff95760405162461bcd60e51b81526004016106ab90613770565b3361200881878787878761282e565b60005b84518110156120ee576000858281518110612028576120286136e6565b602002602001015190506000858381518110612046576120466136e6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156120965760405162461bcd60e51b81526004016106ab906137b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906120d39084906136d3565b92505081905550505050806120e7906136fc565b905061200b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161213e9291906137ff565b60405180910390a4612154818787878787612b02565b505050505050565b6002600454036121ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ab565b6002600455565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916122199190613623565b6000604051808303816000865af19150503d8060008114612256576040519150601f19603f3d011682016040523d82523d6000602084013e61225b565b606091505b50915091508180156122855750805115806122855750808060200190518101906122859190613824565b6121545760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b60448201526064016106ab565b6001600160a01b0383166123195760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016106ab565b336000612325846127e3565b90506000612332846127e3565b90506123528387600085856040518060200160405280600081525061282e565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156123cf5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016106ab565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611f68565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124a39190613623565b6000604051808303816000865af19150503d80600081146124e0576040519150601f19603f3d011682016040523d82523d6000602084013e6124e5565b606091505b509150915081801561250f57508051158061250f57508080602001905181019061250f9190613824565b6110125760405162461bcd60e51b815260206004820152600260248201526114d560f21b60448201526064016106ab565b604080516000808252602082019092526001600160a01b03841690839060405161256a9190613623565b60006040518083038185875af1925050503d80600081146125a7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ac565b606091505b50509050806125e35760405162461bcd60e51b815260206004820152600360248201526253544560e81b60448201526064016106ab565b505050565b6001600160a01b03841661260e5760405162461bcd60e51b81526004016106ab90613770565b33600061261a856127e3565b90506000612627856127e3565b905061263783898985858961282e565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156126785760405162461bcd60e51b81526004016106ab906137b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906126b59084906136d3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612715848a8a8a8a8a6129a7565b505050505050505050565b60608160005b815181101561125b576041828281518110612743576127436136e6565b016020015160f81c108015906127735750605a828281518110612768576127686136e6565b016020015160f81c11155b156127d15781818151811061278a5761278a6136e6565b602001015160f81c60f81b60f81c60206127a49190613841565b60f81b8282815181106127b9576127b96136e6565b60200101906001600160f81b031916908160001a9053505b806127db816136fc565b915050612726565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061281d5761281d6136e6565b602090810291909101015292915050565b6001600160a01b0385166128b55760005b83518110156128b35782818151811061285a5761285a6136e6565b602002602001015160036000868481518110612878576128786136e6565b60200260200101518152602001908152602001600020600082825461289d91906136d3565b909155506128ac9050816136fc565b905061283f565b505b6001600160a01b0384166121545760005b8351811015611f685760008482815181106128e3576128e36136e6565b602002602001015190506000848381518110612901576129016136e6565b60200260200101519050600060036000848152602001908152602001600020549050818110156129845760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016106ab565b600092835260036020526040909220910390556129a0816136fc565b90506128c6565b6001600160a01b0384163b156121545760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129eb908990899088908890889060040161385a565b6020604051808303816000875af1925050508015612a26575060408051601f3d908101601f19168201909252612a2391810190613894565b60015b612ad257612a326138b1565b806308c379a003612a6b5750612a466138cd565b80612a515750612a6d565b8060405162461bcd60e51b81526004016106ab9190612c8b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106ab565b6001600160e01b0319811663f23a6e6160e01b14611f685760405162461bcd60e51b81526004016106ab90613956565b6001600160a01b0384163b156121545760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b46908990899088908890889060040161399e565b6020604051808303816000875af1925050508015612b81575060408051601f3d908101601f19168201909252612b7e91810190613894565b60015b612b8d57612a326138b1565b6001600160e01b0319811663bc197c8160e01b14611f685760405162461bcd60e51b81526004016106ab90613956565b6001600160a01b0381168114612bd257600080fd5b50565b60008060408385031215612be857600080fd5b8235612bf381612bbd565b946020939093013593505050565b6001600160e01b031981168114612bd257600080fd5b600060208284031215612c2957600080fd5b8135612c3481612c01565b9392505050565b60005b83811015612c56578181015183820152602001612c3e565b50506000910152565b60008151808452612c77816020860160208601612c3b565b601f01601f19169290920160200192915050565b602081526000612c346020830184612c5f565b60008083601f840112612cb057600080fd5b5081356001600160401b03811115612cc757600080fd5b602083019150836020828501011115612cdf57600080fd5b9250929050565b60ff81168114612bd257600080fd5b600080600080600060808688031215612d0d57600080fd5b85356001600160401b03811115612d2357600080fd5b612d2f88828901612c9e565b9096509450506020860135612d4381612ce6565b94979396509394604081013594506060013592915050565b600060208284031215612d6d57600080fd5b5035919050565b600080600080600060808688031215612d8c57600080fd5b85356001600160401b03811115612da257600080fd5b612dae88828901612c9e565b9096509450506020860135612dc281612ce6565b9250604086013591506060860135612dd981612bbd565b809150509295509295909350565b600060208284031215612df957600080fd5b8135612c3481612bbd565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612e3f57612e3f612e04565b6040525050565b60006001600160401b03821115612e5f57612e5f612e04565b5060051b60200190565b600082601f830112612e7a57600080fd5b81356020612e8782612e46565b604051612e948282612e1a565b83815260059390931b8501820192828101915086841115612eb457600080fd5b8286015b84811015612ecf5780358352918301918301612eb8565b509695505050505050565b60006001600160401b03821115612ef357612ef3612e04565b50601f01601f191660200190565b600082601f830112612f1257600080fd5b8135612f1d81612eda565b604051612f2a8282612e1a565b828152856020848701011115612f3f57600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080600060a08688031215612f7557600080fd5b8535612f8081612bbd565b94506020860135612f9081612bbd565b935060408601356001600160401b0380821115612fac57600080fd5b612fb889838a01612e69565b94506060880135915080821115612fce57600080fd5b612fda89838a01612e69565b93506080880135915080821115612ff057600080fd5b50612ffd88828901612f01565b9150509295509295909350565b6000806040838503121561301d57600080fd5b50508035926020909101359150565b60018060a01b03815116825260ff602082015116602083015260408101516040830152606081015160608301526000608082015160a0608085015261307460a0850182612c5f565b949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156130d157603f198886030184526130bf85835161302c565b945092850192908501906001016130a3565b5092979650505050505050565b600080604083850312156130f157600080fd5b82356001600160401b038082111561310857600080fd5b818501915085601f83011261311c57600080fd5b8135602061312982612e46565b6040516131368282612e1a565b83815260059390931b850182019282810191508984111561315657600080fd5b948201945b8386101561317d57853561316e81612bbd565b8252948201949082019061315b565b9650508601359250508082111561319357600080fd5b506131a085828601612e69565b9150509250929050565b600081518084526020808501945080840160005b838110156131da578151875295820195908201906001016131be565b509495945050505050565b602081526000612c3460208301846131aa565b8015158114612bd257600080fd5b6000806040838503121561321957600080fd5b823561322481612bbd565b91506020830135613234816131f8565b809150509250929050565b6000806020838503121561325257600080fd5b82356001600160401b0381111561326857600080fd5b61327485828601612c9e565b90969095509350505050565b6000806000806080858703121561329657600080fd5b84356132a181612bbd565b9350602085013592506040850135915060608501356001600160401b038111156132ca57600080fd5b6132d687828801612f01565b91505092959194509250565b60018060a01b038616815260ff8516602082015283604082015282606082015260a06080820152600061331860a0830184612c5f565b979650505050505050565b6000806040838503121561333657600080fd5b823561334181612bbd565b9150602083013561323481612bbd565b600080600080600060a0868803121561336957600080fd5b853561337481612bbd565b9450602086013561338481612bbd565b9350604086013592506060860135915060808601356001600160401b038111156133ad57600080fd5b612ffd88828901612f01565b600080600080608085870312156133cf57600080fd5b84356133da81612bbd565b935060208501356001600160401b03808211156133f657600080fd5b61340288838901612e69565b9450604087013591508082111561341857600080fd5b61342488838901612e69565b9350606087013591508082111561343a57600080fd5b506132d687828801612f01565b600181811c9082168061345b57607f821691505b60208210810361347b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156125e357600081815260208120601f850160051c810160208610156134a85750805b601f850160051c820191505b81811015612154578281556001016134b4565b81516001600160401b038111156134e0576134e0612e04565b6134f4816134ee8454613447565b84613481565b602080601f83116001811461352957600084156135115750858301515b600019600386901b1c1916600185901b178555612154565b600085815260208120601f198616915b8281101561355857888601518255948401946001909101908401613539565b50858210156135765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff83168152604060208201526000613074604083018461302c565b6000602082840312156135b457600080fd5b81516001600160401b038111156135ca57600080fd5b8201601f810184136135db57600080fd5b80516135e681612eda565b6040516135f38282612e1a565b82815286602084860101111561360857600080fd5b613619836020830160208701612c3b565b9695505050505050565b60008251613635818460208701612c3b565b9190910192915050565b60006020828403121561365157600080fd5b8151612c3481612ce6565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106d7576106d76136aa565b808201808211156106d7576106d76136aa565b634e487b7160e01b600052603260045260246000fd5b60006001820161370e5761370e6136aa565b5060010190565b60006020828403121561372757600080fd5b5051919050565b6832ba34393ab732b99d60b91b8152826009820152601d60f91b60298201526000825161376281602a850160208701612c3b565b91909101602a019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061381260408301856131aa565b8281036020840152610fc481856131aa565b60006020828403121561383657600080fd5b8151612c34816131f8565b60ff81811683821601908111156106d7576106d76136aa565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061331890830184612c5f565b6000602082840312156138a657600080fd5b8151612c3481612c01565b600060033d11156138ca5760046000803e5060005160e01c5b90565b600060443d10156138db5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561390a57505050505090565b82850191508151818111156139225750505050505090565b843d870101602082850101111561393c5750505050505090565b61394b60208286010187612e1a565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906139ca908301866131aa565b82810360608401526139dc81866131aa565b905082810360808401526139f08185612c5f565b9897505050505050505056fea26469706673582212205687264d6bc978c2d4d439da728163aa96b80c27e38fa5e062cd14de34df825764736f6c63430008110033

Deployed Bytecode Sourcemap

48982:6089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21796:230;;;;;;;;;;-1:-1:-1;21796:230:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;21796:230:0;;;;;;;;20819:310;;;;;;;;;;-1:-1:-1;20819:310:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;20819:310:0;1038:187:1;49149:40:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49149:40:0;;;;;;;;;;;;:::i;50521:540::-;;;;;;;;;;-1:-1:-1;50521:540:0;;;;;:::i;:::-;;:::i;:::-;;54963:105;;;;;;;;;;-1:-1:-1;54963:105:0;;;;;:::i;:::-;;:::i;51066:553::-;;;;;;:::i;:::-;;:::i;53736:90::-;;;;;;;;;;-1:-1:-1;53803:11:0;:18;53736:90;;53338:393;;;;;;;;;;-1:-1:-1;53338:393:0;;;;;:::i;:::-;;:::i;:::-;;;4508:4:1;4496:17;;;4478:36;;4466:2;4451:18;53338:393:0;4336:184:1;23739:438:0;;;;;;;;;;-1:-1:-1;23739:438:0;;;;;:::i;:::-;;:::i;49251:31::-;;;;;;;;;;-1:-1:-1;49251:31:0;;;;-1:-1:-1;;;;;49251:31:0;;;;;;-1:-1:-1;;;;;7793:32:1;;;7775:51;;7763:2;7748:18;49251:31:0;7608:224:1;53831:413:0;;;;;;;;;;-1:-1:-1;53831:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22192:524::-;;;;;;;;;;-1:-1:-1;22192:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38276:122::-;;;;;;;;;;-1:-1:-1;38276:122:0;;;;;:::i;:::-;38333:4;38154:16;;;:12;:16;;;;;;-1:-1:-1;;;38276:122:0;50087:120;;;;;;;;;;-1:-1:-1;50087:120:0;;;;;:::i;:::-;;:::i;52836:497::-;;;;;;;;;;-1:-1:-1;52836:497:0;;;;;:::i;:::-;;:::i;49353:28::-;;;;;;;;;;-1:-1:-1;49353:28:0;;;;;:::i;:::-;;:::i;51939:554::-;;;;;;;;;;-1:-1:-1;51939:554:0;;;;;:::i;:::-;;:::i;49193:37::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49193:37:0;;;;;52498:333;;;;;;;;;;-1:-1:-1;52498:333:0;;;;;:::i;:::-;;:::i;54281:107::-;;;;;;;;;;-1:-1:-1;54281:107:0;;;;;:::i;:::-;;:::i;38065:113::-;;;;;;;;;;-1:-1:-1;38065:113:0;;;;;:::i;:::-;38127:7;38154:16;;;:12;:16;;;;;;;38065:113;49992:90;;;;;;;;;;-1:-1:-1;49992:90:0;;;;;:::i;:::-;;:::i;51624:310::-;;;;;;;;;;-1:-1:-1;51624:310:0;;;;;:::i;:::-;;:::i;54393:265::-;;;;;;:::i;:::-;;:::i;49385:40::-;;;;;;;;;;-1:-1:-1;49385:40:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;23016:168::-;;;;;;;;;;-1:-1:-1;23016:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;23139:27:0;;;23115:4;23139:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23016:168;50212:110;;;;;;;;;;-1:-1:-1;50212:110:0;;;;;:::i;:::-;;:::i;23256:406::-;;;;;;;;;;-1:-1:-1;23256:406:0;;;;;:::i;:::-;;:::i;54663:295::-;;;;;;:::i;:::-;;:::i;49315:32::-;;;;;;;;;;;;;;;;21796:230;21882:7;-1:-1:-1;;;;;21910:21:0;;21902:76;;;;-1:-1:-1;;;21902:76:0;;16508:2:1;21902:76:0;;;16490:21:1;16547:2;16527:18;;;16520:30;16586:34;16566:18;;;16559:62;-1:-1:-1;;;16637:18:1;;;16630:40;16687:19;;21902:76:0;;;;;;;;;-1:-1:-1;21996:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21996:22:0;;;;;;;;;;21796:230;;;;;:::o;20819:310::-;20921:4;-1:-1:-1;;;;;;20958:41:0;;-1:-1:-1;;;20958:41:0;;:110;;-1:-1:-1;;;;;;;21016:52:0;;-1:-1:-1;;;21016:52:0;20958:110;:163;;;-1:-1:-1;;;;;;;;;;19668:40:0;;;21085:36;19559:157;50521:540;50647:4;;49741:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49741:245:0;-1:-1:-1;49807:24:0;;-1:-1:-1;49826:4:0;;-1:-1:-1;49807:18:0;:24::i;:::-;49792:39;;49839:7;49850:1;49839:12;49836:52;;49859:23;;-1:-1:-1;;;49859:23:0;;16919:2:1;49859:23:0;;;16901:21:1;16958:2;16938:18;;;16931:30;-1:-1:-1;;;16977:18:1;;;16970:43;17030:18;;49859:23:0;16717:337:1;49836:52:0;49911:1;49895:13;;:17;:44;;;;;49926:13;;49916:7;:23;49895:44;49892:84;;;49947:23;;-1:-1:-1;;;49947:23:0;;17261:2:1;49947:23:0;;;17243:21:1;17300:2;17280:18;;;17273:30;-1:-1:-1;;;17319:18:1;;;17312:43;17372:18;;49947:23:0;17059:337:1;49892:84:0;50674:1:::1;50666:5;:9;:28;;;;;50688:6;50679:5;:15;;50666:28;50658:60;;;::::0;-1:-1:-1;;;50658:60:0;;17603:2:1;50658:60:0::1;::::0;::::1;17585:21:1::0;17642:2;17622:18;;;17615:30;-1:-1:-1;;;17661:18:1;;;17654:49;17720:18;;50658:60:0::1;17401:343:1::0;50658:60:0::1;50723:10;50736:11;50742:4;;50736:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50736:5:0::1;::::0;-1:-1:-1;;;50736:11:0:i:1;:::-;-1:-1:-1::0;;;;;50760:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;:17:::1;;::::0;50723:24;;-1:-1:-1;50760:22:0;50752:43:::1;;;::::0;-1:-1:-1;;;50752:43:0;;17951:2:1;50752:43:0::1;::::0;::::1;17933:21:1::0;17990:1;17970:18;;;17963:29;-1:-1:-1;;;18008:18:1;;;18001:38;18056:18;;50752:43:0::1;17749:331:1::0;50752:43:0::1;-1:-1:-1::0;;;;;50808:15:0;::::1;38127:7:::0;38154:16;;;:12;:16;;;;;;50808:20;50800:50:::1;;;::::0;-1:-1:-1;;;50800:50:0;;18287:2:1;50800:50:0::1;::::0;::::1;18269:21:1::0;18326:2;18306:18;;;18299:30;-1:-1:-1;;;18345:18:1;;;18338:47;18402:18;;50800:50:0::1;18085:341:1::0;50800:50:0::1;50857:18;50878:102;;;;;;;;50894:2;-1:-1:-1::0;;;;;50878:102:0::1;;;;;50912:8;50878:102;;;;;;50934:6;50878:102;;;;50953:5;50878:102;;;;50970:4;;50878:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;50878:102:0;;;;-1:-1:-1;;;;;;;50987:10:0;;::::1;::::0;;:6:::1;:10;::::0;;;;;;;;:18;;;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;50987:18:0::1;-1:-1:-1::0;;;;;;50987:18:0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;50857:123;;-1:-1:-1;50857:123:0;;50987:10;;-1:-1:-1;50987:18:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;51010:11:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;51010:20:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;51010:20:0::1;-1:-1:-1::0;;;;;51010:20:0;::::1;;::::0;;51040:16:::1;::::0;::::1;::::0;-1:-1:-1;51040:16:0::1;::::0;51010:20;51050:5;;51040:16:::1;:::i;:::-;;;;;;;;50653:408;;49786:200:::0;50521:540;;;;;;:::o;54963:105::-;55044:11;;:19;;-1:-1:-1;;;55044:19:0;;;;;616:25:1;;;55018:13:0;;-1:-1:-1;;;;;55044:11:0;;:15;;589:18:1;;55044:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55044:19:0;;;;;;;;;;;;:::i;51066:553::-;51198:4;;49741:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49741:245:0;-1:-1:-1;49807:24:0;;-1:-1:-1;49826:4:0;;-1:-1:-1;49807:18:0;:24::i;:::-;49792:39;;49839:7;49850:1;49839:12;49836:52;;49859:23;;-1:-1:-1;;;49859:23:0;;16919:2:1;49859:23:0;;;16901:21:1;16958:2;16938:18;;;16931:30;-1:-1:-1;;;16977:18:1;;;16970:43;17030:18;;49859:23:0;16717:337:1;49836:52:0;49911:1;49895:13;;:17;:44;;;;;49926:13;;49916:7;:23;49895:44;49892:84;;;49947:23;;-1:-1:-1;;;49947:23:0;;17261:2:1;49947:23:0;;;17243:21:1;17300:2;17280:18;;;17273:30;-1:-1:-1;;;17319:18:1;;;17312:43;17372:18;;49947:23:0;17059:337:1;49892:84:0;51226:1:::1;51217:6;:10;51209:34;;;::::0;-1:-1:-1;;;51209:34:0;;22275:2:1;51209:34:0::1;::::0;::::1;22257:21:1::0;22314:2;22294:18;;;22287:30;-1:-1:-1;;;22333:18:1;;;22326:41;22384:18;;51209:34:0::1;22073:335:1::0;51209:34:0::1;51248:10;51261:11;51267:4;;51261:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;51261:5:0::1;::::0;-1:-1:-1;;;51261:11:0:i:1;:::-;-1:-1:-1::0;;;;;51285:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;:17:::1;;::::0;51248:24;;-1:-1:-1;51285:22:0;51277:43:::1;;;::::0;-1:-1:-1;;;51277:43:0;;17951:2:1;51277:43:0::1;::::0;::::1;17933:21:1::0;17990:1;17970:18;;;17963:29;-1:-1:-1;;;18008:18:1;;;18001:38;18056:18;;51277:43:0::1;17749:331:1::0;51277:43:0::1;-1:-1:-1::0;;;;;51333:15:0;::::1;38127:7:::0;38154:16;;;:12;:16;;;;;;51333:20;51325:50:::1;;;::::0;-1:-1:-1;;;51325:50:0;;18287:2:1;51325:50:0::1;::::0;::::1;18269:21:1::0;18326:2;18306:18;;;18299:30;-1:-1:-1;;;18345:18:1;;;18338:47;18402:18;;51325:50:0::1;18085:341:1::0;51325:50:0::1;51382:18;51403:103;;;;;;;;51419:2;-1:-1:-1::0;;;;;51403:103:0::1;;;;;51437:8;51403:103;;;;;;51459:6;51403:103;;;;51478:6;51403:103;;;;51496:4;;51403:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;51403:103:0;;;;-1:-1:-1;;;;;;;51515:10:0;;::::1;::::0;;:6:::1;:10;::::0;;;;;;;;:18;;;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;51515:18:0::1;-1:-1:-1::0;;;;;;51515:18:0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;51382:124;;-1:-1:-1;51382:124:0;;51515:10;;-1:-1:-1;51515:18:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;51538:11:0::1;:20:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;51538:20:0;;;;::::1;::::0;;-1:-1:-1;;;;;;51538:20:0::1;-1:-1:-1::0;;;;;51538:20:0;::::1;::::0;;::::1;::::0;;;51563:25:::1;::::0;;51538:20:::1;51563:25:::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;51569:2:0;;51577:6;;51563:5:::1;:25::i;:::-;51598:16;51605:1;51608:5;51598:16;;;;;;;:::i;53338:393::-:0;-1:-1:-1;;;;;53405:10:0;;53390:5;53405:10;;;:6;:10;;;;;:17;;;:21;53402:325;;-1:-1:-1;;;;;;53441:10:0;;;;;:6;:10;;;;;:19;-1:-1:-1;;;53441:19:0;;;;;53338:393::o;53402:325::-;53498:55;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53498:55:0;-1:-1:-1;;;53498:55:0;;;53601:28;;53478:17;;;;-1:-1:-1;;;;;53601:22:0;;;:28;;53498:55;;53601:28;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53559:70;;;;53643:7;53635:42;;;;-1:-1:-1;;;53635:42:0;;23252:2:1;53635:42:0;;;23234:21:1;23291:2;23271:18;;;23264:30;-1:-1:-1;;;23310:18:1;;;23303:52;23372:18;;53635:42:0;23050:346:1;53635:42:0;53701:10;53690:31;;;;;;;;;;;;:::i;:::-;53683:38;53338:393;-1:-1:-1;;;;;53338:393:0:o;23739:438::-;-1:-1:-1;;;;;23972:20:0;;18556:10;23972:20;;:60;;-1:-1:-1;23996:36:0;24013:4;18556:10;23016:168;:::i;23996:36::-;23950:156;;;;-1:-1:-1;;;23950:156:0;;;;;;;:::i;:::-;24117:52;24140:4;24146:2;24150:3;24155:7;24164:4;24117:22;:52::i;:::-;23739:438;;;;;:::o;53831:413::-;53931:11;:18;53896:25;;53928:57;53962:17;53928:57;53997:11;:18;53992:23;;53989:63;;;54028:11;:18;;-1:-1:-1;53989:63:0;54071:2;54064:4;:9;54056:35;;;;-1:-1:-1;;;54056:35:0;;24270:2:1;54056:35:0;;;24252:21:1;24309:2;24289:18;;;24282:30;-1:-1:-1;;;24328:18:1;;;24321:43;24381:18;;54056:35:0;24068:337:1;54056:35:0;54121:9;54126:4;54121:2;:9;:::i;:::-;-1:-1:-1;;;;;54109:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54109:22:0;;;;;;;;;;;;;;;;;54096:35;;54140:9;54136:104;54159:10;:17;54155:1;:21;54136:104;;;54205:6;:29;54212:11;54224:8;54228:4;54224:1;:8;:::i;:::-;54212:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;54212:21:0;;;54205:29;;;;;;;;;;;;;;;;54189:45;;;;;;;;;;;;;;-1:-1:-1;;;54189:45:0;;;;;;;;;;;;54212:21;54189:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;54200:1;54189:13;;;;;;;;:::i;:::-;;;;;;:45;;;;54178:3;;;;;:::i;:::-;;;;54136:104;;;;53831:413;;;;:::o;22192:524::-;22348:16;22409:3;:10;22390:8;:15;:29;22382:83;;;;-1:-1:-1;;;22382:83:0;;25279:2:1;22382:83:0;;;25261:21:1;25318:2;25298:18;;;25291:30;25357:34;25337:18;;;25330:62;-1:-1:-1;;;25408:18:1;;;25401:39;25457:19;;22382:83:0;25077:405:1;22382:83:0;22478:30;22525:8;:15;-1:-1:-1;;;;;22511:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22511:30:0;;22478:63;;22559:9;22554:122;22578:8;:15;22574:1;:19;22554:122;;;22634:30;22644:8;22653:1;22644:11;;;;;;;;:::i;:::-;;;;;;;22657:3;22661:1;22657:6;;;;;;;;:::i;:::-;;;;;;;22634:9;:30::i;:::-;22615:13;22629:1;22615:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;22595:3;;;:::i;:::-;;;22554:122;;;-1:-1:-1;22695:13:0;22192:524;-1:-1:-1;;;22192:524:0:o;50087:120::-;50161:3;;-1:-1:-1;;;;;50161:3:0;50147:10;:17;50139:26;;;;;;50170:11;:32;;-1:-1:-1;;;;;;50170:32:0;-1:-1:-1;;;;;50170:32:0;;;;;;;;;;50087:120::o;52836:497::-;-1:-1:-1;;;;;52909:10:0;;52929:1;52909:10;;;:6;:10;;;;;:17;;;52886:13;;52909:21;52906:423;;-1:-1:-1;;;;;52945:10:0;;;;;;:6;:10;;;;;:15;;52938:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52836:497;;;:::o;52906:423::-;52999:53;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52999:53:0;-1:-1:-1;;;52999:53:0;;;53100:28;;52979:17;;;;-1:-1:-1;;;;;53100:22:0;;;:28;;52999:53;;53100:28;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53058:70;;;;53142:7;53134:40;;;;-1:-1:-1;;;53134:40:0;;25689:2:1;53134:40:0;;;25671:21:1;25728:2;25708:18;;;25701:30;-1:-1:-1;;;25747:18:1;;;25740:50;25807:18;;53134:40:0;25487:344:1;53134:40:0;53183:10;:17;53204:2;53183:23;53180:144;;53246:10;53229:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;53215:43;;;;;52836:497;;;:::o;53180:144::-;53296:10;53285:32;;;;;;;;;;;;:::i;49353:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49353:28:0;;-1:-1:-1;49353:28:0;:::o;51939:554::-;41762:21;:19;:21::i;:::-;-1:-1:-1;;;;;52064:10:0;::::1;52015;52064::::0;;;:6:::1;:10;::::0;;;;:17:::1;;::::0;52044:5;;52064:22;52056:68:::1;;;::::0;-1:-1:-1;;;52056:68:0;;26038:2:1;52056:68:0::1;::::0;::::1;26020:21:1::0;26077:2;26057:18;;;26050:30;26116:34;26096:18;;;26089:62;-1:-1:-1;;;26167:18:1;;;26160:31;26208:19;;52056:68:0::1;25836:397:1::0;52056:68:0::1;52153:30;::::0;-1:-1:-1;;;52153:30:0;;52177:4:::1;52153:30;::::0;::::1;7775:51:1::0;52129:21:0::1;::::0;-1:-1:-1;;;;;52153:15:0;::::1;::::0;::::1;::::0;7748:18:1;;52153:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52129:54;;52188:82;52228:5;52236:10;52256:4;52263:6;52188:31;:82::i;:::-;52298:30;::::0;-1:-1:-1;;;52298:30:0;;52322:4:::1;52298:30;::::0;::::1;7775:51:1::0;52275:20:0::1;::::0;-1:-1:-1;;;;;52298:15:0;::::1;::::0;::::1;::::0;7748:18:1;;52298:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52275:53:::0;-1:-1:-1;52373:6:0;52341:28:::1;52356:13:::0;52275:53;52341:28:::1;:::i;:::-;:38;52333:65;;;::::0;-1:-1:-1;;;52333:65:0;;26837:2:1;52333:65:0::1;::::0;::::1;26819:21:1::0;26876:2;26856:18;;;26849:30;-1:-1:-1;;;26895:18:1;;;26888:44;26949:18;;52333:65:0::1;26635:338:1::0;52333:65:0::1;52403:33;52409:10;52421:2;-1:-1:-1::0;;;;;52403:33:0::1;52425:6;52403:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;52448:40;::::0;;52453:10:::1;27218:34:1::0;;-1:-1:-1;;;;;27288:15:1;;27283:2;27268:18;;27261:43;27320:18;;;27313:34;;;52448:40:0::1;::::0;27168:2:1;27153:18;52448:40:0::1;;;;;;;52010:483;;;41806:20:::0;41200:1;42326:7;:22;42143:213;41806:20;51939:554;;:::o;52498:333::-;-1:-1:-1;;;;;52563:36:0;;52641:6;52612:25;52622:10;52563:36;52612:9;:25::i;:::-;:35;;52604:68;;;;-1:-1:-1;;;52604:68:0;;27560:2:1;52604:68:0;;;27542:21:1;27599:2;27579:18;;;27572:30;-1:-1:-1;;;27618:18:1;;;27611:50;27678:18;;52604:68:0;27358:344:1;52604:68:0;52677:29;52683:10;52695:2;52699:6;52677:5;:29::i;:::-;52711:63;52747:5;52755:10;52767:6;52711:27;:63::i;:::-;52784:42;;;52791:10;27218:34:1;;-1:-1:-1;;;;;27288:15:1;;27283:2;27268:18;;27261:43;27320:18;;;27313:34;;;52784:42:0;;27168:2:1;27153:18;52784:42:0;;;;;;;52558:273;52498:333;;:::o;54281:107::-;54344:39;;-1:-1:-1;;;54344:39:0;;27909:2:1;54344:39:0;;;27891:21:1;27948:2;27928:18;;;27921:30;27987:31;27967:18;;;27960:59;28036:18;;54344:39:0;27707:353:1;49992:90:0;50058:3;;-1:-1:-1;;;;;50058:3:0;50044:10;:17;50036:26;;;;;;50067:3;:10;;-1:-1:-1;;;;;;50067:10:0;-1:-1:-1;;;;;50067:10:0;;;;;;;;;;49992:90::o;51624:310::-;49687:10;49701:9;49687:23;49679:44;;;;-1:-1:-1;;;49679:44:0;;28267:2:1;49679:44:0;;;28249:21:1;28306:1;28286:18;;;28279:29;-1:-1:-1;;;28324:18:1;;;28317:38;28372:18;;49679:44:0;28065:331:1;49679:44:0;51682:10:::1;51695:11;51701:4;;51695:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;51695:5:0::1;::::0;-1:-1:-1;;;51695:11:0:i:1;:::-;-1:-1:-1::0;;;;;51732:10:0;;::::1;51711:18;51732:10:::0;;;:6:::1;:10;::::0;;;;;;;51711:31;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;51711:31:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;51732:10;;-1:-1:-1;51711:18:0;;51732:10;;51711:31;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;51755:5;:12;;;51771:1;51755:17:::0;51747:46:::1;;;::::0;-1:-1:-1;;;51747:46:0;;28603:2:1;51747:46:0::1;::::0;::::1;28585:21:1::0;28642:2;28622:18;;;28615:30;-1:-1:-1;;;28661:18:1;;;28654:46;28717:18;;51747:46:0::1;28401:340:1::0;51747:46:0::1;51845:12;::::0;::::1;::::0;51830:11:::1;::::0;::::1;::::0;51818:8;;51806:21:::1;::::0;-1:-1:-1;;;;;51806:21:0::1;38127:7:::0;38154:16;;;:12;:16;;;;;;;38065:113;51806:21:::1;:35;;;;:::i;:::-;:51;;51798:82;;;::::0;-1:-1:-1;;;51798:82:0;;28948:2:1;51798:82:0::1;::::0;::::1;28930:21:1::0;28987:2;28967:18;;;28960:30;-1:-1:-1;;;29006:18:1;;;28999:48;29064:18;;51798:82:0::1;28746:342:1::0;51798:82:0::1;51885:44;51891:10;51903:5;:8;;;-1:-1:-1::0;;;;;51885:44:0::1;51913:5;:11;;;51885:44;;;;;;;;;;;::::0;:5:::1;:44::i;:::-;51677:257;;51624:310:::0;;:::o;54393:265::-;41762:21;:19;:21::i;:::-;54524:9:::1;:13:::0;54521:78:::1;;54546:45;54577:2;54581:9;54546:30;:45::i;:::-;54603:50;54620:10;54632:2;54636;54640:6;54648:4;54603:16;:50::i;:::-;41806:20:::0;41200:1;42326:7;:22;42143:213;49385:40;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49385:40:0;;;-1:-1:-1;;;49385:40:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50212:110::-;50288:3;;-1:-1:-1;;;;;50288:3:0;50274:10;:17;50266:26;;;;;;50297:13;:20;50212:110::o;23256:406::-;-1:-1:-1;;;;;23464:20:0;;18556:10;23464:20;;:60;;-1:-1:-1;23488:36:0;23505:4;18556:10;23016:168;:::i;23488:36::-;23442:156;;;;-1:-1:-1;;;23442:156:0;;;;;;;:::i;:::-;23609:45;23627:4;23633:2;23637;23641:6;23649:4;23609:17;:45::i;54663:295::-;41762:21;:19;:21::i;:::-;54819:9:::1;:13:::0;54816:76:::1;;54840:45;54871:2;54875:9;54840:30;:45::i;:::-;54896:57;54918:10;54930:2;54934:3;54939:7;54948:4;54896:21;:57::i;45504:533::-:0;45635:15;;45560:7;;;;;;45657:358;45675:10;45671:1;:14;45657:358;;;45703:8;45720:1;45723;45714:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;45714:11:0;;-1:-1:-1;;;;45738:8:0;;45734:274;;;45761:6;45766:1;45761:6;;:::i;:::-;;;45734:274;;;-1:-1:-1;;;;;;;;;45787:8:0;;;45783:225;;;45810:6;45815:1;45810:6;;:::i;45783:225::-;-1:-1:-1;;;;;;;;;45836:8:0;;;45832:176;;;45859:6;45864:1;45859:6;;:::i;45832:176::-;-1:-1:-1;;;;;;;;;45885:8:0;;;45881:127;;;45908:6;45913:1;45908:6;;:::i;45881:127::-;-1:-1:-1;;;;;;;;;45934:8:0;;;45930:78;;;45957:6;45962:1;45957:6;;:::i;45930:78::-;45992:6;45997:1;45992:6;;:::i;:::-;;;45930:78;-1:-1:-1;45687:5:0;;;;:::i;:::-;;;;45657:358;;;-1:-1:-1;46028:3:0;;45504:533;-1:-1:-1;;;45504:533:0:o;50328:188::-;50385:7;50462:13;50482:25;50502:4;50482:19;:25::i;:::-;50432:76;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50432:76:0;;;;;;;;;50422:87;;50432:76;50422:87;;;;;50328:188;-1:-1:-1;;50328:188:0:o;28437:729::-;-1:-1:-1;;;;;28590:16:0;;28582:62;;;;-1:-1:-1;;;28582:62:0;;29938:2:1;28582:62:0;;;29920:21:1;29977:2;29957:18;;;29950:30;30016:34;29996:18;;;29989:62;-1:-1:-1;;;30067:18:1;;;30060:31;30108:19;;28582:62:0;29736:397:1;28582:62:0;18556:10;28657:16;28722:21;28740:2;28722:17;:21::i;:::-;28699:44;;28754:24;28781:25;28799:6;28781:17;:25::i;:::-;28754:52;;28819:66;28840:8;28858:1;28862:2;28866:3;28871:7;28880:4;28819:20;:66::i;:::-;28898:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28898:17:0;;;;;;;;;:27;;28919:6;;28898:9;:27;;28919:6;;28898:27;:::i;:::-;;;;-1:-1:-1;;28941:52:0;;;30312:25:1;;;30368:2;30353:18;;30346:34;;;-1:-1:-1;;;;;28941:52:0;;;;28974:1;;28941:52;;;;;;30285:18:1;28941:52:0;;;;;;;29084:74;29115:8;29133:1;29137:2;29141;29145:6;29153:4;29084:30;:74::i;:::-;28571:595;;;28437:729;;;;:::o;25973:1146::-;26200:7;:14;26186:3;:10;:28;26178:81;;;;-1:-1:-1;;;26178:81:0;;30593:2:1;26178:81:0;;;30575:21:1;30632:2;30612:18;;;30605:30;30671:34;30651:18;;;30644:62;-1:-1:-1;;;30722:18:1;;;30715:38;30770:19;;26178:81:0;30391:404:1;26178:81:0;-1:-1:-1;;;;;26278:16:0;;26270:66;;;;-1:-1:-1;;;26270:66:0;;;;;;;:::i;:::-;18556:10;26393:60;18556:10;26424:4;26430:2;26434:3;26439:7;26448:4;26393:20;:60::i;:::-;26471:9;26466:421;26490:3;:10;26486:1;:14;26466:421;;;26522:10;26535:3;26539:1;26535:6;;;;;;;;:::i;:::-;;;;;;;26522:19;;26556:14;26573:7;26581:1;26573:10;;;;;;;;:::i;:::-;;;;;;;;;;;;26600:19;26622:13;;;;;;;;;;-1:-1:-1;;;;;26622:19:0;;;;;;;;;;;;26573:10;;-1:-1:-1;26664:21:0;;;;26656:76;;;;-1:-1:-1;;;26656:76:0;;;;;;;:::i;:::-;26776:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26776:19:0;;;;;;;;;;26798:20;;;26776:42;;26848:17;;;;;;;:27;;26798:20;;26776:9;26848:27;;26798:20;;26848:27;:::i;:::-;;;;;;;;26507:380;;;26502:3;;;;:::i;:::-;;;26466:421;;;;26934:2;-1:-1:-1;;;;;26904:47:0;26928:4;-1:-1:-1;;;;;26904:47:0;26918:8;-1:-1:-1;;;;;26904:47:0;;26938:3;26943:7;26904:47;;;;;;;:::i;:::-;;;;;;;;27036:75;27072:8;27082:4;27088:2;27092:3;27097:7;27106:4;27036:35;:75::i;:::-;26167:952;25973:1146;;;;;:::o;41842:293::-;41244:1;41976:7;;:19;41968:63;;;;-1:-1:-1;;;41968:63:0;;32289:2:1;41968:63:0;;;32271:21:1;32328:2;32308:18;;;32301:30;32367:33;32347:18;;;32340:61;32418:18;;41968:63:0;32087:355:1;41968:63:0;41244:1;42109:7;:18;41842:293::o;46881:367::-;47086:69;;;-1:-1:-1;;;;;27236:15:1;;;47086:69:0;;;27218:34:1;27288:15;;;27268:18;;;27261:43;27320:18;;;;27313:34;;;47086:69:0;;;;;;;;;;27153:18:1;;;;47086:69:0;;;;;;;-1:-1:-1;;;;;47086:69:0;-1:-1:-1;;;47086:69:0;;;47075:81;;-1:-1:-1;;;;47075:10:0;;;;:81;;47086:69;47075:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47026:130;;;;47175:7;:57;;;;-1:-1:-1;47187:11:0;;:16;;:44;;;47218:4;47207:24;;;;;;;;;;;;:::i;:::-;47167:73;;;;-1:-1:-1;;;47167:73:0;;32899:2:1;47167:73:0;;;32881:21:1;32938:1;32918:18;;;32911:29;-1:-1:-1;;;32956:18:1;;;32949:33;32999:18;;47167:73:0;32697:326:1;30680:808:0;-1:-1:-1;;;;;30807:18:0;;30799:66;;;;-1:-1:-1;;;30799:66:0;;33230:2:1;30799:66:0;;;33212:21:1;33269:2;33249:18;;;33242:30;33308:34;33288:18;;;33281:62;-1:-1:-1;;;33359:18:1;;;33352:33;33402:19;;30799:66:0;33028:399:1;30799:66:0;18556:10;30878:16;30943:21;30961:2;30943:17;:21::i;:::-;30920:44;;30975:24;31002:25;31020:6;31002:17;:25::i;:::-;30975:52;;31040:66;31061:8;31071:4;31085:1;31089:3;31094:7;31040:66;;;;;;;;;;;;:20;:66::i;:::-;31119:19;31141:13;;;;;;;;;;;-1:-1:-1;;;;;31141:19:0;;;;;;;;;;31179:21;;;;31171:70;;;;-1:-1:-1;;;31171:70:0;;33634:2:1;31171:70:0;;;33616:21:1;33673:2;33653:18;;;33646:30;33712:34;33692:18;;;33685:62;-1:-1:-1;;;33763:18:1;;;33756:34;33807:19;;31171:70:0;33432:400:1;31171:70:0;31277:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31277:19:0;;;;;;;;;;;;31299:20;;;31277:42;;31348:54;;30312:25:1;;;30353:18;;;30346:34;;;31277:19:0;;31348:54;;;;;;30285:18:1;31348:54:0;;;;;;;31415:65;;;;;;;;;31459:1;31415:65;;;25973:1146;47547:316;47712:59;;;-1:-1:-1;;;;;34029:32:1;;;47712:59:0;;;34011:51:1;34078:18;;;;34071:34;;;47712:59:0;;;;;;;;;;33984:18:1;;;;47712:59:0;;;;;;;-1:-1:-1;;;;;47712:59:0;-1:-1:-1;;;47712:59:0;;;47701:71;;-1:-1:-1;;;;47701:10:0;;;;:71;;47712:59;47701:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47665:107;;;;47791:7;:57;;;;-1:-1:-1;47803:11:0;;:16;;:44;;;47834:4;47823:24;;;;;;;;;;;;:::i;:::-;47783:72;;;;-1:-1:-1;;;47783:72:0;;34318:2:1;47783:72:0;;;34300:21:1;34357:1;34337:18;;;34330:29;-1:-1:-1;;;34375:18:1;;;34368:32;34417:18;;47783:72:0;34116:325:1;48733:168:0;48846:12;;;48806;48846;;;;;;;;;-1:-1:-1;;;;;48824:7:0;;;48839:5;;48824:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48805:54;;;48878:7;48870:23;;;;-1:-1:-1;;;48870:23:0;;34648:2:1;48870:23:0;;;34630:21:1;34687:1;34667:18;;;34660:29;-1:-1:-1;;;34705:18:1;;;34698:33;34748:18;;48870:23:0;34446:326:1;48870:23:0;48794:107;48733:168;;:::o;24641:974::-;-1:-1:-1;;;;;24829:16:0;;24821:66;;;;-1:-1:-1;;;24821:66:0;;;;;;;:::i;:::-;18556:10;24900:16;24965:21;24983:2;24965:17;:21::i;:::-;24942:44;;24997:24;25024:25;25042:6;25024:17;:25::i;:::-;24997:52;;25062:60;25083:8;25093:4;25099:2;25103:3;25108:7;25117:4;25062:20;:60::i;:::-;25135:19;25157:13;;;;;;;;;;;-1:-1:-1;;;;;25157:19:0;;;;;;;;;;25195:21;;;;25187:76;;;;-1:-1:-1;;;25187:76:0;;;;;;;:::i;:::-;25299:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25299:19:0;;;;;;;;;;25321:20;;;25299:42;;25363:17;;;;;;;:27;;25321:20;;25299:9;25363:27;;25321:20;;25363:27;:::i;:::-;;;;-1:-1:-1;;25408:46:0;;;30312:25:1;;;30368:2;30353:18;;30346:34;;;-1:-1:-1;;;;;25408:46:0;;;;;;;;;;;;;;30285:18:1;25408:46:0;;;;;;;25539:68;25570:8;25580:4;25586:2;25590;25594:6;25602:4;25539:30;:68::i;:::-;24810:805;;;;24641:974;;;;;:::o;46043:322::-;46100:13;46150:1;46122:19;46159:173;46180:6;:13;46176:1;:17;46159:173;;;46233:2;46219:6;46226:1;46219:9;;;;;;;;:::i;:::-;;;;;;;46213:22;;;;:48;;;46259:2;46245:6;46252:1;46245:9;;;;;;;;:::i;:::-;;;;;;;46239:22;;46213:48;46209:116;;;46299:6;46306:1;46299:9;;;;;;;;:::i;:::-;;;;;;;;;46293:16;;46312:2;46293:21;;;;:::i;:::-;46286:29;;46274:6;46281:1;46274:9;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;46274:41:0;;;;;;;;;46209:116;46195:3;;;;:::i;:::-;;;;46159:173;;37116:198;37236:16;;;37250:1;37236:16;;;;;;;;;37182;;37211:22;;37236:16;;;;;;;;;;;;-1:-1:-1;37236:16:0;37211:41;;37274:7;37263:5;37269:1;37263:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;37301:5;37116:198;-1:-1:-1;;37116:198:0:o;38473:931::-;-1:-1:-1;;;;;38795:18:0;;38791:160;;38835:9;38830:110;38854:3;:10;38850:1;:14;38830:110;;;38914:7;38922:1;38914:10;;;;;;;;:::i;:::-;;;;;;;38890:12;:20;38903:3;38907:1;38903:6;;;;;;;;:::i;:::-;;;;;;;38890:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;38866:3:0;;-1:-1:-1;38866:3:0;;:::i;:::-;;;38830:110;;;;38791:160;-1:-1:-1;;;;;38967:16:0;;38963:434;;39005:9;39000:386;39024:3;:10;39020:1;:14;39000:386;;;39060:10;39073:3;39077:1;39073:6;;;;;;;;:::i;:::-;;;;;;;39060:19;;39098:14;39115:7;39123:1;39115:10;;;;;;;;:::i;:::-;;;;;;;39098:27;;39144:14;39161:12;:16;39174:2;39161:16;;;;;;;;;;;;39144:33;;39214:6;39204;:16;;39196:69;;;;-1:-1:-1;;;39196:69:0;;35132:2:1;39196:69:0;;;35114:21:1;35171:2;35151:18;;;35144:30;35210:34;35190:18;;;35183:62;-1:-1:-1;;;35261:18:1;;;35254:38;35309:19;;39196:69:0;34930:404:1;39196:69:0;39317:16;;;;:12;:16;;;;;;39336:15;;39317:34;;39036:3;;;:::i;:::-;;;39000:386;;35543:744;-1:-1:-1;;;;;35758:13:0;;9891:19;:23;35754:526;;35794:72;;-1:-1:-1;;;35794:72:0;;-1:-1:-1;;;;;35794:38:0;;;;;:72;;35833:8;;35843:4;;35849:2;;35853:6;;35861:4;;35794:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35794:72:0;;;;;;;;-1:-1:-1;;35794:72:0;;;;;;;;;;;;:::i;:::-;;;35790:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36142:6;36135:14;;-1:-1:-1;;;36135:14:0;;;;;;;;:::i;35790:479::-;;;36191:62;;-1:-1:-1;;;36191:62:0;;37221:2:1;36191:62:0;;;37203:21:1;37260:2;37240:18;;;37233:30;37299:34;37279:18;;;37272:62;-1:-1:-1;;;37350:18:1;;;37343:50;37410:19;;36191:62:0;37019:416:1;35790:479:0;-1:-1:-1;;;;;;35916:55:0;;-1:-1:-1;;;35916:55:0;35912:154;;35996:50;;-1:-1:-1;;;35996:50:0;;;;;;;:::i;36295:813::-;-1:-1:-1;;;;;36535:13:0;;9891:19;:23;36531:570;;36571:79;;-1:-1:-1;;;36571:79:0;;-1:-1:-1;;;;;36571:43:0;;;;;:79;;36615:8;;36625:4;;36631:3;;36636:7;;36645:4;;36571:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36571:79:0;;;;;;;;-1:-1:-1;;36571:79:0;;;;;;;;;;;;:::i;:::-;;;36567:523;;;;:::i;:::-;-1:-1:-1;;;;;;36732:60:0;;-1:-1:-1;;;36732:60:0;36728:159;;36817:50;;-1:-1:-1;;;36817:50:0;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:315::-;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:1:o;1230:250::-;1315:1;1325:113;1339:6;1336:1;1333:13;1325:113;;;1415:11;;;1409:18;1396:11;;;1389:39;1361:2;1354:10;1325:113;;;-1:-1:-1;;1472:1:1;1454:16;;1447:27;1230:250::o;1485:271::-;1527:3;1565:5;1559:12;1592:6;1587:3;1580:19;1608:76;1677:6;1670:4;1665:3;1661:14;1654:4;1647:5;1643:16;1608:76;:::i;:::-;1738:2;1717:15;-1:-1:-1;;1713:29:1;1704:39;;;;1745:4;1700:50;;1485:271;-1:-1:-1;;1485:271:1:o;1761:220::-;1910:2;1899:9;1892:21;1873:4;1930:45;1971:2;1960:9;1956:18;1948:6;1930:45;:::i;1986:348::-;2038:8;2048:6;2102:3;2095:4;2087:6;2083:17;2079:27;2069:55;;2120:1;2117;2110:12;2069:55;-1:-1:-1;2143:20:1;;-1:-1:-1;;;;;2175:30:1;;2172:50;;;2218:1;2215;2208:12;2172:50;2255:4;2247:6;2243:17;2231:29;;2307:3;2300:4;2291:6;2283;2279:19;2275:30;2272:39;2269:59;;;2324:1;2321;2314:12;2269:59;1986:348;;;;;:::o;2339:114::-;2423:4;2416:5;2412:16;2405:5;2402:27;2392:55;;2443:1;2440;2433:12;2458:679;2554:6;2562;2570;2578;2586;2639:3;2627:9;2618:7;2614:23;2610:33;2607:53;;;2656:1;2653;2646:12;2607:53;2696:9;2683:23;-1:-1:-1;;;;;2721:6:1;2718:30;2715:50;;;2761:1;2758;2751:12;2715:50;2800:59;2851:7;2842:6;2831:9;2827:22;2800:59;:::i;:::-;2878:8;;-1:-1:-1;2774:85:1;-1:-1:-1;;2963:2:1;2948:18;;2935:32;2976:29;2935:32;2976:29;:::i;:::-;2458:679;;;;-1:-1:-1;3024:5:1;;3076:2;3061:18;;3048:32;;-1:-1:-1;3127:2:1;3112:18;3099:32;;2458:679;-1:-1:-1;;2458:679:1:o;3142:180::-;3201:6;3254:2;3242:9;3233:7;3229:23;3225:32;3222:52;;;3270:1;3267;3260:12;3222:52;-1:-1:-1;3293:23:1;;3142:180;-1:-1:-1;3142:180:1:o;3327:752::-;3423:6;3431;3439;3447;3455;3508:3;3496:9;3487:7;3483:23;3479:33;3476:53;;;3525:1;3522;3515:12;3476:53;3565:9;3552:23;-1:-1:-1;;;;;3590:6:1;3587:30;3584:50;;;3630:1;3627;3620:12;3584:50;3669:59;3720:7;3711:6;3700:9;3696:22;3669:59;:::i;:::-;3747:8;;-1:-1:-1;3643:85:1;-1:-1:-1;;3832:2:1;3817:18;;3804:32;3845:29;3804:32;3845:29;:::i;:::-;3893:5;-1:-1:-1;3945:2:1;3930:18;;3917:32;;-1:-1:-1;4001:2:1;3986:18;;3973:32;4014:33;3973:32;4014:33;:::i;:::-;4066:7;4056:17;;;3327:752;;;;;;;;:::o;4084:247::-;4143:6;4196:2;4184:9;4175:7;4171:23;4167:32;4164:52;;;4212:1;4209;4202:12;4164:52;4251:9;4238:23;4270:31;4295:5;4270:31;:::i;4525:127::-;4586:10;4581:3;4577:20;4574:1;4567:31;4617:4;4614:1;4607:15;4641:4;4638:1;4631:15;4657:249;4767:2;4748:13;;-1:-1:-1;;4744:27:1;4732:40;;-1:-1:-1;;;;;4787:34:1;;4823:22;;;4784:62;4781:88;;;4849:18;;:::i;:::-;4885:2;4878:22;-1:-1:-1;;4657:249:1:o;4911:183::-;4971:4;-1:-1:-1;;;;;4996:6:1;4993:30;4990:56;;;5026:18;;:::i;:::-;-1:-1:-1;5071:1:1;5067:14;5083:4;5063:25;;4911:183::o;5099:724::-;5153:5;5206:3;5199:4;5191:6;5187:17;5183:27;5173:55;;5224:1;5221;5214:12;5173:55;5260:6;5247:20;5286:4;5309:43;5349:2;5309:43;:::i;:::-;5381:2;5375:9;5393:31;5421:2;5413:6;5393:31;:::i;:::-;5459:18;;;5551:1;5547:10;;;;5535:23;;5531:32;;;5493:15;;;;-1:-1:-1;5575:15:1;;;5572:35;;;5603:1;5600;5593:12;5572:35;5639:2;5631:6;5627:15;5651:142;5667:6;5662:3;5659:15;5651:142;;;5733:17;;5721:30;;5771:12;;;;5684;;5651:142;;;-1:-1:-1;5811:6:1;5099:724;-1:-1:-1;;;;;;5099:724:1:o;5828:186::-;5876:4;-1:-1:-1;;;;;5901:6:1;5898:30;5895:56;;;5931:18;;:::i;:::-;-1:-1:-1;5997:2:1;5976:15;-1:-1:-1;;5972:29:1;6003:4;5968:40;;5828:186::o;6019:508::-;6061:5;6114:3;6107:4;6099:6;6095:17;6091:27;6081:55;;6132:1;6129;6122:12;6081:55;6168:6;6155:20;6194:31;6222:2;6194:31;:::i;:::-;6254:2;6248:9;6266:31;6294:2;6286:6;6266:31;:::i;:::-;6321:2;6313:6;6306:18;6367:3;6360:4;6355:2;6347:6;6343:15;6339:26;6336:35;6333:55;;;6384:1;6381;6374:12;6333:55;6448:2;6441:4;6433:6;6429:17;6422:4;6414:6;6410:17;6397:54;6495:1;6471:15;;;6488:4;6467:26;6460:37;;;;-1:-1:-1;6475:6:1;6019:508;-1:-1:-1;;;6019:508:1:o;6532:1071::-;6686:6;6694;6702;6710;6718;6771:3;6759:9;6750:7;6746:23;6742:33;6739:53;;;6788:1;6785;6778:12;6739:53;6827:9;6814:23;6846:31;6871:5;6846:31;:::i;:::-;6896:5;-1:-1:-1;6953:2:1;6938:18;;6925:32;6966:33;6925:32;6966:33;:::i;:::-;7018:7;-1:-1:-1;7076:2:1;7061:18;;7048:32;-1:-1:-1;;;;;7129:14:1;;;7126:34;;;7156:1;7153;7146:12;7126:34;7179:61;7232:7;7223:6;7212:9;7208:22;7179:61;:::i;:::-;7169:71;;7293:2;7282:9;7278:18;7265:32;7249:48;;7322:2;7312:8;7309:16;7306:36;;;7338:1;7335;7328:12;7306:36;7361:63;7416:7;7405:8;7394:9;7390:24;7361:63;:::i;:::-;7351:73;;7477:3;7466:9;7462:19;7449:33;7433:49;;7507:2;7497:8;7494:16;7491:36;;;7523:1;7520;7513:12;7491:36;;7546:51;7589:7;7578:8;7567:9;7563:24;7546:51;:::i;:::-;7536:61;;;6532:1071;;;;;;;;:::o;7837:248::-;7905:6;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:52;;;7982:1;7979;7972:12;7934:52;-1:-1:-1;;8005:23:1;;;8075:2;8060:18;;;8047:32;;-1:-1:-1;7837:248:1:o;8090:454::-;8203:1;8199;8194:3;8190:11;8186:19;8178:5;8172:12;8168:38;8163:3;8156:51;8268:4;8260;8253:5;8249:16;8243:23;8239:34;8232:4;8227:3;8223:14;8216:58;8323:4;8316:5;8312:16;8306:23;8299:4;8294:3;8290:14;8283:47;8379:4;8372:5;8368:16;8362:23;8355:4;8350:3;8346:14;8339:47;8138:3;8432:4;8425:5;8421:16;8415:23;8470:4;8463;8458:3;8454:14;8447:28;8491:47;8532:4;8527:3;8523:14;8509:12;8491:47;:::i;:::-;8484:54;8090:454;-1:-1:-1;;;;8090:454:1:o;8549:835::-;8737:4;8766:2;8806;8795:9;8791:18;8836:2;8825:9;8818:21;8859:6;8894;8888:13;8925:6;8917;8910:22;8963:2;8952:9;8948:18;8941:25;;9025:2;9015:6;9012:1;9008:14;8997:9;8993:30;8989:39;8975:53;;9063:2;9055:6;9051:15;9084:1;9094:261;9108:6;9105:1;9102:13;9094:261;;;9201:2;9197:7;9185:9;9177:6;9173:22;9169:36;9164:3;9157:49;9229:46;9268:6;9259;9253:13;9229:46;:::i;:::-;9219:56;-1:-1:-1;9333:12:1;;;;9298:15;;;;9130:1;9123:9;9094:261;;;-1:-1:-1;9372:6:1;;8549:835;-1:-1:-1;;;;;;;8549:835:1:o;9389:1277::-;9507:6;9515;9568:2;9556:9;9547:7;9543:23;9539:32;9536:52;;;9584:1;9581;9574:12;9536:52;9624:9;9611:23;-1:-1:-1;;;;;9694:2:1;9686:6;9683:14;9680:34;;;9710:1;9707;9700:12;9680:34;9748:6;9737:9;9733:22;9723:32;;9793:7;9786:4;9782:2;9778:13;9774:27;9764:55;;9815:1;9812;9805:12;9764:55;9851:2;9838:16;9873:4;9896:43;9936:2;9896:43;:::i;:::-;9968:2;9962:9;9980:31;10008:2;10000:6;9980:31;:::i;:::-;10046:18;;;10134:1;10130:10;;;;10122:19;;10118:28;;;10080:15;;;;-1:-1:-1;10158:19:1;;;10155:39;;;10190:1;10187;10180:12;10155:39;10214:11;;;;10234:217;10250:6;10245:3;10242:15;10234:217;;;10330:3;10317:17;10347:31;10372:5;10347:31;:::i;:::-;10391:18;;10267:12;;;;10429;;;;10234:217;;;10470:6;-1:-1:-1;;10514:18:1;;10501:32;;-1:-1:-1;;10545:16:1;;;10542:36;;;10574:1;10571;10564:12;10542:36;;10597:63;10652:7;10641:8;10630:9;10626:24;10597:63;:::i;:::-;10587:73;;;9389:1277;;;;;:::o;10671:435::-;10724:3;10762:5;10756:12;10789:6;10784:3;10777:19;10815:4;10844:2;10839:3;10835:12;10828:19;;10881:2;10874:5;10870:14;10902:1;10912:169;10926:6;10923:1;10920:13;10912:169;;;10987:13;;10975:26;;11021:12;;;;11056:15;;;;10948:1;10941:9;10912:169;;;-1:-1:-1;11097:3:1;;10671:435;-1:-1:-1;;;;;10671:435:1:o;11111:261::-;11290:2;11279:9;11272:21;11253:4;11310:56;11362:2;11351:9;11347:18;11339:6;11310:56;:::i;12172:118::-;12258:5;12251:13;12244:21;12237:5;12234:32;12224:60;;12280:1;12277;12270:12;12295:382;12360:6;12368;12421:2;12409:9;12400:7;12396:23;12392:32;12389:52;;;12437:1;12434;12427:12;12389:52;12476:9;12463:23;12495:31;12520:5;12495:31;:::i;:::-;12545:5;-1:-1:-1;12602:2:1;12587:18;;12574:32;12615:30;12574:32;12615:30;:::i;:::-;12664:7;12654:17;;;12295:382;;;;;:::o;12682:411::-;12753:6;12761;12814:2;12802:9;12793:7;12789:23;12785:32;12782:52;;;12830:1;12827;12820:12;12782:52;12870:9;12857:23;-1:-1:-1;;;;;12895:6:1;12892:30;12889:50;;;12935:1;12932;12925:12;12889:50;12974:59;13025:7;13016:6;13005:9;13001:22;12974:59;:::i;:::-;13052:8;;12948:85;;-1:-1:-1;12682:411:1;-1:-1:-1;;;;12682:411:1:o;13098:592::-;13193:6;13201;13209;13217;13270:3;13258:9;13249:7;13245:23;13241:33;13238:53;;;13287:1;13284;13277:12;13238:53;13326:9;13313:23;13345:31;13370:5;13345:31;:::i;:::-;13395:5;-1:-1:-1;13447:2:1;13432:18;;13419:32;;-1:-1:-1;13498:2:1;13483:18;;13470:32;;-1:-1:-1;13553:2:1;13538:18;;13525:32;-1:-1:-1;;;;;13569:30:1;;13566:50;;;13612:1;13609;13602:12;13566:50;13635:49;13676:7;13667:6;13656:9;13652:22;13635:49;:::i;:::-;13625:59;;;13098:592;;;;;;;:::o;13695:540::-;13981:1;13977;13972:3;13968:11;13964:19;13956:6;13952:32;13941:9;13934:51;14033:4;14025:6;14021:17;14016:2;14005:9;14001:18;13994:45;14075:6;14070:2;14059:9;14055:18;14048:34;14118:6;14113:2;14102:9;14098:18;14091:34;14162:3;14156;14145:9;14141:19;14134:32;13915:4;14183:46;14224:3;14213:9;14209:19;14201:6;14183:46;:::i;:::-;14175:54;13695:540;-1:-1:-1;;;;;;;13695:540:1:o;14240:388::-;14308:6;14316;14369:2;14357:9;14348:7;14344:23;14340:32;14337:52;;;14385:1;14382;14375:12;14337:52;14424:9;14411:23;14443:31;14468:5;14443:31;:::i;:::-;14493:5;-1:-1:-1;14550:2:1;14535:18;;14522:32;14563:33;14522:32;14563:33;:::i;14633:734::-;14737:6;14745;14753;14761;14769;14822:3;14810:9;14801:7;14797:23;14793:33;14790:53;;;14839:1;14836;14829:12;14790:53;14878:9;14865:23;14897:31;14922:5;14897:31;:::i;:::-;14947:5;-1:-1:-1;15004:2:1;14989:18;;14976:32;15017:33;14976:32;15017:33;:::i;:::-;15069:7;-1:-1:-1;15123:2:1;15108:18;;15095:32;;-1:-1:-1;15174:2:1;15159:18;;15146:32;;-1:-1:-1;15229:3:1;15214:19;;15201:33;-1:-1:-1;;;;;15246:30:1;;15243:50;;;15289:1;15286;15279:12;15243:50;15312:49;15353:7;15344:6;15333:9;15329:22;15312:49;:::i;15372:929::-;15517:6;15525;15533;15541;15594:3;15582:9;15573:7;15569:23;15565:33;15562:53;;;15611:1;15608;15601:12;15562:53;15650:9;15637:23;15669:31;15694:5;15669:31;:::i;:::-;15719:5;-1:-1:-1;15775:2:1;15760:18;;15747:32;-1:-1:-1;;;;;15828:14:1;;;15825:34;;;15855:1;15852;15845:12;15825:34;15878:61;15931:7;15922:6;15911:9;15907:22;15878:61;:::i;:::-;15868:71;;15992:2;15981:9;15977:18;15964:32;15948:48;;16021:2;16011:8;16008:16;16005:36;;;16037:1;16034;16027:12;16005:36;16060:63;16115:7;16104:8;16093:9;16089:24;16060:63;:::i;:::-;16050:73;;16176:2;16165:9;16161:18;16148:32;16132:48;;16205:2;16195:8;16192:16;16189:36;;;16221:1;16218;16211:12;16189:36;;16244:51;16287:7;16276:8;16265:9;16261:24;16244:51;:::i;18431:380::-;18510:1;18506:12;;;;18553;;;18574:61;;18628:4;18620:6;18616:17;18606:27;;18574:61;18681:2;18673:6;18670:14;18650:18;18647:38;18644:161;;18727:10;18722:3;18718:20;18715:1;18708:31;18762:4;18759:1;18752:15;18790:4;18787:1;18780:15;18644:161;;18431:380;;;:::o;18942:545::-;19044:2;19039:3;19036:11;19033:448;;;19080:1;19105:5;19101:2;19094:17;19150:4;19146:2;19136:19;19220:2;19208:10;19204:19;19201:1;19197:27;19191:4;19187:38;19256:4;19244:10;19241:20;19238:47;;;-1:-1:-1;19279:4:1;19238:47;19334:2;19329:3;19325:12;19322:1;19318:20;19312:4;19308:31;19298:41;;19389:82;19407:2;19400:5;19397:13;19389:82;;;19452:17;;;19433:1;19422:13;19389:82;;19663:1352;19789:3;19783:10;-1:-1:-1;;;;;19808:6:1;19805:30;19802:56;;;19838:18;;:::i;:::-;19867:97;19957:6;19917:38;19949:4;19943:11;19917:38;:::i;:::-;19911:4;19867:97;:::i;:::-;20019:4;;20083:2;20072:14;;20100:1;20095:663;;;;20802:1;20819:6;20816:89;;;-1:-1:-1;20871:19:1;;;20865:26;20816:89;-1:-1:-1;;19620:1:1;19616:11;;;19612:24;19608:29;19598:40;19644:1;19640:11;;;19595:57;20918:81;;20065:944;;20095:663;18889:1;18882:14;;;18926:4;18913:18;;-1:-1:-1;;20131:20:1;;;20249:236;20263:7;20260:1;20257:14;20249:236;;;20352:19;;;20346:26;20331:42;;20444:27;;;;20412:1;20400:14;;;;20279:19;;20249:236;;;20253:3;20513:6;20504:7;20501:19;20498:201;;;20574:19;;;20568:26;-1:-1:-1;;20657:1:1;20653:14;;;20669:3;20649:24;20645:37;20641:42;20626:58;20611:74;;20498:201;-1:-1:-1;;;;;20745:1:1;20729:14;;;20725:22;20712:36;;-1:-1:-1;19663:1352:1:o;21020:340::-;21241:4;21233:6;21229:17;21218:9;21211:36;21283:2;21278;21267:9;21263:18;21256:30;21192:4;21303:51;21350:2;21339:9;21335:18;21327:6;21303:51;:::i;21365:703::-;21445:6;21498:2;21486:9;21477:7;21473:23;21469:32;21466:52;;;21514:1;21511;21504:12;21466:52;21547:9;21541:16;-1:-1:-1;;;;;21572:6:1;21569:30;21566:50;;;21612:1;21609;21602:12;21566:50;21635:22;;21688:4;21680:13;;21676:27;-1:-1:-1;21666:55:1;;21717:1;21714;21707:12;21666:55;21746:2;21740:9;21768:31;21796:2;21768:31;:::i;:::-;21828:2;21822:9;21840:31;21868:2;21860:6;21840:31;:::i;:::-;21895:2;21887:6;21880:18;21935:7;21930:2;21925;21921;21917:11;21913:20;21910:33;21907:53;;;21956:1;21953;21946:12;21907:53;21969:68;22034:2;22029;22021:6;22017:15;22012:2;22008;22004:11;21969:68;:::i;:::-;22056:6;21365:703;-1:-1:-1;;;;;;21365:703:1:o;22758:287::-;22887:3;22925:6;22919:13;22941:66;23000:6;22995:3;22988:4;22980:6;22976:17;22941:66;:::i;:::-;23023:16;;;;;22758:287;-1:-1:-1;;22758:287:1:o;23401:247::-;23469:6;23522:2;23510:9;23501:7;23497:23;23493:32;23490:52;;;23538:1;23535;23528:12;23490:52;23570:9;23564:16;23589:29;23612:5;23589:29;:::i;23653:410::-;23855:2;23837:21;;;23894:2;23874:18;;;23867:30;23933:34;23928:2;23913:18;;23906:62;-1:-1:-1;;;23999:2:1;23984:18;;23977:44;24053:3;24038:19;;23653:410::o;24410:127::-;24471:10;24466:3;24462:20;24459:1;24452:31;24502:4;24499:1;24492:15;24526:4;24523:1;24516:15;24542:128;24609:9;;;24630:11;;;24627:37;;;24644:18;;:::i;24675:125::-;24740:9;;;24761:10;;;24758:36;;;24774:18;;:::i;24805:127::-;24866:10;24861:3;24857:20;24854:1;24847:31;24897:4;24894:1;24887:15;24921:4;24918:1;24911:15;24937:135;24976:3;24997:17;;;24994:43;;25017:18;;:::i;:::-;-1:-1:-1;25064:1:1;25053:13;;24937:135::o;26446:184::-;26516:6;26569:2;26557:9;26548:7;26544:23;26540:32;26537:52;;;26585:1;26582;26575:12;26537:52;-1:-1:-1;26608:16:1;;26446:184;-1:-1:-1;26446:184:1:o;29093:638::-;-1:-1:-1;;;29479:3:1;29472:24;29525:6;29521:1;29516:3;29512:11;29505:27;-1:-1:-1;;;29557:2:1;29552:3;29548:12;29541:25;29454:3;29595:6;29589:13;29611:73;29677:6;29672:2;29667:3;29663:12;29658:2;29650:6;29646:15;29611:73;:::i;:::-;29704:16;;;;29722:2;29700:25;;29093:638;-1:-1:-1;;;29093:638:1:o;30800:401::-;31002:2;30984:21;;;31041:2;31021:18;;;31014:30;31080:34;31075:2;31060:18;;31053:62;-1:-1:-1;;;31146:2:1;31131:18;;31124:35;31191:3;31176:19;;30800:401::o;31206:406::-;31408:2;31390:21;;;31447:2;31427:18;;;31420:30;31486:34;31481:2;31466:18;;31459:62;-1:-1:-1;;;31552:2:1;31537:18;;31530:40;31602:3;31587:19;;31206:406::o;31617:465::-;31874:2;31863:9;31856:21;31837:4;31900:56;31952:2;31941:9;31937:18;31929:6;31900:56;:::i;:::-;32004:9;31996:6;31992:22;31987:2;31976:9;31972:18;31965:50;32032:44;32069:6;32061;32032:44;:::i;32447:245::-;32514:6;32567:2;32555:9;32546:7;32542:23;32538:32;32535:52;;;32583:1;32580;32573:12;32535:52;32615:9;32609:16;32634:28;32656:5;32634:28;:::i;34777:148::-;34865:4;34844:12;;;34858;;;34840:31;;34883:13;;34880:39;;;34899:18;;:::i;35339:561::-;-1:-1:-1;;;;;35636:15:1;;;35618:34;;35688:15;;35683:2;35668:18;;35661:43;35735:2;35720:18;;35713:34;;;35778:2;35763:18;;35756:34;;;35598:3;35821;35806:19;;35799:32;;;35561:4;;35848:46;;35874:19;;35866:6;35848:46;:::i;35905:249::-;35974:6;36027:2;36015:9;36006:7;36002:23;35998:32;35995:52;;;36043:1;36040;36033:12;35995:52;36075:9;36069:16;36094:30;36118:5;36094:30;:::i;36159:179::-;36194:3;36236:1;36218:16;36215:23;36212:120;;;36282:1;36279;36276;36261:23;-1:-1:-1;36319:1:1;36313:8;36308:3;36304:18;36212:120;36159:179;:::o;36343:671::-;36382:3;36424:4;36406:16;36403:26;36400:39;;;36343:671;:::o;36400:39::-;36466:2;36460:9;-1:-1:-1;;36531:16:1;36527:25;;36524:1;36460:9;36503:50;36582:4;36576:11;36606:16;-1:-1:-1;;;;;36712:2:1;36705:4;36697:6;36693:17;36690:25;36685:2;36677:6;36674:14;36671:45;36668:58;;;36719:5;;;;;36343:671;:::o;36668:58::-;36756:6;36750:4;36746:17;36735:28;;36792:3;36786:10;36819:2;36811:6;36808:14;36805:27;;;36825:5;;;;;;36343:671;:::o;36805:27::-;36909:2;36890:16;36884:4;36880:27;36876:36;36869:4;36860:6;36855:3;36851:16;36847:27;36844:69;36841:82;;;36916:5;;;;;;36343:671;:::o;36841:82::-;36932:57;36983:4;36974:6;36966;36962:19;36958:30;36952:4;36932:57;:::i;:::-;-1:-1:-1;37005:3:1;;36343:671;-1:-1:-1;;;;;36343:671:1:o;37440:404::-;37642:2;37624:21;;;37681:2;37661:18;;;37654:30;37720:34;37715:2;37700:18;;37693:62;-1:-1:-1;;;37786:2:1;37771:18;;37764:38;37834:3;37819:19;;37440:404::o;37849:827::-;-1:-1:-1;;;;;38246:15:1;;;38228:34;;38298:15;;38293:2;38278:18;;38271:43;38208:3;38345:2;38330:18;;38323:31;;;38171:4;;38377:57;;38414:19;;38406:6;38377:57;:::i;:::-;38482:9;38474:6;38470:22;38465:2;38454:9;38450:18;38443:50;38516:44;38553:6;38545;38516:44;:::i;:::-;38502:58;;38609:9;38601:6;38597:22;38591:3;38580:9;38576:19;38569:51;38637:33;38663:6;38655;38637:33;:::i;:::-;38629:41;37849:827;-1:-1:-1;;;;;;;;37849:827:1:o

Swarm Source

ipfs://5687264d6bc978c2d4d439da728163aa96b80c27e38fa5e062cd14de34df8257
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.