ETH Price: $2,604.84 (+0.06%)
Gas: 6 Gwei

Token

Birthroom by NFT ART TOKYO (BTR)
 

Overview

Max Total Supply

148 BTR

Holders

148

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x855111488654118674bf241a0f30c7208543dc78
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:
Birthroom

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-30
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

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


abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155Supply {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}

// File: kizuna/kizuna.sol


pragma solidity ^0.8.9;




pragma solidity ^0.8.9;



pragma solidity ^0.8.9;
abstract contract Operable is Context {
    mapping(address => bool) _operators;
    modifier onlyOperator() {
        _checkOperatorRole(_msgSender());
        _;
    }
    function isOperator(address _operator) public view returns (bool) {
        return _operators[_operator];
    }
    function _grantOperatorRole(address _candidate) internal {
        require(
            !_operators[_candidate],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is already has an operator role"
                )
            )
        );
        _operators[_candidate] = true;
    }
    function _revokeOperatorRole(address _candidate) internal {
        _checkOperatorRole(_candidate);
        delete _operators[_candidate];
    }
    function _checkOperatorRole(address _operator) internal view {
        require(
            _operators[_operator],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is not an operator"
                )
            )
        );
    }
}

// File: EXO/NEW/EXO.sol

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}




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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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




pragma solidity ^0.8.7;
abstract contract MerkleProof {
    bytes32 internal _wlMerkleRoot;
    mapping(uint256 => bytes32) internal _alMerkleRoot;
    uint256 public phaseId;

    function _setWlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _wlMerkleRoot = merkleRoot_;
    }
    function isWhitelisted(string memory _passwd, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(_passwd));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _wlMerkleRoot;
    }

    function _setAlMerkleRootWithId(uint256 _phaseId,bytes32 merkleRoot_) internal virtual {
        _alMerkleRoot[_phaseId] = merkleRoot_;
    }

    function _setAlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _alMerkleRoot[phaseId] = merkleRoot_;
    }

    function isAllowlisted(address address_,uint256 _phaseId, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _alMerkleRoot[_phaseId];
    }

}



pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);
    bool public operatorFilteringEnabled = true;

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}


pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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



