ETH Price: $3,319.14 (+0.34%)
Gas: 10 Gwei

Token

Moody Brain by Loopring ()
 

Overview

Max Total Supply

455

Holders

146

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x28d81c0660d627083e430497f299edff5cfabe76
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:
MoodyBrainsNFT

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-29
*/

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.2;
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



/**
 * @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/IERC1155.sol




/**
 * @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 be 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/IERC1155Receiver.sol




/**
 * @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.
        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. 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/token/ERC1155/extensions/IERC1155MetadataURI.sol




/**
 * @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/utils/Address.sol



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



/**
 * @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/ERC165.sol




/**
 * @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/ERC1155.sol









/**
 * @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: balance query for the zero address");
        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 {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 owner nor 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: transfer caller is not owner nor 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

        _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 `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

        emit TransferSingle(operator, account, address(0), id, amount);
    }

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

        address operator = _msgSender();

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

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

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

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @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 `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 _beforeTokenTransfer(
        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/access/Ownable.sol




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

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

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

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

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

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

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

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

// File: contracts/AddressSet.sol

// Copyright 2017 Loopring Technology Limited.


/// @title AddressSet
/// @author Daniel Wang - <[email protected]>
contract AddressSet
{
    struct Set
    {
        address[] addresses;
        mapping (address => uint) positions;
        uint count;
    }
    mapping (bytes32 => Set) private sets;

    function addAddressToSet(
        bytes32 key,
        address addr,
        bool    maintainList
        ) internal
    {
        Set storage set = sets[key];
        require(set.positions[addr] == 0, "ALREADY_IN_SET");

        if (maintainList) {
            require(set.addresses.length == set.count, "PREVIOUSLY_NOT_MAINTAILED");
            set.addresses.push(addr);
        } else {
            require(set.addresses.length == 0, "MUST_MAINTAIN");
        }

        set.count += 1;
        set.positions[addr] = set.count;
    }

    function removeAddressFromSet(
        bytes32 key,
        address addr
        )
        internal
    {
        Set storage set = sets[key];
        uint pos = set.positions[addr];
        require(pos != 0, "NOT_IN_SET");

        delete set.positions[addr];
        set.count -= 1;

        if (set.addresses.length > 0) {
            address lastAddr = set.addresses[set.count];
            if (lastAddr != addr) {
                set.addresses[pos - 1] = lastAddr;
                set.positions[lastAddr] = pos;
            }
            set.addresses.pop();
        }
    }

    function removeSet(bytes32 key)
        internal
    {
        delete sets[key];
    }

    function isAddressInSet(
        bytes32 key,
        address addr
        )
        internal
        view
        returns (bool)
    {
        return sets[key].positions[addr] != 0;
    }

    function numAddressesInSet(bytes32 key)
        internal
        view
        returns (uint)
    {
        Set storage set = sets[key];
        return set.count;
    }

    function addressesInSet(bytes32 key)
        internal
        view
        returns (address[] memory)
    {
        Set storage set = sets[key];
        require(set.count == set.addresses.length, "NOT_MAINTAINED");
        return sets[key].addresses;
    }
}

// File: contracts/external/IL2MintableNFT.sol

// Copyright 2017 Loopring Technology Limited.


interface IL2MintableNFT
{
    /// @dev This function is called when an NFT minted on L2 is withdrawn from Loopring.
    ///      That means the NFTs were burned on L2 and now need to be minted on L1.
    ///
    ///      This function can only be called by the Loopring exchange.
    ///
    /// @param to The owner of the NFT
    /// @param tokenId The token type 'id`
    /// @param amount The amount of NFTs to mint
    /// @param minter The minter on L2, which can be used to decide if the NFT is authentic
    /// @param data Opaque data that can be used by the contract
    function mintFromL2(
        address          to,
        uint256          tokenId,
        uint             amount,
        address          minter,
        bytes   calldata data
        )
        external;

    /// @dev Returns a list of all address that are authorized to mint NFTs on L2.
    /// @return The list of authorized minter on L2
    function minters()
        external
        view
        returns (address[] memory);
}

// File: contracts/ICollection.sol




/**
 * @title ICollection
 */
abstract contract ICollection
{
    function collectionID()
        public
        view
        virtual
        returns (uint32 id);

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        returns (string memory);
}

// File: ../contracts/MoodyBrainsNFT.sol








/**
 * @title MoodyBrainsNFT
 */