contract Birthroom is ERC1155URIStorage, Ownable, Operable,ReentrancyGuard, DefaultOperatorFilterer,ERC2981,MerkleProof {
    using Strings for string;

    string public name = 'Birthroom by NFT ART TOKYO';
    string public symbol = 'BTR';
    mapping(address => bool) bondedAddress;
    bool unlock = true;
    uint256 public nowPhaseWl;
    uint256 public nowPhaseAl;
    uint256 public wlMintPrice = 0.0 ether;
    uint256 public alMintPrice = 0.0 ether;
    uint256 public mintable;
    uint256 internal nftId;
    uint256 public maxMintsPerWL = 1;
    mapping(uint256 => uint256) public maxMintsPerAL;
    uint256 public maxMintsPerALOT = 1;
    bool public isWlSaleEnabled;
    bool public isAlSaleEnabled;
    mapping(uint256 => mapping(address => uint256)) internal _alMinted;
    mapping(uint256 => mapping(address => uint256)) internal _wlMinted;
    mapping(string => uint256) internal _pswdMinted;
    address public deployer;

    constructor(
        address payable _ownerAdd
    ) ERC1155('') {
        _grantOperatorRole(0x637d25D0769f747B2742A04d249802dA85395970);
        deployer = _ownerAdd;
        _grantOperatorRole(deployer);
        _setDefaultRoyalty(deployer,1000);
        _setBaseURI('https://arweave.net/u-jGG-dg3L_1OTueE_AqbNHfMbF0CmvT1e8GnDbqc44');
        _wlMerkleRoot = 0x37bf940f5237cce27ec044ecead10b604d34374ad9c18f030ad1293882fa0c08;
        // initializeSBT(0, '/');
    }

  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOperator {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }

    //OPENSEA.OPERATORFilterer.START
    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOperator {
        operatorFilteringEnabled = value;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }


    //OPENSEA.OPERATORFilterer.END


    function locked(address to) external view returns (bool) {
        return bondedAddress[to];
    }

    function bound(address to, bool flag) public onlyOperator {
        bondedAddress[to] = flag;
    }

    function setBaseURI(string memory uri_) external onlyOperator {
        _setBaseURI(uri_);
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI)
        external
        onlyOperator
    {
        _setURI(tokenId, _tokenURI);
    }

    function initializeSBT(uint256 tokenId, string memory _tokenURI)
        public
        onlyOperator
    {
        require(bytes(uri(tokenId)).length == 0, 'SBT already exists');
        _mint(deployer, tokenId, 1, '');
        _setURI(tokenId, _tokenURI);
    }
  //WL mint.
  function whitelistMint(uint256 _amount, bytes32[] memory proof_,string memory _passwd) external payable virtual nonReentrant {
    require(bytes(uri(nftId)).length != 0, 'Not initialized');
    require(isWlSaleEnabled, "whitelistMint is Paused");
    require(isWhitelisted(_passwd, proof_), "You are not whitelisted!");
    require(maxMintsPerWL >= _wlMinted[nowPhaseWl][msg.sender] + _amount, "You have no whitelistMint left");
    require(maxMintsPerWL >= _pswdMinted[_passwd] + _amount, "this pswd have no whitelistMint left");
    require(msg.value == wlMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply(nftId)) <= (mintable) || mintable == 0, "No more NFTs");
    _wlMinted[nowPhaseWl][msg.sender] += _amount;
    _pswdMinted[_passwd] += _amount;
    _mint(msg.sender, nftId, _amount, '');
  }

    //AL mint.
  function allowlistMint(uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(bytes(uri(nftId)).length != 0, 'Not initialized');
    require(isAlSaleEnabled, "allowlistMint is Paused");
    require(isAllowlisted(msg.sender,phaseId, proof_), "You are not whitelisted!");
    require(maxMintsPerALOT >= _amount, "allowlistMint: Over max mints per one time");
    require(maxMintsPerAL[phaseId] >= _amount, "allowlistMint: Over max mints per wallet");
    require(maxMintsPerAL[phaseId] >= _alMinted[nowPhaseAl][msg.sender] + _amount, "You have no whitelistMint left");
    require(msg.value == alMintPrice * _amount, "ETH value is not correct");
    require((_amount + totalSupply(nftId)) <= (mintable) || mintable == 0, "No more NFTs");
    _alMinted[nowPhaseAl][msg.sender] += _amount;
    _mint(msg.sender, nftId, _amount, '');
  }
  function setMintable(uint256 _mintable) external virtual onlyOperator {
    mintable = _mintable;
  }
  // GET MINTED COUNT.
  function wlMinted(address _address) external view virtual returns (uint256){
    return _wlMinted[nowPhaseWl][_address];
  }

  function alMinted(address _address) external view virtual returns (uint256){
    return _alMinted[nowPhaseAl][_address];
  }
  function alIdMinted(uint256 _nowPhaseAl,address _address) external view virtual returns (uint256){
    return _alMinted[_nowPhaseAl][_address];
  }
  function pswdMinted(string memory _passwd) external view virtual returns (uint256){
    return _pswdMinted[_passwd];
  }

    // GET phaseId.
  function getPhaseId() external view virtual returns (uint256){
    return phaseId;
  }
    // SET phaseId.
  function setPhaseId(uint256 _phaseId) external virtual onlyOperator {
    phaseId = _phaseId;
  }
    // SET phaseId.
  function setPhaseIdWithReset(uint256 _phaseId) external virtual onlyOperator {
    phaseId = _phaseId;
    nowPhaseAl += 1;
  }

  function setNowPhaseAl(uint256 _nowPhaseAl) external virtual onlyOperator {
    nowPhaseAl = _nowPhaseAl;
  }

  function setMaxMintsPerALOT(uint256 _maxMintsPerALOT) external virtual onlyOperator {
    maxMintsPerALOT = _maxMintsPerALOT;
  }
  function setMaxMintsPerAL(uint256 _maxMintsPerAL,uint256 _id) external virtual onlyOperator {
    maxMintsPerAL[_id] = _maxMintsPerAL;
  }
  function setMerkleRootAlWithId(uint256 _phaseId,bytes32 merkleRoot_) external virtual onlyOperator {
    _setAlMerkleRootWithId(_phaseId,merkleRoot_);
  }

  //WL.SaleEnable
  function setWhitelistSaleEnable(bool bool_) external virtual onlyOperator {
    isWlSaleEnabled = bool_;
  }

  //AL.SaleEnable
  function setAllowlistSaleEnable(bool bool_) external virtual onlyOperator {
    isAlSaleEnabled = bool_;
  }
  //setUnlock
  function setUnlock(bool bool_) external virtual onlyOperator {
    unlock = bool_;
  }

    function mint(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        require(bytes(uri(id)).length != 0, 'Not initialized');
        _mint(to, id, amount, '');
    }

    function batchMintTo(
        address[] memory list,
        uint256 id,
        uint256[] memory amount
    ) public onlyOperator {
        for (uint256 i = 0; i < list.length; i++) {
            _mint(list[i], id, amount[i], '');
        }
    }

    function burnAdmin(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        _burn(to, id, amount);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        require(
            operator == owner() || bondedAddress[operator] == true || unlock == true || from == address(0),
            'Send NFT not allowed'
        );
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
    /**
        @dev Operable.Role.ADD
     */
    function grantOperatorRole(address _candidate) external onlyOwner {
        _grantOperatorRole(_candidate);
    }
    /**
        @dev Operable.Role.REMOVE
     */
    function revokeOperatorRole(address _candidate) external onlyOwner {
        _revokeOperatorRole(_candidate);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_ownerAdd","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nowPhaseAl","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"alIdMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"alMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","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":"list","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"bound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPhaseId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"grantOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"initializeSBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_passwd","type":"string"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMintsPerAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerALOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowPhaseAl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowPhaseWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_passwd","type":"string"}],"name":"pswdMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"revokeOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setAllowlistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintsPerAL","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setMaxMintsPerAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintsPerALOT","type":"uint256"}],"name":"setMaxMintsPerALOT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootAlWithId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintable","type":"uint256"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nowPhaseAl","type":"uint256"}],"name":"setNowPhaseAl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"setPhaseId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"setPhaseIdWithReset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhitelistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"},{"internalType":"string","name":"_passwd","type":"string"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a0604052600060809081526004906200001a9082620007b2565b506009805460ff1916600117905560408051808201909152601a81527f4269727468726f6f6d206279204e46542041525420544f4b594f0000000000006020820152600f906200006b9082620007b2565b50604080518082019091526003815262212a2960e91b6020820152601090620000959082620007b2565b506012805460ff19166001908117909155600060158190556016556019819055601b55348015620000c557600080fd5b5060405162004e2138038062004e21833981016040819052620000e8916200087e565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060200160405280600081525062000120816200032a60201b60201c565b506200012c336200033c565b60016008556daaeb6d7670e522a718067333cd4e3b1562000276578015620001c457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001a557600080fd5b505af1158015620001ba573d6000803e3d6000fd5b5050505062000276565b6001600160a01b03821615620002155760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200018a565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200025c57600080fd5b505af115801562000271573d6000803e3d6000fd5b505050505b5062000298905073637d25d0769f747b2742a04d249802da853959706200038e565b602080546001600160a01b0319166001600160a01b038316908117909155620002c1906200038e565b602054620002db906001600160a01b03166103e86200043c565b620002ff6040518060600160405280603f815260200162004de2603f91396200053d565b507f37bf940f5237cce27ec044ecead10b604d34374ad9c18f030ad1293882fa0c08600c55620009d3565b6002620003388282620007b2565b5050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811660009081526007602052604090205460ff1615620003cc336001600160a01b031660146200054b60201b62001f7a1760201c565b604051602001620003de9190620008cf565b60405160208183030381529060405290620004175760405162461bcd60e51b81526004016200040e919062000928565b60405180910390fd5b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6127106001600160601b0382161115620004ac5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200040e565b6001600160a01b038216620005045760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200040e565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6004620003388282620007b2565b606060006200055c83600262000973565b620005699060026200098d565b6001600160401b038111156200058357620005836200070d565b6040519080825280601f01601f191660200182016040528015620005ae576020820181803683370190505b509050600360fc1b81600081518110620005cc57620005cc620009a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620005fe57620005fe620009a3565b60200101906001600160f81b031916908160001a90535060006200062484600262000973565b620006319060016200098d565b90505b6001811115620006b3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620006695762000669620009a3565b1a60f81b828281518110620006825762000682620009a3565b60200101906001600160f81b031916908160001a90535060049490941c93620006ab81620009b9565b905062000634565b508315620007045760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016200040e565b90505b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200073857607f821691505b6020821081036200075957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620007ad57600081815260208120601f850160051c81016020861015620007885750805b601f850160051c820191505b81811015620007a95782815560010162000794565b5050505b505050565b81516001600160401b03811115620007ce57620007ce6200070d565b620007e681620007df845462000723565b846200075f565b602080601f8311600181146200081e5760008415620008055750858301515b600019600386901b1c1916600185901b178555620007a9565b600085815260208120601f198616915b828110156200084f578886015182559484019460019091019084016200082e565b50858210156200086e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200089157600080fd5b81516001600160a01b03811681146200070457600080fd5b60005b83811015620008c6578181015183820152602001620008ac565b50506000910152565b67030b1b1b7bab73a160c51b815260008251620008f4816008850160208701620008a9565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b602081526000825180602084015262000949816040850160208701620008a9565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200070757620007076200095d565b808201808211156200070757620007076200095d565b634e487b7160e01b600052603260045260246000fd5b600081620009cb57620009cb6200095d565b506000190190565b6143ff80620009e36000396000f3fe6080604052600436106103b75760003560e01c80637672287e116101f2578063b7c0b8e81161010d578063d5dcfbc6116100a0578063f242432a1161006f578063f242432a14610bd9578063f2fde38b14610bf9578063fb796e6c14610c19578063fdf03cd514610c3357600080fd5b8063d5dcfbc614610b45578063d5f3948814610b5b578063e8a3d48514610b7b578063e985e9c514610b9057600080fd5b8063c6dd4ddd116100dc578063c6dd4ddd14610ac4578063cbf9fe5f14610ad7578063d2de022f14610b10578063d4e45c1414610b3057600080fd5b8063b7c0b8e814610a38578063bd85b03914610a58578063c3e5368314610a85578063c3faf72414610aa457600080fd5b8063910da0e9116101855780639970cc29116101545780639970cc29146109c2578063a22cb465146109d8578063b219f7d7146109f8578063b2b1b37b14610a1857600080fd5b8063910da0e91461094d57806391e4bac81461096d5780639324b42a1461098d57806395d89b41146109ad57600080fd5b8063830f8211116101c1578063830f8211146108b6578063872a2803146108cc5780638da5cb5b146108ec5780638e37326a1461090a57600080fd5b80637672287e1461081f57806378a923801461083f57806378d8fed8146108835780637bc9200e146108a357600080fd5b80632e9901f4116102e257806355f804b3116102755780636d70f7ae116102445780636d70f7ae146107915780636fa0cf5f146107ca578063715018a6146107ea57806375ed36e8146107ff57600080fd5b806355f804b31461071b57806356f5d89d1461073b57806358303b101461075b5780635f341ad81461077157600080fd5b8063449d0f10116102b1578063449d0f10146106935780634bf365df146106a95780634e1273f4146106bf5780634f558e79146106ec57600080fd5b80632e9901f4146106035780632eb2c2d614610619578063385453cd1461063957806341f434341461065957600080fd5b8063162094c41161035a578063267fe98911610329578063267fe9891461056e57806327ac0c581461058e5780632a55205a146105ae5780632c4e9fc6146105ed57600080fd5b8063162094c4146104c3578063189f3de1146104e35780631a8b8357146104fd578063214344211461052a57600080fd5b806304634d8d1161039657806304634d8d1461044157806306fdde03146104615780630e89341c14610483578063156e29f6146104a357600080fd5b8062fdd58e146103bc57806301ffc9a7146103ef57806303c0f48c1461041f575b600080fd5b3480156103c857600080fd5b506103dc6103d73660046134e1565b610c53565b6040519081526020015b60405180910390f35b3480156103fb57600080fd5b5061040f61040a366004613521565b610cec565b60405190151581526020016103e6565b34801561042b57600080fd5b5061043f61043a36600461353e565b610cf7565b005b34801561044d57600080fd5b5061043f61045c366004613557565b610d05565b34801561046d57600080fd5b50610476610d1c565b6040516103e691906135ea565b34801561048f57600080fd5b5061047661049e36600461353e565b610daa565b3480156104af57600080fd5b5061043f6104be3660046135fd565b610e8a565b3480156104cf57600080fd5b5061043f6104de3660046136e5565b610edc565b3480156104ef57600080fd5b50601c5461040f9060ff1681565b34801561050957600080fd5b506103dc61051836600461353e565b601a6020526000908152604090205481565b34801561053657600080fd5b506103dc61054536600461372b565b6014546000908152601d602090815260408083206001600160a01b039094168352929052205490565b34801561057a57600080fd5b5061043f61058936600461353e565b610eef565b34801561059a57600080fd5b5061043f6105a936600461372b565b610f1a565b3480156105ba57600080fd5b506105ce6105c9366004613746565b610f2e565b604080516001600160a01b0390931683526020830191909152016103e6565b3480156105f957600080fd5b506103dc60155481565b34801561060f57600080fd5b506103dc601b5481565b34801561062557600080fd5b5061043f6106343660046137fc565b610fda565b34801561064557600080fd5b5061043f610654366004613746565b6110c9565b34801561066557600080fd5b5061067b6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b0390911681526020016103e6565b34801561069f57600080fd5b506103dc60165481565b3480156106b557600080fd5b506103dc60175481565b3480156106cb57600080fd5b506106df6106da366004613912565b6110e3565b6040516103e691906139a6565b3480156106f857600080fd5b5061040f61070736600461353e565b600090815260036020526040902054151590565b34801561072757600080fd5b5061043f6107363660046139b9565b61120c565b34801561074757600080fd5b5061043f610756366004613a03565b61121e565b34801561076757600080fd5b506103dc600e5481565b34801561077d57600080fd5b5061040f61078c366004613a2f565b611252565b34801561079d57600080fd5b5061040f6107ac36600461372b565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156107d657600080fd5b5061043f6107e5366004613746565b611366565b3480156107f657600080fd5b5061043f611381565b34801561080b57600080fd5b506103dc61081a3660046139b9565b611395565b34801561082b57600080fd5b5061043f61083a366004613a65565b6113bd565b34801561084b57600080fd5b506103dc61085a36600461372b565b6013546000908152601e602090815260408083206001600160a01b039094168352929052205490565b34801561088f57600080fd5b5061043f61089e366004613a65565b6113e0565b61043f6108b1366004613a82565b6113fc565b3480156108c257600080fd5b506103dc60135481565b3480156108d857600080fd5b5061043f6108e7366004613abe565b611751565b3480156108f857600080fd5b506006546001600160a01b031661067b565b34801561091657600080fd5b506103dc610925366004613b2a565b6000918252601d602090815260408084206001600160a01b0393909316845291905290205490565b34801561095957600080fd5b5061043f6109683660046136e5565b6117cb565b34801561097957600080fd5b5061043f61098836600461353e565b61184b565b34801561099957600080fd5b5061043f6109a83660046135fd565b611859565b3480156109b957600080fd5b5061047661186d565b3480156109ce57600080fd5b506103dc60195481565b3480156109e457600080fd5b5061043f6109f3366004613a03565b61187a565b348015610a0457600080fd5b5061043f610a1336600461372b565b611959565b348015610a2457600080fd5b5061043f610a3336600461353e565b61196a565b348015610a4457600080fd5b5061043f610a53366004613a65565b611978565b348015610a6457600080fd5b506103dc610a7336600461353e565b60009081526003602052604090205490565b348015610a9157600080fd5b50601c5461040f90610100900460ff1681565b348015610ab057600080fd5b5061043f610abf366004613a65565b611994565b61043f610ad2366004613b56565b6119b0565b348015610ae357600080fd5b5061040f610af236600461372b565b6001600160a01b031660009081526011602052604090205460ff1690565b348015610b1c57600080fd5b5061040f610b2b366004613bb8565b611cd3565b348015610b3c57600080fd5b50600e546103dc565b348015610b5157600080fd5b506103dc60145481565b348015610b6757600080fd5b5060205461067b906001600160a01b031681565b348015610b8757600080fd5b50610476611e05565b348015610b9c57600080fd5b5061040f610bab366004613c04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610be557600080fd5b5061043f610bf4366004613c2e565b611e14565b348015610c0557600080fd5b5061043f610c1436600461372b565b611ef6565b348015610c2557600080fd5b5060095461040f9060ff1681565b348015610c3f57600080fd5b5061043f610c4e36600461353e565b611f6c565b60006001600160a01b038316610cc35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610ce682612115565b610d003361213a565b601455565b610d0e3361213a565b610d1882826121a8565b5050565b600f8054610d2990613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5590613c92565b8015610da25780601f10610d7757610100808354040283529160200191610da2565b820191906000526020600020905b815481529060010190602001808311610d8557829003601f168201915b505050505081565b600081815260056020526040812080546060929190610dc890613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610df490613c92565b8015610e415780601f10610e1657610100808354040283529160200191610e41565b820191906000526020600020905b815481529060010190602001808311610e2457829003601f168201915b505050505090506000815111610e5f57610e5a836122a5565b610e83565b600481604051602001610e73929190613ccc565b6040516020818303038152906040525b9392505050565b610e933361213a565b610e9c82610daa565b51600003610ebc5760405162461bcd60e51b8152600401610cba90613d53565b610ed783838360405180602001604052806000815250612339565b505050565b610ee53361213a565b610d18828261245c565b610ef83361213a565b80600e81905550600160146000828254610f129190613d92565b909155505050565b610f226124b9565b610f2b81612513565b50565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610fa3575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610fc2906001600160601b031687613da5565b610fcc9190613dbc565b915196919550909350505050565b846daaeb6d7670e522a718067333cd4e3b15801590610ffb575060095460ff165b156110b457336001600160a01b038216036110225761101d868686868661259b565b6110c1565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110959190613dde565b6110b457604051633b79c77360e21b8152336004820152602401610cba565b6110c1868686868661259b565b505050505050565b6110d23361213a565b6000908152601a6020526040902055565b606081518351146111485760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610cba565b600083516001600160401b0381111561116357611163613630565b60405190808252806020026020018201604052801561118c578160200160208202803683370190505b50905060005b8451811015611204576111d78582815181106111b0576111b0613dfb565b60200260200101518583815181106111ca576111ca613dfb565b6020026020010151610c53565b8282815181106111e9576111e9613dfb565b60209081029190910101526111fd81613e11565b9050611192565b509392505050565b6112153361213a565b610f2b816125e7565b6112273361213a565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b600080836040516020016112669190613e2a565b60405160208183030381529060405280519060200120905060005b835181101561135a5783818151811061129c5761129c613dfb565b602002602001015182106112fa578381815181106112bc576112bc613dfb565b6020026020010151826040516020016112df929190918252602082015260400190565b60405160208183030381529060405280519060200120611346565b8184828151811061130d5761130d613dfb565b602002602001015160405160200161132f929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061135281613e11565b915050611281565b50600c54149392505050565b61136f3361213a565b6000918252600d602052604090912055565b6113896124b9565b61139360006125f3565b565b6000601f826040516113a79190613e2a565b9081526020016040518091039020549050919050565b6113c63361213a565b601c80549115156101000261ff0019909216919091179055565b6113e93361213a565b6012805460ff1916911515919091179055565b611404612645565b61140f601854610daa565b5160000361142f5760405162461bcd60e51b8152600401610cba90613d53565b601c54610100900460ff166114865760405162461bcd60e51b815260206004820152601760248201527f616c6c6f776c6973744d696e74206973205061757365640000000000000000006044820152606401610cba565b61149333600e5483611cd3565b6114da5760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610cba565b81601b54101561153f5760405162461bcd60e51b815260206004820152602a60248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560448201526972206f6e652074696d6560b01b6064820152608401610cba565b600e546000908152601a60205260409020548211156115b15760405162461bcd60e51b815260206004820152602860248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610cba565b6014546000908152601d602090815260408083203384529091529020546115d9908390613d92565b600e546000908152601a602052604090205410156116395760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610cba565b816016546116479190613da5565b34146116905760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610cba565b6017546018546000908152600360205260409020546116af9084613d92565b1115806116bc5750601754155b6116f75760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610cba565b6014546000908152601d6020908152604080832033845290915281208054849290611723908490613d92565b92505081905550611747336018548460405180602001604052806000815250612339565b610d186001600855565b61175a3361213a565b60005b83518110156117c5576117b384828151811061177b5761177b613dfb565b60200260200101518484848151811061179657611796613dfb565b602002602001015160405180602001604052806000815250612339565b806117bd81613e11565b91505061175d565b50505050565b6117d43361213a565b6117dd82610daa565b51156118205760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610cba565b6020805460408051928301905260008252610ee5916001600160a01b03909116908490600190612339565b6118543361213a565b601755565b6118623361213a565b610ed783838361269e565b60108054610d2990613c92565b816daaeb6d7670e522a718067333cd4e3b1580159061189b575060095460ff165b1561194457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191c9190613dde565b61194457604051633b79c77360e21b81526001600160a01b0382166004820152602401610cba565b61194e838361282e565b610ed7338484612835565b6119616124b9565b610f2b81612915565b6119733361213a565b601b55565b6119813361213a565b6009805460ff1916911515919091179055565b61199d3361213a565b601c805460ff1916911515919091179055565b6119b8612645565b6119c3601854610daa565b516000036119e35760405162461bcd60e51b8152600401610cba90613d53565b601c5460ff16611a355760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610cba565b611a3f8183611252565b611a865760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610cba565b6013546000908152601e60209081526040808320338452909152902054611aae908490613d92565b6019541015611aff5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610cba565b82601f82604051611b109190613e2a565b908152602001604051809103902054611b299190613d92565b6019541015611b865760405162461bcd60e51b8152602060048201526024808201527f7468697320707377642068617665206e6f2077686974656c6973744d696e74206044820152631b19599d60e21b6064820152608401610cba565b82601554611b949190613da5565b3414611bdd5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610cba565b601754601854600090815260036020526040902054611bfc9085613d92565b111580611c095750601754155b611c445760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610cba565b6013546000908152601e6020908152604080832033845290915281208054859290611c70908490613d92565b9250508190555082601f82604051611c889190613e2a565b90815260200160405180910390206000828254611ca59190613d92565b92505081905550611cc9336018548560405180602001604052806000815250612339565b610ed76001600855565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611deb57838181518110611d2d57611d2d613dfb565b60200260200101518210611d8b57838181518110611d4d57611d4d613dfb565b602002602001015182604051602001611d70929190918252602082015260400190565b60405160208183030381529060405280519060200120611dd7565b81848281518110611d9e57611d9e613dfb565b6020026020010151604051602001611dc0929190918252602082015260400190565b604051602081830303815290604052805190602001205b915080611de381613e11565b915050611d12565b506000848152600d60205260409020541490509392505050565b6060611e0f61293f565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590611e35575060095460ff165b15611ee957336001600160a01b03821603611e575761101d86868686866129bf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190613dde565b611ee957604051633b79c77360e21b8152336004820152602401610cba565b6110c186868686866129bf565b611efe6124b9565b6001600160a01b038116611f635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b610f2b816125f3565b611f753361213a565b600e55565b60606000611f89836002613da5565b611f94906002613d92565b6001600160401b03811115611fab57611fab613630565b6040519080825280601f01601f191660200182016040528015611fd5576020820181803683370190505b509050600360fc1b81600081518110611ff057611ff0613dfb565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061201f5761201f613dfb565b60200101906001600160f81b031916908160001a9053506000612043846002613da5565b61204e906001613d92565b90505b60018111156120c6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061208257612082613dfb565b1a60f81b82828151811061209857612098613dfb565b60200101906001600160f81b031916908160001a90535060049490941c936120bf81613e46565b9050612051565b508315610e835760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cba565b60006001600160e01b0319821663152a902d60e11b1480610ce65750610ce682612a04565b6001600160a01b03811660009081526007602052604090205460ff1661216b335b6001600160a01b03166014611f7a565b60405160200161217b9190613e5d565b60405160208183030381529060405290610d185760405162461bcd60e51b8152600401610cba91906135ea565b6127106001600160601b03821611156122165760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610cba565b6001600160a01b03821661226c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610cba565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6060600280546122b490613c92565b80601f01602080910402602001604051908101604052809291908181526020018280546122e090613c92565b801561232d5780601f106123025761010080835404028352916020019161232d565b820191906000526020600020905b81548152906001019060200180831161231057829003601f168201915b50505050509050919050565b6001600160a01b0384166123995760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610cba565b3360006123a585612a54565b905060006123b285612a54565b90506123c383600089858589612a9f565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906123f3908490613d92565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461245383600089898989612b4d565b50505050505050565b60008281526005602052604090206124748282613ef0565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6124a084610daa565b6040516124ad91906135ea565b60405180910390a25050565b6006546001600160a01b031633146113935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cba565b6001600160a01b03811660009081526007602052604090205460ff16156125393361215b565b6040516020016125499190613faf565b604051602081830303815290604052906125765760405162461bcd60e51b8152600401610cba91906135ea565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0385163314806125b757506125b78533610bab565b6125d35760405162461bcd60e51b8152600401610cba90614006565b6125e08585858585612ca8565b5050505050565b6004610d188282613ef0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600854036126975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cba565b6002600855565b6001600160a01b0383166127005760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610cba565b33600061270c84612a54565b9050600061271984612a54565b905061273983876000858560405180602001604052806000815250612a9f565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156127b65760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610cba565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612453565b610d183383835b816001600160a01b0316836001600160a01b0316036128a85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610cba565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61291e8161213a565b6001600160a01b03166000908152600760205260409020805460ff19169055565b606060008061295081612710610f2e565b9150915061299961296082612e8b565b612974846001600160a01b03166014611f7a565b604051602001612985929190614054565b604051602081830303815290604052612f1d565b6040516020016129a991906140da565b6040516020818303038152906040529250505090565b6001600160a01b0385163314806129db57506129db8533610bab565b6129f75760405162461bcd60e51b8152600401610cba90614006565b6125e08585858585613081565b60006001600160e01b03198216636cdb3d1360e11b1480612a3557506001600160e01b031982166303a24d0760e21b145b80610ce657506301ffc9a760e01b6001600160e01b0319831614610ce6565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612a8e57612a8e613dfb565b602090810291909101015292915050565b6006546001600160a01b0387811691161480612ad857506001600160a01b03861660009081526011602052604090205460ff1615156001145b80612aea575060125460ff1615156001145b80612afc57506001600160a01b038516155b612b3f5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610cba565b6110c18686868686866131b9565b6001600160a01b0384163b156110c15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612b91908990899088908890889060040161411f565b6020604051808303816000875af1925050508015612bcc575060408051601f3d908101601f19168201909252612bc991810190614164565b60015b612c7857612bd8614181565b806308c379a003612c115750612bec61419d565b80612bf75750612c13565b8060405162461bcd60e51b8152600401610cba91906135ea565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610cba565b6001600160e01b0319811663f23a6e6160e01b146124535760405162461bcd60e51b8152600401610cba90614226565b8151835114612d0a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610cba565b6001600160a01b038416612d305760405162461bcd60e51b8152600401610cba9061426e565b33612d3f818787878787612a9f565b60005b8451811015612e25576000858281518110612d5f57612d5f613dfb565b602002602001015190506000858381518110612d7d57612d7d613dfb565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612dcd5760405162461bcd60e51b8152600401610cba906142b3565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612e0a908490613d92565b9250508190555050505080612e1e90613e11565b9050612d42565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612e759291906142fd565b60405180910390a46110c1818787878787613332565b60606000612e98836133ed565b60010190506000816001600160401b03811115612eb757612eb7613630565b6040519080825280601f01601f191660200182016040528015612ee1576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612eeb57509392505050565b60608151600003612f3c57505060408051602081019091526000815290565b600060405180606001604052806040815260200161438a6040913990506000600384516002612f6b9190613d92565b612f759190613dbc565b612f80906004613da5565b90506000612f8f826020613d92565b6001600160401b03811115612fa657612fa6613630565b6040519080825280601f01601f191660200182016040528015612fd0576020820181803683370190505b509050818152600183018586518101602084015b8183101561303c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612fe4565b600389510660018114613056576002811461306757613073565b613d3d60f01b600119830152613073565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b0384166130a75760405162461bcd60e51b8152600401610cba9061426e565b3360006130b385612a54565b905060006130c085612a54565b90506130d0838989858589612a9f565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156131115760405162461bcd60e51b8152600401610cba906142b3565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061314e908490613d92565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131ae848a8a8a8a8a612b4d565b505050505050505050565b6001600160a01b0385166132405760005b835181101561323e578281815181106131e5576131e5613dfb565b60200260200101516003600086848151811061320357613203613dfb565b6020026020010151815260200190815260200160002060008282546132289190613d92565b90915550613237905081613e11565b90506131ca565b505b6001600160a01b0384166110c15760005b835181101561245357600084828151811061326e5761326e613dfb565b60200260200101519050600084838151811061328c5761328c613dfb565b602002602001015190506000600360008481526020019081526020016000205490508181101561330f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610cba565b6000928352600360205260409092209103905561332b81613e11565b9050613251565b6001600160a01b0384163b156110c15760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613376908990899088908890889060040161432b565b6020604051808303816000875af19250505080156133b1575060408051601f3d908101601f191682019092526133ae91810190614164565b60015b6133bd57612bd8614181565b6001600160e01b0319811663bc197c8160e01b146124535760405162461bcd60e51b8152600401610cba90614226565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061342c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613458576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061347657662386f26fc10000830492506010015b6305f5e100831061348e576305f5e100830492506008015b61271083106134a257612710830492506004015b606483106134b4576064830492506002015b600a8310610ce65760010192915050565b80356001600160a01b03811681146134dc57600080fd5b919050565b600080604083850312156134f457600080fd5b6134fd836134c5565b946020939093013593505050565b6001600160e01b031981168114610f2b57600080fd5b60006020828403121561353357600080fd5b8135610e838161350b565b60006020828403121561355057600080fd5b5035919050565b6000806040838503121561356a57600080fd5b613573836134c5565b915060208301356001600160601b038116811461358f57600080fd5b809150509250929050565b60005b838110156135b557818101518382015260200161359d565b50506000910152565b600081518084526135d681602086016020860161359a565b601f01601f19169290920160200192915050565b602081526000610e8360208301846135be565b60008060006060848603121561361257600080fd5b61361b846134c5565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561366b5761366b613630565b6040525050565b600082601f83011261368357600080fd5b81356001600160401b0381111561369c5761369c613630565b6040516136b3601f8301601f191660200182613646565b8181528460208386010111156136c857600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156136f857600080fd5b8235915060208301356001600160401b0381111561371557600080fd5b61372185828601613672565b9150509250929050565b60006020828403121561373d57600080fd5b610e83826134c5565b6000806040838503121561375957600080fd5b50508035926020909101359150565b60006001600160401b0382111561378157613781613630565b5060051b60200190565b600082601f83011261379c57600080fd5b813560206137a982613768565b6040516137b68282613646565b83815260059390931b85018201928281019150868411156137d657600080fd5b8286015b848110156137f157803583529183019183016137da565b509695505050505050565b600080600080600060a0868803121561381457600080fd5b61381d866134c5565b945061382b602087016134c5565b935060408601356001600160401b038082111561384757600080fd5b61385389838a0161378b565b9450606088013591508082111561386957600080fd5b61387589838a0161378b565b9350608088013591508082111561388b57600080fd5b5061389888828901613672565b9150509295509295909350565b600082601f8301126138b657600080fd5b813560206138c382613768565b6040516138d08282613646565b83815260059390931b85018201928281019150868411156138f057600080fd5b8286015b848110156137f157613905816134c5565b83529183019183016138f4565b6000806040838503121561392557600080fd5b82356001600160401b038082111561393c57600080fd5b613948868387016138a5565b9350602085013591508082111561395e57600080fd5b506137218582860161378b565b600081518084526020808501945080840160005b8381101561399b5781518752958201959082019060010161397f565b509495945050505050565b602081526000610e83602083018461396b565b6000602082840312156139cb57600080fd5b81356001600160401b038111156139e157600080fd5b6139ed84828501613672565b949350505050565b8015158114610f2b57600080fd5b60008060408385031215613a1657600080fd5b613a1f836134c5565b9150602083013561358f816139f5565b60008060408385031215613a4257600080fd5b82356001600160401b0380821115613a5957600080fd5b61394886838701613672565b600060208284031215613a7757600080fd5b8135610e83816139f5565b60008060408385031215613a9557600080fd5b8235915060208301356001600160401b03811115613ab257600080fd5b6137218582860161378b565b600080600060608486031215613ad357600080fd5b83356001600160401b0380821115613aea57600080fd5b613af6878388016138a5565b9450602086013593506040860135915080821115613b1357600080fd5b50613b208682870161378b565b9150509250925092565b60008060408385031215613b3d57600080fd5b82359150613b4d602084016134c5565b90509250929050565b600080600060608486031215613b6b57600080fd5b8335925060208401356001600160401b0380821115613b8957600080fd5b613b958783880161378b565b93506040860135915080821115613bab57600080fd5b50613b2086828701613672565b600080600060608486031215613bcd57600080fd5b613bd6846134c5565b92506020840135915060408401356001600160401b03811115613bf857600080fd5b613b208682870161378b565b60008060408385031215613c1757600080fd5b613c20836134c5565b9150613b4d602084016134c5565b600080600080600060a08688031215613c4657600080fd5b613c4f866134c5565b9450613c5d602087016134c5565b9350604086013592506060860135915060808601356001600160401b03811115613c8657600080fd5b61389888828901613672565b600181811c90821680613ca657607f821691505b602082108103613cc657634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454613cda81613c92565b60018281168015613cf25760018114613d0757613d36565b60ff1984168752821515830287019450613d36565b8860005260208060002060005b85811015613d2d5781548a820152908401908201613d14565b50505082870194505b505050508351613d4a81836020880161359a565b01949350505050565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ce657610ce6613d7c565b8082028115828204841417610ce657610ce6613d7c565b600082613dd957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613df057600080fd5b8151610e83816139f5565b634e487b7160e01b600052603260045260246000fd5b600060018201613e2357613e23613d7c565b5060010190565b60008251613e3c81846020870161359a565b9190910192915050565b600081613e5557613e55613d7c565b506000190190565b67030b1b1b7bab73a160c51b815260008251613e8081600885016020870161359a565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610ed757600081815260208120601f850160051c81016020861015613ed15750805b601f850160051c820191505b818110156110c157828155600101613edd565b81516001600160401b03811115613f0957613f09613630565b613f1d81613f178454613c92565b84613eaa565b602080601f831160018114613f525760008415613f3a5750858301515b600019600386901b1c1916600185901b1785556110c1565b600085815260208120601f198616915b82811015613f8157888601518255948401946001909101908401613f62565b5085821015613f9f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251613fd281600885016020870161359a565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161408c81601b85016020880161359a565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b9184019182015283516140bf81602e84016020880161359a565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161411281601d85016020870161359a565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614159908301846135be565b979650505050505050565b60006020828403121561417657600080fd5b8151610e838161350b565b600060033d111561419a5760046000803e5060005160e01c5b90565b600060443d10156141ab5790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156141da57505050505090565b82850191508151818111156141f25750505050505090565b843d870101602082850101111561420c5750505050505090565b61421b60208286010187613646565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000614310604083018561396b565b8281036020840152614322818561396b565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906143579083018661396b565b8281036060840152614369818661396b565b9050828103608084015261437d81856135be565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122090c4ce24882964c94716eb1e0138ccd1a30d6a80969dd055afcb4410368218b064736f6c6343000811003368747470733a2f2f617277656176652e6e65742f752d6a47472d6467334c5f314f547565455f4171624e48664d624630436d7654316538476e446271633434000000000000000000000000f73b733e7459cf1e7321ed45ad7ac08893aebc04

Deployed Bytecode

0x6080604052600436106103b75760003560e01c80637672287e116101f2578063b7c0b8e81161010d578063d5dcfbc6116100a0578063f242432a1161006f578063f242432a14610bd9578063f2fde38b14610bf9578063fb796e6c14610c19578063fdf03cd514610c3357600080fd5b8063d5dcfbc614610b45578063d5f3948814610b5b578063e8a3d48514610b7b578063e985e9c514610b9057600080fd5b8063c6dd4ddd116100dc578063c6dd4ddd14610ac4578063cbf9fe5f14610ad7578063d2de022f14610b10578063d4e45c1414610b3057600080fd5b8063b7c0b8e814610a38578063bd85b03914610a58578063c3e5368314610a85578063c3faf72414610aa457600080fd5b8063910da0e9116101855780639970cc29116101545780639970cc29146109c2578063a22cb465146109d8578063b219f7d7146109f8578063b2b1b37b14610a1857600080fd5b8063910da0e91461094d57806391e4bac81461096d5780639324b42a1461098d57806395d89b41146109ad57600080fd5b8063830f8211116101c1578063830f8211146108b6578063872a2803146108cc5780638da5cb5b146108ec5780638e37326a1461090a57600080fd5b80637672287e1461081f57806378a923801461083f57806378d8fed8146108835780637bc9200e146108a357600080fd5b80632e9901f4116102e257806355f804b3116102755780636d70f7ae116102445780636d70f7ae146107915780636fa0cf5f146107ca578063715018a6146107ea57806375ed36e8146107ff57600080fd5b806355f804b31461071b57806356f5d89d1461073b57806358303b101461075b5780635f341ad81461077157600080fd5b8063449d0f10116102b1578063449d0f10146106935780634bf365df146106a95780634e1273f4146106bf5780634f558e79146106ec57600080fd5b80632e9901f4146106035780632eb2c2d614610619578063385453cd1461063957806341f434341461065957600080fd5b8063162094c41161035a578063267fe98911610329578063267fe9891461056e57806327ac0c581461058e5780632a55205a146105ae5780632c4e9fc6146105ed57600080fd5b8063162094c4146104c3578063189f3de1146104e35780631a8b8357146104fd578063214344211461052a57600080fd5b806304634d8d1161039657806304634d8d1461044157806306fdde03146104615780630e89341c14610483578063156e29f6146104a357600080fd5b8062fdd58e146103bc57806301ffc9a7146103ef57806303c0f48c1461041f575b600080fd5b3480156103c857600080fd5b506103dc6103d73660046134e1565b610c53565b6040519081526020015b60405180910390f35b3480156103fb57600080fd5b5061040f61040a366004613521565b610cec565b60405190151581526020016103e6565b34801561042b57600080fd5b5061043f61043a36600461353e565b610cf7565b005b34801561044d57600080fd5b5061043f61045c366004613557565b610d05565b34801561046d57600080fd5b50610476610d1c565b6040516103e691906135ea565b34801561048f57600080fd5b5061047661049e36600461353e565b610daa565b3480156104af57600080fd5b5061043f6104be3660046135fd565b610e8a565b3480156104cf57600080fd5b5061043f6104de3660046136e5565b610edc565b3480156104ef57600080fd5b50601c5461040f9060ff1681565b34801561050957600080fd5b506103dc61051836600461353e565b601a6020526000908152604090205481565b34801561053657600080fd5b506103dc61054536600461372b565b6014546000908152601d602090815260408083206001600160a01b039094168352929052205490565b34801561057a57600080fd5b5061043f61058936600461353e565b610eef565b34801561059a57600080fd5b5061043f6105a936600461372b565b610f1a565b3480156105ba57600080fd5b506105ce6105c9366004613746565b610f2e565b604080516001600160a01b0390931683526020830191909152016103e6565b3480156105f957600080fd5b506103dc60155481565b34801561060f57600080fd5b506103dc601b5481565b34801561062557600080fd5b5061043f6106343660046137fc565b610fda565b34801561064557600080fd5b5061043f610654366004613746565b6110c9565b34801561066557600080fd5b5061067b6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b0390911681526020016103e6565b34801561069f57600080fd5b506103dc60165481565b3480156106b557600080fd5b506103dc60175481565b3480156106cb57600080fd5b506106df6106da366004613912565b6110e3565b6040516103e691906139a6565b3480156106f857600080fd5b5061040f61070736600461353e565b600090815260036020526040902054151590565b34801561072757600080fd5b5061043f6107363660046139b9565b61120c565b34801561074757600080fd5b5061043f610756366004613a03565b61121e565b34801561076757600080fd5b506103dc600e5481565b34801561077d57600080fd5b5061040f61078c366004613a2f565b611252565b34801561079d57600080fd5b5061040f6107ac36600461372b565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156107d657600080fd5b5061043f6107e5366004613746565b611366565b3480156107f657600080fd5b5061043f611381565b34801561080b57600080fd5b506103dc61081a3660046139b9565b611395565b34801561082b57600080fd5b5061043f61083a366004613a65565b6113bd565b34801561084b57600080fd5b506103dc61085a36600461372b565b6013546000908152601e602090815260408083206001600160a01b039094168352929052205490565b34801561088f57600080fd5b5061043f61089e366004613a65565b6113e0565b61043f6108b1366004613a82565b6113fc565b3480156108c257600080fd5b506103dc60135481565b3480156108d857600080fd5b5061043f6108e7366004613abe565b611751565b3480156108f857600080fd5b506006546001600160a01b031661067b565b34801561091657600080fd5b506103dc610925366004613b2a565b6000918252601d602090815260408084206001600160a01b0393909316845291905290205490565b34801561095957600080fd5b5061043f6109683660046136e5565b6117cb565b34801561097957600080fd5b5061043f61098836600461353e565b61184b565b34801561099957600080fd5b5061043f6109a83660046135fd565b611859565b3480156109b957600080fd5b5061047661186d565b3480156109ce57600080fd5b506103dc60195481565b3480156109e457600080fd5b5061043f6109f3366004613a03565b61187a565b348015610a0457600080fd5b5061043f610a1336600461372b565b611959565b348015610a2457600080fd5b5061043f610a3336600461353e565b61196a565b348015610a4457600080fd5b5061043f610a53366004613a65565b611978565b348015610a6457600080fd5b506103dc610a7336600461353e565b60009081526003602052604090205490565b348015610a9157600080fd5b50601c5461040f90610100900460ff1681565b348015610ab057600080fd5b5061043f610abf366004613a65565b611994565b61043f610ad2366004613b56565b6119b0565b348015610ae357600080fd5b5061040f610af236600461372b565b6001600160a01b031660009081526011602052604090205460ff1690565b348015610b1c57600080fd5b5061040f610b2b366004613bb8565b611cd3565b348015610b3c57600080fd5b50600e546103dc565b348015610b5157600080fd5b506103dc60145481565b348015610b6757600080fd5b5060205461067b906001600160a01b031681565b348015610b8757600080fd5b50610476611e05565b348015610b9c57600080fd5b5061040f610bab366004613c04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610be557600080fd5b5061043f610bf4366004613c2e565b611e14565b348015610c0557600080fd5b5061043f610c1436600461372b565b611ef6565b348015610c2557600080fd5b5060095461040f9060ff1681565b348015610c3f57600080fd5b5061043f610c4e36600461353e565b611f6c565b60006001600160a01b038316610cc35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610ce682612115565b610d003361213a565b601455565b610d0e3361213a565b610d1882826121a8565b5050565b600f8054610d2990613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5590613c92565b8015610da25780601f10610d7757610100808354040283529160200191610da2565b820191906000526020600020905b815481529060010190602001808311610d8557829003601f168201915b505050505081565b600081815260056020526040812080546060929190610dc890613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610df490613c92565b8015610e415780601f10610e1657610100808354040283529160200191610e41565b820191906000526020600020905b815481529060010190602001808311610e2457829003601f168201915b505050505090506000815111610e5f57610e5a836122a5565b610e83565b600481604051602001610e73929190613ccc565b6040516020818303038152906040525b9392505050565b610e933361213a565b610e9c82610daa565b51600003610ebc5760405162461bcd60e51b8152600401610cba90613d53565b610ed783838360405180602001604052806000815250612339565b505050565b610ee53361213a565b610d18828261245c565b610ef83361213a565b80600e81905550600160146000828254610f129190613d92565b909155505050565b610f226124b9565b610f2b81612513565b50565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610fa3575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610fc2906001600160601b031687613da5565b610fcc9190613dbc565b915196919550909350505050565b846daaeb6d7670e522a718067333cd4e3b15801590610ffb575060095460ff165b156110b457336001600160a01b038216036110225761101d868686868661259b565b6110c1565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110959190613dde565b6110b457604051633b79c77360e21b8152336004820152602401610cba565b6110c1868686868661259b565b505050505050565b6110d23361213a565b6000908152601a6020526040902055565b606081518351146111485760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610cba565b600083516001600160401b0381111561116357611163613630565b60405190808252806020026020018201604052801561118c578160200160208202803683370190505b50905060005b8451811015611204576111d78582815181106111b0576111b0613dfb565b60200260200101518583815181106111ca576111ca613dfb565b6020026020010151610c53565b8282815181106111e9576111e9613dfb565b60209081029190910101526111fd81613e11565b9050611192565b509392505050565b6112153361213a565b610f2b816125e7565b6112273361213a565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b600080836040516020016112669190613e2a565b60405160208183030381529060405280519060200120905060005b835181101561135a5783818151811061129c5761129c613dfb565b602002602001015182106112fa578381815181106112bc576112bc613dfb565b6020026020010151826040516020016112df929190918252602082015260400190565b60405160208183030381529060405280519060200120611346565b8184828151811061130d5761130d613dfb565b602002602001015160405160200161132f929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061135281613e11565b915050611281565b50600c54149392505050565b61136f3361213a565b6000918252600d602052604090912055565b6113896124b9565b61139360006125f3565b565b6000601f826040516113a79190613e2a565b9081526020016040518091039020549050919050565b6113c63361213a565b601c80549115156101000261ff0019909216919091179055565b6113e93361213a565b6012805460ff1916911515919091179055565b611404612645565b61140f601854610daa565b5160000361142f5760405162461bcd60e51b8152600401610cba90613d53565b601c54610100900460ff166114865760405162461bcd60e51b815260206004820152601760248201527f616c6c6f776c6973744d696e74206973205061757365640000000000000000006044820152606401610cba565b61149333600e5483611cd3565b6114da5760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610cba565b81601b54101561153f5760405162461bcd60e51b815260206004820152602a60248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560448201526972206f6e652074696d6560b01b6064820152608401610cba565b600e546000908152601a60205260409020548211156115b15760405162461bcd60e51b815260206004820152602860248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610cba565b6014546000908152601d602090815260408083203384529091529020546115d9908390613d92565b600e546000908152601a602052604090205410156116395760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610cba565b816016546116479190613da5565b34146116905760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610cba565b6017546018546000908152600360205260409020546116af9084613d92565b1115806116bc5750601754155b6116f75760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610cba565b6014546000908152601d6020908152604080832033845290915281208054849290611723908490613d92565b92505081905550611747336018548460405180602001604052806000815250612339565b610d186001600855565b61175a3361213a565b60005b83518110156117c5576117b384828151811061177b5761177b613dfb565b60200260200101518484848151811061179657611796613dfb565b602002602001015160405180602001604052806000815250612339565b806117bd81613e11565b91505061175d565b50505050565b6117d43361213a565b6117dd82610daa565b51156118205760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610cba565b6020805460408051928301905260008252610ee5916001600160a01b03909116908490600190612339565b6118543361213a565b601755565b6118623361213a565b610ed783838361269e565b60108054610d2990613c92565b816daaeb6d7670e522a718067333cd4e3b1580159061189b575060095460ff165b1561194457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191c9190613dde565b61194457604051633b79c77360e21b81526001600160a01b0382166004820152602401610cba565b61194e838361282e565b610ed7338484612835565b6119616124b9565b610f2b81612915565b6119733361213a565b601b55565b6119813361213a565b6009805460ff1916911515919091179055565b61199d3361213a565b601c805460ff1916911515919091179055565b6119b8612645565b6119c3601854610daa565b516000036119e35760405162461bcd60e51b8152600401610cba90613d53565b601c5460ff16611a355760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610cba565b611a3f8183611252565b611a865760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610cba565b6013546000908152601e60209081526040808320338452909152902054611aae908490613d92565b6019541015611aff5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610cba565b82601f82604051611b109190613e2a565b908152602001604051809103902054611b299190613d92565b6019541015611b865760405162461bcd60e51b8152602060048201526024808201527f7468697320707377642068617665206e6f2077686974656c6973744d696e74206044820152631b19599d60e21b6064820152608401610cba565b82601554611b949190613da5565b3414611bdd5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610cba565b601754601854600090815260036020526040902054611bfc9085613d92565b111580611c095750601754155b611c445760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610cba565b6013546000908152601e6020908152604080832033845290915281208054859290611c70908490613d92565b9250508190555082601f82604051611c889190613e2a565b90815260200160405180910390206000828254611ca59190613d92565b92505081905550611cc9336018548560405180602001604052806000815250612339565b610ed76001600855565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611deb57838181518110611d2d57611d2d613dfb565b60200260200101518210611d8b57838181518110611d4d57611d4d613dfb565b602002602001015182604051602001611d70929190918252602082015260400190565b60405160208183030381529060405280519060200120611dd7565b81848281518110611d9e57611d9e613dfb565b6020026020010151604051602001611dc0929190918252602082015260400190565b604051602081830303815290604052805190602001205b915080611de381613e11565b915050611d12565b506000848152600d60205260409020541490509392505050565b6060611e0f61293f565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590611e35575060095460ff165b15611ee957336001600160a01b03821603611e575761101d86868686866129bf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190613dde565b611ee957604051633b79c77360e21b8152336004820152602401610cba565b6110c186868686866129bf565b611efe6124b9565b6001600160a01b038116611f635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b610f2b816125f3565b611f753361213a565b600e55565b60606000611f89836002613da5565b611f94906002613d92565b6001600160401b03811115611fab57611fab613630565b6040519080825280601f01601f191660200182016040528015611fd5576020820181803683370190505b509050600360fc1b81600081518110611ff057611ff0613dfb565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061201f5761201f613dfb565b60200101906001600160f81b031916908160001a9053506000612043846002613da5565b61204e906001613d92565b90505b60018111156120c6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061208257612082613dfb565b1a60f81b82828151811061209857612098613dfb565b60200101906001600160f81b031916908160001a90535060049490941c936120bf81613e46565b9050612051565b508315610e835760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cba565b60006001600160e01b0319821663152a902d60e11b1480610ce65750610ce682612a04565b6001600160a01b03811660009081526007602052604090205460ff1661216b335b6001600160a01b03166014611f7a565b60405160200161217b9190613e5d565b60405160208183030381529060405290610d185760405162461bcd60e51b8152600401610cba91906135ea565b6127106001600160601b03821611156122165760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610cba565b6001600160a01b03821661226c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610cba565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6060600280546122b490613c92565b80601f01602080910402602001604051908101604052809291908181526020018280546122e090613c92565b801561232d5780601f106123025761010080835404028352916020019161232d565b820191906000526020600020905b81548152906001019060200180831161231057829003601f168201915b50505050509050919050565b6001600160a01b0384166123995760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610cba565b3360006123a585612a54565b905060006123b285612a54565b90506123c383600089858589612a9f565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906123f3908490613d92565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461245383600089898989612b4d565b50505050505050565b60008281526005602052604090206124748282613ef0565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6124a084610daa565b6040516124ad91906135ea565b60405180910390a25050565b6006546001600160a01b031633146113935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cba565b6001600160a01b03811660009081526007602052604090205460ff16156125393361215b565b6040516020016125499190613faf565b604051602081830303815290604052906125765760405162461bcd60e51b8152600401610cba91906135ea565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0385163314806125b757506125b78533610bab565b6125d35760405162461bcd60e51b8152600401610cba90614006565b6125e08585858585612ca8565b5050505050565b6004610d188282613ef0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600854036126975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cba565b6002600855565b6001600160a01b0383166127005760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610cba565b33600061270c84612a54565b9050600061271984612a54565b905061273983876000858560405180602001604052806000815250612a9f565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156127b65760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610cba565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612453565b610d183383835b816001600160a01b0316836001600160a01b0316036128a85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610cba565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61291e8161213a565b6001600160a01b03166000908152600760205260409020805460ff19169055565b606060008061295081612710610f2e565b9150915061299961296082612e8b565b612974846001600160a01b03166014611f7a565b604051602001612985929190614054565b604051602081830303815290604052612f1d565b6040516020016129a991906140da565b6040516020818303038152906040529250505090565b6001600160a01b0385163314806129db57506129db8533610bab565b6129f75760405162461bcd60e51b8152600401610cba90614006565b6125e08585858585613081565b60006001600160e01b03198216636cdb3d1360e11b1480612a3557506001600160e01b031982166303a24d0760e21b145b80610ce657506301ffc9a760e01b6001600160e01b0319831614610ce6565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612a8e57612a8e613dfb565b602090810291909101015292915050565b6006546001600160a01b0387811691161480612ad857506001600160a01b03861660009081526011602052604090205460ff1615156001145b80612aea575060125460ff1615156001145b80612afc57506001600160a01b038516155b612b3f5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610cba565b6110c18686868686866131b9565b6001600160a01b0384163b156110c15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612b91908990899088908890889060040161411f565b6020604051808303816000875af1925050508015612bcc575060408051601f3d908101601f19168201909252612bc991810190614164565b60015b612c7857612bd8614181565b806308c379a003612c115750612bec61419d565b80612bf75750612c13565b8060405162461bcd60e51b8152600401610cba91906135ea565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610cba565b6001600160e01b0319811663f23a6e6160e01b146124535760405162461bcd60e51b8152600401610cba90614226565b8151835114612d0a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610cba565b6001600160a01b038416612d305760405162461bcd60e51b8152600401610cba9061426e565b33612d3f818787878787612a9f565b60005b8451811015612e25576000858281518110612d5f57612d5f613dfb565b602002602001015190506000858381518110612d7d57612d7d613dfb565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612dcd5760405162461bcd60e51b8152600401610cba906142b3565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612e0a908490613d92565b9250508190555050505080612e1e90613e11565b9050612d42565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612e759291906142fd565b60405180910390a46110c1818787878787613332565b60606000612e98836133ed565b60010190506000816001600160401b03811115612eb757612eb7613630565b6040519080825280601f01601f191660200182016040528015612ee1576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612eeb57509392505050565b60608151600003612f3c57505060408051602081019091526000815290565b600060405180606001604052806040815260200161438a6040913990506000600384516002612f6b9190613d92565b612f759190613dbc565b612f80906004613da5565b90506000612f8f826020613d92565b6001600160401b03811115612fa657612fa6613630565b6040519080825280601f01601f191660200182016040528015612fd0576020820181803683370190505b509050818152600183018586518101602084015b8183101561303c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612fe4565b600389510660018114613056576002811461306757613073565b613d3d60f01b600119830152613073565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b0384166130a75760405162461bcd60e51b8152600401610cba9061426e565b3360006130b385612a54565b905060006130c085612a54565b90506130d0838989858589612a9f565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156131115760405162461bcd60e51b8152600401610cba906142b3565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061314e908490613d92565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131ae848a8a8a8a8a612b4d565b505050505050505050565b6001600160a01b0385166132405760005b835181101561323e578281815181106131e5576131e5613dfb565b60200260200101516003600086848151811061320357613203613dfb565b6020026020010151815260200190815260200160002060008282546132289190613d92565b90915550613237905081613e11565b90506131ca565b505b6001600160a01b0384166110c15760005b835181101561245357600084828151811061326e5761326e613dfb565b60200260200101519050600084838151811061328c5761328c613dfb565b602002602001015190506000600360008481526020019081526020016000205490508181101561330f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610cba565b6000928352600360205260409092209103905561332b81613e11565b9050613251565b6001600160a01b0384163b156110c15760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613376908990899088908890889060040161432b565b6020604051808303816000875af19250505080156133b1575060408051601f3d908101601f191682019092526133ae91810190614164565b60015b6133bd57612bd8614181565b6001600160e01b0319811663bc197c8160e01b146124535760405162461bcd60e51b8152600401610cba90614226565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061342c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613458576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061347657662386f26fc10000830492506010015b6305f5e100831061348e576305f5e100830492506008015b61271083106134a257612710830492506004015b606483106134b4576064830492506002015b600a8310610ce65760010192915050565b80356001600160a01b03811681146134dc57600080fd5b919050565b600080604083850312156134f457600080fd5b6134fd836134c5565b946020939093013593505050565b6001600160e01b031981168114610f2b57600080fd5b60006020828403121561353357600080fd5b8135610e838161350b565b60006020828403121561355057600080fd5b5035919050565b6000806040838503121561356a57600080fd5b613573836134c5565b915060208301356001600160601b038116811461358f57600080fd5b809150509250929050565b60005b838110156135b557818101518382015260200161359d565b50506000910152565b600081518084526135d681602086016020860161359a565b601f01601f19169290920160200192915050565b602081526000610e8360208301846135be565b60008060006060848603121561361257600080fd5b61361b846134c5565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561366b5761366b613630565b6040525050565b600082601f83011261368357600080fd5b81356001600160401b0381111561369c5761369c613630565b6040516136b3601f8301601f191660200182613646565b8181528460208386010111156136c857600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156136f857600080fd5b8235915060208301356001600160401b0381111561371557600080fd5b61372185828601613672565b9150509250929050565b60006020828403121561373d57600080fd5b610e83826134c5565b6000806040838503121561375957600080fd5b50508035926020909101359150565b60006001600160401b0382111561378157613781613630565b5060051b60200190565b600082601f83011261379c57600080fd5b813560206137a982613768565b6040516137b68282613646565b83815260059390931b85018201928281019150868411156137d657600080fd5b8286015b848110156137f157803583529183019183016137da565b509695505050505050565b600080600080600060a0868803121561381457600080fd5b61381d866134c5565b945061382b602087016134c5565b935060408601356001600160401b038082111561384757600080fd5b61385389838a0161378b565b9450606088013591508082111561386957600080fd5b61387589838a0161378b565b9350608088013591508082111561388b57600080fd5b5061389888828901613672565b9150509295509295909350565b600082601f8301126138b657600080fd5b813560206138c382613768565b6040516138d08282613646565b83815260059390931b85018201928281019150868411156138f057600080fd5b8286015b848110156137f157613905816134c5565b83529183019183016138f4565b6000806040838503121561392557600080fd5b82356001600160401b038082111561393c57600080fd5b613948868387016138a5565b9350602085013591508082111561395e57600080fd5b506137218582860161378b565b600081518084526020808501945080840160005b8381101561399b5781518752958201959082019060010161397f565b509495945050505050565b602081526000610e83602083018461396b565b6000602082840312156139cb57600080fd5b81356001600160401b038111156139e157600080fd5b6139ed84828501613672565b949350505050565b8015158114610f2b57600080fd5b60008060408385031215613a1657600080fd5b613a1f836134c5565b9150602083013561358f816139f5565b60008060408385031215613a4257600080fd5b82356001600160401b0380821115613a5957600080fd5b61394886838701613672565b600060208284031215613a7757600080fd5b8135610e83816139f5565b60008060408385031215613a9557600080fd5b8235915060208301356001600160401b03811115613ab257600080fd5b6137218582860161378b565b600080600060608486031215613ad357600080fd5b83356001600160401b0380821115613aea57600080fd5b613af6878388016138a5565b9450602086013593506040860135915080821115613b1357600080fd5b50613b208682870161378b565b9150509250925092565b60008060408385031215613b3d57600080fd5b82359150613b4d602084016134c5565b90509250929050565b600080600060608486031215613b6b57600080fd5b8335925060208401356001600160401b0380821115613b8957600080fd5b613b958783880161378b565b93506040860135915080821115613bab57600080fd5b50613b2086828701613672565b600080600060608486031215613bcd57600080fd5b613bd6846134c5565b92506020840135915060408401356001600160401b03811115613bf857600080fd5b613b208682870161378b565b60008060408385031215613c1757600080fd5b613c20836134c5565b9150613b4d602084016134c5565b600080600080600060a08688031215613c4657600080fd5b613c4f866134c5565b9450613c5d602087016134c5565b9350604086013592506060860135915060808601356001600160401b03811115613c8657600080fd5b61389888828901613672565b600181811c90821680613ca657607f821691505b602082108103613cc657634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454613cda81613c92565b60018281168015613cf25760018114613d0757613d36565b60ff1984168752821515830287019450613d36565b8860005260208060002060005b85811015613d2d5781548a820152908401908201613d14565b50505082870194505b505050508351613d4a81836020880161359a565b01949350505050565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ce657610ce6613d7c565b8082028115828204841417610ce657610ce6613d7c565b600082613dd957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613df057600080fd5b8151610e83816139f5565b634e487b7160e01b600052603260045260246000fd5b600060018201613e2357613e23613d7c565b5060010190565b60008251613e3c81846020870161359a565b9190910192915050565b600081613e5557613e55613d7c565b506000190190565b67030b1b1b7bab73a160c51b815260008251613e8081600885016020870161359a565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610ed757600081815260208120601f850160051c81016020861015613ed15750805b601f850160051c820191505b818110156110c157828155600101613edd565b81516001600160401b03811115613f0957613f09613630565b613f1d81613f178454613c92565b84613eaa565b602080601f831160018114613f525760008415613f3a5750858301515b600019600386901b1c1916600185901b1785556110c1565b600085815260208120601f198616915b82811015613f8157888601518255948401946001909101908401613f62565b5085821015613f9f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251613fd281600885016020870161359a565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081526000835161408c81601b85016020880161359a565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b9184019182015283516140bf81602e84016020880161359a565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161411281601d85016020870161359a565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614159908301846135be565b979650505050505050565b60006020828403121561417657600080fd5b8151610e838161350b565b600060033d111561419a5760046000803e5060005160e01c5b90565b600060443d10156141ab5790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156141da57505050505090565b82850191508151818111156141f25750505050505090565b843d870101602082850101111561420c5750505050505090565b61421b60208286010187613646565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000614310604083018561396b565b8281036020840152614322818561396b565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906143579083018661396b565b8281036060840152614369818661396b565b9050828103608084015261437d81856135be565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122090c4ce24882964c94716eb1e0138ccd1a30d6a80969dd055afcb4410368218b064736f6c63430008110033

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