contract MoodyBrainsNFT is ERC1155, Ownable, IL2MintableNFT, AddressSet
{
    event CollectionUpdated(
        uint32  indexed collectionID,
        ICollection     collection
    );

    event MintFromL2(
        address owner,
        uint256 id,
        uint    amount,
        address minter
    );

    bytes32 internal constant MINTERS = keccak256("__MINTERS__");
    bytes32 internal constant DEPRECATED_MINTERS = keccak256("__DEPRECATED_MINTERS__");

    address public immutable layer2Address;

    mapping(uint32 => ICollection) collections;

    modifier onlyFromLayer2
    {
        require(msg.sender == layer2Address, "not authorized");
        _;
    }

    modifier onlyFromMinter
    {
        require(isMinter(msg.sender), "not authorized");
        _;
    }

    constructor(address _layer2Address)
        ERC1155("")
    {
        layer2Address = _layer2Address;
    }

    function mint(
        address       account,
        uint256       id,
        uint256       amount,
        bytes  memory data
        )
        external
    onlyFromMinter
    {
        _mint(account, id, amount, data);
    }

    function mintBatch(
        address          to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes     memory data
        )
        external
    onlyFromMinter
    {
        _mintBatch(to, ids, amounts, data);
    }

    function addCollection(ICollection collection)
        external
        onlyOwner
    {
        uint32 id = collection.collectionID();
        collections[id] = collection;
        emit CollectionUpdated(id, collection);
    }

    function setMinter(
        address minter,
        bool enabled
        )
        external
        onlyOwner
    {
        if (enabled) {
            addAddressToSet(MINTERS, minter, true);
            if (isAddressInSet(DEPRECATED_MINTERS, minter)) {
                removeAddressFromSet(DEPRECATED_MINTERS, minter);
            }
        } else {
            removeAddressFromSet(MINTERS, minter);
            addAddressToSet(DEPRECATED_MINTERS, minter, true);
        }
    }

    function uri(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        // The collection ID is always stored in the highest 32 bits
        uint32 collectionID = uint32((tokenId >> 224) & 0xFFFFFFFF);
        return collections[collectionID].tokenURI(tokenId);
    }

    // Layer 2 logic

    function mintFromL2(
        address          to,
        uint256          id,
        uint             amount,
        address          minter,
        bytes   calldata data
        )
        external
        override
    onlyFromLayer2
    {
        require(isMinter(minter), "invalid minter");

        _mint(to, id, amount, data);
        emit MintFromL2(to, id, amount, minter);
    }

    function minters()
        public
        view
        override
        returns (address[] memory)
    {
        return addressesInSet(MINTERS);
    }

    function isMinter(address addr)
        public
        view
        returns (bool)
    {
        return isAddressInSet(MINTERS, addr) || isAddressInSet(DEPRECATED_MINTERS, addr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_layer2Address","type":"address"}],"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":true,"internalType":"uint32","name":"collectionID","type":"uint32"},{"indexed":false,"internalType":"contract ICollection","name":"collection","type":"address"}],"name":"CollectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"MintFromL2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"inputs":[{"internalType":"contract ICollection","name":"collection","type":"address"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layer2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintFromL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMinter","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b50604051620033213803806200332183398101604081905262000034916200017d565b6040805160208101909152600081526200004e816200006c565b506200005a3362000085565b6001600160a01b0316608052620001ec565b805162000081906002906020840190620000d7565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000e590620001af565b90600052602060002090601f01602090048101928262000109576000855562000154565b82601f106200012457805160ff191683800117855562000154565b8280016001018555821562000154579182015b828111156200015457825182559160200191906001019062000137565b506200016292915062000166565b5090565b5b8082111562000162576000815560010162000167565b6000602082840312156200019057600080fd5b81516001600160a01b0381168114620001a857600080fd5b9392505050565b600181811c90821680620001c457607f821691505b60208210811415620001e657634e487b7160e01b600052602260045260246000fd5b50919050565b6080516131126200020f600039600081816101fe015261076201526131126000f3fe608060405234801561001057600080fd5b50600436106101505760003560e01c8063731133e9116100cd578063cf456ae711610081578063f242432a11610066578063f242432a14610333578063f2fde38b14610346578063f97b57ec1461035957600080fd5b8063cf456ae7146102d7578063e985e9c5146102ea57600080fd5b8063a174e77a116100b2578063a174e77a1461029e578063a22cb465146102b1578063aa271e1a146102c457600080fd5b8063731133e91461026d5780638da5cb5b1461028057600080fd5b80632eb2c2d6116101245780634d3d629f116101095780634d3d629f146101f95780634e1273f414610245578063715018a61461026557600080fd5b80632eb2c2d6146101d35780632f680ebe146101e657600080fd5b8062fdd58e1461015557806301ffc9a71461017b5780630e89341c1461019e5780631f7fdffa146101be575b600080fd5b6101686101633660046125fa565b61036e565b6040519081526020015b60405180910390f35b61018e610189366004612654565b61044b565b6040519015158152602001610172565b6101b16101ac366004612671565b610530565b6040516101729190612700565b6101d16101cc3660046128c4565b610600565b005b6101d16101e136600461295f565b610681565b6101d16101f4366004612a0d565b61074a565b6102207f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610172565b610258610253366004612ab7565b610900565b6040516101729190612bbf565b6101d1610a58565b6101d161027b366004612bd2565b610ae5565b60035473ffffffffffffffffffffffffffffffffffffffff16610220565b6101d16102ac366004612c29565b610b60565b6101d16102bf366004612c46565b610ce5565b61018e6102d2366004612c29565b610e22565b6101d16102e5366004612c46565b610ebb565b61018e6102f8366004612c84565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101d1610341366004612cb2565b61103c565b6101d1610354366004612c29565b6110fe565b61036161122e565b6040516101729190612d1b565b600073ffffffffffffffffffffffffffffffffffffffff8316610418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061052a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60e081901c600081815260056020526040908190205490517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018490526060929173ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156105b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105f99190810190612d75565b9392505050565b61060933610e22565b61066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b61067b8484848461125e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff85163314806106aa57506106aa85336102f8565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161040f565b61074385858585856114d7565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b6107f283610e22565b610858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964206d696e746572000000000000000000000000000000000000604482015260640161040f565b61089a86868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181192505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8881168252602082018890528183018790528516606082015290517ff97830743cbec3abdff86bef2b90c64e37b7205980ad7f8afeeec1133f7aaaf19181900360800190a1505050505050565b60608151835114610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161040f565b6000835167ffffffffffffffff8111156109af576109af612713565b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b50905060005b8451811015610a5057610a238582815181106109fc576109fc612df7565b6020026020010151858381518110610a1657610a16612df7565b602002602001015161036e565b828281518110610a3557610a35612df7565b6020908102919091010152610a4981612e55565b90506109de565b509392505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b610ae36000611978565b565b610aee33610e22565b610b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b61067b84848484611811565b60035473ffffffffffffffffffffffffffffffffffffffff163314610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b60008173ffffffffffffffffffffffffffffffffffffffff166358b33e696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c529190612e8e565b63ffffffff811660008181526005602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155915191825292935090917f7a5a410b51203573beb704bb5a79eca8e8441fe426a786216c3eb726e532b43c910160405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff83161415610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161040f565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff811660009081527ff2ea1d6fee3f90c6ddb8b66c32cdab4a7cae01159033de26d5665769d83899f3602052604081205415158061052a575073ffffffffffffffffffffffffffffffffffffffff821660009081527f2d9745ca76c9d6eb6f8a7af149b2df1633da69b5b9a8f0b425ae90a1a5cba0936020526040902054151561052a565b60035473ffffffffffffffffffffffffffffffffffffffff163314610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b8015610fe657610f6e7f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e48360016119ef565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f2d9745ca76c9d6eb6f8a7af149b2df1633da69b5b9a8f0b425ae90a1a5cba093602052604090205415610fe257610fe27f5a686a16f83c1cfdadd65bb3fd95e216e2ccdb4315d3afc709eaa43c462a6ea183611c0d565b5050565b6110107f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e483611c0d565b610fe27f5a686a16f83c1cfdadd65bb3fd95e216e2ccdb4315d3afc709eaa43c462a6ea18360016119ef565b73ffffffffffffffffffffffffffffffffffffffff8516331480611065575061106585336102f8565b6110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161040f565b6107438585858585611e2c565b60035473ffffffffffffffffffffffffffffffffffffffff16331461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b73ffffffffffffffffffffffffffffffffffffffff8116611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161040f565b61122b81611978565b50565b60606112597f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e461205d565b905090565b73ffffffffffffffffffffffffffffffffffffffff8416611301576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161040f565b8151835114611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161040f565b3360005b8451811015611448578381815181106113b1576113b1612df7565b60200260200101516000808784815181106113ce576113ce612df7565b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114309190612eb4565b9091555081905061144081612e55565b915050611396565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114c0929190612ecc565b60405180910390a461074381600087878787612155565b8151835114611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161040f565b73ffffffffffffffffffffffffffffffffffffffff841661160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161040f565b3360005b845181101561177c57600085828151811061162c5761162c612df7565b60200260200101519050600085838151811061164a5761164a612df7565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161040f565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b16825281208054849290611761908490612eb4565b925050819055505050508061177590612e55565b905061160f565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117f3929190612ecc565b60405180910390a4611809818787878787612155565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff84166118b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161040f565b336118ce816000876118c5886123e0565b610743886123e0565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061190b908490612eb4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107438160008787878761242b565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600083815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452600181019092529091205415611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f494e5f534554000000000000000000000000000000000000604482015260640161040f565b8115611b54576002810154815414611aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604482015260640161040f565b80546001810182556000828152602090200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055611bbd565b805415611bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d5553545f4d41494e5441494e00000000000000000000000000000000000000604482015260640161040f565b6001816002016000828254611bd29190612eb4565b9091555050600281015473ffffffffffffffffffffffffffffffffffffffff9093166000908152600190910160205260409020919091555050565b600082815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452600181019092529091205480611ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f494e5f53455400000000000000000000000000000000000000000000604482015260640161040f565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260018084016020526040822082905560028401805491929091611ce9908490612efa565b909155505081541561067b57600082600001836002015481548110611d1057611d10612df7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116915084168114611dbc578083611d4b600185612efa565b81548110611d5b57611d5b612df7565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918316815260018501909152604090208290555b8254839080611dcd57611dcd612f11565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050505050565b73ffffffffffffffffffffffffffffffffffffffff8416611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161040f565b33611edf8187876118c5886123e0565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915290205483811015611f9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161040f565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083208785039055908816825281208054869290611fe7908490612eb4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461205482888888888861242b565b50505050505050565b60008181526004602052604090208054600282015460609291146120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f4d41494e5441494e4544000000000000000000000000000000000000604482015260640161040f565b6000838152600460209081526040918290208054835181840281018401909452808452909183018282801561214857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161211d575b5050505050915050919050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611809576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906121cc9089908990889088908890600401612f40565b6020604051808303816000875af1925050508015612225575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261222291810190612fab565b60015b61230f57612231612fc8565b806308c379a014156122855750612246612fe4565b806122515750612287565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040f9190612700565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161040f565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161040f565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061241a5761241a612df7565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611809576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906124a2908990899088908890889060040161308c565b6020604051808303816000875af19250505080156124fb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124f891810190612fab565b60015b61250757612231612fc8565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161040f565b73ffffffffffffffffffffffffffffffffffffffff8116811461122b57600080fd5b6000806040838503121561260d57600080fd5b8235612618816125d8565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461122b57600080fd5b60006020828403121561266657600080fd5b81356105f981612626565b60006020828403121561268357600080fd5b5035919050565b60005b838110156126a557818101518382015260200161268d565b8381111561067b5750506000910152565b600081518084526126ce81602086016020860161268a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105f960208301846126b6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561278657612786612713565b6040525050565b600067ffffffffffffffff8211156127a7576127a7612713565b5060051b60200190565b600082601f8301126127c257600080fd5b813560206127cf8261278d565b6040516127dc8282612742565b83815260059390931b85018201928281019150868411156127fc57600080fd5b8286015b848110156128175780358352918301918301612800565b509695505050505050565b600067ffffffffffffffff82111561283c5761283c612713565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261287957600080fd5b813561288481612822565b6040516128918282612742565b8281528560208487010111156128a657600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080608085870312156128da57600080fd5b84356128e5816125d8565b9350602085013567ffffffffffffffff8082111561290257600080fd5b61290e888389016127b1565b9450604087013591508082111561292457600080fd5b612930888389016127b1565b9350606087013591508082111561294657600080fd5b5061295387828801612868565b91505092959194509250565b600080600080600060a0868803121561297757600080fd5b8535612982816125d8565b94506020860135612992816125d8565b9350604086013567ffffffffffffffff808211156129af57600080fd5b6129bb89838a016127b1565b945060608801359150808211156129d157600080fd5b6129dd89838a016127b1565b935060808801359150808211156129f357600080fd5b50612a0088828901612868565b9150509295509295909350565b60008060008060008060a08789031215612a2657600080fd5b8635612a31816125d8565b955060208701359450604087013593506060870135612a4f816125d8565b9250608087013567ffffffffffffffff80821115612a6c57600080fd5b818901915089601f830112612a8057600080fd5b813581811115612a8f57600080fd5b8a6020828501011115612aa157600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612aca57600080fd5b823567ffffffffffffffff80821115612ae257600080fd5b818501915085601f830112612af657600080fd5b81356020612b038261278d565b604051612b108282612742565b83815260059390931b8501820192828101915089841115612b3057600080fd5b948201945b83861015612b57578535612b48816125d8565b82529482019490820190612b35565b96505086013592505080821115612b6d57600080fd5b50612b7a858286016127b1565b9150509250929050565b600081518084526020808501945080840160005b83811015612bb457815187529582019590820190600101612b98565b509495945050505050565b6020815260006105f96020830184612b84565b60008060008060808587031215612be857600080fd5b8435612bf3816125d8565b93506020850135925060408501359150606085013567ffffffffffffffff811115612c1d57600080fd5b61295387828801612868565b600060208284031215612c3b57600080fd5b81356105f9816125d8565b60008060408385031215612c5957600080fd5b8235612c64816125d8565b915060208301358015158114612c7957600080fd5b809150509250929050565b60008060408385031215612c9757600080fd5b8235612ca2816125d8565b91506020830135612c79816125d8565b600080600080600060a08688031215612cca57600080fd5b8535612cd5816125d8565b94506020860135612ce5816125d8565b93506040860135925060608601359150608086013567ffffffffffffffff811115612d0f57600080fd5b612a0088828901612868565b6020808252825182820181905260009190848201906040850190845b81811015612d6957835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612d37565b50909695505050505050565b600060208284031215612d8757600080fd5b815167ffffffffffffffff811115612d9e57600080fd5b8201601f81018413612daf57600080fd5b8051612dba81612822565b604051612dc78282612742565b828152866020848601011115612ddc57600080fd5b612ded83602083016020870161268a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8757612e87612e26565b5060010190565b600060208284031215612ea057600080fd5b815163ffffffff811681146105f957600080fd5b60008219821115612ec757612ec7612e26565b500190565b604081526000612edf6040830185612b84565b8281036020840152612ef18185612b84565b95945050505050565b600082821015612f0c57612f0c612e26565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152612f7960a0830186612b84565b8281036060840152612f8b8186612b84565b90508281036080840152612f9f81856126b6565b98975050505050505050565b600060208284031215612fbd57600080fd5b81516105f981612626565b600060033d1115612fe15760046000803e5060005160e01c5b90565b600060443d1015612ff25790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561304057505050505090565b82850191508151818111156130585750505050505090565b843d87010160208285010111156130725750505050505090565b61308160208286010187612742565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526130d160a08301846126b6565b97965050505050505056fea2646970667358221220efd574228b9d240671c9b95f3fdc4d3dbf69ef6f8545e2f1dc65cbbc12a31b6664736f6c634300080a00330000000000000000000000000baba1ad5be3a5c0a66e7ac838a129bf948f1ea4

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101505760003560e01c8063731133e9116100cd578063cf456ae711610081578063f242432a11610066578063f242432a14610333578063f2fde38b14610346578063f97b57ec1461035957600080fd5b8063cf456ae7146102d7578063e985e9c5146102ea57600080fd5b8063a174e77a116100b2578063a174e77a1461029e578063a22cb465146102b1578063aa271e1a146102c457600080fd5b8063731133e91461026d5780638da5cb5b1461028057600080fd5b80632eb2c2d6116101245780634d3d629f116101095780634d3d629f146101f95780634e1273f414610245578063715018a61461026557600080fd5b80632eb2c2d6146101d35780632f680ebe146101e657600080fd5b8062fdd58e1461015557806301ffc9a71461017b5780630e89341c1461019e5780631f7fdffa146101be575b600080fd5b6101686101633660046125fa565b61036e565b6040519081526020015b60405180910390f35b61018e610189366004612654565b61044b565b6040519015158152602001610172565b6101b16101ac366004612671565b610530565b6040516101729190612700565b6101d16101cc3660046128c4565b610600565b005b6101d16101e136600461295f565b610681565b6101d16101f4366004612a0d565b61074a565b6102207f0000000000000000000000000baba1ad5be3a5c0a66e7ac838a129bf948f1ea481565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610172565b610258610253366004612ab7565b610900565b6040516101729190612bbf565b6101d1610a58565b6101d161027b366004612bd2565b610ae5565b60035473ffffffffffffffffffffffffffffffffffffffff16610220565b6101d16102ac366004612c29565b610b60565b6101d16102bf366004612c46565b610ce5565b61018e6102d2366004612c29565b610e22565b6101d16102e5366004612c46565b610ebb565b61018e6102f8366004612c84565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101d1610341366004612cb2565b61103c565b6101d1610354366004612c29565b6110fe565b61036161122e565b6040516101729190612d1b565b600073ffffffffffffffffffffffffffffffffffffffff8316610418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061052a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60e081901c600081815260056020526040908190205490517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018490526060929173ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156105b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105f99190810190612d75565b9392505050565b61060933610e22565b61066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b61067b8484848461125e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff85163314806106aa57506106aa85336102f8565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161040f565b61074385858585856114d7565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000baba1ad5be3a5c0a66e7ac838a129bf948f1ea416146107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b6107f283610e22565b610858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964206d696e746572000000000000000000000000000000000000604482015260640161040f565b61089a86868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181192505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8881168252602082018890528183018790528516606082015290517ff97830743cbec3abdff86bef2b90c64e37b7205980ad7f8afeeec1133f7aaaf19181900360800190a1505050505050565b60608151835114610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161040f565b6000835167ffffffffffffffff8111156109af576109af612713565b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b50905060005b8451811015610a5057610a238582815181106109fc576109fc612df7565b6020026020010151858381518110610a1657610a16612df7565b602002602001015161036e565b828281518110610a3557610a35612df7565b6020908102919091010152610a4981612e55565b90506109de565b509392505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b610ae36000611978565b565b610aee33610e22565b610b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161040f565b61067b84848484611811565b60035473ffffffffffffffffffffffffffffffffffffffff163314610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b60008173ffffffffffffffffffffffffffffffffffffffff166358b33e696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c529190612e8e565b63ffffffff811660008181526005602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155915191825292935090917f7a5a410b51203573beb704bb5a79eca8e8441fe426a786216c3eb726e532b43c910160405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff83161415610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161040f565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff811660009081527ff2ea1d6fee3f90c6ddb8b66c32cdab4a7cae01159033de26d5665769d83899f3602052604081205415158061052a575073ffffffffffffffffffffffffffffffffffffffff821660009081527f2d9745ca76c9d6eb6f8a7af149b2df1633da69b5b9a8f0b425ae90a1a5cba0936020526040902054151561052a565b60035473ffffffffffffffffffffffffffffffffffffffff163314610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b8015610fe657610f6e7f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e48360016119ef565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f2d9745ca76c9d6eb6f8a7af149b2df1633da69b5b9a8f0b425ae90a1a5cba093602052604090205415610fe257610fe27f5a686a16f83c1cfdadd65bb3fd95e216e2ccdb4315d3afc709eaa43c462a6ea183611c0d565b5050565b6110107f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e483611c0d565b610fe27f5a686a16f83c1cfdadd65bb3fd95e216e2ccdb4315d3afc709eaa43c462a6ea18360016119ef565b73ffffffffffffffffffffffffffffffffffffffff8516331480611065575061106585336102f8565b6110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161040f565b6107438585858585611e2c565b60035473ffffffffffffffffffffffffffffffffffffffff16331461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161040f565b73ffffffffffffffffffffffffffffffffffffffff8116611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161040f565b61122b81611978565b50565b60606112597f1464ab5f7dd0e6b8afecabb71df0efbd0a285cb55cd1e26175d6ece586a3b8e461205d565b905090565b73ffffffffffffffffffffffffffffffffffffffff8416611301576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161040f565b8151835114611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161040f565b3360005b8451811015611448578381815181106113b1576113b1612df7565b60200260200101516000808784815181106113ce576113ce612df7565b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114309190612eb4565b9091555081905061144081612e55565b915050611396565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114c0929190612ecc565b60405180910390a461074381600087878787612155565b8151835114611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161040f565b73ffffffffffffffffffffffffffffffffffffffff841661160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161040f565b3360005b845181101561177c57600085828151811061162c5761162c612df7565b60200260200101519050600085838151811061164a5761164a612df7565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161040f565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b16825281208054849290611761908490612eb4565b925050819055505050508061177590612e55565b905061160f565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117f3929190612ecc565b60405180910390a4611809818787878787612155565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff84166118b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161040f565b336118ce816000876118c5886123e0565b610743886123e0565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061190b908490612eb4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107438160008787878761242b565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600083815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452600181019092529091205415611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f494e5f534554000000000000000000000000000000000000604482015260640161040f565b8115611b54576002810154815414611aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604482015260640161040f565b80546001810182556000828152602090200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055611bbd565b805415611bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d5553545f4d41494e5441494e00000000000000000000000000000000000000604482015260640161040f565b6001816002016000828254611bd29190612eb4565b9091555050600281015473ffffffffffffffffffffffffffffffffffffffff9093166000908152600190910160205260409020919091555050565b600082815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452600181019092529091205480611ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f494e5f53455400000000000000000000000000000000000000000000604482015260640161040f565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260018084016020526040822082905560028401805491929091611ce9908490612efa565b909155505081541561067b57600082600001836002015481548110611d1057611d10612df7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116915084168114611dbc578083611d4b600185612efa565b81548110611d5b57611d5b612df7565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918316815260018501909152604090208290555b8254839080611dcd57611dcd612f11565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050505050565b73ffffffffffffffffffffffffffffffffffffffff8416611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161040f565b33611edf8187876118c5886123e0565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915290205483811015611f9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161040f565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083208785039055908816825281208054869290611fe7908490612eb4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461205482888888888861242b565b50505050505050565b60008181526004602052604090208054600282015460609291146120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f4d41494e5441494e4544000000000000000000000000000000000000604482015260640161040f565b6000838152600460209081526040918290208054835181840281018401909452808452909183018282801561214857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161211d575b5050505050915050919050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611809576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906121cc9089908990889088908890600401612f40565b6020604051808303816000875af1925050508015612225575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261222291810190612fab565b60015b61230f57612231612fc8565b806308c379a014156122855750612246612fe4565b806122515750612287565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040f9190612700565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161040f565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161040f565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061241a5761241a612df7565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611809576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906124a2908990899088908890889060040161308c565b6020604051808303816000875af19250505080156124fb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124f891810190612fab565b60015b61250757612231612fc8565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161040f565b73ffffffffffffffffffffffffffffffffffffffff8116811461122b57600080fd5b6000806040838503121561260d57600080fd5b8235612618816125d8565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461122b57600080fd5b60006020828403121561266657600080fd5b81356105f981612626565b60006020828403121561268357600080fd5b5035919050565b60005b838110156126a557818101518382015260200161268d565b8381111561067b5750506000910152565b600081518084526126ce81602086016020860161268a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105f960208301846126b6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561278657612786612713565b6040525050565b600067ffffffffffffffff8211156127a7576127a7612713565b5060051b60200190565b600082601f8301126127c257600080fd5b813560206127cf8261278d565b6040516127dc8282612742565b83815260059390931b85018201928281019150868411156127fc57600080fd5b8286015b848110156128175780358352918301918301612800565b509695505050505050565b600067ffffffffffffffff82111561283c5761283c612713565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261287957600080fd5b813561288481612822565b6040516128918282612742565b8281528560208487010111156128a657600080fd5b82602086016020830137600092810160200192909252509392505050565b600080600080608085870312156128da57600080fd5b84356128e5816125d8565b9350602085013567ffffffffffffffff8082111561290257600080fd5b61290e888389016127b1565b9450604087013591508082111561292457600080fd5b612930888389016127b1565b9350606087013591508082111561294657600080fd5b5061295387828801612868565b91505092959194509250565b600080600080600060a0868803121561297757600080fd5b8535612982816125d8565b94506020860135612992816125d8565b9350604086013567ffffffffffffffff808211156129af57600080fd5b6129bb89838a016127b1565b945060608801359150808211156129d157600080fd5b6129dd89838a016127b1565b935060808801359150808211156129f357600080fd5b50612a0088828901612868565b9150509295509295909350565b60008060008060008060a08789031215612a2657600080fd5b8635612a31816125d8565b955060208701359450604087013593506060870135612a4f816125d8565b9250608087013567ffffffffffffffff80821115612a6c57600080fd5b818901915089601f830112612a8057600080fd5b813581811115612a8f57600080fd5b8a6020828501011115612aa157600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612aca57600080fd5b823567ffffffffffffffff80821115612ae257600080fd5b818501915085601f830112612af657600080fd5b81356020612b038261278d565b604051612b108282612742565b83815260059390931b8501820192828101915089841115612b3057600080fd5b948201945b83861015612b57578535612b48816125d8565b82529482019490820190612b35565b96505086013592505080821115612b6d57600080fd5b50612b7a858286016127b1565b9150509250929050565b600081518084526020808501945080840160005b83811015612bb457815187529582019590820190600101612b98565b509495945050505050565b6020815260006105f96020830184612b84565b60008060008060808587031215612be857600080fd5b8435612bf3816125d8565b93506020850135925060408501359150606085013567ffffffffffffffff811115612c1d57600080fd5b61295387828801612868565b600060208284031215612c3b57600080fd5b81356105f9816125d8565b60008060408385031215612c5957600080fd5b8235612c64816125d8565b915060208301358015158114612c7957600080fd5b809150509250929050565b60008060408385031215612c9757600080fd5b8235612ca2816125d8565b91506020830135612c79816125d8565b600080600080600060a08688031215612cca57600080fd5b8535612cd5816125d8565b94506020860135612ce5816125d8565b93506040860135925060608601359150608086013567ffffffffffffffff811115612d0f57600080fd5b612a0088828901612868565b6020808252825182820181905260009190848201906040850190845b81811015612d6957835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612d37565b50909695505050505050565b600060208284031215612d8757600080fd5b815167ffffffffffffffff811115612d9e57600080fd5b8201601f81018413612daf57600080fd5b8051612dba81612822565b604051612dc78282612742565b828152866020848601011115612ddc57600080fd5b612ded83602083016020870161268a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8757612e87612e26565b5060010190565b600060208284031215612ea057600080fd5b815163ffffffff811681146105f957600080fd5b60008219821115612ec757612ec7612e26565b500190565b604081526000612edf6040830185612b84565b8281036020840152612ef18185612b84565b95945050505050565b600082821015612f0c57612f0c612e26565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152612f7960a0830186612b84565b8281036060840152612f8b8186612b84565b90508281036080840152612f9f81856126b6565b98975050505050505050565b600060208284031215612fbd57600080fd5b81516105f981612626565b600060033d1115612fe15760046000803e5060005160e01c5b90565b600060443d1015612ff25790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561304057505050505090565b82850191508151818111156130585750505050505090565b843d87010160208285010111156130725750505050505090565b61308160208286010187612742565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526130d160a08301846126b6565b97965050505050505056fea2646970667358221220efd574228b9d240671c9b95f3fdc4d3dbf69ef6f8545e2f1dc65cbbc12a31b6664736f6c634300080a0033

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

0000000000000000000000000baba1ad5be3a5c0a66e7ac838a129bf948f1ea4

-----Decoded View---------------
Arg [0] : _layer2Address (address): 0x0BABA1Ad5bE3a5C0a66E7ac838a129Bf948f1eA4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000baba1ad5be3a5c0a66e7ac838a129bf948f1ea4


Deployed Bytecode Sourcemap

39195:3330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19773:231;;;;;;:::i;:::-;;:::i;:::-;;;639:25:1;;;627:2;612:18;19773:231:0;;;;;;;;18796:310;;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;18796:310:0;1107:187:1;41381:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40375:254::-;;;;;;:::i;:::-;;:::i;:::-;;21868:442;;;;;;:::i;:::-;;:::i;41755:404::-;;;;;;:::i;:::-;;:::i;39675:38::-;;;;;;;;7672:42:1;7660:55;;;7642:74;;7630:2;7615:18;39675:38:0;7496:226:1;20170:524:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34689:94::-;;;:::i;40129:238::-;;;;;;:::i;:::-;;:::i;34038:87::-;34111:6;;;;34038:87;;40637:233;;;;;;:::i;:::-;;:::i;20767:311::-;;;;;;:::i;:::-;;:::i;42332:190::-;;;;;;:::i;:::-;;:::i;40878:495::-;;;;;;:::i;:::-;;:::i;21150:168::-;;;;;;:::i;:::-;21273:27;;;;21249:4;21273:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21150:168;21390:401;;;;;;:::i;:::-;;:::i;34938:192::-;;;;;;:::i;:::-;;:::i;42167:157::-;;;:::i;:::-;;;;;;;:::i;19773:231::-;19859:7;19887:21;;;19879:77;;;;;;;13277:2:1;19879:77:0;;;13259:21:1;13316:2;13296:18;;;13289:30;13355:34;13335:18;;;13328:62;13426:13;13406:18;;;13399:41;13457:19;;19879:77:0;;;;;;;;;-1:-1:-1;19974:9:0;:13;;;;;;;;;;;:22;;;;;;;;;;;;;19773:231::o;18796:310::-;18898:4;18935:41;;;18950:26;18935:41;;:110;;-1:-1:-1;18993:52:0;;;19008:37;18993:52;18935:110;:163;;;-1:-1:-1;17768:25:0;17753:40;;;;19062:36;18915:183;18796:310;-1:-1:-1;;18796:310:0:o;41381:342::-;41636:3;41625:14;;;41595:19;41672:25;;;:11;:25;;;;;;;;:43;;;;;;;;639:25:1;;;41494:13:0;;41625:14;41672:25;;;:34;;612:18:1;;41672:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41665:50;41381:342;-1:-1:-1;;;41381:342:0:o;40375:254::-;39943:20;39952:10;39943:8;:20::i;:::-;39935:47;;;;;;;14384:2:1;39935:47:0;;;14366:21:1;14423:2;14403:18;;;14396:30;14462:16;14442:18;;;14435:44;14496:18;;39935:47:0;14182:338:1;39935:47:0;40587:34:::1;40598:2;40602:3;40607:7;40616:4;40587:10;:34::i;:::-;40375:254:::0;;;;:::o;21868:442::-;22101:20;;;16739:10;22101:20;;:60;;-1:-1:-1;22125:36:0;22142:4;16739:10;21150:168;:::i;22125:36::-;22079:160;;;;;;;14727:2:1;22079:160:0;;;14709:21:1;14766:2;14746:18;;;14739:30;14805:34;14785:18;;;14778:62;14876:20;14856:18;;;14849:48;14914:19;;22079:160:0;14525:414:1;22079:160:0;22250:52;22273:4;22279:2;22283:3;22288:7;22297:4;22250:22;:52::i;:::-;21868:442;;;;;:::o;41755:404::-;39821:10;:27;39835:13;39821:27;;39813:54;;;;;;;14384:2:1;39813:54:0;;;14366:21:1;14423:2;14403:18;;;14396:30;14462:16;14442:18;;;14435:44;14496:18;;39813:54:0;14182:338:1;39813:54:0;42026:16:::1;42035:6;42026:8;:16::i;:::-;42018:43;;;::::0;::::1;::::0;;15146:2:1;42018:43:0::1;::::0;::::1;15128:21:1::0;15185:2;15165:18;;;15158:30;15224:16;15204:18;;;15197:44;15258:18;;42018:43:0::1;14944:338:1::0;42018:43:0::1;42074:27;42080:2;42084;42088:6;42096:4;;42074:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42074:5:0::1;::::0;-1:-1:-1;;;42074:27:0:i:1;:::-;42117:34;::::0;;15528:42:1;15597:15;;;15579:34;;15644:2;15629:18;;15622:34;;;15672:18;;;15665:34;;;15735:15;;15730:2;15715:18;;15708:43;42117:34:0;;::::1;::::0;;;;15505:3:1;42117:34:0;;::::1;41755:404:::0;;;;;;:::o;20170:524::-;20326:16;20387:3;:10;20368:8;:15;:29;20360:83;;;;;;;15964:2:1;20360:83:0;;;15946:21:1;16003:2;15983:18;;;15976:30;16042:34;16022:18;;;16015:62;16113:11;16093:18;;;16086:39;16142:19;;20360:83:0;15762:405:1;20360:83:0;20456:30;20503:8;:15;20489:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20489:30:0;;20456:63;;20537:9;20532:122;20556:8;:15;20552:1;:19;20532:122;;;20612:30;20622:8;20631:1;20622:11;;;;;;;;:::i;:::-;;;;;;;20635:3;20639:1;20635:6;;;;;;;;:::i;:::-;;;;;;;20612:9;:30::i;:::-;20593:13;20607:1;20593:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;20573:3;;;:::i;:::-;;;20532:122;;;-1:-1:-1;20673:13:0;20170:524;-1:-1:-1;;;20170:524:0:o;34689:94::-;34111:6;;34258:23;34111:6;16739:10;34258:23;34250:68;;;;;;;16952:2:1;34250:68:0;;;16934:21:1;;;16971:18;;;16964:30;17030:34;17010:18;;;17003:62;17082:18;;34250:68:0;16750:356:1;34250:68:0;34754:21:::1;34772:1;34754:9;:21::i;:::-;34689:94::o:0;40129:238::-;39943:20;39952:10;39943:8;:20::i;:::-;39935:47;;;;;;;14384:2:1;39935:47:0;;;14366:21:1;14423:2;14403:18;;;14396:30;14462:16;14442:18;;;14435:44;14496:18;;39935:47:0;14182:338:1;39935:47:0;40327:32:::1;40333:7;40342:2;40346:6;40354:4;40327:5;:32::i;40637:233::-:0;34111:6;;34258:23;34111:6;16739:10;34258:23;34250:68;;;;;;;16952:2:1;34250:68:0;;;16934:21:1;;;16971:18;;;16964:30;17030:34;17010:18;;;17003:62;17082:18;;34250:68:0;16750:356:1;34250:68:0;40737:9:::1;40749:10;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40785:15;::::0;::::1;;::::0;;;:11:::1;:15;::::0;;;;;;;;:28;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;40829:33;;7642:74:1;;;40785:15:0;;-1:-1:-1;40785:15:0;;40829:33:::1;::::0;7615:18:1;40829:33:0::1;;;;;;;40726:144;40637:233:::0;:::o;20767:311::-;16739:10;20870:24;;;;;20862:78;;;;;;;17849:2:1;20862:78:0;;;17831:21:1;17888:2;17868:18;;;17861:30;17927:34;17907:18;;;17900:62;17998:11;17978:18;;;17971:39;18027:19;;20862:78:0;17647:405:1;20862:78:0;16739:10;20953:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;21022:48;;1247:41:1;;;20953:42:0;;16739:10;21022:48;;1220:18:1;21022:48:0;;;;;;;20767:311;;:::o;42332:190::-;37107:25;;;42412:4;37107:25;;;:19;:9;:25;:9;:25;;;:30;;42441:73;;;-1:-1:-1;37107:25:0;;;37078:4;37107:25;;;:19;:9;:25;:9;:25;;;:30;;42474:40;36948:197;40878:495;34111:6;;34258:23;34111:6;16739:10;34258:23;34250:68;;;;;;;16952:2:1;34250:68:0;;;16934:21:1;;;16971:18;;;16964:30;17030:34;17010:18;;;17003:62;17082:18;;34250:68:0;16750:356:1;34250:68:0;41013:7:::1;41009:357;;;41037:38;39553:24;41062:6;41070:4;41037:15;:38::i;:::-;37107:25:::0;;;37078:4;37107:25;;;:19;:9;:25;:9;:25;;;:30;41090:131:::1;;41157:48;39631:35;41198:6;41157:20;:48::i;:::-;40878:495:::0;;:::o;41009:357::-:1;41253:37;39553:24;41283:6;41253:20;:37::i;:::-;41305:49;39631:35;41341:6;41349:4;41305:15;:49::i;21390:401::-:0;21598:20;;;16739:10;21598:20;;:60;;-1:-1:-1;21622:36:0;21639:4;16739:10;21150:168;:::i;21622:36::-;21576:151;;;;;;;18259:2:1;21576:151:0;;;18241:21:1;18298:2;18278:18;;;18271:30;18337:34;18317:18;;;18310:62;18408:11;18388:18;;;18381:39;18437:19;;21576:151:0;18057:405:1;21576:151:0;21738:45;21756:4;21762:2;21766;21770:6;21778:4;21738:17;:45::i;34938:192::-;34111:6;;34258:23;34111:6;16739:10;34258:23;34250:68;;;;;;;16952:2:1;34250:68:0;;;16934:21:1;;;16971:18;;;16964:30;17030:34;17010:18;;;17003:62;17082:18;;34250:68:0;16750:356:1;34250:68:0;35027:22:::1;::::0;::::1;35019:73;;;::::0;::::1;::::0;;18669:2:1;35019:73:0::1;::::0;::::1;18651:21:1::0;18708:2;18688:18;;;18681:30;18747:34;18727:18;;;18720:62;18818:8;18798:18;;;18791:36;18844:19;;35019:73:0::1;18467:402:1::0;35019:73:0::1;35103:19;35113:8;35103:9;:19::i;:::-;34938:192:::0;:::o;42167:157::-;42252:16;42293:23;39553:24;42293:14;:23::i;:::-;42286:30;;42167:157;:::o;27314:735::-;27492:16;;;27484:62;;;;;;;19076:2:1;27484:62:0;;;19058:21:1;19115:2;19095:18;;;19088:30;19154:34;19134:18;;;19127:62;19225:3;19205:18;;;19198:31;19246:19;;27484:62:0;18874:397:1;27484:62:0;27579:7;:14;27565:3;:10;:28;27557:81;;;;;;;19478:2:1;27557:81:0;;;19460:21:1;19517:2;19497:18;;;19490:30;19556:34;19536:18;;;19529:62;19627:10;19607:18;;;19600:38;19655:19;;27557:81:0;19276:404:1;27557:81:0;16739:10;27651:16;27774:103;27798:3;:10;27794:1;:14;27774:103;;;27855:7;27863:1;27855:10;;;;;;;;:::i;:::-;;;;;;;27830:9;:17;27840:3;27844:1;27840:6;;;;;;;;:::i;:::-;;;;;;;27830:17;;;;;;;;;;;:21;27848:2;27830:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;27810:3:0;;-1:-1:-1;27810:3:0;;;:::i;:::-;;;;27774:103;;;;27930:2;27894:53;;27926:1;27894:53;;27908:8;27894:53;;;27934:3;27939:7;27894:53;;;;;;;:::i;:::-;;;;;;;;27960:81;27996:8;28014:1;28018:2;28022:3;28027:7;28036:4;27960:35;:81::i;23952:1074::-;24179:7;:14;24165:3;:10;:28;24157:81;;;;;;;19478:2:1;24157:81:0;;;19460:21:1;19517:2;19497:18;;;19490:30;19556:34;19536:18;;;19529:62;19627:10;19607:18;;;19600:38;19655:19;;24157:81:0;19276:404:1;24157:81:0;24257:16;;;24249:66;;;;;;;20490:2:1;24249:66:0;;;20472:21:1;20529:2;20509:18;;;20502:30;20568:34;20548:18;;;20541:62;20639:7;20619:18;;;20612:35;20664:19;;24249:66:0;20288:401:1;24249:66:0;16739:10;24328:16;24445:421;24469:3;:10;24465:1;:14;24445:421;;;24501:10;24514:3;24518:1;24514:6;;;;;;;;:::i;:::-;;;;;;;24501:19;;24535:14;24552:7;24560:1;24552:10;;;;;;;;:::i;:::-;;;;;;;;;;;;24579:19;24601:13;;;;;;;;;;:19;;;;;;;;;;;;;24552:10;;-1:-1:-1;24643:21:0;;;;24635:76;;;;;;;20896:2:1;24635:76:0;;;20878:21:1;20935:2;20915:18;;;20908:30;20974:34;20954:18;;;20947:62;21045:12;21025:18;;;21018:40;21075:19;;24635:76:0;20694:406:1;24635:76:0;24755:9;:13;;;;;;;;;;;:19;;;;;;;;;;;24777:20;;;24755:42;;24827:17;;;;;;;:27;;24777:20;;24755:9;24827:27;;24777:20;;24827:27;:::i;:::-;;;;;;;;24486:380;;;24481:3;;;;:::i;:::-;;;24445:421;;;;24913:2;24883:47;;24907:4;24883:47;;24897:8;24883:47;;;24917:3;24922:7;24883:47;;;;;;;:::i;:::-;;;;;;;;24943:75;24979:8;24989:4;24995:2;24999:3;25004:7;25013:4;24943:35;:75::i;:::-;24146:880;23952:1074;;;;;:::o;26359:599::-;26517:21;;;26509:67;;;;;;;19076:2:1;26509:67:0;;;19058:21:1;19115:2;19095:18;;;19088:30;19154:34;19134:18;;;19127:62;19225:3;19205:18;;;19198:31;19246:19;;26509:67:0;18874:397:1;26509:67:0;16739:10;26633:107;16739:10;26589:16;26676:7;26685:21;26703:2;26685:17;:21::i;:::-;26708:25;26726:6;26708:17;:25::i;26633:107::-;26753:9;:13;;;;;;;;;;;:22;;;;;;;;;;:32;;26779:6;;26753:9;:32;;26779:6;;26753:32;:::i;:::-;;;;-1:-1:-1;;26801:57:0;;;21279:25:1;;;21335:2;21320:18;;21313:34;;;26801:57:0;;;;;26834:1;;26801:57;;;;;;21252:18:1;26801:57:0;;;;;;;26871:79;26902:8;26920:1;26924:7;26933:2;26937:6;26945:4;26871:30;:79::i;35138:173::-;35213:6;;;;35230:17;;;;;;;;;;;35263:40;;35213:6;;;35230:17;35213:6;;35263:40;;35194:16;;35263:40;35183:128;35138:173;:::o;35680:554::-;35817:15;35835:9;;;:4;:9;;;;;;;;35863:19;;;;;:13;;;:19;;;;;;;:24;35855:51;;;;;;;21560:2:1;35855:51:0;;;21542:21:1;21599:2;21579:18;;;21572:30;21638:16;21618:18;;;21611:44;21672:18;;35855:51:0;21358:338:1;35855:51:0;35923:12;35919:239;;;35984:9;;;;35960:20;;:33;35952:71;;;;;;;21903:2:1;35952:71:0;;;21885:21:1;21942:2;21922:18;;;21915:30;21981:27;21961:18;;;21954:55;22026:18;;35952:71:0;21701:349:1;35952:71:0;36038:24;;;;;;;-1:-1:-1;36038:24:0;;;;;;;;;;;;;;;;;35919:239;;;36103:20;;:25;36095:51;;;;;;;22257:2:1;36095:51:0;;;22239:21:1;22296:2;22276:18;;;22269:30;22335:15;22315:18;;;22308:43;22368:18;;36095:51:0;22055:337:1;36095:51:0;36183:1;36170:3;:9;;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;36217:9:0;;;;36195:19;;;;;;;;:13;;;;:19;;;;;:31;;;;-1:-1:-1;;35680:554:0:o;36242:600::-;36362:15;36380:9;;;:4;:9;;;;;;;;36411:19;;;;;:13;;;:19;;;;;;;36449:8;36441:31;;;;;;;22599:2:1;36441:31:0;;;22581:21:1;22638:2;22618:18;;;22611:30;22677:12;22657:18;;;22650:40;22707:18;;36441:31:0;22397:334:1;36441:31:0;36492:19;;;;;;;:13;;;;:19;;;;;36485:26;;;36522:9;;;:14;;36492:13;;36522:9;;:14;;36492:13;;36522:14;:::i;:::-;;;;-1:-1:-1;;36553:20:0;;:24;36549:286;;36594:16;36613:3;:13;;36627:3;:9;;;36613:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;36656:16:0;;;;36652:138;;36718:8;36693:3;36707:7;36713:1;36707:3;:7;:::i;:::-;36693:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;;;;;;;;36745:23;;;;;-1:-1:-1;36745:13:0;;:23;;;;;;:29;;;36652:138;36804:19;;:3;;:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36351:491:0;;36242:600;;:::o;22774:820::-;22962:16;;;22954:66;;;;;;;20490:2:1;22954:66:0;;;20472:21:1;20529:2;20509:18;;;20502:30;20568:34;20548:18;;;20541:62;20639:7;20619:18;;;20612:35;20664:19;;22954:66:0;20288:401:1;22954:66:0;16739:10;23077:96;16739:10;23108:4;23114:2;23118:21;23136:2;23118:17;:21::i;23077:96::-;23186:19;23208:13;;;;;;;;;;;:19;;;;;;;;;;;23246:21;;;;23238:76;;;;;;;20896:2:1;23238:76:0;;;20878:21:1;20935:2;20915:18;;;20908:30;20974:34;20954:18;;;20947:62;21045:12;21025:18;;;21018:40;21075:19;;23238:76:0;20694:406:1;23238:76:0;23350:9;:13;;;;;;;;;;;:19;;;;;;;;;;;23372:20;;;23350:42;;23414:17;;;;;;;:27;;23372:20;;23350:9;23414:27;;23372:20;;23414:27;:::i;:::-;;;;-1:-1:-1;;23459:46:0;;;21279:25:1;;;21335:2;21320:18;;21313:34;;;23459:46:0;;;;;;;;;;;;;;;21252:18:1;23459:46:0;;;;;;;23518:68;23549:8;23559:4;23565:2;23569;23573:6;23581:4;23518:30;:68::i;:::-;22943:651;;22774:820;;;;;:::o;37335:264::-;37456:15;37474:9;;;:4;:9;;;;;37515:20;;37502:9;;;;37422:16;;37474:9;37502:33;37494:60;;;;;;;23257:2:1;37494:60:0;;;23239:21:1;23296:2;23276:18;;;23269:30;23335:16;23315:18;;;23308:44;23369:18;;37494:60:0;23055:338:1;37494:60:0;37572:9;;;;:4;:9;;;;;;;;;37565:26;;;;;;;;;;;;;;;;;37572:9;;37565:26;;37572:9;37565:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37335:264;;;:::o;32041:813::-;32281:13;;;9053:20;9101:8;32277:570;;32317:79;;;;;:43;;;;;;:79;;32361:8;;32371:4;;32377:3;;32382:7;;32391:4;;32317:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32317:79:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32313:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32709:6;32702:14;;;;;;;;;;;:::i;32313:523::-;;;32758:62;;;;;25629:2:1;32758:62:0;;;25611:21:1;25668:2;25648:18;;;25641:30;25707:34;25687:18;;;25680:62;25778:22;25758:18;;;25751:50;25818:19;;32758:62:0;25427:416:1;32313:523:0;32478:60;;;32490:48;32478:60;32474:159;;32563:50;;;;;26050:2:1;32563:50:0;;;26032:21:1;26089:2;26069:18;;;26062:30;26128:34;26108:18;;;26101:62;26199:10;26179:18;;;26172:38;26227:19;;32563:50:0;25848:404:1;32862:198:0;32982:16;;;32996:1;32982:16;;;;;;;;;32928;;32957:22;;32982:16;;;;;;;;;;;;-1:-1:-1;32982:16:0;32957:41;;33020:7;33009:5;33015:1;33009:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;33047:5;32862:198;-1:-1:-1;;32862:198:0:o;31289:744::-;31504:13;;;9053:20;9101:8;31500:526;;31540:72;;;;;:38;;;;;;:72;;31579:8;;31589:4;;31595:2;;31599:6;;31607:4;;31540:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31540:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31536:479;;;;:::i;:::-;31662:55;;;31674:43;31662:55;31658:154;;31742:50;;;;;26050:2:1;31742:50:0;;;26032:21:1;26089:2;26069:18;;;26062:30;26128:34;26108:18;;;26101:62;26199:10;26179:18;;;26172:38;26227:19;;31742:50:0;25848:404:1;14:154;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;675:177::-;760:66;753:5;749:78;742:5;739:89;729:117;;842:1;839;832:12;857:245;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1023:9;1010:23;1042:30;1066:5;1042:30;:::i;1299:180::-;1358:6;1411:2;1399:9;1390:7;1386:23;1382:32;1379:52;;;1427:1;1424;1417:12;1379:52;-1:-1:-1;1450:23:1;;1299:180;-1:-1:-1;1299:180:1:o;1484:258::-;1556:1;1566:113;1580:6;1577:1;1574:13;1566:113;;;1656:11;;;1650:18;1637:11;;;1630:39;1602:2;1595:10;1566:113;;;1697:6;1694:1;1691:13;1688:48;;;-1:-1:-1;;1732:1:1;1714:16;;1707:27;1484:258::o;1747:317::-;1789:3;1827:5;1821:12;1854:6;1849:3;1842:19;1870:63;1926:6;1919:4;1914:3;1910:14;1903:4;1896:5;1892:16;1870:63;:::i;:::-;1978:2;1966:15;1983:66;1962:88;1953:98;;;;2053:4;1949:109;;1747:317;-1:-1:-1;;1747:317:1:o;2069:220::-;2218:2;2207:9;2200:21;2181:4;2238:45;2279:2;2268:9;2264:18;2256:6;2238:45;:::i;2294:184::-;2346:77;2343:1;2336:88;2443:4;2440:1;2433:15;2467:4;2464:1;2457:15;2483:308;2589:66;2584:2;2578:4;2574:13;2570:86;2562:6;2558:99;2723:6;2711:10;2708:22;2687:18;2675:10;2672:34;2669:62;2666:88;;;2734:18;;:::i;:::-;2770:2;2763:22;-1:-1:-1;;2483:308:1:o;2796:183::-;2856:4;2889:18;2881:6;2878:30;2875:56;;;2911:18;;:::i;:::-;-1:-1:-1;2956:1:1;2952:14;2968:4;2948:25;;2796:183::o;2984:724::-;3038:5;3091:3;3084:4;3076:6;3072:17;3068:27;3058:55;;3109:1;3106;3099:12;3058:55;3145:6;3132:20;3171:4;3194:43;3234:2;3194:43;:::i;:::-;3266:2;3260:9;3278:31;3306:2;3298:6;3278:31;:::i;:::-;3344:18;;;3436:1;3432:10;;;;3420:23;;3416:32;;;3378:15;;;;-1:-1:-1;3460:15:1;;;3457:35;;;3488:1;3485;3478:12;3457:35;3524:2;3516:6;3512:15;3536:142;3552:6;3547:3;3544:15;3536:142;;;3618:17;;3606:30;;3656:12;;;;3569;;3536:142;;;-1:-1:-1;3696:6:1;2984:724;-1:-1:-1;;;;;;2984:724:1:o;3713:245::-;3761:4;3794:18;3786:6;3783:30;3780:56;;;3816:18;;:::i;:::-;-1:-1:-1;3873:2:1;3861:15;3878:66;3857:88;3947:4;3853:99;;3713:245::o;3963:508::-;4005:5;4058:3;4051:4;4043:6;4039:17;4035:27;4025:55;;4076:1;4073;4066:12;4025:55;4112:6;4099:20;4138:31;4166:2;4138:31;:::i;:::-;4198:2;4192:9;4210:31;4238:2;4230:6;4210:31;:::i;:::-;4265:2;4257:6;4250:18;4311:3;4304:4;4299:2;4291:6;4287:15;4283:26;4280:35;4277:55;;;4328:1;4325;4318:12;4277:55;4392:2;4385:4;4377:6;4373:17;4366:4;4358:6;4354:17;4341:54;4439:1;4415:15;;;4432:4;4411:26;4404:37;;;;-1:-1:-1;4419:6:1;3963:508;-1:-1:-1;;;3963:508:1:o;4476:929::-;4621:6;4629;4637;4645;4698:3;4686:9;4677:7;4673:23;4669:33;4666:53;;;4715:1;4712;4705:12;4666:53;4754:9;4741:23;4773:31;4798:5;4773:31;:::i;:::-;4823:5;-1:-1:-1;4879:2:1;4864:18;;4851:32;4902:18;4932:14;;;4929:34;;;4959:1;4956;4949:12;4929:34;4982:61;5035:7;5026:6;5015:9;5011:22;4982:61;:::i;:::-;4972:71;;5096:2;5085:9;5081:18;5068:32;5052:48;;5125:2;5115:8;5112:16;5109:36;;;5141:1;5138;5131:12;5109:36;5164:63;5219:7;5208:8;5197:9;5193:24;5164:63;:::i;:::-;5154:73;;5280:2;5269:9;5265:18;5252:32;5236:48;;5309:2;5299:8;5296:16;5293:36;;;5325:1;5322;5315:12;5293:36;;5348:51;5391:7;5380:8;5369:9;5365:24;5348:51;:::i;:::-;5338:61;;;4476:929;;;;;;;:::o;5410:1071::-;5564:6;5572;5580;5588;5596;5649:3;5637:9;5628:7;5624:23;5620:33;5617:53;;;5666:1;5663;5656:12;5617:53;5705:9;5692:23;5724:31;5749:5;5724:31;:::i;:::-;5774:5;-1:-1:-1;5831:2:1;5816:18;;5803:32;5844:33;5803:32;5844:33;:::i;:::-;5896:7;-1:-1:-1;5954:2:1;5939:18;;5926:32;5977:18;6007:14;;;6004:34;;;6034:1;6031;6024:12;6004:34;6057:61;6110:7;6101:6;6090:9;6086:22;6057:61;:::i;:::-;6047:71;;6171:2;6160:9;6156:18;6143:32;6127:48;;6200:2;6190:8;6187:16;6184:36;;;6216:1;6213;6206:12;6184:36;6239:63;6294:7;6283:8;6272:9;6268:24;6239:63;:::i;:::-;6229:73;;6355:3;6344:9;6340:19;6327:33;6311:49;;6385:2;6375:8;6372:16;6369:36;;;6401:1;6398;6391:12;6369:36;;6424:51;6467:7;6456:8;6445:9;6441:24;6424:51;:::i;:::-;6414:61;;;5410:1071;;;;;;;;:::o;6486:1005::-;6592:6;6600;6608;6616;6624;6632;6685:3;6673:9;6664:7;6660:23;6656:33;6653:53;;;6702:1;6699;6692:12;6653:53;6741:9;6728:23;6760:31;6785:5;6760:31;:::i;:::-;6810:5;-1:-1:-1;6862:2:1;6847:18;;6834:32;;-1:-1:-1;6913:2:1;6898:18;;6885:32;;-1:-1:-1;6969:2:1;6954:18;;6941:32;6982:33;6941:32;6982:33;:::i;:::-;7034:7;-1:-1:-1;7092:3:1;7077:19;;7064:33;7116:18;7146:14;;;7143:34;;;7173:1;7170;7163:12;7143:34;7211:6;7200:9;7196:22;7186:32;;7256:7;7249:4;7245:2;7241:13;7237:27;7227:55;;7278:1;7275;7268:12;7227:55;7318:2;7305:16;7344:2;7336:6;7333:14;7330:34;;;7360:1;7357;7350:12;7330:34;7405:7;7400:2;7391:6;7387:2;7383:15;7379:24;7376:37;7373:57;;;7426:1;7423;7416:12;7373:57;7457:2;7453;7449:11;7439:21;;7479:6;7469:16;;;;;6486:1005;;;;;;;;:::o;7727:1277::-;7845:6;7853;7906:2;7894:9;7885:7;7881:23;7877:32;7874:52;;;7922:1;7919;7912:12;7874:52;7962:9;7949:23;7991:18;8032:2;8024:6;8021:14;8018:34;;;8048:1;8045;8038:12;8018:34;8086:6;8075:9;8071:22;8061:32;;8131:7;8124:4;8120:2;8116:13;8112:27;8102:55;;8153:1;8150;8143:12;8102:55;8189:2;8176:16;8211:4;8234:43;8274:2;8234:43;:::i;:::-;8306:2;8300:9;8318:31;8346:2;8338:6;8318:31;:::i;:::-;8384:18;;;8472:1;8468:10;;;;8460:19;;8456:28;;;8418:15;;;;-1:-1:-1;8496:19:1;;;8493:39;;;8528:1;8525;8518:12;8493:39;8552:11;;;;8572:217;8588:6;8583:3;8580:15;8572:217;;;8668:3;8655:17;8685:31;8710:5;8685:31;:::i;:::-;8729:18;;8605:12;;;;8767;;;;8572:217;;;8808:6;-1:-1:-1;;8852:18:1;;8839:32;;-1:-1:-1;;8883:16:1;;;8880:36;;;8912:1;8909;8902:12;8880:36;;8935:63;8990:7;8979:8;8968:9;8964:24;8935:63;:::i;:::-;8925:73;;;7727:1277;;;;;:::o;9009:435::-;9062:3;9100:5;9094:12;9127:6;9122:3;9115:19;9153:4;9182:2;9177:3;9173:12;9166:19;;9219:2;9212:5;9208:14;9240:1;9250:169;9264:6;9261:1;9258:13;9250:169;;;9325:13;;9313:26;;9359:12;;;;9394:15;;;;9286:1;9279:9;9250:169;;;-1:-1:-1;9435:3:1;;9009:435;-1:-1:-1;;;;;9009:435:1:o;9449:261::-;9628:2;9617:9;9610:21;9591:4;9648:56;9700:2;9689:9;9685:18;9677:6;9648:56;:::i;9715:592::-;9810:6;9818;9826;9834;9887:3;9875:9;9866:7;9862:23;9858:33;9855:53;;;9904:1;9901;9894:12;9855:53;9943:9;9930:23;9962:31;9987:5;9962:31;:::i;:::-;10012:5;-1:-1:-1;10064:2:1;10049:18;;10036:32;;-1:-1:-1;10115:2:1;10100:18;;10087:32;;-1:-1:-1;10170:2:1;10155:18;;10142:32;10197:18;10186:30;;10183:50;;;10229:1;10226;10219:12;10183:50;10252:49;10293:7;10284:6;10273:9;10269:22;10252:49;:::i;10312:267::-;10391:6;10444:2;10432:9;10423:7;10419:23;10415:32;10412:52;;;10460:1;10457;10450:12;10412:52;10499:9;10486:23;10518:31;10543:5;10518:31;:::i;10584:416::-;10649:6;10657;10710:2;10698:9;10689:7;10685:23;10681:32;10678:52;;;10726:1;10723;10716:12;10678:52;10765:9;10752:23;10784:31;10809:5;10784:31;:::i;:::-;10834:5;-1:-1:-1;10891:2:1;10876:18;;10863:32;10933:15;;10926:23;10914:36;;10904:64;;10964:1;10961;10954:12;10904:64;10987:7;10977:17;;;10584:416;;;;;:::o;11257:388::-;11325:6;11333;11386:2;11374:9;11365:7;11361:23;11357:32;11354:52;;;11402:1;11399;11392:12;11354:52;11441:9;11428:23;11460:31;11485:5;11460:31;:::i;:::-;11510:5;-1:-1:-1;11567:2:1;11552:18;;11539:32;11580:33;11539:32;11580:33;:::i;11650:734::-;11754:6;11762;11770;11778;11786;11839:3;11827:9;11818:7;11814:23;11810:33;11807:53;;;11856:1;11853;11846:12;11807:53;11895:9;11882:23;11914:31;11939:5;11914:31;:::i;:::-;11964:5;-1:-1:-1;12021:2:1;12006:18;;11993:32;12034:33;11993:32;12034:33;:::i;:::-;12086:7;-1:-1:-1;12140:2:1;12125:18;;12112:32;;-1:-1:-1;12191:2:1;12176:18;;12163:32;;-1:-1:-1;12246:3:1;12231:19;;12218:33;12274:18;12263:30;;12260:50;;;12306:1;12303;12296:12;12260:50;12329:49;12370:7;12361:6;12350:9;12346:22;12329:49;:::i;12389:681::-;12560:2;12612:21;;;12682:13;;12585:18;;;12704:22;;;12531:4;;12560:2;12783:15;;;;12757:2;12742:18;;;12531:4;12826:218;12840:6;12837:1;12834:13;12826:218;;;12905:13;;12920:42;12901:62;12889:75;;13019:15;;;;12984:12;;;;12862:1;12855:9;12826:218;;;-1:-1:-1;13061:3:1;;12389:681;-1:-1:-1;;;;;;12389:681:1:o;13487:690::-;13567:6;13620:2;13608:9;13599:7;13595:23;13591:32;13588:52;;;13636:1;13633;13626:12;13588:52;13669:9;13663:16;13702:18;13694:6;13691:30;13688:50;;;13734:1;13731;13724:12;13688:50;13757:22;;13810:4;13802:13;;13798:27;-1:-1:-1;13788:55:1;;13839:1;13836;13829:12;13788:55;13868:2;13862:9;13890:31;13918:2;13890:31;:::i;:::-;13950:2;13944:9;13962:31;13990:2;13982:6;13962:31;:::i;:::-;14017:2;14009:6;14002:18;14057:7;14052:2;14047;14043;14039:11;14035:20;14032:33;14029:53;;;14078:1;14075;14068:12;14029:53;14091:55;14143:2;14138;14130:6;14126:15;14121:2;14117;14113:11;14091:55;:::i;:::-;14165:6;13487:690;-1:-1:-1;;;;;;13487:690:1:o;16172:184::-;16224:77;16221:1;16214:88;16321:4;16318:1;16311:15;16345:4;16342:1;16335:15;16361:184;16413:77;16410:1;16403:88;16510:4;16507:1;16500:15;16534:4;16531:1;16524:15;16550:195;16589:3;16620:66;16613:5;16610:77;16607:103;;;16690:18;;:::i;:::-;-1:-1:-1;16737:1:1;16726:13;;16550:195::o;17111:280::-;17180:6;17233:2;17221:9;17212:7;17208:23;17204:32;17201:52;;;17249:1;17246;17239:12;17201:52;17281:9;17275:16;17331:10;17324:5;17320:22;17313:5;17310:33;17300:61;;17357:1;17354;17347:12;19685:128;19725:3;19756:1;19752:6;19749:1;19746:13;19743:39;;;19762:18;;:::i;:::-;-1:-1:-1;19798:9:1;;19685:128::o;19818:465::-;20075:2;20064:9;20057:21;20038:4;20101:56;20153:2;20142:9;20138:18;20130:6;20101:56;:::i;:::-;20205:9;20197:6;20193:22;20188:2;20177:9;20173:18;20166:50;20233:44;20270:6;20262;20233:44;:::i;:::-;20225:52;19818:465;-1:-1:-1;;;;;19818:465:1:o;22736:125::-;22776:4;22804:1;22801;22798:8;22795:34;;;22809:18;;:::i;:::-;-1:-1:-1;22846:9:1;;22736:125::o;22866:184::-;22918:77;22915:1;22908:88;23015:4;23012:1;23005:15;23039:4;23036:1;23029:15;23398:850;23720:4;23749:42;23830:2;23822:6;23818:15;23807:9;23800:34;23882:2;23874:6;23870:15;23865:2;23854:9;23850:18;23843:43;;23922:3;23917:2;23906:9;23902:18;23895:31;23949:57;24001:3;23990:9;23986:19;23978:6;23949:57;:::i;:::-;24054:9;24046:6;24042:22;24037:2;24026:9;24022:18;24015:50;24088:44;24125:6;24117;24088:44;:::i;:::-;24074:58;;24181:9;24173:6;24169:22;24163:3;24152:9;24148:19;24141:51;24209:33;24235:6;24227;24209:33;:::i;:::-;24201:41;23398:850;-1:-1:-1;;;;;;;;23398:850:1:o;24253:249::-;24322:6;24375:2;24363:9;24354:7;24350:23;24346:32;24343:52;;;24391:1;24388;24381:12;24343:52;24423:9;24417:16;24442:30;24466:5;24442:30;:::i;24507:179::-;24542:3;24584:1;24566:16;24563:23;24560:120;;;24630:1;24627;24624;24609:23;-1:-1:-1;24667:1:1;24661:8;24656:3;24652:18;24560:120;24507:179;:::o;24691:731::-;24730:3;24772:4;24754:16;24751:26;24748:39;;;24691:731;:::o;24748:39::-;24814:2;24808:9;24836:66;24957:2;24939:16;24935:25;24932:1;24926:4;24911:50;24990:4;24984:11;25014:16;25049:18;25120:2;25113:4;25105:6;25101:17;25098:25;25093:2;25085:6;25082:14;25079:45;25076:58;;;25127:5;;;;;24691:731;:::o;25076:58::-;25164:6;25158:4;25154:17;25143:28;;25200:3;25194:10;25227:2;25219:6;25216:14;25213:27;;;25233:5;;;;;;24691:731;:::o;25213:27::-;25317:2;25298:16;25292:4;25288:27;25284:36;25277:4;25268:6;25263:3;25259:16;25255:27;25252:69;25249:82;;;25324:5;;;;;;24691:731;:::o;25249:82::-;25340:57;25391:4;25382:6;25374;25370:19;25366:30;25360:4;25340:57;:::i;:::-;-1:-1:-1;25413:3:1;;24691:731;-1:-1:-1;;;;;24691:731:1:o;26257:584::-;26479:4;26508:42;26589:2;26581:6;26577:15;26566:9;26559:34;26641:2;26633:6;26629:15;26624:2;26613:9;26609:18;26602:43;;26681:6;26676:2;26665:9;26661:18;26654:34;26724:6;26719:2;26708:9;26704:18;26697:34;26768:3;26762;26751:9;26747:19;26740:32;26789:46;26830:3;26819:9;26815:19;26807:6;26789:46;:::i;:::-;26781:54;26257:584;-1:-1:-1;;;;;;;26257:584:1:o

Swarm Source

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