000000000000000000000000f73b733e7459cf1e7321ed45ad7ac08893aebc04

-----Decoded View---------------
Arg [0] : _ownerAdd (address): 0xf73B733e7459cF1E7321Ed45Ad7Ac08893AeBC04

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f73b733e7459cf1e7321ed45ad7ac08893aebc04


Deployed Bytecode Sourcemap

80214:10369:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24477:230;;;;;;;;;;-1:-1:-1;24477:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;24477:230:0;;;;;;;;81902:165;;;;;;;;;;-1:-1:-1;81902:165:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;81902:165:0;1019:187:1;88159:111:0;;;;;;;;;;-1:-1:-1;88159:111:0;;;;;:::i;:::-;;:::i;:::-;;81724:157;;;;;;;;;;-1:-1:-1;81724:157:0;;;;;:::i;:::-;;:::i;80374:49::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58087:351::-;;;;;;;;;;-1:-1:-1;58087:351:0;;;;;:::i;:::-;;:::i;89096:217::-;;;;;;;;;;-1:-1:-1;89096:217:0;;;;;:::i;:::-;;:::i;84890:154::-;;;;;;;;;;-1:-1:-1;84890:154:0;;;;;:::i;:::-;;:::i;80883:27::-;;;;;;;;;;-1:-1:-1;80883:27:0;;;;;;;;80787:48;;;;;;;;;;-1:-1:-1;80787:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;87354:126;;;;;;;;;;-1:-1:-1;87354:126:0;;;;;:::i;:::-;87453:10;;87421:7;87443:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;87443:31:0;;;;;;;;;;;87354:126;88023:130;;;;;;;;;;-1:-1:-1;88023:130:0;;;;;:::i;:::-;;:::i;90289:115::-;;;;;;;;;;-1:-1:-1;90289:115:0;;;;;:::i;:::-;;:::i;77659:442::-;;;;;;;;;;-1:-1:-1;77659:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4828:32:1;;;4810:51;;4892:2;4877:18;;4870:34;;;;4783:18;77659:442:0;4636:274:1;80599:38:0;;;;;;;;;;;;;;;;80842:34;;;;;;;;;;;;;;;;84215:302;;;;;;;;;;-1:-1:-1;84215:302:0;;;;;:::i;:::-;;:::i;88411:140::-;;;;;;;;;;-1:-1:-1;88411:140:0;;;;;:::i;:::-;;:::i;72388:143::-;;;;;;;;;;;;72488:42;72388:143;;;;;-1:-1:-1;;;;;6977:32:1;;;6959:51;;6947:2;6932:18;72388:143:0;6781:235:1;80644:38:0;;;;;;;;;;;;;;;;80689:23;;;;;;;;;;;;;;;;24873:524;;;;;;;;;;-1:-1:-1;24873:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55595:122::-;;;;;;;;;;-1:-1:-1;55595:122:0;;;;;:::i;:::-;55652:4;55473:16;;;:12;:16;;;;;;-1:-1:-1;;;55595:122:0;84784:98;;;;;;;;;;-1:-1:-1;84784:98:0;;;;;:::i;:::-;;:::i;84675:101::-;;;;;;;;;;-1:-1:-1;84675:101:0;;;;;:::i;:::-;;:::i;68255:22::-;;;;;;;;;;;;;;;;68402:411;;;;;;;;;;-1:-1:-1;68402:411:0;;;;;:::i;:::-;;:::i;59182:113::-;;;;;;;;;;-1:-1:-1;59182:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;59266:21:0;59242:4;59266:21;;;:10;:21;;;;;;;;;59182:113;88555:156;;;;;;;;;;-1:-1:-1;88555:156:0;;;;;:::i;:::-;;:::i;2753:103::-;;;;;;;;;;;;;:::i;87637:122::-;;;;;;;;;;-1:-1:-1;87637:122:0;;;;;:::i;:::-;;:::i;88871:110::-;;;;;;;;;;-1:-1:-1;88871:110:0;;;;;:::i;:::-;;:::i;87222:126::-;;;;;;;;;;-1:-1:-1;87222:126:0;;;;;:::i;:::-;87321:10;;87289:7;87311:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;87311:31:0;;;;;;;;;;;87222:126;89000:88;;;;;;;;;;-1:-1:-1;89000:88:0;;;;;:::i;:::-;;:::i;86205:882::-;;;;;;:::i;:::-;;:::i;80535:25::-;;;;;;;;;;;;;;;;89321:255;;;;;;;;;;-1:-1:-1;89321:255:0;;;;;:::i;:::-;;:::i;2105:87::-;;;;;;;;;;-1:-1:-1;2178:6:0;;-1:-1:-1;;;;;2178:6:0;2105:87;;87484:149;;;;;;;;;;-1:-1:-1;87484:149:0;;;;;:::i;:::-;87573:7;87595:22;;;:9;:22;;;;;;;;-1:-1:-1;;;;;87595:32:0;;;;;;;;;;;;;87484:149;85052:269;;;;;;;;;;-1:-1:-1;85052:269:0;;;;;:::i;:::-;;:::i;87091:103::-;;;;;;;;;;-1:-1:-1;87091:103:0;;;;;:::i;:::-;;:::i;89584:153::-;;;;;;;;;;-1:-1:-1;89584:153:0;;;;;:::i;:::-;;:::i;80430:28::-;;;;;;;;;;;;;:::i;80748:32::-;;;;;;;;;;;;;;;;83343:239;;;;;;;;;;-1:-1:-1;83343:239:0;;;;;:::i;:::-;;:::i;90463:117::-;;;;;;;;;;-1:-1:-1;90463:117:0;;;;;:::i;:::-;;:::i;88276:131::-;;;;;;;;;;-1:-1:-1;88276:131:0;;;;;:::i;:::-;;:::i;83032:122::-;;;;;;;;;;-1:-1:-1;83032:122:0;;;;;:::i;:::-;;:::i;55384:113::-;;;;;;;;;;-1:-1:-1;55384:113:0;;;;;:::i;:::-;55446:7;55473:16;;;:12;:16;;;;;;;55384:113;80917:27;;;;;;;;;;-1:-1:-1;80917:27:0;;;;;;;;;;;88736:110;;;;;;;;;;-1:-1:-1;88736:110:0;;;;;:::i;:::-;;:::i;85339:844::-;;;;;;:::i;:::-;;:::i;84567:100::-;;;;;;;;;;-1:-1:-1;84567:100:0;;;;;:::i;:::-;-1:-1:-1;;;;;84642:17:0;84618:4;84642:17;;;:13;:17;;;;;;;;;84567:100;69099:434;;;;;;;;;;-1:-1:-1;69099:434:0;;;;;:::i;:::-;;:::i;87786:88::-;;;;;;;;;;-1:-1:-1;87861:7:0;;87786:88;;80567:25;;;;;;;;;;;;;;;;81151:23;;;;;;;;;;-1:-1:-1;81151:23:0;;;;-1:-1:-1;;;;;81151:23:0;;;82096:113;;;;;;;;;;;;;:::i;25697:168::-;;;;;;;;;;-1:-1:-1;25697:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;25820:27:0;;;25796:4;25820:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;25697:168;83770:252;;;;;;;;;;-1:-1:-1;83770:252:0;;;;;:::i;:::-;;:::i;3011:201::-;;;;;;;;;;-1:-1:-1;3011:201:0;;;;;:::i;:::-;;:::i;72336:43::-;;;;;;;;;;-1:-1:-1;72336:43:0;;;;;;;;87899:99;;;;;;;;;;-1:-1:-1;87899:99:0;;;;;:::i;:::-;;:::i;24477:230::-;24563:7;-1:-1:-1;;;;;24591:21:0;;24583:76;;;;-1:-1:-1;;;24583:76:0;;14677:2:1;24583:76:0;;;14659:21:1;14716:2;14696:18;;;14689:30;14755:34;14735:18;;;14728:62;-1:-1:-1;;;14806:18:1;;;14799:40;14856:19;;24583:76:0;;;;;;;;;-1:-1:-1;24677:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;24677:22:0;;;;;;;;;;24477:230;;;;;:::o;81902:165::-;82005:4;82025:36;82049:11;82025:23;:36::i;88159:111::-;59124:32;736:10;59124:18;:32::i;:::-;88240:10:::1;:24:::0;88159:111::o;81724:157::-;59124:32;736:10;59124:18;:32::i;:::-;81831:44:::1;81850:9;81861:13;81831:18;:44::i;:::-;81724:157:::0;;:::o;80374:49::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58087:351::-;58181:22;58206:19;;;:10;:19;;;;;58181:44;;58155:13;;58181:22;58206:19;58181:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58361:1;58342:8;58336:22;:26;:94;;58412:18;58422:7;58412:9;:18::i;:::-;58336:94;;;58389:8;58399;58372:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58336:94;58329:101;58087:351;-1:-1:-1;;;58087:351:0:o;89096:217::-;59124:32;736:10;59124:18;:32::i;:::-;89229:7:::1;89233:2;89229:3;:7::i;:::-;89223:21;89248:1;89223:26:::0;89215:54:::1;;;;-1:-1:-1::0;;;89215:54:0::1;;;;;;;:::i;:::-;89280:25;89286:2;89290;89294:6;89280:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;89096:217:::0;;;:::o;84890:154::-;59124:32;736:10;59124:18;:32::i;:::-;85009:27:::1;85017:7;85026:9;85009:7;:27::i;88023:130::-:0;59124:32;736:10;59124:18;:32::i;:::-;88117:8:::1;88107:7;:18;;;;88146:1;88132:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;88023:130:0:o;90289:115::-;1991:13;:11;:13::i;:::-;90366:30:::1;90385:10;90366:18;:30::i;:::-;90289:115:::0;:::o;77659:442::-;77756:7;77814:27;;;:17;:27;;;;;;;;77785:56;;;;;;;;;-1:-1:-1;;;;;77785:56:0;;;;;-1:-1:-1;;;77785:56:0;;;-1:-1:-1;;;;;77785:56:0;;;;;;;;77756:7;;77854:92;;-1:-1:-1;77905:29:0;;;;;;;;;77915:19;77905:29;-1:-1:-1;;;;;77905:29:0;;;;-1:-1:-1;;;77905:29:0;;-1:-1:-1;;;;;77905:29:0;;;;;77854:92;77996:23;;;;77958:21;;78467:5;;77983:36;;-1:-1:-1;;;;;77983:36:0;:10;:36;:::i;:::-;77982:58;;;;:::i;:::-;78061:16;;;;;-1:-1:-1;77659:442:0;;-1:-1:-1;;;;77659:442:0:o;84215:302::-;84435:4;72488:42;73636:45;:49;;;;:77;;-1:-1:-1;73689:24:0;;;;73636:77;73632:567;;;73953:10;-1:-1:-1;;;;;73945:18:0;;;73941:85;;84452:57:::1;84480:4;84486:2;84490:3;84495:7;84504:4;84452:27;:57::i;:::-;74004:7:::0;;73941:85;74045:69;;-1:-1:-1;;;74045:69:0;;74096:4;74045:69;;;17767:34:1;74103:10:0;17817:18:1;;;17810:43;72488:42:0;;74045;;17702:18:1;;74045:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74040:148;;74142:30;;-1:-1:-1;;;74142:30:0;;74161:10;74142:30;;;6959:51:1;6932:18;;74142:30:0;6781:235:1;74040:148:0;84452:57:::1;84480:4;84486:2;84490:3;84495:7;84504:4;84452:27;:57::i;:::-;84215:302:::0;;;;;;:::o;88411:140::-;59124:32;736:10;59124:18;:32::i;:::-;88510:18:::1;::::0;;;:13:::1;:18;::::0;;;;:35;88411:140::o;24873:524::-;25029:16;25090:3;:10;25071:8;:15;:29;25063:83;;;;-1:-1:-1;;;25063:83:0;;18316:2:1;25063:83:0;;;18298:21:1;18355:2;18335:18;;;18328:30;18394:34;18374:18;;;18367:62;-1:-1:-1;;;18445:18:1;;;18438:39;18494:19;;25063:83:0;18114:405:1;25063:83:0;25159:30;25206:8;:15;-1:-1:-1;;;;;25192:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25192:30:0;;25159:63;;25240:9;25235:122;25259:8;:15;25255:1;:19;25235:122;;;25315:30;25325:8;25334:1;25325:11;;;;;;;;:::i;:::-;;;;;;;25338:3;25342:1;25338:6;;;;;;;;:::i;:::-;;;;;;;25315:9;:30::i;:::-;25296:13;25310:1;25296:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;25276:3;;;:::i;:::-;;;25235:122;;;-1:-1:-1;25376:13:0;24873:524;-1:-1:-1;;;24873:524:0:o;84784:98::-;59124:32;736:10;59124:18;:32::i;:::-;84857:17:::1;84869:4;84857:11;:17::i;84675:101::-:0;59124:32;736:10;59124:18;:32::i;:::-;-1:-1:-1;;;;;84744:17:0;;;::::1;;::::0;;;:13:::1;:17;::::0;;;;:24;;-1:-1:-1;;84744:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;84675:101::o;68402:411::-;68494:4;68511:13;68554:7;68537:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;68527:36;;;;;;68511:52;;68579:9;68574:192;68598:6;:13;68594:1;:17;68574:192;;;68649:6;68656:1;68649:9;;;;;;;;:::i;:::-;;;;;;;68641:5;:17;:113;;68736:6;68743:1;68736:9;;;;;;;;:::i;:::-;;;;;;;68747:5;68719:34;;;;;;;;19247:19:1;;;19291:2;19282:12;;19275:28;19328:2;19319:12;;19090:247;68719:34:0;;;;;;;;;;;;;68709:45;;;;;;68641:113;;;68688:5;68695:6;68702:1;68695:9;;;;;;;;:::i;:::-;;;;;;;68671:34;;;;;;;;19247:19:1;;;19291:2;19282:12;;19275:28;19328:2;19319:12;;19090:247;68671:34:0;;;;;;;;;;;;;68661:45;;;;;;68641:113;68633:121;-1:-1:-1;68613:3:0;;;;:::i;:::-;;;;68574:192;;;-1:-1:-1;68792:13:0;;68783:22;;68402:411;-1:-1:-1;;;68402:411:0:o;88555:156::-;59124:32;736:10;59124:18;:32::i;:::-;68919:23;;;;:13;:23;;;;;;:37;81724:157::o;2753:103::-;1991:13;:11;:13::i;:::-;2818:30:::1;2845:1;2818:18;:30::i;:::-;2753:103::o:0;87637:122::-;87711:7;87733:11;87745:7;87733:20;;;;;;:::i;:::-;;;;;;;;;;;;;;87726:27;;87637:122;;;:::o;88871:110::-;59124:32;736:10;59124:18;:32::i;:::-;88952:15:::1;:23:::0;;;::::1;;;;-1:-1:-1::0;;88952:23:0;;::::1;::::0;;;::::1;::::0;;88871:110::o;89000:88::-;59124:32;736:10;59124:18;:32::i;:::-;89068:6:::1;:14:::0;;-1:-1:-1;;89068:14:0::1;::::0;::::1;;::::0;;;::::1;::::0;;89000:88::o;86205:882::-;67492:21;:19;:21::i;:::-;86329:10:::1;86333:5;;86329:3;:10::i;:::-;86323:24;86351:1;86323:29:::0;86315:57:::1;;;;-1:-1:-1::0;;;86315:57:0::1;;;;;;;:::i;:::-;86387:15;::::0;::::1;::::0;::::1;;;86379:51;;;::::0;-1:-1:-1;;;86379:51:0;;19544:2:1;86379:51:0::1;::::0;::::1;19526:21:1::0;19583:2;19563:18;;;19556:30;19622:25;19602:18;;;19595:53;19665:18;;86379:51:0::1;19342:347:1::0;86379:51:0::1;86445:41;86459:10;86470:7;;86479:6;86445:13;:41::i;:::-;86437:78;;;::::0;-1:-1:-1;;;86437:78:0;;19896:2:1;86437:78:0::1;::::0;::::1;19878:21:1::0;19935:2;19915:18;;;19908:30;-1:-1:-1;;;19954:18:1;;;19947:54;20018:18;;86437:78:0::1;19694:348:1::0;86437:78:0::1;86549:7;86530:15;;:26;;86522:81;;;::::0;-1:-1:-1;;;86522:81:0;;20249:2:1;86522:81:0::1;::::0;::::1;20231:21:1::0;20288:2;20268:18;;;20261:30;20327:34;20307:18;;;20300:62;-1:-1:-1;;;20378:18:1;;;20371:40;20428:19;;86522:81:0::1;20047:406:1::0;86522:81:0::1;86632:7;::::0;86618:22:::1;::::0;;;:13:::1;:22;::::0;;;;;:33;-1:-1:-1;86618:33:0::1;86610:86;;;::::0;-1:-1:-1;;;86610:86:0;;20660:2:1;86610:86:0::1;::::0;::::1;20642:21:1::0;20699:2;20679:18;;;20672:30;20738:34;20718:18;;;20711:62;-1:-1:-1;;;20789:18:1;;;20782:38;20837:19;;86610:86:0::1;20458:404:1::0;86610:86:0::1;86747:10;::::0;86737:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;86759:10:::1;86737:33:::0;;;;;;;;:43:::1;::::0;86773:7;;86737:43:::1;:::i;:::-;86725:7;::::0;86711:22:::1;::::0;;;:13:::1;:22;::::0;;;;;:69:::1;;86703:112;;;::::0;-1:-1:-1;;;86703:112:0;;21069:2:1;86703:112:0::1;::::0;::::1;21051:21:1::0;21108:2;21088:18;;;21081:30;21147:32;21127:18;;;21120:60;21197:18;;86703:112:0::1;20867:354:1::0;86703:112:0::1;86857:7;86843:11;;:21;;;;:::i;:::-;86830:9;:34;86822:71;;;::::0;-1:-1:-1;;;86822:71:0;;21428:2:1;86822:71:0::1;::::0;::::1;21410:21:1::0;21467:2;21447:18;;;21440:30;-1:-1:-1;;;21486:18:1;;;21479:54;21550:18;;86822:71:0::1;21226:348:1::0;86822:71:0::1;86943:8;::::0;86931:5:::1;::::0;55446:7;55473:16;;;:12;:16;;;;;;86909:28:::1;::::0;:7;:28:::1;:::i;:::-;86908:44;;:61;;;-1:-1:-1::0;86956:8:0::1;::::0;:13;86908:61:::1;86900:86;;;::::0;-1:-1:-1;;;86900:86:0;;21781:2:1;86900:86:0::1;::::0;::::1;21763:21:1::0;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:42;21891:18;;86900:86:0::1;21579:336:1::0;86900:86:0::1;87003:10;::::0;86993:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;87015:10:::1;86993:33:::0;;;;;;;:44;;87030:7;;86993:21;:44:::1;::::0;87030:7;;86993:44:::1;:::i;:::-;;;;;;;;87044:37;87050:10;87062:5;;87069:7;87044:37;;;;;;;;;;;::::0;:5:::1;:37::i;:::-;67536:20:::0;66930:1;68056:7;:22;67873:213;89321:255;59124:32;736:10;59124:18;:32::i;:::-;89472:9:::1;89467:102;89491:4;:11;89487:1;:15;89467:102;;;89524:33;89530:4;89535:1;89530:7;;;;;;;;:::i;:::-;;;;;;;89539:2;89543:6;89550:1;89543:9;;;;;;;;:::i;:::-;;;;;;;89524:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;89504:3:::0;::::1;::::0;::::1;:::i;:::-;;;;89467:102;;;;89321:255:::0;;;:::o;85052:269::-;59124:32;736:10;59124:18;:32::i;:::-;85185:12:::1;85189:7;85185:3;:12::i;:::-;85179:26:::0;:31;85171:62:::1;;;::::0;-1:-1:-1;;;85171:62:0;;22122:2:1;85171:62:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;-1:-1:-1;;;22180:18:1;;;22173:48;22238:18;;85171:62:0::1;21920:342:1::0;85171:62:0::1;85250:8;::::0;;85244:31:::1;::::0;;;;::::1;::::0;;85250:8:::1;85244:31:::0;;::::1;::::0;-1:-1:-1;;;;;85250:8:0;;::::1;::::0;85260:7;;85250:8;;85244:5:::1;:31::i;87091:103::-:0;59124:32;736:10;59124:18;:32::i;:::-;87168:8:::1;:20:::0;87091:103::o;89584:153::-;59124:32;736:10;59124:18;:32::i;:::-;89708:21:::1;89714:2;89718;89722:6;89708:5;:21::i;80430:28::-:0;;;;;;;:::i;83343:239::-;83447:8;72488:42;74410:45;:49;;;;:77;;-1:-1:-1;74463:24:0;;;;74410:77;74406:253;;;74509:67;;-1:-1:-1;;;74509:67:0;;74560:4;74509:67;;;17767:34:1;-1:-1:-1;;;;;17837:15:1;;17817:18;;;17810:43;72488:42:0;;74509;;17702:18:1;;74509:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74504:144;;74604:28;;-1:-1:-1;;;74604:28:0;;-1:-1:-1;;;;;6977:32:1;;74604:28:0;;;6959:51:1;6932:18;;74604:28:0;6781:235:1;74504:144:0;83468:43:::1;83492:8;83502;83468:23;:43::i;:::-;83522:52;736:10:::0;83555:8:::1;83565;83522:18;:52::i;90463:117::-:0;1991:13;:11;:13::i;:::-;90541:31:::1;90561:10;90541:19;:31::i;88276:131::-:0;59124:32;736:10;59124:18;:32::i;:::-;88367:15:::1;:34:::0;88276:131::o;83032:122::-;59124:32;736:10;59124:18;:32::i;:::-;83114:24:::1;:32:::0;;-1:-1:-1;;83114:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;83032:122::o;88736:110::-;59124:32;736:10;59124:18;:32::i;:::-;88817:15:::1;:23:::0;;-1:-1:-1;;88817:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;88736:110::o;85339:844::-;67492:21;:19;:21::i;:::-;85485:10:::1;85489:5;;85485:3;:10::i;:::-;85479:24;85507:1;85479:29:::0;85471:57:::1;;;;-1:-1:-1::0;;;85471:57:0::1;;;;;;;:::i;:::-;85543:15;::::0;::::1;;85535:51;;;::::0;-1:-1:-1;;;85535:51:0;;22469:2:1;85535:51:0::1;::::0;::::1;22451:21:1::0;22508:2;22488:18;;;22481:30;22547:25;22527:18;;;22520:53;22590:18;;85535:51:0::1;22267:347:1::0;85535:51:0::1;85601:30;85615:7;85624:6;85601:13;:30::i;:::-;85593:67;;;::::0;-1:-1:-1;;;85593:67:0;;19896:2:1;85593:67:0::1;::::0;::::1;19878:21:1::0;19935:2;19915:18;;;19908:30;-1:-1:-1;;;19954:18:1;;;19947:54;20018:18;;85593:67:0::1;19694:348:1::0;85593:67:0::1;85702:10;::::0;85692:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;85714:10:::1;85692:33:::0;;;;;;;;:43:::1;::::0;85728:7;;85692:43:::1;:::i;:::-;85675:13;;:60;;85667:103;;;::::0;-1:-1:-1;;;85667:103:0;;21069:2:1;85667:103:0::1;::::0;::::1;21051:21:1::0;21108:2;21088:18;;;21081:30;21147:32;21127:18;;;21120:60;21197:18;;85667:103:0::1;20867:354:1::0;85667:103:0::1;85825:7;85802:11;85814:7;85802:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:30;;;;:::i;:::-;85785:13;;:47;;85777:96;;;::::0;-1:-1:-1;;;85777:96:0;;22821:2:1;85777:96:0::1;::::0;::::1;22803:21:1::0;22860:2;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;-1:-1:-1;;;22950:18:1;;;22943:34;22994:19;;85777:96:0::1;22619:400:1::0;85777:96:0::1;85915:7;85901:11;;:21;;;;:::i;:::-;85888:9;:34;85880:71;;;::::0;-1:-1:-1;;;85880:71:0;;21428:2:1;85880:71:0::1;::::0;::::1;21410:21:1::0;21467:2;21447:18;;;21440:30;-1:-1:-1;;;21486:18:1;;;21479:54;21550:18;;85880:71:0::1;21226:348:1::0;85880:71:0::1;86001:8;::::0;85989:5:::1;::::0;55446:7;55473:16;;;:12;:16;;;;;;85967:28:::1;::::0;:7;:28:::1;:::i;:::-;85966:44;;:61;;;-1:-1:-1::0;86014:8:0::1;::::0;:13;85966:61:::1;85958:86;;;::::0;-1:-1:-1;;;85958:86:0;;21781:2:1;85958:86:0::1;::::0;::::1;21763:21:1::0;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:42;21891:18;;85958:86:0::1;21579:336:1::0;85958:86:0::1;86061:10;::::0;86051:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;86073:10:::1;86051:33:::0;;;;;;;:44;;86088:7;;86051:21;:44:::1;::::0;86088:7;;86051:44:::1;:::i;:::-;;;;;;;;86126:7;86102:11;86114:7;86102:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;86140:37;86146:10;86158:5;;86165:7;86140:37;;;;;;;;;;;::::0;:5:::1;:37::i;:::-;67536:20:::0;66930:1;68056:7;:22;67873:213;69099:434;69246:26;;-1:-1:-1;;23173:2:1;23169:15;;;23165:53;69246:26:0;;;23153:66:1;69203:4:0;;;;23235:12:1;;69246:26:0;;;;;;;;;;;;69236:37;;;;;;69220:53;;69289:9;69284:192;69308:6;:13;69304:1;:17;69284:192;;;69359:6;69366:1;69359:9;;;;;;;;:::i;:::-;;;;;;;69351:5;:17;:113;;69446:6;69453:1;69446:9;;;;;;;;:::i;:::-;;;;;;;69457:5;69429:34;;;;;;;;19247:19:1;;;19291:2;19282:12;;19275:28;19328:2;19319:12;;19090:247;69429:34:0;;;;;;;;;;;;;69419:45;;;;;;69351:113;;;69398:5;69405:6;69412:1;69405:9;;;;;;;;:::i;:::-;;;;;;;69381:34;;;;;;;;19247:19:1;;;19291:2;19282:12;;19275:28;19328:2;19319:12;;19090:247;69381:34:0;;;;;;;;;;;;;69371:45;;;;;;69351:113;69343:121;-1:-1:-1;69323:3:0;;;;:::i;:::-;;;;69284:192;;;-1:-1:-1;69502:23:0;;;;:13;:23;;;;;;69493:32;;-1:-1:-1;69099:434:0;;;;;:::o;82096:113::-;82150:13;82183:20;:18;:20::i;:::-;82176:27;;82096:113;:::o;83770:252::-;83937:4;72488:42;73636:45;:49;;;;:77;;-1:-1:-1;73689:24:0;;;;73636:77;73632:567;;;73953:10;-1:-1:-1;;;;;73945:18:0;;;73941:85;;83959:55:::1;83982:4;83988:2;83992:7;84001:6;84009:4;83959:22;:55::i;73941:85::-:0;74045:69;;-1:-1:-1;;;74045:69:0;;74096:4;74045:69;;;17767:34:1;74103:10:0;17817:18:1;;;17810:43;72488:42:0;;74045;;17702:18:1;;74045:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74040:148;;74142:30;;-1:-1:-1;;;74142:30:0;;74161:10;74142:30;;;6959:51:1;6932:18;;74142:30:0;6781:235:1;74040:148:0;83959:55:::1;83982:4;83988:2;83992:7;84001:6;84009:4;83959:22;:55::i;3011:201::-:0;1991:13;:11;:13::i;:::-;-1:-1:-1;;;;;3100:22:0;::::1;3092:73;;;::::0;-1:-1:-1;;;3092:73:0;;23460:2:1;3092:73:0::1;::::0;::::1;23442:21:1::0;23499:2;23479:18;;;23472:30;23538:34;23518:18;;;23511:62;-1:-1:-1;;;23589:18:1;;;23582:36;23635:19;;3092:73:0::1;23258:402:1::0;3092:73:0::1;3176:28;3195:8;3176:18;:28::i;87899:99::-:0;59124:32;736:10;59124:18;:32::i;:::-;87974:7:::1;:18:::0;87899:99::o;54439:447::-;54514:13;54540:19;54572:10;54576:6;54572:1;:10;:::i;:::-;:14;;54585:1;54572:14;:::i;:::-;-1:-1:-1;;;;;54562:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54562:25:0;;54540:47;;-1:-1:-1;;;54598:6:0;54605:1;54598:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54598:15:0;;;;;;;;;-1:-1:-1;;;54624:6:0;54631:1;54624:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54624:15:0;;;;;;;;-1:-1:-1;54655:9:0;54667:10;54671:6;54667:1;:10;:::i;:::-;:14;;54680:1;54667:14;:::i;:::-;54655:26;;54650:131;54687:1;54683;:5;54650:131;;;-1:-1:-1;;;54731:5:0;54739:3;54731:11;54722:21;;;;;;;:::i;:::-;;;;54710:6;54717:1;54710:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;54710:33:0;;;;;;;;-1:-1:-1;54768:1:0;54758:11;;;;;54690:3;;;:::i;:::-;;;54650:131;;;-1:-1:-1;54799:10:0;;54791:55;;;;-1:-1:-1;;;54791:55:0;;24008:2:1;54791:55:0;;;23990:21:1;;;24027:18;;;24020:30;24086:34;24066:18;;;24059:62;24138:18;;54791:55:0;23806:356:1;77389:215:0;77491:4;-1:-1:-1;;;;;;77515:41:0;;-1:-1:-1;;;77515:41:0;;:81;;;77560:36;77584:11;77560:23;:36::i;59881:370::-;-1:-1:-1;;;;;59975:21:0;;;;;;:10;:21;;;;;;;;60108:46;736:10;60136:12;-1:-1:-1;;;;;60108:46:0;60151:2;60108:19;:46::i;:::-;60036:181;;;;;;;;:::i;:::-;;;;;;;;;;;;;59953:290;;;;;-1:-1:-1;;;59953:290:0;;;;;;;;:::i;78751:332::-;78467:5;-1:-1:-1;;;;;78854:33:0;;;;78846:88;;;;-1:-1:-1;;;78846:88:0;;24985:2:1;78846:88:0;;;24967:21:1;25024:2;25004:18;;;24997:30;25063:34;25043:18;;;25036:62;-1:-1:-1;;;25114:18:1;;;25107:40;25164:19;;78846:88:0;24783:406:1;78846:88:0;-1:-1:-1;;;;;78953:22:0;;78945:60;;;;-1:-1:-1;;;78945:60:0;;25396:2:1;78945:60:0;;;25378:21:1;25435:2;25415:18;;;25408:30;25474:27;25454:18;;;25447:55;25519:18;;78945:60:0;25194:349:1;78945:60:0;79040:35;;;;;;;;;-1:-1:-1;;;;;79040:35:0;;;;;;-1:-1:-1;;;;;79040:35:0;;;;;;;;;;-1:-1:-1;;;79018:57:0;;;;:19;:57;78751:332::o;24221:105::-;24281:13;24314:4;24307:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24221:105;;;:::o;31118:729::-;-1:-1:-1;;;;;31271:16:0;;31263:62;;;;-1:-1:-1;;;31263:62:0;;25750:2:1;31263:62:0;;;25732:21:1;25789:2;25769:18;;;25762:30;25828:34;25808:18;;;25801:62;-1:-1:-1;;;25879:18:1;;;25872:31;25920:19;;31263:62:0;25548:397:1;31263:62:0;736:10;31338:16;31403:21;31421:2;31403:17;:21::i;:::-;31380:44;;31435:24;31462:25;31480:6;31462:17;:25::i;:::-;31435:52;;31500:66;31521:8;31539:1;31543:2;31547:3;31552:7;31561:4;31500:20;:66::i;:::-;31579:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31579:17:0;;;;;;;;;:27;;31600:6;;31579:9;:27;;31600:6;;31579:27;:::i;:::-;;;;-1:-1:-1;;31622:52:0;;;26124:25:1;;;26180:2;26165:18;;26158:34;;;-1:-1:-1;;;;;31622:52:0;;;;31655:1;;31622:52;;;;;;26097:18:1;31622:52:0;;;;;;;31765:74;31796:8;31814:1;31818:2;31822;31826:6;31834:4;31765:30;:74::i;:::-;31252:595;;;31118:729;;;;:::o;58523:166::-;58609:19;;;;:10;:19;;;;;:30;58631:8;58609:19;:30;:::i;:::-;;58673:7;58655:26;58659:12;58663:7;58659:3;:12::i;:::-;58655:26;;;;;;:::i;:::-;;;;;;;;58523:166;;:::o;2270:132::-;2178:6;;-1:-1:-1;;;;;2178:6:0;736:10;2334:23;2326:68;;;;-1:-1:-1;;;2326:68:0;;28483:2:1;2326:68:0;;;28465:21:1;;;28502:18;;;28495:30;28561:34;28541:18;;;28534:62;28613:18;;2326:68:0;28281:356:1;59301:421:0;-1:-1:-1;;;;;59392:22:0;;;;;;:10;:22;;;;;;;;59391:23;59526:46;736:10;59554:12;656:98;59526:46;59454:194;;;;;;;;:::i;:::-;;;;;;;;;;;;;59369:305;;;;;-1:-1:-1;;;59369:305:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;59685:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;59685:29:0;59710:4;59685:29;;;59301:421::o;26420:438::-;-1:-1:-1;;;;;26653:20:0;;736:10;26653:20;;:60;;-1:-1:-1;26677:36:0;26694:4;736:10;25697:168;:::i;26677:36::-;26631:156;;;;-1:-1:-1;;;26631:156:0;;;;;;;:::i;:::-;26798:52;26821:4;26827:2;26831:3;26836:7;26845:4;26798:22;:52::i;:::-;26420:438;;;;;:::o;58776:98::-;58848:8;:18;58859:7;58848:8;:18;:::i;3372:191::-;3465:6;;;-1:-1:-1;;;;;3482:17:0;;;-1:-1:-1;;;;;;3482:17:0;;;;;;;3515:40;;3465:6;;;3482:17;3465:6;;3515:40;;3446:16;;3515:40;3435:128;3372:191;:::o;67572:293::-;66974:1;67706:7;;:19;67698:63;;;;-1:-1:-1;;;67698:63:0;;29888:2:1;67698:63:0;;;29870:21:1;29927:2;29907:18;;;29900:30;29966:33;29946:18;;;29939:61;30017:18;;67698:63:0;29686:355:1;67698:63:0;66974:1;67839:7;:18;67572:293::o;33361:808::-;-1:-1:-1;;;;;33488:18:0;;33480:66;;;;-1:-1:-1;;;33480:66:0;;30248:2:1;33480:66:0;;;30230:21:1;30287:2;30267:18;;;30260:30;30326:34;30306:18;;;30299:62;-1:-1:-1;;;30377:18:1;;;30370:33;30420:19;;33480:66:0;30046:399:1;33480:66:0;736:10;33559:16;33624:21;33642:2;33624:17;:21::i;:::-;33601:44;;33656:24;33683:25;33701:6;33683:17;:25::i;:::-;33656:52;;33721:66;33742:8;33752:4;33766:1;33770:3;33775:7;33721:66;;;;;;;;;;;;:20;:66::i;:::-;33800:19;33822:13;;;;;;;;;;;-1:-1:-1;;;;;33822:19:0;;;;;;;;;;33860:21;;;;33852:70;;;;-1:-1:-1;;;33852:70:0;;30652:2:1;33852:70:0;;;30634:21:1;30691:2;30671:18;;;30664:30;30730:34;30710:18;;;30703:62;-1:-1:-1;;;30781:18:1;;;30774:34;30825:19;;33852:70:0;30450:400:1;33852:70:0;33958:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33958:19:0;;;;;;;;;;;;33980:20;;;33958:42;;34029:54;;26124:25:1;;;26165:18;;;26158:34;;;33958:19:0;;34029:54;;;;;;26097:18:1;34029:54:0;;;;;;;34096:65;;;;;;;;;34140:1;34096:65;;;84215:302;25470:155;25565:52;736:10;25598:8;25608;35531:331;35686:8;-1:-1:-1;;;;;35677:17:0;:5;-1:-1:-1;;;;;35677:17:0;;35669:71;;;;-1:-1:-1;;;35669:71:0;;31057:2:1;35669:71:0;;;31039:21:1;31096:2;31076:18;;;31069:30;31135:34;31115:18;;;31108:62;-1:-1:-1;;;31186:18:1;;;31179:39;31235:19;;35669:71:0;30855:405:1;35669:71:0;-1:-1:-1;;;;;35751:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35751:46:0;;;;;;;;;;35813:41;;1159::1;;;35813::0;;1132:18:1;35813:41:0;;;;;;;35531:331;;;:::o;59728:147::-;59797:30;59816:10;59797:18;:30::i;:::-;-1:-1:-1;;;;;59845:22:0;;;;;:10;:22;;;;;59838:29;;-1:-1:-1;;59838:29:0;;;59728:147::o;82235:567::-;82288:13;82311:16;;82356:32;82311:16;78467:5;82356:11;:32::i;:::-;82310:78;;;;82497:283;82609:33;82626:15;82609:16;:33::i;:::-;82684:51;82720:8;-1:-1:-1;;;;;82704:26:0;82732:2;82684:19;:51::i;:::-;82543:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82497:13;:283::i;:::-;82428:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;82406:390;;;;82235:567;:::o;25937:406::-;-1:-1:-1;;;;;26145:20:0;;736:10;26145:20;;:60;;-1:-1:-1;26169:36:0;26186:4;736:10;25697:168;:::i;26169:36::-;26123:156;;;;-1:-1:-1;;;26123:156:0;;;;;;;:::i;:::-;26290:45;26308:4;26314:2;26318;26322:6;26330:4;26290:17;:45::i;23500:310::-;23602:4;-1:-1:-1;;;;;;23639:41:0;;-1:-1:-1;;;23639:41:0;;:110;;-1:-1:-1;;;;;;;23697:52:0;;-1:-1:-1;;;23697:52:0;23639:110;:163;;;-1:-1:-1;;;;;;;;;;14889:40:0;;;23766:36;14780:157;39797:198;39917:16;;;39931:1;39917:16;;;;;;;;;39863;;39892:22;;39917:16;;;;;;;;;;;;-1:-1:-1;39917:16:0;39892:41;;39955:7;39944:5;39950:1;39944:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;39982:5;39797:198;-1:-1:-1;;39797:198:0:o;89745:488::-;2178:6;;-1:-1:-1;;;;;90006:19:0;;;2178:6;;90006:19;;:54;;-1:-1:-1;;;;;;90029:23:0;;;;;;:13;:23;;;;;;;;:31;;:23;:31;90006:54;:72;;;-1:-1:-1;90064:6:0;;;;:14;;:6;:14;90006:72;:94;;;-1:-1:-1;;;;;;90082:18:0;;;90006:94;89984:164;;;;-1:-1:-1;;;89984:164:0;;32988:2:1;89984:164:0;;;32970:21:1;33027:2;33007:18;;;33000:30;-1:-1:-1;;;33046:18:1;;;33039:50;33106:18;;89984:164:0;32786:344:1;89984:164:0;90159:66;90186:8;90196:4;90202:2;90206:3;90211:7;90220:4;90159:26;:66::i;38224:744::-;-1:-1:-1;;;;;38439:13:0;;5098:19;:23;38435:526;;38475:72;;-1:-1:-1;;;38475:72:0;;-1:-1:-1;;;;;38475:38:0;;;;;:72;;38514:8;;38524:4;;38530:2;;38534:6;;38542:4;;38475:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38475:72:0;;;;;;;;-1:-1:-1;;38475:72:0;;;;;;;;;;;;:::i;:::-;;;38471:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38823:6;38816:14;;-1:-1:-1;;;38816:14:0;;;;;;;;:::i;38471:479::-;;;38872:62;;-1:-1:-1;;;38872:62:0;;35017:2:1;38872:62:0;;;34999:21:1;35056:2;35036:18;;;35029:30;35095:34;35075:18;;;35068:62;-1:-1:-1;;;35146:18:1;;;35139:50;35206:19;;38872:62:0;34815:416:1;38471:479:0;-1:-1:-1;;;;;;38597:55:0;;-1:-1:-1;;;38597:55:0;38593:154;;38677:50;;-1:-1:-1;;;38677:50:0;;;;;;;:::i;28654:1146::-;28881:7;:14;28867:3;:10;:28;28859:81;;;;-1:-1:-1;;;28859:81:0;;35847:2:1;28859:81:0;;;35829:21:1;35886:2;35866:18;;;35859:30;35925:34;35905:18;;;35898:62;-1:-1:-1;;;35976:18:1;;;35969:38;36024:19;;28859:81:0;35645:404:1;28859:81:0;-1:-1:-1;;;;;28959:16:0;;28951:66;;;;-1:-1:-1;;;28951:66:0;;;;;;;:::i;:::-;736:10;29074:60;736:10;29105:4;29111:2;29115:3;29120:7;29129:4;29074:20;:60::i;:::-;29152:9;29147:421;29171:3;:10;29167:1;:14;29147:421;;;29203:10;29216:3;29220:1;29216:6;;;;;;;;:::i;:::-;;;;;;;29203:19;;29237:14;29254:7;29262:1;29254:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29281:19;29303:13;;;;;;;;;;-1:-1:-1;;;;;29303:19:0;;;;;;;;;;;;29254:10;;-1:-1:-1;29345:21:0;;;;29337:76;;;;-1:-1:-1;;;29337:76:0;;;;;;;:::i;:::-;29457:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29457:19:0;;;;;;;;;;29479:20;;;29457:42;;29529:17;;;;;;;:27;;29479:20;;29457:9;29529:27;;29479:20;;29529:27;:::i;:::-;;;;;;;;29188:380;;;29183:3;;;;:::i;:::-;;;29147:421;;;;29615:2;-1:-1:-1;;;;;29585:47:0;29609:4;-1:-1:-1;;;;;29585:47:0;29599:8;-1:-1:-1;;;;;29585:47:0;;29619:3;29624:7;29585:47;;;;;;;:::i;:::-;;;;;;;;29717:75;29753:8;29763:4;29769:2;29773:3;29778:7;29787:4;29717:35;:75::i;53307:716::-;53363:13;53414:14;53431:17;53442:5;53431:10;:17::i;:::-;53451:1;53431:21;53414:38;;53467:20;53501:6;-1:-1:-1;;;;;53490:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53490:18:0;-1:-1:-1;53467:41:0;-1:-1:-1;53632:28:0;;;53648:2;53632:28;53689:288;-1:-1:-1;;53721:5:0;-1:-1:-1;;;53858:2:0;53847:14;;53842:30;53721:5;53829:44;53919:2;53910:11;;;-1:-1:-1;53940:21:0;53689:288;53940:21;-1:-1:-1;53998:6:0;53307:716;-1:-1:-1;;;53307:716:0:o;61042:1912::-;61100:13;61130:4;:11;61145:1;61130:16;61126:31;;-1:-1:-1;;61148:9:0;;;;;;;;;-1:-1:-1;61148:9:0;;;61042:1912::o;61126:31::-;61209:19;61231:12;;;;;;;;;;;;;;;;;61209:34;;61295:18;61341:1;61322:4;:11;61336:1;61322:15;;;;:::i;:::-;61321:21;;;;:::i;:::-;61316:27;;:1;:27;:::i;:::-;61295:48;-1:-1:-1;61426:20:0;61460:15;61295:48;61473:2;61460:15;:::i;:::-;-1:-1:-1;;;;;61449:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61449:27:0;;61426:50;;61573:10;61565:6;61558:26;61668:1;61661:5;61657:13;61727:4;61778;61772:11;61763:7;61759:25;61874:2;61866:6;61862:15;61947:754;61966:6;61957:7;61954:19;61947:754;;;62066:1;62057:7;62053:15;62042:26;;62105:7;62099:14;62231:4;62223:5;62219:2;62215:14;62211:25;62201:8;62197:40;62191:47;62180:9;62172:67;62285:1;62274:9;62270:17;62257:30;;62364:4;62356:5;62352:2;62348:14;62344:25;62334:8;62330:40;62324:47;62313:9;62305:67;62418:1;62407:9;62403:17;62390:30;;62497:4;62489:5;62486:1;62481:14;62477:25;62467:8;62463:40;62457:47;62446:9;62438:67;62551:1;62540:9;62536:17;62523:30;;62630:4;62622:5;62610:25;62600:8;62596:40;62590:47;62579:9;62571:67;-1:-1:-1;62684:1:0;62669:17;61947:754;;;62774:1;62767:4;62761:11;62757:19;62795:1;62790:54;;;;62863:1;62858:52;;;;62750:160;;62790:54;-1:-1:-1;;;;;62806:17:0;;62799:43;62790:54;;62858:52;-1:-1:-1;;;;;62874:17:0;;62867:41;62750:160;-1:-1:-1;62940:6:0;;61042:1912;-1:-1:-1;;;;;;;;61042:1912:0:o;27322:974::-;-1:-1:-1;;;;;27510:16:0;;27502:66;;;;-1:-1:-1;;;27502:66:0;;;;;;;:::i;:::-;736:10;27581:16;27646:21;27664:2;27646:17;:21::i;:::-;27623:44;;27678:24;27705:25;27723:6;27705:17;:25::i;:::-;27678:52;;27743:60;27764:8;27774:4;27780:2;27784:3;27789:7;27798:4;27743:20;:60::i;:::-;27816:19;27838:13;;;;;;;;;;;-1:-1:-1;;;;;27838:19:0;;;;;;;;;;27876:21;;;;27868:76;;;;-1:-1:-1;;;27868:76:0;;;;;;;:::i;:::-;27980:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27980:19:0;;;;;;;;;;28002:20;;;27980:42;;28044:17;;;;;;;:27;;28002:20;;27980:9;28044:27;;28002:20;;28044:27;:::i;:::-;;;;-1:-1:-1;;28089:46:0;;;26124:25:1;;;26180:2;26165:18;;26158:34;;;-1:-1:-1;;;;;28089:46:0;;;;;;;;;;;;;;26097:18:1;28089:46:0;;;;;;;28220:68;28251:8;28261:4;28267:2;28271;28275:6;28283:4;28220:30;:68::i;:::-;27491:805;;;;27322:974;;;;;:::o;55792:931::-;-1:-1:-1;;;;;56114:18:0;;56110:160;;56154:9;56149:110;56173:3;:10;56169:1;:14;56149:110;;;56233:7;56241:1;56233:10;;;;;;;;:::i;:::-;;;;;;;56209:12;:20;56222:3;56226:1;56222:6;;;;;;;;:::i;:::-;;;;;;;56209:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;56185:3:0;;-1:-1:-1;56185:3:0;;:::i;:::-;;;56149:110;;;;56110:160;-1:-1:-1;;;;;56286:16:0;;56282:434;;56324:9;56319:386;56343:3;:10;56339:1;:14;56319:386;;;56379:10;56392:3;56396:1;56392:6;;;;;;;;:::i;:::-;;;;;;;56379:19;;56417:14;56434:7;56442:1;56434:10;;;;;;;;:::i;:::-;;;;;;;56417:27;;56463:14;56480:12;:16;56493:2;56480:16;;;;;;;;;;;;56463:33;;56533:6;56523;:16;;56515:69;;;;-1:-1:-1;;;56515:69:0;;37543:2:1;56515:69:0;;;37525:21:1;37582:2;37562:18;;;37555:30;37621:34;37601:18;;;37594:62;-1:-1:-1;;;37672:18:1;;;37665:38;37720:19;;56515:69:0;37341:404:1;56515:69:0;56636:16;;;;:12;:16;;;;;;56655:15;;56636:34;;56355:3;;;:::i;:::-;;;56319:386;;38976:813;-1:-1:-1;;;;;39216:13:0;;5098:19;:23;39212:570;;39252:79;;-1:-1:-1;;;39252:79:0;;-1:-1:-1;;;;;39252:43:0;;;;;:79;;39296:8;;39306:4;;39312:3;;39317:7;;39326:4;;39252:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39252:79:0;;;;;;;;-1:-1:-1;;39252:79:0;;;;;;;;;;;;:::i;:::-;;;39248:523;;;;:::i;:::-;-1:-1:-1;;;;;;39413:60:0;;-1:-1:-1;;;39413:60:0;39409:159;;39498:50;;-1:-1:-1;;;39498:50:0;;;;;;;:::i;50173:922::-;50226:7;;-1:-1:-1;;;50304:15:0;;50300:102;;-1:-1:-1;;;50340:15:0;;;-1:-1:-1;50384:2:0;50374:12;50300:102;50429:6;50420:5;:15;50416:102;;50465:6;50456:15;;;-1:-1:-1;50500:2:0;50490:12;50416:102;50545:6;50536:5;:15;50532:102;;50581:6;50572:15;;;-1:-1:-1;50616:2:0;50606:12;50532:102;50661:5;50652;:14;50648:99;;50696:5;50687:14;;;-1:-1:-1;50730:1:0;50720:11;50648:99;50774:5;50765;:14;50761:99;;50809:5;50800:14;;;-1:-1:-1;50843:1:0;50833:11;50761:99;50887:5;50878;:14;50874:99;;50922:5;50913:14;;;-1:-1:-1;50956:1:0;50946:11;50874:99;51000:5;50991;:14;50987:66;;51036:1;51026:11;51081:6;50173:922;-1:-1:-1;;50173:922:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:366::-;1463:6;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1642:2;1631:9;1627:18;1614:32;-1:-1:-1;;;;;1679:5:1;1675:38;1668:5;1665:49;1655:77;;1728:1;1725;1718:12;1655:77;1751:5;1741:15;;;1396:366;;;;;:::o;1767:250::-;1852:1;1862:113;1876:6;1873:1;1870:13;1862:113;;;1952:11;;;1946:18;1933:11;;;1926:39;1898:2;1891:10;1862:113;;;-1:-1:-1;;2009:1:1;1991:16;;1984:27;1767:250::o;2022:271::-;2064:3;2102:5;2096:12;2129:6;2124:3;2117:19;2145:76;2214:6;2207:4;2202:3;2198:14;2191:4;2184:5;2180:16;2145:76;:::i;:::-;2275:2;2254:15;-1:-1:-1;;2250:29:1;2241:39;;;;2282:4;2237:50;;2022:271;-1:-1:-1;;2022:271:1:o;2298:220::-;2447:2;2436:9;2429:21;2410:4;2467:45;2508:2;2497:9;2493:18;2485:6;2467:45;:::i;2523:322::-;2600:6;2608;2616;2669:2;2657:9;2648:7;2644:23;2640:32;2637:52;;;2685:1;2682;2675:12;2637:52;2708:29;2727:9;2708:29;:::i;:::-;2698:39;2784:2;2769:18;;2756:32;;-1:-1:-1;2835:2:1;2820:18;;;2807:32;;2523:322;-1:-1:-1;;;2523:322:1:o;2850:127::-;2911:10;2906:3;2902:20;2899:1;2892:31;2942:4;2939:1;2932:15;2966:4;2963:1;2956:15;2982:249;3092:2;3073:13;;-1:-1:-1;;3069:27:1;3057:40;;-1:-1:-1;;;;;3112:34:1;;3148:22;;;3109:62;3106:88;;;3174:18;;:::i;:::-;3210:2;3203:22;-1:-1:-1;;2982:249:1:o;3236:556::-;3279:5;3332:3;3325:4;3317:6;3313:17;3309:27;3299:55;;3350:1;3347;3340:12;3299:55;3386:6;3373:20;-1:-1:-1;;;;;3408:2:1;3405:26;3402:52;;;3434:18;;:::i;:::-;3483:2;3477:9;3495:67;3550:2;3531:13;;-1:-1:-1;;3527:27:1;3556:4;3523:38;3477:9;3495:67;:::i;:::-;3586:2;3578:6;3571:18;3632:3;3625:4;3620:2;3612:6;3608:15;3604:26;3601:35;3598:55;;;3649:1;3646;3639:12;3598:55;3713:2;3706:4;3698:6;3694:17;3687:4;3679:6;3675:17;3662:54;3760:1;3736:15;;;3753:4;3732:26;3725:37;;;;3740:6;3236:556;-1:-1:-1;;;3236:556:1:o;3797:390::-;3875:6;3883;3936:2;3924:9;3915:7;3911:23;3907:32;3904:52;;;3952:1;3949;3942:12;3904:52;3988:9;3975:23;3965:33;;4049:2;4038:9;4034:18;4021:32;-1:-1:-1;;;;;4068:6:1;4065:30;4062:50;;;4108:1;4105;4098:12;4062:50;4131;4173:7;4164:6;4153:9;4149:22;4131:50;:::i;:::-;4121:60;;;3797:390;;;;;:::o;4192:186::-;4251:6;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;4343:29;4362:9;4343:29;:::i;4383:248::-;4451:6;4459;4512:2;4500:9;4491:7;4487:23;4483:32;4480:52;;;4528:1;4525;4518:12;4480:52;-1:-1:-1;;4551:23:1;;;4621:2;4606:18;;;4593:32;;-1:-1:-1;4383:248:1:o;4915:183::-;4975:4;-1:-1:-1;;;;;5000:6:1;4997:30;4994:56;;;5030:18;;:::i;:::-;-1:-1:-1;5075:1:1;5071:14;5087:4;5067:25;;4915:183::o;5103:724::-;5157:5;5210:3;5203:4;5195:6;5191:17;5187:27;5177:55;;5228:1;5225;5218:12;5177:55;5264:6;5251:20;5290:4;5313:43;5353:2;5313:43;:::i;:::-;5385:2;5379:9;5397:31;5425:2;5417:6;5397:31;:::i;:::-;5463:18;;;5555:1;5551:10;;;;5539:23;;5535:32;;;5497:15;;;;-1:-1:-1;5579:15:1;;;5576:35;;;5607:1;5604;5597:12;5576:35;5643:2;5635:6;5631:15;5655:142;5671:6;5666:3;5663:15;5655:142;;;5737:17;;5725:30;;5775:12;;;;5688;;5655:142;;;-1:-1:-1;5815:6:1;5103:724;-1:-1:-1;;;;;;5103:724:1:o;5832:944::-;5986:6;5994;6002;6010;6018;6071:3;6059:9;6050:7;6046:23;6042:33;6039:53;;;6088:1;6085;6078:12;6039:53;6111:29;6130:9;6111:29;:::i;:::-;6101:39;;6159:38;6193:2;6182:9;6178:18;6159:38;:::i;:::-;6149:48;;6248:2;6237:9;6233:18;6220:32;-1:-1:-1;;;;;6312:2:1;6304:6;6301:14;6298:34;;;6328:1;6325;6318:12;6298:34;6351:61;6404:7;6395:6;6384:9;6380:22;6351:61;:::i;:::-;6341:71;;6465:2;6454:9;6450:18;6437:32;6421:48;;6494:2;6484:8;6481:16;6478:36;;;6510:1;6507;6500:12;6478:36;6533:63;6588:7;6577:8;6566:9;6562:24;6533:63;:::i;:::-;6523:73;;6649:3;6638:9;6634:19;6621:33;6605:49;;6679:2;6669:8;6666:16;6663:36;;;6695:1;6692;6685:12;6663:36;;6718:52;6762:7;6751:8;6740:9;6736:24;6718:52;:::i;:::-;6708:62;;;5832:944;;;;;;;;:::o;7021:730::-;7075:5;7128:3;7121:4;7113:6;7109:17;7105:27;7095:55;;7146:1;7143;7136:12;7095:55;7182:6;7169:20;7208:4;7231:43;7271:2;7231:43;:::i;:::-;7303:2;7297:9;7315:31;7343:2;7335:6;7315:31;:::i;:::-;7381:18;;;7473:1;7469:10;;;;7457:23;;7453:32;;;7415:15;;;;-1:-1:-1;7497:15:1;;;7494:35;;;7525:1;7522;7515:12;7494:35;7561:2;7553:6;7549:15;7573:148;7589:6;7584:3;7581:15;7573:148;;;7655:23;7674:3;7655:23;:::i;:::-;7643:36;;7699:12;;;;7606;;7573:148;;7756:595;7874:6;7882;7935:2;7923:9;7914:7;7910:23;7906:32;7903:52;;;7951:1;7948;7941:12;7903:52;7991:9;7978:23;-1:-1:-1;;;;;8061:2:1;8053:6;8050:14;8047:34;;;8077:1;8074;8067:12;8047:34;8100:61;8153:7;8144:6;8133:9;8129:22;8100:61;:::i;:::-;8090:71;;8214:2;8203:9;8199:18;8186:32;8170:48;;8243:2;8233:8;8230:16;8227:36;;;8259:1;8256;8249:12;8227:36;;8282:63;8337:7;8326:8;8315:9;8311:24;8282:63;:::i;8356:435::-;8409:3;8447:5;8441:12;8474:6;8469:3;8462:19;8500:4;8529:2;8524:3;8520:12;8513:19;;8566:2;8559:5;8555:14;8587:1;8597:169;8611:6;8608:1;8605:13;8597:169;;;8672:13;;8660:26;;8706:12;;;;8741:15;;;;8633:1;8626:9;8597:169;;;-1:-1:-1;8782:3:1;;8356:435;-1:-1:-1;;;;;8356:435:1:o;8796:261::-;8975:2;8964:9;8957:21;8938:4;8995:56;9047:2;9036:9;9032:18;9024:6;8995:56;:::i;9062:322::-;9131:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:52;;;9200:1;9197;9190:12;9152:52;9240:9;9227:23;-1:-1:-1;;;;;9265:6:1;9262:30;9259:50;;;9305:1;9302;9295:12;9259:50;9328;9370:7;9361:6;9350:9;9346:22;9328:50;:::i;:::-;9318:60;9062:322;-1:-1:-1;;;;9062:322:1:o;9389:118::-;9475:5;9468:13;9461:21;9454:5;9451:32;9441:60;;9497:1;9494;9487:12;9512:315;9577:6;9585;9638:2;9626:9;9617:7;9613:23;9609:32;9606:52;;;9654:1;9651;9644:12;9606:52;9677:29;9696:9;9677:29;:::i;:::-;9667:39;;9756:2;9745:9;9741:18;9728:32;9769:28;9791:5;9769:28;:::i;9832:569::-;9935:6;9943;9996:2;9984:9;9975:7;9971:23;9967:32;9964:52;;;10012:1;10009;10002:12;9964:52;10052:9;10039:23;-1:-1:-1;;;;;10122:2:1;10114:6;10111:14;10108:34;;;10138:1;10135;10128:12;10108:34;10161:50;10203:7;10194:6;10183:9;10179:22;10161:50;:::i;10659:241::-;10715:6;10768:2;10756:9;10747:7;10743:23;10739:32;10736:52;;;10784:1;10781;10774:12;10736:52;10823:9;10810:23;10842:28;10864:5;10842:28;:::i;10905:416::-;10998:6;11006;11059:2;11047:9;11038:7;11034:23;11030:32;11027:52;;;11075:1;11072;11065:12;11027:52;11111:9;11098:23;11088:33;;11172:2;11161:9;11157:18;11144:32;-1:-1:-1;;;;;11191:6:1;11188:30;11185:50;;;11231:1;11228;11221:12;11185:50;11254:61;11307:7;11298:6;11287:9;11283:22;11254:61;:::i;11326:663::-;11453:6;11461;11469;11522:2;11510:9;11501:7;11497:23;11493:32;11490:52;;;11538:1;11535;11528:12;11490:52;11578:9;11565:23;-1:-1:-1;;;;;11648:2:1;11640:6;11637:14;11634:34;;;11664:1;11661;11654:12;11634:34;11687:61;11740:7;11731:6;11720:9;11716:22;11687:61;:::i;:::-;11677:71;;11795:2;11784:9;11780:18;11767:32;11757:42;;11852:2;11841:9;11837:18;11824:32;11808:48;;11881:2;11871:8;11868:16;11865:36;;;11897:1;11894;11887:12;11865:36;;11920:63;11975:7;11964:8;11953:9;11949:24;11920:63;:::i;:::-;11910:73;;;11326:663;;;;;:::o;12202:254::-;12270:6;12278;12331:2;12319:9;12310:7;12306:23;12302:32;12299:52;;;12347:1;12344;12337:12;12299:52;12383:9;12370:23;12360:33;;12412:38;12446:2;12435:9;12431:18;12412:38;:::i;:::-;12402:48;;12202:254;;;;;:::o;12461:637::-;12573:6;12581;12589;12642:2;12630:9;12621:7;12617:23;12613:32;12610:52;;;12658:1;12655;12648:12;12610:52;12694:9;12681:23;12671:33;;12755:2;12744:9;12740:18;12727:32;-1:-1:-1;;;;;12819:2:1;12811:6;12808:14;12805:34;;;12835:1;12832;12825:12;12805:34;12858:61;12911:7;12902:6;12891:9;12887:22;12858:61;:::i;:::-;12848:71;;12972:2;12961:9;12957:18;12944:32;12928:48;;13001:2;12991:8;12988:16;12985:36;;;13017:1;13014;13007:12;12985:36;;13040:52;13084:7;13073:8;13062:9;13058:24;13040:52;:::i;13103:490::-;13205:6;13213;13221;13274:2;13262:9;13253:7;13249:23;13245:32;13242:52;;;13290:1;13287;13280:12;13242:52;13313:29;13332:9;13313:29;:::i;:::-;13303:39;;13389:2;13378:9;13374:18;13361:32;13351:42;;13444:2;13433:9;13429:18;13416:32;-1:-1:-1;;;;;13463:6:1;13460:30;13457:50;;;13503:1;13500;13493:12;13457:50;13526:61;13579:7;13570:6;13559:9;13555:22;13526:61;:::i;13598:260::-;13666:6;13674;13727:2;13715:9;13706:7;13702:23;13698:32;13695:52;;;13743:1;13740;13733:12;13695:52;13766:29;13785:9;13766:29;:::i;:::-;13756:39;;13814:38;13848:2;13837:9;13833:18;13814:38;:::i;13863:607::-;13967:6;13975;13983;13991;13999;14052:3;14040:9;14031:7;14027:23;14023:33;14020:53;;;14069:1;14066;14059:12;14020:53;14092:29;14111:9;14092:29;:::i;:::-;14082:39;;14140:38;14174:2;14163:9;14159:18;14140:38;:::i;:::-;14130:48;;14225:2;14214:9;14210:18;14197:32;14187:42;;14276:2;14265:9;14261:18;14248:32;14238:42;;14331:3;14320:9;14316:19;14303:33;-1:-1:-1;;;;;14351:6:1;14348:30;14345:50;;;14391:1;14388;14381:12;14345:50;14414;14456:7;14447:6;14436:9;14432:22;14414:50;:::i;14886:380::-;14965:1;14961:12;;;;15008;;;15029:61;;15083:4;15075:6;15071:17;15061:27;;15029:61;15136:2;15128:6;15125:14;15105:18;15102:38;15099:161;;15182:10;15177:3;15173:20;15170:1;15163:31;15217:4;15214:1;15207:15;15245:4;15242:1;15235:15;15099:161;;14886:380;;;:::o;15397:1020::-;15573:3;15602:1;15635:6;15629:13;15665:36;15691:9;15665:36;:::i;:::-;15720:1;15737:18;;;15764:133;;;;15911:1;15906:356;;;;15730:532;;15764:133;-1:-1:-1;;15797:24:1;;15785:37;;15870:14;;15863:22;15851:35;;15842:45;;;-1:-1:-1;15764:133:1;;15906:356;15937:6;15934:1;15927:17;15967:4;16012:2;16009:1;15999:16;16037:1;16051:165;16065:6;16062:1;16059:13;16051:165;;;16143:14;;16130:11;;;16123:35;16186:16;;;;16080:10;;16051:165;;;16055:3;;;16245:6;16240:3;16236:16;16229:23;;15730:532;;;;;16293:6;16287:13;16309:68;16368:8;16363:3;16356:4;16348:6;16344:17;16309:68;:::i;:::-;16393:18;;15397:1020;-1:-1:-1;;;;15397:1020:1:o;16422:339::-;16624:2;16606:21;;;16663:2;16643:18;;;16636:30;-1:-1:-1;;;16697:2:1;16682:18;;16675:45;16752:2;16737:18;;16422:339::o;16766:127::-;16827:10;16822:3;16818:20;16815:1;16808:31;16858:4;16855:1;16848:15;16882:4;16879:1;16872:15;16898:125;16963:9;;;16984:10;;;16981:36;;;16997:18;;:::i;17028:168::-;17101:9;;;17132;;17149:15;;;17143:22;;17129:37;17119:71;;17170:18;;:::i;17333:217::-;17373:1;17399;17389:132;;17443:10;17438:3;17434:20;17431:1;17424:31;17478:4;17475:1;17468:15;17506:4;17503:1;17496:15;17389:132;-1:-1:-1;17535:9:1;;17333:217::o;17864:245::-;17931:6;17984:2;17972:9;17963:7;17959:23;17955:32;17952:52;;;18000:1;17997;17990:12;17952:52;18032:9;18026:16;18051:28;18073:5;18051:28;:::i;18524:127::-;18585:10;18580:3;18576:20;18573:1;18566:31;18616:4;18613:1;18606:15;18640:4;18637:1;18630:15;18656:135;18695:3;18716:17;;;18713:43;;18736:18;;:::i;:::-;-1:-1:-1;18783:1:1;18772:13;;18656:135::o;18796:289::-;18927:3;18965:6;18959:13;18981:66;19040:6;19035:3;19028:4;19020:6;19016:17;18981:66;:::i;:::-;19063:16;;;;;18796:289;-1:-1:-1;;18796:289:1:o;23665:136::-;23704:3;23732:5;23722:39;;23741:18;;:::i;:::-;-1:-1:-1;;;23777:18:1;;23665:136::o;24167:611::-;-1:-1:-1;;;24525:3:1;24518:23;24500:3;24570:6;24564:13;24586:74;24653:6;24649:1;24644:3;24640:11;24633:4;24625:6;24621:17;24586:74;:::i;:::-;-1:-1:-1;;;24719:1:1;24679:16;;;;24711:10;;;24704:41;-1:-1:-1;24769:2:1;24761:11;;24167:611;-1:-1:-1;24167:611:1:o;26203:545::-;26305:2;26300:3;26297:11;26294:448;;;26341:1;26366:5;26362:2;26355:17;26411:4;26407:2;26397:19;26481:2;26469:10;26465:19;26462:1;26458:27;26452:4;26448:38;26517:4;26505:10;26502:20;26499:47;;;-1:-1:-1;26540:4:1;26499:47;26595:2;26590:3;26586:12;26583:1;26579:20;26573:4;26569:31;26559:41;;26650:82;26668:2;26661:5;26658:13;26650:82;;;26713:17;;;26694:1;26683:13;26650:82;;26924:1352;27050:3;27044:10;-1:-1:-1;;;;;27069:6:1;27066:30;27063:56;;;27099:18;;:::i;:::-;27128:97;27218:6;27178:38;27210:4;27204:11;27178:38;:::i;:::-;27172:4;27128:97;:::i;:::-;27280:4;;27344:2;27333:14;;27361:1;27356:663;;;;28063:1;28080:6;28077:89;;;-1:-1:-1;28132:19:1;;;28126:26;28077:89;-1:-1:-1;;26881:1:1;26877:11;;;26873:24;26869:29;26859:40;26905:1;26901:11;;;26856:57;28179:81;;27326:944;;27356:663;15344:1;15337:14;;;15381:4;15368:18;;-1:-1:-1;;27392:20:1;;;27510:236;27524:7;27521:1;27518:14;27510:236;;;27613:19;;;27607:26;27592:42;;27705:27;;;;27673:1;27661:14;;;;27540:19;;27510:236;;;27514:3;27774:6;27765:7;27762:19;27759:201;;;27835:19;;;27829:26;-1:-1:-1;;27918:1:1;27914:14;;;27930:3;27910:24;27906:37;27902:42;27887:58;27872:74;;27759:201;-1:-1:-1;;;;;28006:1:1;27990:14;;;27986:22;27973:36;;-1:-1:-1;26924:1352:1:o;28642:624::-;-1:-1:-1;;;29000:3:1;28993:23;28975:3;29045:6;29039:13;29061:74;29128:6;29124:1;29119:3;29115:11;29108:4;29100:6;29096:17;29061:74;:::i;:::-;29198:34;29194:1;29154:16;;;;29186:10;;;29179:54;-1:-1:-1;29257:2:1;29249:11;;28642:624;-1:-1:-1;28642:624:1:o;29271:410::-;29473:2;29455:21;;;29512:2;29492:18;;;29485:30;29551:34;29546:2;29531:18;;29524:62;-1:-1:-1;;;29617:2:1;29602:18;;29595:44;29671:3;29656:19;;29271:410::o;31265:1050::-;31777:66;31772:3;31765:79;31747:3;31873:6;31867:13;31889:75;31957:6;31952:2;31947:3;31943:12;31936:4;31928:6;31924:17;31889:75;:::i;:::-;-1:-1:-1;;;32023:2:1;31983:16;;;32015:11;;;32008:71;32104:13;;32126:76;32104:13;32188:2;32180:11;;32173:4;32161:17;;32126:76;:::i;:::-;-1:-1:-1;;;32262:2:1;32221:17;;;;32254:11;;;32247:35;32306:2;32298:11;;31265:1050;-1:-1:-1;;;;31265:1050:1:o;32320:461::-;32582:31;32577:3;32570:44;32552:3;32643:6;32637:13;32659:75;32727:6;32722:2;32717:3;32713:12;32706:4;32698:6;32694:17;32659:75;:::i;:::-;32754:16;;;;32772:2;32750:25;;32320:461;-1:-1:-1;;32320:461:1:o;33135:561::-;-1:-1:-1;;;;;33432:15:1;;;33414:34;;33484:15;;33479:2;33464:18;;33457:43;33531:2;33516:18;;33509:34;;;33574:2;33559:18;;33552:34;;;33394:3;33617;33602:19;;33595:32;;;33357:4;;33644:46;;33670:19;;33662:6;33644:46;:::i;:::-;33636:54;33135:561;-1:-1:-1;;;;;;;33135:561:1:o;33701:249::-;33770:6;33823:2;33811:9;33802:7;33798:23;33794:32;33791:52;;;33839:1;33836;33829:12;33791:52;33871:9;33865:16;33890:30;33914:5;33890:30;:::i;33955:179::-;33990:3;34032:1;34014:16;34011:23;34008:120;;;34078:1;34075;34072;34057:23;-1:-1:-1;34115:1:1;34109:8;34104:3;34100:18;34008:120;33955:179;:::o;34139:671::-;34178:3;34220:4;34202:16;34199:26;34196:39;;;34139:671;:::o;34196:39::-;34262:2;34256:9;-1:-1:-1;;34327:16:1;34323:25;;34320:1;34256:9;34299:50;34378:4;34372:11;34402:16;-1:-1:-1;;;;;34508:2:1;34501:4;34493:6;34489:17;34486:25;34481:2;34473:6;34470:14;34467:45;34464:58;;;34515:5;;;;;34139:671;:::o;34464:58::-;34552:6;34546:4;34542:17;34531:28;;34588:3;34582:10;34615:2;34607:6;34604:14;34601:27;;;34621:5;;;;;;34139:671;:::o;34601:27::-;34705:2;34686:16;34680:4;34676:27;34672:36;34665:4;34656:6;34651:3;34647:16;34643:27;34640:69;34637:82;;;34712:5;;;;;;34139:671;:::o;34637:82::-;34728:57;34779:4;34770:6;34762;34758:19;34754:30;34748:4;34728:57;:::i;:::-;-1:-1:-1;34801:3:1;;34139:671;-1:-1:-1;;;;;34139:671:1:o;35236:404::-;35438:2;35420:21;;;35477:2;35457:18;;;35450:30;35516:34;35511:2;35496:18;;35489:62;-1:-1:-1;;;35582:2:1;35567:18;;35560:38;35630:3;35615:19;;35236:404::o;36054:401::-;36256:2;36238:21;;;36295:2;36275:18;;;36268:30;36334:34;36329:2;36314:18;;36307:62;-1:-1:-1;;;36400:2:1;36385:18;;36378:35;36445:3;36430:19;;36054:401::o;36460:406::-;36662:2;36644:21;;;36701:2;36681:18;;;36674:30;36740:34;36735:2;36720:18;;36713:62;-1:-1:-1;;;36806:2:1;36791:18;;36784:40;36856:3;36841:19;;36460:406::o;36871:465::-;37128:2;37117:9;37110:21;37091:4;37154:56;37206:2;37195:9;37191:18;37183:6;37154:56;:::i;:::-;37258:9;37250:6;37246:22;37241:2;37230:9;37226:18;37219:50;37286:44;37323:6;37315;37286:44;:::i;:::-;37278:52;36871:465;-1:-1:-1;;;;;36871:465:1:o;37750:827::-;-1:-1:-1;;;;;38147:15:1;;;38129:34;;38199:15;;38194:2;38179:18;;38172:43;38109:3;38246:2;38231:18;;38224:31;;;38072:4;;38278:57;;38315:19;;38307:6;38278:57;:::i;:::-;38383:9;38375:6;38371:22;38366:2;38355:9;38351:18;38344:50;38417:44;38454:6;38446;38417:44;:::i;:::-;38403:58;;38510:9;38502:6;38498:22;38492:3;38481:9;38477:19;38470:51;38538:33;38564:6;38556;38538:33;:::i;:::-;38530:41;37750:827;-1:-1:-1;;;;;;;;37750:827:1:o

Swarm Source

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