ETH Price: $3,698.21 (+2.90%)

Token

ERC-20: KIZUNA by STARTJPN (KIZUNA)
 

Overview

Max Total Supply

2,505 KIZUNA

Holders

2,401

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0xe5c4689045c70a52091d99df802606e36ab971c4
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:
KIZUNA

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-02-27
*/

// 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 {
    mapping(uint256 => bytes32) internal _alMerkleRoot;
    uint256 public phaseId;

    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 KIZUNA is ERC1155URIStorage, Ownable, Operable,ReentrancyGuard, DefaultOperatorFilterer,ERC2981,MerkleProof {
    using Strings for string;

    string public name = 'KIZUNA by STARTJPN';
    string public symbol = 'KIZUNA';
    mapping(address => bool) bondedAddress;
    bool unlock = true;
    uint256 public nowPhaseAl;
    uint256 public alMintPrice = 0.0 ether;
    uint256 public mintable;
    mapping(uint256 => uint256) public maxMintsPerAL;
    uint256 public maxMintsPerALOT = 1;
    bool public isAlSaleEnabled;
    mapping(uint256 => mapping(address => uint256)) internal _alMinted;
    address public deployer;

    constructor(
    address _royaltyReceiver,
    uint96 _royaltyFraction
    ) ERC1155('') {
        deployer = msg.sender;
        _grantOperatorRole(msg.sender);
        _grantOperatorRole(_royaltyReceiver);
        _setDefaultRoyalty(_royaltyReceiver,_royaltyFraction);
        _setBaseURI('https://startdata.io/kizuna/');
        initializeSBT(0, 'index.json');
        maxMintsPerAL[0] = 1;
    }


  //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(msg.sender, tokenId, 1, '');
        _setURI(tokenId, _tokenURI);
    }

    //AL mint.
  function allowlistMint(uint256 _amount,uint256 id, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(bytes(uri(id)).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(id)) <= (mintable) || mintable == 0, "No more NFTs");
    _alMinted[nowPhaseAl][msg.sender] += _amount;
    _mint(msg.sender, id, _amount, '');
  }
  function setMintable(uint256 _mintable) external virtual onlyOperator {
    mintable = _mintable;
  }

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

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

  //AL.SaleEnable
  function setAllowlistSaleEnable(bool bool_) external virtual onlyOperator {
    isAlSaleEnabled = bool_;
  }
  //AL.SaleEnable
  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","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"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":"uint256","name":"id","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":"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":[{"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":"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":[],"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":"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"}]

60a0604052600060809081526004906200001a90826200108e565b506009805460ff1916600117905560408051808201909152601281527125a4ad2aa72090313c9029aa20a92a25282760711b6020820152600e906200006090826200108e565b506040805180820190915260068152654b495a554e4160d01b6020820152600f906200008d90826200108e565b506011805460ff191660019081179091556000601355601655348015620000b357600080fd5b506040516200528f3803806200528f833981016040819052620000d6916200115a565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001604051806020016040528060008152506200010e816200034660201b60201c565b506200011a3362000358565b60016008556daaeb6d7670e522a718067333cd4e3b1562000264578015620001b257604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200019357600080fd5b505af1158015620001a8573d6000803e3d6000fd5b5050505062000264565b6001600160a01b03821615620002035760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000178565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024a57600080fd5b505af11580156200025f573d6000803e3d6000fd5b505050505b5050601980546001600160a01b031916339081179091556200028690620003aa565b6200029182620003aa565b6200029d828262000459565b60408051808201909152601c81527f68747470733a2f2f7374617274646174612e696f2f6b697a756e612f000000006020820152620002dc906200055a565b6200031160006040518060400160405280600a81526020016934b73232bc173539b7b760b11b8152506200056860201b60201c565b505060008052601560205260017fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed556200153b565b60026200035482826200108e565b5050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811660009081526007602052604090205460ff1615620003e9335b6001600160a01b03166014620005f360201b620019901760201c565b604051602001620003fb9190620011d5565b60405160208183030381529060405290620004345760405162461bcd60e51b81526004016200042b91906200125c565b60405180910390fd5b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6127106001600160601b0382161115620004c95760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200042b565b6001600160a01b038216620005215760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200042b565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b60046200035482826200108e565b6200057333620007b5565b6200057e826200081e565b5115620005c35760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b60448201526064016200042b565b620005e733836001604051806020016040528060008152506200091760201b60201c565b62000354828262000a46565b606060006200060483600262001287565b62000611906002620012a1565b6001600160401b038111156200062b576200062b62000fed565b6040519080825280601f01601f19166020018201604052801562000656576020820181803683370190505b509050600360fc1b81600081518110620006745762000674620012b7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620006a657620006a6620012b7565b60200101906001600160f81b031916908160001a9053506000620006cc84600262001287565b620006d9906001620012a1565b90505b60018111156200075b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620007115762000711620012b7565b1a60f81b8282815181106200072a576200072a620012b7565b60200101906001600160f81b031916908160001a90535060049490941c936200075381620012cd565b9050620006dc565b508315620007ac5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016200042b565b90505b92915050565b6001600160a01b03811660009081526007602052604090205460ff16620007dc33620003cd565b604051602001620007ee9190620012e7565b60405160208183030381529060405290620003545760405162461bcd60e51b81526004016200042b91906200125c565b6000818152600560205260408120805460609291906200083e9062001003565b80601f01602080910402602001604051908101604052809291908181526020018280546200086c9062001003565b8015620008bd5780601f106200089157610100808354040283529160200191620008bd565b820191906000526020600020905b8154815290600101906020018083116200089f57829003601f168201915b505050505090506000815111620008ea57620008e48362000aa960201b62001b2b1760201c565b62000910565b6004816040516020016200090092919062001340565b6040516020818303038152906040525b9392505050565b6001600160a01b038416620009795760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016200042b565b336000620009878562000b45565b90506000620009968562000b45565b9050620009a98360008985858962000b93565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290620009db908490620012a1565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a462000a3d8360008989898962000c64565b50505050505050565b600082815260056020526040902062000a6082826200108e565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b62000a8e826200081e565b60405162000a9d91906200125c565b60405180910390a25050565b60606002805462000aba9062001003565b80601f016020809104026020016040519081016040528092919081815260200182805462000ae89062001003565b801562000b395780601f1062000b0d5761010080835404028352916020019162000b39565b820191906000526020600020905b81548152906001019060200180831162000b1b57829003601f168201915b50505050509050919050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811062000b825762000b82620012b7565b602090810291909101015292915050565b6006546001600160a01b038781169116148062000bcd57506001600160a01b03861660009081526010602052604090205460ff1615156001145b8062000be0575060115460ff1615156001145b8062000bf357506001600160a01b038516155b62000c415760405162461bcd60e51b815260206004820152601460248201527f53656e64204e4654206e6f7420616c6c6f77656400000000000000000000000060448201526064016200042b565b62000c5c86868686868662000e3060201b62001bbf1760201c565b505050505050565b62000c83846001600160a01b031662000fde60201b62001d411760201c565b1562000c5c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619062000cbf9089908990889088908890600401620013d1565b6020604051808303816000875af192505050801562000cfd575060408051601f3d908101601f1916820190925262000cfa9181019062001418565b60015b62000dbd5762000d0c62001444565b806308c379a00362000d4c575062000d2362001490565b8062000d30575062000d4e565b8060405162461bcd60e51b81526004016200042b91906200125c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016200042b565b6001600160e01b0319811663f23a6e6160e01b1462000a3d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016200042b565b62000e4b86868686868662000c5c60201b620012bd1760201c565b6001600160a01b03851662000edf5760005b835181101562000edd5782818151811062000e7c5762000e7c620012b7565b60200260200101516003600086848151811062000e9d5762000e9d620012b7565b60200260200101518152602001908152602001600020600082825462000ec49190620012a1565b9091555062000ed59050816200151f565b905062000e5d565b505b6001600160a01b03841662000c5c5760005b835181101562000a3d57600084828151811062000f125762000f12620012b7565b60200260200101519050600084838151811062000f335762000f33620012b7565b602002602001015190506000600360008481526020019081526020016000205490508181101562000fb85760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016200042b565b6000928352600360205260409092209103905562000fd6816200151f565b905062000ef1565b6001600160a01b03163b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200101857607f821691505b6020821081036200103957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200108957600081815260208120601f850160051c81016020861015620010685750805b601f850160051c820191505b8181101562000c5c5782815560010162001074565b505050565b81516001600160401b03811115620010aa57620010aa62000fed565b620010c281620010bb845462001003565b846200103f565b602080601f831160018114620010fa5760008415620010e15750858301515b600019600386901b1c1916600185901b17855562000c5c565b600085815260208120601f198616915b828110156200112b578886015182559484019460019091019084016200110a565b50858210156200114a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080604083850312156200116e57600080fd5b82516001600160a01b03811681146200118657600080fd5b60208401519092506001600160601b0381168114620011a457600080fd5b809150509250929050565b60005b83811015620011cc578181015183820152602001620011b2565b50506000910152565b67030b1b1b7bab73a160c51b815260008251620011fa816008850160208701620011af565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6000815180845262001248816020860160208601620011af565b601f01601f19169290920160200192915050565b6020815260006200091060208301846200122e565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620007af57620007af62001271565b80820180821115620007af57620007af62001271565b634e487b7160e01b600052603260045260246000fd5b600081620012df57620012df62001271565b506000190190565b67030b1b1b7bab73a160c51b8152600082516200130c816008850160208701620011af565b7f206973206e6f7420616e206f70657261746f72000000000000000000000000006008939091019283015250601b01919050565b6000808454620013508162001003565b600182811680156200136b57600181146200138157620013b2565b60ff1984168752821515830287019450620013b2565b8860005260208060002060005b85811015620013a95781548a8201529084019082016200138e565b50505082870194505b505050508351620013c8818360208801620011af565b01949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906200140d908301846200122e565b979650505050505050565b6000602082840312156200142b57600080fd5b81516001600160e01b031981168114620007ac57600080fd5b600060033d11156200145e5760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b038111828210171562001489576200148962000fed565b6040525050565b600060443d10156200149f5790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715620014cf57505050505090565b8285019150815181811115620014e85750505050505090565b843d8701016020828501011115620015035750505050505090565b620015146020828601018762001461565b509095945050505050565b60006001820162001534576200153462001271565b5060010190565b613d44806200154b6000396000f3fe6080604052600436106103345760003560e01c8063715018a6116101ab578063b7c0b8e8116100f7578063d5f3948811610095578063f242432a1161006f578063f242432a14610a3e578063f2fde38b14610a5e578063fb796e6c14610a7e578063fdf03cd514610a9857600080fd5b8063d5f39488146109c0578063e8a3d485146109e0578063e985e9c5146109f557600080fd5b8063cbf9fe5f116100d1578063cbf9fe5f1461093c578063d2de022f14610975578063d4e45c1414610995578063d5dcfbc6146109aa57600080fd5b8063b7c0b8e8146108d5578063bd85b039146108f5578063c3e536831461092257600080fd5b8063910da0e91161016457806395d89b411161013e57806395d89b4114610860578063a22cb46514610875578063b219f7d714610895578063b2b1b37b146108b557600080fd5b8063910da0e91461080057806391e4bac8146108205780639324b42a1461084057600080fd5b8063715018a61461072a5780637672287e1461073f57806378d8fed81461075f578063872a28031461077f5780638da5cb5b1461079f5780638e37326a146107bd57600080fd5b80632d945cb9116102855780634e1273f41161022357806356f5d89d116101fd57806356f5d89d1461069b57806358303b10146106bb5780636d70f7ae146106d15780636fa0cf5f1461070a57600080fd5b80634e1273f41461061f5780634f558e791461064c57806355f804b31461067b57600080fd5b8063385453cd1161025f578063385453cd1461059957806341f43434146105b9578063449d0f10146105f35780634bf365df1461060957600080fd5b80632d945cb9146105505780632e9901f4146105635780632eb2c2d61461057957600080fd5b8063156e29f6116102f257806321434421116102cc578063214344211461048d578063267fe989146104d157806327ac0c58146104f15780632a55205a1461051157600080fd5b8063156e29f614610420578063162094c4146104405780631a8b83571461046057600080fd5b8062fdd58e1461033957806301ffc9a71461036c57806303c0f48c1461039c57806304634d8d146103be57806306fdde03146103de5780630e89341c14610400575b600080fd5b34801561034557600080fd5b50610359610354366004612f06565b610ab8565b6040519081526020015b60405180910390f35b34801561037857600080fd5b5061038c610387366004612f46565b610b51565b6040519015158152602001610363565b3480156103a857600080fd5b506103bc6103b7366004612f63565b610b5c565b005b3480156103ca57600080fd5b506103bc6103d9366004612f7c565b610b6a565b3480156103ea57600080fd5b506103f3610b81565b604051610363919061300f565b34801561040c57600080fd5b506103f361041b366004612f63565b610c0f565b34801561042c57600080fd5b506103bc61043b366004613022565b610cef565b34801561044c57600080fd5b506103bc61045b36600461310a565b610d63565b34801561046c57600080fd5b5061035961047b366004612f63565b60156020526000908152604090205481565b34801561049957600080fd5b506103596104a8366004613150565b60125460009081526018602090815260408083206001600160a01b039094168352929052205490565b3480156104dd57600080fd5b506103bc6104ec366004612f63565b610d76565b3480156104fd57600080fd5b506103bc61050c366004613150565b610da1565b34801561051d57600080fd5b5061053161052c36600461316b565b610db5565b604080516001600160a01b039093168352602083019190915201610363565b6103bc61055e366004613221565b610e61565b34801561056f57600080fd5b5061035960165481565b34801561058557600080fd5b506103bc610594366004613270565b6111d6565b3480156105a557600080fd5b506103bc6105b436600461316b565b6112c5565b3480156105c557600080fd5b506105db6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610363565b3480156105ff57600080fd5b5061035960135481565b34801561061557600080fd5b5061035960145481565b34801561062b57600080fd5b5061063f61063a366004613386565b6112df565b604051610363919061341a565b34801561065857600080fd5b5061038c610667366004612f63565b600090815260036020526040902054151590565b34801561068757600080fd5b506103bc61069636600461342d565b611408565b3480156106a757600080fd5b506103bc6106b6366004613477565b61141a565b3480156106c757600080fd5b50610359600d5481565b3480156106dd57600080fd5b5061038c6106ec366004613150565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071657600080fd5b506103bc61072536600461316b565b61144e565b34801561073657600080fd5b506103bc611469565b34801561074b57600080fd5b506103bc61075a3660046134a3565b61147d565b34801561076b57600080fd5b506103bc61077a3660046134a3565b611499565b34801561078b57600080fd5b506103bc61079a3660046134c0565b6114b5565b3480156107ab57600080fd5b506006546001600160a01b03166105db565b3480156107c957600080fd5b506103596107d8366004613522565b60009182526018602090815260408084206001600160a01b0393909316845291905290205490565b34801561080c57600080fd5b506103bc61081b36600461310a565b61152f565b34801561082c57600080fd5b506103bc61083b366004612f63565b6115a0565b34801561084c57600080fd5b506103bc61085b366004613022565b6115ae565b34801561086c57600080fd5b506103f36115c2565b34801561088157600080fd5b506103bc610890366004613477565b6115cf565b3480156108a157600080fd5b506103bc6108b0366004613150565b6116ae565b3480156108c157600080fd5b506103bc6108d0366004612f63565b6116bf565b3480156108e157600080fd5b506103bc6108f03660046134a3565b6116cd565b34801561090157600080fd5b50610359610910366004612f63565b60009081526003602052604090205490565b34801561092e57600080fd5b5060175461038c9060ff1681565b34801561094857600080fd5b5061038c610957366004613150565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561098157600080fd5b5061038c61099036600461354e565b6116e9565b3480156109a157600080fd5b50600d54610359565b3480156109b657600080fd5b5061035960125481565b3480156109cc57600080fd5b506019546105db906001600160a01b031681565b3480156109ec57600080fd5b506103f361181b565b348015610a0157600080fd5b5061038c610a1036600461358e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a4a57600080fd5b506103bc610a593660046135b8565b61182a565b348015610a6a57600080fd5b506103bc610a79366004613150565b61190c565b348015610a8a57600080fd5b5060095461038c9060ff1681565b348015610aa457600080fd5b506103bc610ab3366004612f63565b611982565b60006001600160a01b038316610b285760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610b4b82611d50565b610b6533611d75565b601255565b610b7333611d75565b610b7d8282611de3565b5050565b600e8054610b8e9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bba9061361c565b8015610c075780601f10610bdc57610100808354040283529160200191610c07565b820191906000526020600020905b815481529060010190602001808311610bea57829003601f168201915b505050505081565b600081815260056020526040812080546060929190610c2d9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c599061361c565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505090506000815111610cc457610cbf83611b2b565b610ce8565b600481604051602001610cd8929190613656565b6040516020818303038152906040525b9392505050565b610cf833611d75565b610d0182610c0f565b51600003610d435760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610b1f565b610d5e83838360405180602001604052806000815250611ee0565b505050565b610d6c33611d75565b610b7d8282611ffa565b610d7f33611d75565b80600d81905550600160126000828254610d9991906136f3565b909155505050565b610da9612057565b610db2816120b1565b50565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e2a575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e49906001600160601b031687613706565b610e53919061371d565b915196919550909350505050565b610e69612139565b610e7282610c0f565b51600003610eb45760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610b1f565b60175460ff16610f065760405162461bcd60e51b815260206004820152601760248201527f616c6c6f776c6973744d696e74206973205061757365640000000000000000006044820152606401610b1f565b610f1333600d54836116e9565b610f5f5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610b1f565b826016541015610fc45760405162461bcd60e51b815260206004820152602a60248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560448201526972206f6e652074696d6560b01b6064820152608401610b1f565b600d546000908152601560205260409020548311156110365760405162461bcd60e51b815260206004820152602860248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610b1f565b601254600090815260186020908152604080832033845290915290205461105e9084906136f3565b600d5460009081526015602052604090205410156110be5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610b1f565b826013546110cc9190613706565b341461111a5760405162461bcd60e51b815260206004820152601860248201527f4554482076616c7565206973206e6f7420636f727265637400000000000000006044820152606401610b1f565b60145460008381526003602052604090205461113690856136f3565b1115806111435750601454155b61117e5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610b1f565b6012546000908152601860209081526040808320338452909152812080548592906111aa9084906136f3565b925050819055506111cc33838560405180602001604052806000815250611ee0565b610d5e6001600855565b846daaeb6d7670e522a718067333cd4e3b158015906111f7575060095460ff165b156112b057336001600160a01b0382160361121e576112198686868686612192565b6112bd565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611291919061373f565b6112b057604051633b79c77360e21b8152336004820152602401610b1f565b6112bd8686868686612192565b505050505050565b6112ce33611d75565b600090815260156020526040902055565b606081518351146113445760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b1f565b600083516001600160401b0381111561135f5761135f613055565b604051908082528060200260200182016040528015611388578160200160208202803683370190505b50905060005b8451811015611400576113d38582815181106113ac576113ac61375c565b60200260200101518583815181106113c6576113c661375c565b6020026020010151610ab8565b8282815181106113e5576113e561375c565b60209081029190910101526113f981613772565b905061138e565b509392505050565b61141133611d75565b610db2816121de565b61142333611d75565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b61145733611d75565b6000918252600c602052604090912055565b611471612057565b61147b60006121ea565b565b61148633611d75565b6017805460ff1916911515919091179055565b6114a233611d75565b6011805460ff1916911515919091179055565b6114be33611d75565b60005b8351811015611529576115178482815181106114df576114df61375c565b6020026020010151848484815181106114fa576114fa61375c565b602002602001015160405180602001604052806000815250611ee0565b8061152181613772565b9150506114c1565b50505050565b61153833611d75565b61154182610c0f565b51156115845760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610b1f565b610d6c3383600160405180602001604052806000815250611ee0565b6115a933611d75565b601455565b6115b733611d75565b610d5e83838361223c565b600f8054610b8e9061361c565b816daaeb6d7670e522a718067333cd4e3b158015906115f0575060095460ff165b1561169957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611671919061373f565b61169957604051633b79c77360e21b81526001600160a01b0382166004820152602401610b1f565b6116a383836123cc565b610d5e3384846123d3565b6116b6612057565b610db2816124b3565b6116c833611d75565b601655565b6116d633611d75565b6009805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611801578381815181106117435761174361375c565b602002602001015182106117a1578381815181106117635761176361375c565b602002602001015182604051602001611786929190918252602082015260400190565b604051602081830303815290604052805190602001206117ed565b818482815181106117b4576117b461375c565b60200260200101516040516020016117d6929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806117f981613772565b915050611728565b506000848152600c60205260409020541490509392505050565b60606118256124dd565b905090565b846daaeb6d7670e522a718067333cd4e3b1580159061184b575060095460ff165b156118ff57336001600160a01b0382160361186d57611219868686868661255d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e0919061373f565b6118ff57604051633b79c77360e21b8152336004820152602401610b1f565b6112bd868686868661255d565b611914612057565b6001600160a01b0381166119795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b1f565b610db2816121ea565b61198b33611d75565b600d55565b6060600061199f836002613706565b6119aa9060026136f3565b6001600160401b038111156119c1576119c1613055565b6040519080825280601f01601f1916602001820160405280156119eb576020820181803683370190505b509050600360fc1b81600081518110611a0657611a0661375c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a3557611a3561375c565b60200101906001600160f81b031916908160001a9053506000611a59846002613706565b611a649060016136f3565b90505b6001811115611adc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611a9857611a9861375c565b1a60f81b828281518110611aae57611aae61375c565b60200101906001600160f81b031916908160001a90535060049490941c93611ad58161378b565b9050611a67565b508315610ce85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b1f565b606060028054611b3a9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b669061361c565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b50505050509050919050565b6001600160a01b038516611c465760005b8351811015611c4457828181518110611beb57611beb61375c565b602002602001015160036000868481518110611c0957611c0961375c565b602002602001015181526020019081526020016000206000828254611c2e91906136f3565b90915550611c3d905081613772565b9050611bd0565b505b6001600160a01b0384166112bd5760005b8351811015611d38576000848281518110611c7457611c7461375c565b602002602001015190506000848381518110611c9257611c9261375c565b6020026020010151905060006003600084815260200190815260200160002054905081811015611d155760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610b1f565b60009283526003602052604090922091039055611d3181613772565b9050611c57565b50505050505050565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b1480610b4b5750610b4b826125a2565b6001600160a01b03811660009081526007602052604090205460ff16611da6335b6001600160a01b03166014611990565b604051602001611db691906137a2565b60405160208183030381529060405290610b7d5760405162461bcd60e51b8152600401610b1f919061300f565b6127106001600160601b0382161115611e515760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b1f565b6001600160a01b038216611ea75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b1f565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6001600160a01b038416611f405760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b1f565b336000611f4c856125f2565b90506000611f59856125f2565b9050611f6a8360008985858961263d565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611f9a9084906136f3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d38836000898989896126eb565b60008281526005602052604090206120128282613835565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61203e84610c0f565b60405161204b919061300f565b60405180910390a25050565b6006546001600160a01b0316331461147b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b1f565b6001600160a01b03811660009081526007602052604090205460ff16156120d733611d96565b6040516020016120e791906138f4565b604051602081830303815290604052906121145760405162461bcd60e51b8152600401610b1f919061300f565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b60026008540361218b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b1f565b6002600855565b6001600160a01b0385163314806121ae57506121ae8533610a10565b6121ca5760405162461bcd60e51b8152600401610b1f9061394b565b6121d78585858585612846565b5050505050565b6004610b7d8282613835565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831661229e5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610b1f565b3360006122aa846125f2565b905060006122b7846125f2565b90506122d78387600085856040518060200160405280600081525061263d565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156123545760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610b1f565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611d38565b610b7d3383835b816001600160a01b0316836001600160a01b0316036124465760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b1f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6124bc81611d75565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60606000806124ee81612710610db5565b915091506125376124fe82612a29565b612512846001600160a01b03166014611990565b604051602001612523929190613999565b604051602081830303815290604052612abb565b6040516020016125479190613a1f565b6040516020818303038152906040529250505090565b6001600160a01b03851633148061257957506125798533610a10565b6125955760405162461bcd60e51b8152600401610b1f9061394b565b6121d78585858585612c1f565b60006001600160e01b03198216636cdb3d1360e11b14806125d357506001600160e01b031982166303a24d0760e21b145b80610b4b57506301ffc9a760e01b6001600160e01b0319831614610b4b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061262c5761262c61375c565b602090810291909101015292915050565b6006546001600160a01b038781169116148061267657506001600160a01b03861660009081526010602052604090205460ff1615156001145b80612688575060115460ff1615156001145b8061269a57506001600160a01b038516155b6126dd5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610b1f565b6112bd868686868686611bbf565b6001600160a01b0384163b156112bd5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061272f9089908990889088908890600401613a64565b6020604051808303816000875af192505050801561276a575060408051601f3d908101601f1916820190925261276791810190613aa9565b60015b61281657612776613ac6565b806308c379a0036127af575061278a613ae2565b8061279557506127b1565b8060405162461bcd60e51b8152600401610b1f919061300f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b1f565b6001600160e01b0319811663f23a6e6160e01b14611d385760405162461bcd60e51b8152600401610b1f90613b6b565b81518351146128a85760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610b1f565b6001600160a01b0384166128ce5760405162461bcd60e51b8152600401610b1f90613bb3565b336128dd81878787878761263d565b60005b84518110156129c35760008582815181106128fd576128fd61375c565b60200260200101519050600085838151811061291b5761291b61375c565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561296b5760405162461bcd60e51b8152600401610b1f90613bf8565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906129a89084906136f3565b92505081905550505050806129bc90613772565b90506128e0565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612a13929190613c42565b60405180910390a46112bd818787878787612d57565b60606000612a3683612e12565b60010190506000816001600160401b03811115612a5557612a55613055565b6040519080825280601f01601f191660200182016040528015612a7f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612a8957509392505050565b60608151600003612ada57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613ccf6040913990506000600384516002612b0991906136f3565b612b13919061371d565b612b1e906004613706565b90506000612b2d8260206136f3565b6001600160401b03811115612b4457612b44613055565b6040519080825280601f01601f191660200182016040528015612b6e576020820181803683370190505b509050818152600183018586518101602084015b81831015612bda576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612b82565b600389510660018114612bf45760028114612c0557612c11565b613d3d60f01b600119830152612c11565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038416612c455760405162461bcd60e51b8152600401610b1f90613bb3565b336000612c51856125f2565b90506000612c5e856125f2565b9050612c6e83898985858961263d565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612caf5760405162461bcd60e51b8152600401610b1f90613bf8565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612cec9084906136f3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612d4c848a8a8a8a8a6126eb565b505050505050505050565b6001600160a01b0384163b156112bd5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612d9b9089908990889088908890600401613c70565b6020604051808303816000875af1925050508015612dd6575060408051601f3d908101601f19168201909252612dd391810190613aa9565b60015b612de257612776613ac6565b6001600160e01b0319811663bc197c8160e01b14611d385760405162461bcd60e51b8152600401610b1f90613b6b565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612e515772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612e7d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612e9b57662386f26fc10000830492506010015b6305f5e1008310612eb3576305f5e100830492506008015b6127108310612ec757612710830492506004015b60648310612ed9576064830492506002015b600a8310610b4b5760010192915050565b80356001600160a01b0381168114612f0157600080fd5b919050565b60008060408385031215612f1957600080fd5b612f2283612eea565b946020939093013593505050565b6001600160e01b031981168114610db257600080fd5b600060208284031215612f5857600080fd5b8135610ce881612f30565b600060208284031215612f7557600080fd5b5035919050565b60008060408385031215612f8f57600080fd5b612f9883612eea565b915060208301356001600160601b0381168114612fb457600080fd5b809150509250929050565b60005b83811015612fda578181015183820152602001612fc2565b50506000910152565b60008151808452612ffb816020860160208601612fbf565b601f01601f19169290920160200192915050565b602081526000610ce86020830184612fe3565b60008060006060848603121561303757600080fd5b61304084612eea565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561309057613090613055565b6040525050565b600082601f8301126130a857600080fd5b81356001600160401b038111156130c1576130c1613055565b6040516130d8601f8301601f19166020018261306b565b8181528460208386010111156130ed57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b61314685828601613097565b9150509250929050565b60006020828403121561316257600080fd5b610ce882612eea565b6000806040838503121561317e57600080fd5b50508035926020909101359150565b60006001600160401b038211156131a6576131a6613055565b5060051b60200190565b600082601f8301126131c157600080fd5b813560206131ce8261318d565b6040516131db828261306b565b83815260059390931b85018201928281019150868411156131fb57600080fd5b8286015b8481101561321657803583529183019183016131ff565b509695505050505050565b60008060006060848603121561323657600080fd5b833592506020840135915060408401356001600160401b0381111561325a57600080fd5b613266868287016131b0565b9150509250925092565b600080600080600060a0868803121561328857600080fd5b61329186612eea565b945061329f60208701612eea565b935060408601356001600160401b03808211156132bb57600080fd5b6132c789838a016131b0565b945060608801359150808211156132dd57600080fd5b6132e989838a016131b0565b935060808801359150808211156132ff57600080fd5b5061330c88828901613097565b9150509295509295909350565b600082601f83011261332a57600080fd5b813560206133378261318d565b604051613344828261306b565b83815260059390931b850182019282810191508684111561336457600080fd5b8286015b848110156132165761337981612eea565b8352918301918301613368565b6000806040838503121561339957600080fd5b82356001600160401b03808211156133b057600080fd5b6133bc86838701613319565b935060208501359150808211156133d257600080fd5b50613146858286016131b0565b600081518084526020808501945080840160005b8381101561340f578151875295820195908201906001016133f3565b509495945050505050565b602081526000610ce860208301846133df565b60006020828403121561343f57600080fd5b81356001600160401b0381111561345557600080fd5b61346184828501613097565b949350505050565b8015158114610db257600080fd5b6000806040838503121561348a57600080fd5b61349383612eea565b91506020830135612fb481613469565b6000602082840312156134b557600080fd5b8135610ce881613469565b6000806000606084860312156134d557600080fd5b83356001600160401b03808211156134ec57600080fd5b6134f887838801613319565b945060208601359350604086013591508082111561351557600080fd5b50613266868287016131b0565b6000806040838503121561353557600080fd5b8235915061354560208401612eea565b90509250929050565b60008060006060848603121561356357600080fd5b61356c84612eea565b92506020840135915060408401356001600160401b0381111561325a57600080fd5b600080604083850312156135a157600080fd5b6135aa83612eea565b915061354560208401612eea565b600080600080600060a086880312156135d057600080fd5b6135d986612eea565b94506135e760208701612eea565b9350604086013592506060860135915060808601356001600160401b0381111561361057600080fd5b61330c88828901613097565b600181811c9082168061363057607f821691505b60208210810361365057634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546136648161361c565b6001828116801561367c5760018114613691576136c0565b60ff19841687528215158302870194506136c0565b8860005260208060002060005b858110156136b75781548a82015290840190820161369e565b50505082870194505b5050505083516136d4818360208801612fbf565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b4b57610b4b6136dd565b8082028115828204841417610b4b57610b4b6136dd565b60008261373a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561375157600080fd5b8151610ce881613469565b634e487b7160e01b600052603260045260246000fd5b600060018201613784576137846136dd565b5060010190565b60008161379a5761379a6136dd565b506000190190565b67030b1b1b7bab73a160c51b8152600082516137c5816008850160208701612fbf565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610d5e57600081815260208120601f850160051c810160208610156138165750805b601f850160051c820191505b818110156112bd57828155600101613822565b81516001600160401b0381111561384e5761384e613055565b6138628161385c845461361c565b846137ef565b602080601f831160018114613897576000841561387f5750858301515b600019600386901b1c1916600185901b1785556112bd565b600085815260208120601f198616915b828110156138c6578886015182559484019460019091019084016138a7565b50858210156138e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251613917816008850160208701612fbf565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a00000000008152600083516139d181601b850160208801612fbf565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613a0481602e840160208801612fbf565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613a5781601d850160208701612fbf565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613a9e90830184612fe3565b979650505050505050565b600060208284031215613abb57600080fd5b8151610ce881612f30565b600060033d1115613adf5760046000803e5060005160e01c5b90565b600060443d1015613af05790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b1f57505050505090565b8285019150815181811115613b375750505050505090565b843d8701016020828501011115613b515750505050505090565b613b606020828601018761306b565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000613c5560408301856133df565b8281036020840152613c6781856133df565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613c9c908301866133df565b8281036060840152613cae81866133df565b90508281036080840152613cc28185612fe3565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122045aee3506863332304800ad1c3f8eb125c059e39f0b289346b7bb3131958df6c64736f6c63430008110033000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106103345760003560e01c8063715018a6116101ab578063b7c0b8e8116100f7578063d5f3948811610095578063f242432a1161006f578063f242432a14610a3e578063f2fde38b14610a5e578063fb796e6c14610a7e578063fdf03cd514610a9857600080fd5b8063d5f39488146109c0578063e8a3d485146109e0578063e985e9c5146109f557600080fd5b8063cbf9fe5f116100d1578063cbf9fe5f1461093c578063d2de022f14610975578063d4e45c1414610995578063d5dcfbc6146109aa57600080fd5b8063b7c0b8e8146108d5578063bd85b039146108f5578063c3e536831461092257600080fd5b8063910da0e91161016457806395d89b411161013e57806395d89b4114610860578063a22cb46514610875578063b219f7d714610895578063b2b1b37b146108b557600080fd5b8063910da0e91461080057806391e4bac8146108205780639324b42a1461084057600080fd5b8063715018a61461072a5780637672287e1461073f57806378d8fed81461075f578063872a28031461077f5780638da5cb5b1461079f5780638e37326a146107bd57600080fd5b80632d945cb9116102855780634e1273f41161022357806356f5d89d116101fd57806356f5d89d1461069b57806358303b10146106bb5780636d70f7ae146106d15780636fa0cf5f1461070a57600080fd5b80634e1273f41461061f5780634f558e791461064c57806355f804b31461067b57600080fd5b8063385453cd1161025f578063385453cd1461059957806341f43434146105b9578063449d0f10146105f35780634bf365df1461060957600080fd5b80632d945cb9146105505780632e9901f4146105635780632eb2c2d61461057957600080fd5b8063156e29f6116102f257806321434421116102cc578063214344211461048d578063267fe989146104d157806327ac0c58146104f15780632a55205a1461051157600080fd5b8063156e29f614610420578063162094c4146104405780631a8b83571461046057600080fd5b8062fdd58e1461033957806301ffc9a71461036c57806303c0f48c1461039c57806304634d8d146103be57806306fdde03146103de5780630e89341c14610400575b600080fd5b34801561034557600080fd5b50610359610354366004612f06565b610ab8565b6040519081526020015b60405180910390f35b34801561037857600080fd5b5061038c610387366004612f46565b610b51565b6040519015158152602001610363565b3480156103a857600080fd5b506103bc6103b7366004612f63565b610b5c565b005b3480156103ca57600080fd5b506103bc6103d9366004612f7c565b610b6a565b3480156103ea57600080fd5b506103f3610b81565b604051610363919061300f565b34801561040c57600080fd5b506103f361041b366004612f63565b610c0f565b34801561042c57600080fd5b506103bc61043b366004613022565b610cef565b34801561044c57600080fd5b506103bc61045b36600461310a565b610d63565b34801561046c57600080fd5b5061035961047b366004612f63565b60156020526000908152604090205481565b34801561049957600080fd5b506103596104a8366004613150565b60125460009081526018602090815260408083206001600160a01b039094168352929052205490565b3480156104dd57600080fd5b506103bc6104ec366004612f63565b610d76565b3480156104fd57600080fd5b506103bc61050c366004613150565b610da1565b34801561051d57600080fd5b5061053161052c36600461316b565b610db5565b604080516001600160a01b039093168352602083019190915201610363565b6103bc61055e366004613221565b610e61565b34801561056f57600080fd5b5061035960165481565b34801561058557600080fd5b506103bc610594366004613270565b6111d6565b3480156105a557600080fd5b506103bc6105b436600461316b565b6112c5565b3480156105c557600080fd5b506105db6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610363565b3480156105ff57600080fd5b5061035960135481565b34801561061557600080fd5b5061035960145481565b34801561062b57600080fd5b5061063f61063a366004613386565b6112df565b604051610363919061341a565b34801561065857600080fd5b5061038c610667366004612f63565b600090815260036020526040902054151590565b34801561068757600080fd5b506103bc61069636600461342d565b611408565b3480156106a757600080fd5b506103bc6106b6366004613477565b61141a565b3480156106c757600080fd5b50610359600d5481565b3480156106dd57600080fd5b5061038c6106ec366004613150565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071657600080fd5b506103bc61072536600461316b565b61144e565b34801561073657600080fd5b506103bc611469565b34801561074b57600080fd5b506103bc61075a3660046134a3565b61147d565b34801561076b57600080fd5b506103bc61077a3660046134a3565b611499565b34801561078b57600080fd5b506103bc61079a3660046134c0565b6114b5565b3480156107ab57600080fd5b506006546001600160a01b03166105db565b3480156107c957600080fd5b506103596107d8366004613522565b60009182526018602090815260408084206001600160a01b0393909316845291905290205490565b34801561080c57600080fd5b506103bc61081b36600461310a565b61152f565b34801561082c57600080fd5b506103bc61083b366004612f63565b6115a0565b34801561084c57600080fd5b506103bc61085b366004613022565b6115ae565b34801561086c57600080fd5b506103f36115c2565b34801561088157600080fd5b506103bc610890366004613477565b6115cf565b3480156108a157600080fd5b506103bc6108b0366004613150565b6116ae565b3480156108c157600080fd5b506103bc6108d0366004612f63565b6116bf565b3480156108e157600080fd5b506103bc6108f03660046134a3565b6116cd565b34801561090157600080fd5b50610359610910366004612f63565b60009081526003602052604090205490565b34801561092e57600080fd5b5060175461038c9060ff1681565b34801561094857600080fd5b5061038c610957366004613150565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561098157600080fd5b5061038c61099036600461354e565b6116e9565b3480156109a157600080fd5b50600d54610359565b3480156109b657600080fd5b5061035960125481565b3480156109cc57600080fd5b506019546105db906001600160a01b031681565b3480156109ec57600080fd5b506103f361181b565b348015610a0157600080fd5b5061038c610a1036600461358e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a4a57600080fd5b506103bc610a593660046135b8565b61182a565b348015610a6a57600080fd5b506103bc610a79366004613150565b61190c565b348015610a8a57600080fd5b5060095461038c9060ff1681565b348015610aa457600080fd5b506103bc610ab3366004612f63565b611982565b60006001600160a01b038316610b285760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610b4b82611d50565b610b6533611d75565b601255565b610b7333611d75565b610b7d8282611de3565b5050565b600e8054610b8e9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bba9061361c565b8015610c075780601f10610bdc57610100808354040283529160200191610c07565b820191906000526020600020905b815481529060010190602001808311610bea57829003601f168201915b505050505081565b600081815260056020526040812080546060929190610c2d9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c599061361c565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505090506000815111610cc457610cbf83611b2b565b610ce8565b600481604051602001610cd8929190613656565b6040516020818303038152906040525b9392505050565b610cf833611d75565b610d0182610c0f565b51600003610d435760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610b1f565b610d5e83838360405180602001604052806000815250611ee0565b505050565b610d6c33611d75565b610b7d8282611ffa565b610d7f33611d75565b80600d81905550600160126000828254610d9991906136f3565b909155505050565b610da9612057565b610db2816120b1565b50565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e2a575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e49906001600160601b031687613706565b610e53919061371d565b915196919550909350505050565b610e69612139565b610e7282610c0f565b51600003610eb45760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610b1f565b60175460ff16610f065760405162461bcd60e51b815260206004820152601760248201527f616c6c6f776c6973744d696e74206973205061757365640000000000000000006044820152606401610b1f565b610f1333600d54836116e9565b610f5f5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610b1f565b826016541015610fc45760405162461bcd60e51b815260206004820152602a60248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560448201526972206f6e652074696d6560b01b6064820152608401610b1f565b600d546000908152601560205260409020548311156110365760405162461bcd60e51b815260206004820152602860248201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610b1f565b601254600090815260186020908152604080832033845290915290205461105e9084906136f3565b600d5460009081526015602052604090205410156110be5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610b1f565b826013546110cc9190613706565b341461111a5760405162461bcd60e51b815260206004820152601860248201527f4554482076616c7565206973206e6f7420636f727265637400000000000000006044820152606401610b1f565b60145460008381526003602052604090205461113690856136f3565b1115806111435750601454155b61117e5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610b1f565b6012546000908152601860209081526040808320338452909152812080548592906111aa9084906136f3565b925050819055506111cc33838560405180602001604052806000815250611ee0565b610d5e6001600855565b846daaeb6d7670e522a718067333cd4e3b158015906111f7575060095460ff165b156112b057336001600160a01b0382160361121e576112198686868686612192565b6112bd565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611291919061373f565b6112b057604051633b79c77360e21b8152336004820152602401610b1f565b6112bd8686868686612192565b505050505050565b6112ce33611d75565b600090815260156020526040902055565b606081518351146113445760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b1f565b600083516001600160401b0381111561135f5761135f613055565b604051908082528060200260200182016040528015611388578160200160208202803683370190505b50905060005b8451811015611400576113d38582815181106113ac576113ac61375c565b60200260200101518583815181106113c6576113c661375c565b6020026020010151610ab8565b8282815181106113e5576113e561375c565b60209081029190910101526113f981613772565b905061138e565b509392505050565b61141133611d75565b610db2816121de565b61142333611d75565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b61145733611d75565b6000918252600c602052604090912055565b611471612057565b61147b60006121ea565b565b61148633611d75565b6017805460ff1916911515919091179055565b6114a233611d75565b6011805460ff1916911515919091179055565b6114be33611d75565b60005b8351811015611529576115178482815181106114df576114df61375c565b6020026020010151848484815181106114fa576114fa61375c565b602002602001015160405180602001604052806000815250611ee0565b8061152181613772565b9150506114c1565b50505050565b61153833611d75565b61154182610c0f565b51156115845760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610b1f565b610d6c3383600160405180602001604052806000815250611ee0565b6115a933611d75565b601455565b6115b733611d75565b610d5e83838361223c565b600f8054610b8e9061361c565b816daaeb6d7670e522a718067333cd4e3b158015906115f0575060095460ff165b1561169957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611671919061373f565b61169957604051633b79c77360e21b81526001600160a01b0382166004820152602401610b1f565b6116a383836123cc565b610d5e3384846123d3565b6116b6612057565b610db2816124b3565b6116c833611d75565b601655565b6116d633611d75565b6009805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611801578381815181106117435761174361375c565b602002602001015182106117a1578381815181106117635761176361375c565b602002602001015182604051602001611786929190918252602082015260400190565b604051602081830303815290604052805190602001206117ed565b818482815181106117b4576117b461375c565b60200260200101516040516020016117d6929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806117f981613772565b915050611728565b506000848152600c60205260409020541490509392505050565b60606118256124dd565b905090565b846daaeb6d7670e522a718067333cd4e3b1580159061184b575060095460ff165b156118ff57336001600160a01b0382160361186d57611219868686868661255d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e0919061373f565b6118ff57604051633b79c77360e21b8152336004820152602401610b1f565b6112bd868686868661255d565b611914612057565b6001600160a01b0381166119795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b1f565b610db2816121ea565b61198b33611d75565b600d55565b6060600061199f836002613706565b6119aa9060026136f3565b6001600160401b038111156119c1576119c1613055565b6040519080825280601f01601f1916602001820160405280156119eb576020820181803683370190505b509050600360fc1b81600081518110611a0657611a0661375c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a3557611a3561375c565b60200101906001600160f81b031916908160001a9053506000611a59846002613706565b611a649060016136f3565b90505b6001811115611adc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611a9857611a9861375c565b1a60f81b828281518110611aae57611aae61375c565b60200101906001600160f81b031916908160001a90535060049490941c93611ad58161378b565b9050611a67565b508315610ce85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b1f565b606060028054611b3a9061361c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b669061361c565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b50505050509050919050565b6001600160a01b038516611c465760005b8351811015611c4457828181518110611beb57611beb61375c565b602002602001015160036000868481518110611c0957611c0961375c565b602002602001015181526020019081526020016000206000828254611c2e91906136f3565b90915550611c3d905081613772565b9050611bd0565b505b6001600160a01b0384166112bd5760005b8351811015611d38576000848281518110611c7457611c7461375c565b602002602001015190506000848381518110611c9257611c9261375c565b6020026020010151905060006003600084815260200190815260200160002054905081811015611d155760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610b1f565b60009283526003602052604090922091039055611d3181613772565b9050611c57565b50505050505050565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b1480610b4b5750610b4b826125a2565b6001600160a01b03811660009081526007602052604090205460ff16611da6335b6001600160a01b03166014611990565b604051602001611db691906137a2565b60405160208183030381529060405290610b7d5760405162461bcd60e51b8152600401610b1f919061300f565b6127106001600160601b0382161115611e515760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b1f565b6001600160a01b038216611ea75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b1f565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6001600160a01b038416611f405760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b1f565b336000611f4c856125f2565b90506000611f59856125f2565b9050611f6a8360008985858961263d565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611f9a9084906136f3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d38836000898989896126eb565b60008281526005602052604090206120128282613835565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61203e84610c0f565b60405161204b919061300f565b60405180910390a25050565b6006546001600160a01b0316331461147b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b1f565b6001600160a01b03811660009081526007602052604090205460ff16156120d733611d96565b6040516020016120e791906138f4565b604051602081830303815290604052906121145760405162461bcd60e51b8152600401610b1f919061300f565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b60026008540361218b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b1f565b6002600855565b6001600160a01b0385163314806121ae57506121ae8533610a10565b6121ca5760405162461bcd60e51b8152600401610b1f9061394b565b6121d78585858585612846565b5050505050565b6004610b7d8282613835565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831661229e5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610b1f565b3360006122aa846125f2565b905060006122b7846125f2565b90506122d78387600085856040518060200160405280600081525061263d565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156123545760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610b1f565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611d38565b610b7d3383835b816001600160a01b0316836001600160a01b0316036124465760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b1f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6124bc81611d75565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60606000806124ee81612710610db5565b915091506125376124fe82612a29565b612512846001600160a01b03166014611990565b604051602001612523929190613999565b604051602081830303815290604052612abb565b6040516020016125479190613a1f565b6040516020818303038152906040529250505090565b6001600160a01b03851633148061257957506125798533610a10565b6125955760405162461bcd60e51b8152600401610b1f9061394b565b6121d78585858585612c1f565b60006001600160e01b03198216636cdb3d1360e11b14806125d357506001600160e01b031982166303a24d0760e21b145b80610b4b57506301ffc9a760e01b6001600160e01b0319831614610b4b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061262c5761262c61375c565b602090810291909101015292915050565b6006546001600160a01b038781169116148061267657506001600160a01b03861660009081526010602052604090205460ff1615156001145b80612688575060115460ff1615156001145b8061269a57506001600160a01b038516155b6126dd5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610b1f565b6112bd868686868686611bbf565b6001600160a01b0384163b156112bd5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061272f9089908990889088908890600401613a64565b6020604051808303816000875af192505050801561276a575060408051601f3d908101601f1916820190925261276791810190613aa9565b60015b61281657612776613ac6565b806308c379a0036127af575061278a613ae2565b8061279557506127b1565b8060405162461bcd60e51b8152600401610b1f919061300f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b1f565b6001600160e01b0319811663f23a6e6160e01b14611d385760405162461bcd60e51b8152600401610b1f90613b6b565b81518351146128a85760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610b1f565b6001600160a01b0384166128ce5760405162461bcd60e51b8152600401610b1f90613bb3565b336128dd81878787878761263d565b60005b84518110156129c35760008582815181106128fd576128fd61375c565b60200260200101519050600085838151811061291b5761291b61375c565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561296b5760405162461bcd60e51b8152600401610b1f90613bf8565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906129a89084906136f3565b92505081905550505050806129bc90613772565b90506128e0565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612a13929190613c42565b60405180910390a46112bd818787878787612d57565b60606000612a3683612e12565b60010190506000816001600160401b03811115612a5557612a55613055565b6040519080825280601f01601f191660200182016040528015612a7f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612a8957509392505050565b60608151600003612ada57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613ccf6040913990506000600384516002612b0991906136f3565b612b13919061371d565b612b1e906004613706565b90506000612b2d8260206136f3565b6001600160401b03811115612b4457612b44613055565b6040519080825280601f01601f191660200182016040528015612b6e576020820181803683370190505b509050818152600183018586518101602084015b81831015612bda576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612b82565b600389510660018114612bf45760028114612c0557612c11565b613d3d60f01b600119830152612c11565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038416612c455760405162461bcd60e51b8152600401610b1f90613bb3565b336000612c51856125f2565b90506000612c5e856125f2565b9050612c6e83898985858961263d565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612caf5760405162461bcd60e51b8152600401610b1f90613bf8565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612cec9084906136f3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612d4c848a8a8a8a8a6126eb565b505050505050505050565b6001600160a01b0384163b156112bd5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612d9b9089908990889088908890600401613c70565b6020604051808303816000875af1925050508015612dd6575060408051601f3d908101601f19168201909252612dd391810190613aa9565b60015b612de257612776613ac6565b6001600160e01b0319811663bc197c8160e01b14611d385760405162461bcd60e51b8152600401610b1f90613b6b565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612e515772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612e7d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612e9b57662386f26fc10000830492506010015b6305f5e1008310612eb3576305f5e100830492506008015b6127108310612ec757612710830492506004015b60648310612ed9576064830492506002015b600a8310610b4b5760010192915050565b80356001600160a01b0381168114612f0157600080fd5b919050565b60008060408385031215612f1957600080fd5b612f2283612eea565b946020939093013593505050565b6001600160e01b031981168114610db257600080fd5b600060208284031215612f5857600080fd5b8135610ce881612f30565b600060208284031215612f7557600080fd5b5035919050565b60008060408385031215612f8f57600080fd5b612f9883612eea565b915060208301356001600160601b0381168114612fb457600080fd5b809150509250929050565b60005b83811015612fda578181015183820152602001612fc2565b50506000910152565b60008151808452612ffb816020860160208601612fbf565b601f01601f19169290920160200192915050565b602081526000610ce86020830184612fe3565b60008060006060848603121561303757600080fd5b61304084612eea565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561309057613090613055565b6040525050565b600082601f8301126130a857600080fd5b81356001600160401b038111156130c1576130c1613055565b6040516130d8601f8301601f19166020018261306b565b8181528460208386010111156130ed57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b61314685828601613097565b9150509250929050565b60006020828403121561316257600080fd5b610ce882612eea565b6000806040838503121561317e57600080fd5b50508035926020909101359150565b60006001600160401b038211156131a6576131a6613055565b5060051b60200190565b600082601f8301126131c157600080fd5b813560206131ce8261318d565b6040516131db828261306b565b83815260059390931b85018201928281019150868411156131fb57600080fd5b8286015b8481101561321657803583529183019183016131ff565b509695505050505050565b60008060006060848603121561323657600080fd5b833592506020840135915060408401356001600160401b0381111561325a57600080fd5b613266868287016131b0565b9150509250925092565b600080600080600060a0868803121561328857600080fd5b61329186612eea565b945061329f60208701612eea565b935060408601356001600160401b03808211156132bb57600080fd5b6132c789838a016131b0565b945060608801359150808211156132dd57600080fd5b6132e989838a016131b0565b935060808801359150808211156132ff57600080fd5b5061330c88828901613097565b9150509295509295909350565b600082601f83011261332a57600080fd5b813560206133378261318d565b604051613344828261306b565b83815260059390931b850182019282810191508684111561336457600080fd5b8286015b848110156132165761337981612eea565b8352918301918301613368565b6000806040838503121561339957600080fd5b82356001600160401b03808211156133b057600080fd5b6133bc86838701613319565b935060208501359150808211156133d257600080fd5b50613146858286016131b0565b600081518084526020808501945080840160005b8381101561340f578151875295820195908201906001016133f3565b509495945050505050565b602081526000610ce860208301846133df565b60006020828403121561343f57600080fd5b81356001600160401b0381111561345557600080fd5b61346184828501613097565b949350505050565b8015158114610db257600080fd5b6000806040838503121561348a57600080fd5b61349383612eea565b91506020830135612fb481613469565b6000602082840312156134b557600080fd5b8135610ce881613469565b6000806000606084860312156134d557600080fd5b83356001600160401b03808211156134ec57600080fd5b6134f887838801613319565b945060208601359350604086013591508082111561351557600080fd5b50613266868287016131b0565b6000806040838503121561353557600080fd5b8235915061354560208401612eea565b90509250929050565b60008060006060848603121561356357600080fd5b61356c84612eea565b92506020840135915060408401356001600160401b0381111561325a57600080fd5b600080604083850312156135a157600080fd5b6135aa83612eea565b915061354560208401612eea565b600080600080600060a086880312156135d057600080fd5b6135d986612eea565b94506135e760208701612eea565b9350604086013592506060860135915060808601356001600160401b0381111561361057600080fd5b61330c88828901613097565b600181811c9082168061363057607f821691505b60208210810361365057634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546136648161361c565b6001828116801561367c5760018114613691576136c0565b60ff19841687528215158302870194506136c0565b8860005260208060002060005b858110156136b75781548a82015290840190820161369e565b50505082870194505b5050505083516136d4818360208801612fbf565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b4b57610b4b6136dd565b8082028115828204841417610b4b57610b4b6136dd565b60008261373a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561375157600080fd5b8151610ce881613469565b634e487b7160e01b600052603260045260246000fd5b600060018201613784576137846136dd565b5060010190565b60008161379a5761379a6136dd565b506000190190565b67030b1b1b7bab73a160c51b8152600082516137c5816008850160208701612fbf565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610d5e57600081815260208120601f850160051c810160208610156138165750805b601f850160051c820191505b818110156112bd57828155600101613822565b81516001600160401b0381111561384e5761384e613055565b6138628161385c845461361c565b846137ef565b602080601f831160018114613897576000841561387f5750858301515b600019600386901b1c1916600185901b1785556112bd565b600085815260208120601f198616915b828110156138c6578886015182559484019460019091019084016138a7565b50858210156138e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251613917816008850160208701612fbf565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a00000000008152600083516139d181601b850160208801612fbf565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613a0481602e840160208801612fbf565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613a5781601d850160208701612fbf565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613a9e90830184612fe3565b979650505050505050565b600060208284031215613abb57600080fd5b8151610ce881612f30565b600060033d1115613adf5760046000803e5060005160e01c5b90565b600060443d1015613af05790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b1f57505050505090565b8285019150815181811115613b375750505050505090565b843d8701016020828501011115613b515750505050505090565b613b606020828601018761306b565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000613c5560408301856133df565b8281036020840152613c6781856133df565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613c9c908301866133df565b8281036060840152613cae81866133df565b90508281036080840152613cc28185612fe3565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122045aee3506863332304800ad1c3f8eb125c059e39f0b289346b7bb3131958df6c64736f6c63430008110033

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

000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xB4250F715995683c6EA5BC7c5e2CDF9b1601ba3f
Arg [1] : _royaltyFraction (uint96): 1000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

79642:8719:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24477:230;;;;;;;;;;-1:-1:-1;24477:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;24477:230:0;;;;;;;;80949:165;;;;;;;;;;-1:-1:-1;80949:165:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;80949:165:0;1019:187:1;86068:111:0;;;;;;;;;;-1:-1:-1;86068:111:0;;;;;:::i;:::-;;:::i;:::-;;80771:157;;;;;;;;;;-1:-1:-1;80771:157:0;;;;;:::i;:::-;;:::i;79799:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58087:351::-;;;;;;;;;;-1:-1:-1;58087:351:0;;;;;:::i;:::-;;:::i;86874:217::-;;;;;;;;;;-1:-1:-1;86874:217:0;;;;;:::i;:::-;;:::i;83937:154::-;;;;;;;;;;-1:-1:-1;83937:154:0;;;;;:::i;:::-;;:::i;80062:48::-;;;;;;;;;;-1:-1:-1;80062:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;85389:126;;;;;;;;;;-1:-1:-1;85389:126:0;;;;;:::i;:::-;85488:10;;85456:7;85478:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;85478:31:0;;;;;;;;;;;85389:126;85932:130;;;;;;;;;;-1:-1:-1;85932:130:0;;;;;:::i;:::-;;:::i;88067:115::-;;;;;;;;;;-1:-1:-1;88067:115:0;;;;;:::i;:::-;;:::i;77087:442::-;;;;;;;;;;-1:-1:-1;77087:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4828:32:1;;;4810:51;;4892:2;4877:18;;4870:34;;;;4783:18;77087:442:0;4636:274:1;84392:884:0;;;;;;:::i;:::-;;:::i;80117:34::-;;;;;;;;;;;;;;;;83262:302;;;;;;;;;;-1:-1:-1;83262:302:0;;;;;:::i;:::-;;:::i;86320:140::-;;;;;;;;;;-1:-1:-1;86320:140:0;;;;;:::i;:::-;;:::i;71816:143::-;;;;;;;;;;;;71916:42;71816:143;;;;;-1:-1:-1;;;;;8195:32:1;;;8177:51;;8165:2;8150:18;71816:143:0;7999:235:1;79987:38:0;;;;;;;;;;;;;;;;80032: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;83831:98;;;;;;;;;;-1:-1:-1;83831:98:0;;;;;:::i;:::-;;:::i;83722:101::-;;;;;;;;;;-1:-1:-1;83722:101:0;;;;;:::i;:::-;;:::i;68218:22::-;;;;;;;;;;;;;;;;59182:113;;;;;;;;;;-1:-1:-1;59182:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;59266:21:0;59242:4;59266:21;;;:10;:21;;;;;;;;;59182:113;86464:156;;;;;;;;;;-1:-1:-1;86464:156:0;;;;;:::i;:::-;;:::i;2753:103::-;;;;;;;;;;;;;:::i;86645:110::-;;;;;;;;;;-1:-1:-1;86645:110:0;;;;;:::i;:::-;;:::i;86778:88::-;;;;;;;;;;-1:-1:-1;86778:88:0;;;;;:::i;:::-;;:::i;87099:255::-;;;;;;;;;;-1:-1:-1;87099:255:0;;;;;:::i;:::-;;:::i;2105:87::-;;;;;;;;;;-1:-1:-1;2178:6:0;;-1:-1:-1;;;;;2178:6:0;2105:87;;85519:149;;;;;;;;;;-1:-1:-1;85519:149:0;;;;;:::i;:::-;85608:7;85630:22;;;:9;:22;;;;;;;;-1:-1:-1;;;;;85630:32:0;;;;;;;;;;;;;85519:149;84099:271;;;;;;;;;;-1:-1:-1;84099:271:0;;;;;:::i;:::-;;:::i;85280:103::-;;;;;;;;;;-1:-1:-1;85280:103:0;;;;;:::i;:::-;;:::i;87362:153::-;;;;;;;;;;-1:-1:-1;87362:153:0;;;;;:::i;:::-;;:::i;79847:31::-;;;;;;;;;;;;;:::i;82390:239::-;;;;;;;;;;-1:-1:-1;82390:239:0;;;;;:::i;:::-;;:::i;88241:117::-;;;;;;;;;;-1:-1:-1;88241:117:0;;;;;:::i;:::-;;:::i;86185:131::-;;;;;;;;;;-1:-1:-1;86185:131:0;;;;;:::i;:::-;;:::i;82079:122::-;;;;;;;;;;-1:-1:-1;82079:122:0;;;;;:::i;:::-;;:::i;55384:113::-;;;;;;;;;;-1:-1:-1;55384:113:0;;;;;:::i;:::-;55446:7;55473:16;;;:12;:16;;;;;;;55384:113;80158:27;;;;;;;;;;-1:-1:-1;80158:27:0;;;;;;;;83614:100;;;;;;;;;;-1:-1:-1;83614:100:0;;;;;:::i;:::-;-1:-1:-1;;;;;83689:17:0;83665:4;83689:17;;;:13;:17;;;;;;;;;83614:100;68527:434;;;;;;;;;;-1:-1:-1;68527:434:0;;;;;:::i;:::-;;:::i;85695:88::-;;;;;;;;;;-1:-1:-1;85770:7:0;;85695:88;;79955:25;;;;;;;;;;;;;;;;80265:23;;;;;;;;;;-1:-1:-1;80265:23:0;;;;-1:-1:-1;;;;;80265:23:0;;;81143: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;82817:252;;;;;;;;;;-1:-1:-1;82817:252:0;;;;;:::i;:::-;;:::i;3011:201::-;;;;;;;;;;-1:-1:-1;3011:201:0;;;;;:::i;:::-;;:::i;71764:43::-;;;;;;;;;;-1:-1:-1;71764:43:0;;;;;;;;85808:99;;;;;;;;;;-1:-1:-1;85808:99:0;;;;;:::i;:::-;;:::i;24477:230::-;24563:7;-1:-1:-1;;;;;24591:21:0;;24583:76;;;;-1:-1:-1;;;24583:76:0;;14258:2:1;24583:76:0;;;14240:21:1;14297:2;14277:18;;;14270:30;14336:34;14316:18;;;14309:62;-1:-1:-1;;;14387:18:1;;;14380:40;14437:19;;24583:76:0;;;;;;;;;-1:-1:-1;24677:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;24677:22:0;;;;;;;;;;24477:230;;;;;:::o;80949:165::-;81052:4;81072:36;81096:11;81072:23;:36::i;86068:111::-;59124:32;736:10;59124:18;:32::i;:::-;86149:10:::1;:24:::0;86068:111::o;80771:157::-;59124:32;736:10;59124:18;:32::i;:::-;80878:44:::1;80897:9;80908:13;80878:18;:44::i;:::-;80771:157:::0;;:::o;79799:41::-;;;;;;;:::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;86874:217::-;59124:32;736:10;59124:18;:32::i;:::-;87007:7:::1;87011:2;87007:3;:7::i;:::-;87001:21;87026:1;87001:26:::0;86993:54:::1;;;::::0;-1:-1:-1;;;86993:54:0;;16205:2:1;86993:54:0::1;::::0;::::1;16187:21:1::0;16244:2;16224:18;;;16217:30;-1:-1:-1;;;16263:18:1;;;16256:45;16318:18;;86993:54:0::1;16003:339:1::0;86993:54:0::1;87058:25;87064:2;87068;87072:6;87058:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;86874:217:::0;;;:::o;83937:154::-;59124:32;736:10;59124:18;:32::i;:::-;84056:27:::1;84064:7;84073:9;84056:7;:27::i;85932:130::-:0;59124:32;736:10;59124:18;:32::i;:::-;86026:8:::1;86016:7;:18;;;;86055:1;86041:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;85932:130:0:o;88067:115::-;1991:13;:11;:13::i;:::-;88144:30:::1;88163:10;88144:18;:30::i;:::-;88067:115:::0;:::o;77087:442::-;77184:7;77242:27;;;:17;:27;;;;;;;;77213:56;;;;;;;;;-1:-1:-1;;;;;77213:56:0;;;;;-1:-1:-1;;;77213:56:0;;;-1:-1:-1;;;;;77213:56:0;;;;;;;;77184:7;;77282:92;;-1:-1:-1;77333:29:0;;;;;;;;;77343:19;77333:29;-1:-1:-1;;;;;77333:29:0;;;;-1:-1:-1;;;77333:29:0;;-1:-1:-1;;;;;77333:29:0;;;;;77282:92;77424:23;;;;77386:21;;77895:5;;77411:36;;-1:-1:-1;;;;;77411:36:0;:10;:36;:::i;:::-;77410:58;;;;:::i;:::-;77489:16;;;;;-1:-1:-1;77087:442:0;;-1:-1:-1;;;;77087:442:0:o;84392:884::-;67492:21;:19;:21::i;:::-;84527:7:::1;84531:2;84527:3;:7::i;:::-;84521:21;84546:1;84521:26:::0;84513:54:::1;;;::::0;-1:-1:-1;;;84513:54:0;;16205:2:1;84513:54:0::1;::::0;::::1;16187:21:1::0;16244:2;16224:18;;;16217:30;-1:-1:-1;;;16263:18:1;;;16256:45;16318:18;;84513:54:0::1;16003:339:1::0;84513:54:0::1;84582:15;::::0;::::1;;84574:51;;;::::0;-1:-1:-1;;;84574:51:0;;17338:2:1;84574:51:0::1;::::0;::::1;17320:21:1::0;17377:2;17357:18;;;17350:30;17416:25;17396:18;;;17389:53;17459:18;;84574:51:0::1;17136:347:1::0;84574:51:0::1;84640:41;84654:10;84665:7;;84674:6;84640:13;:41::i;:::-;84632:78;;;::::0;-1:-1:-1;;;84632:78:0;;17690:2:1;84632:78:0::1;::::0;::::1;17672:21:1::0;17729:2;17709:18;;;17702:30;17768:26;17748:18;;;17741:54;17812:18;;84632:78:0::1;17488:348:1::0;84632:78:0::1;84744:7;84725:15;;:26;;84717:81;;;::::0;-1:-1:-1;;;84717:81:0;;18043:2:1;84717:81:0::1;::::0;::::1;18025:21:1::0;18082:2;18062:18;;;18055:30;18121:34;18101:18;;;18094:62;-1:-1:-1;;;18172:18:1;;;18165:40;18222:19;;84717:81:0::1;17841:406:1::0;84717:81:0::1;84827:7;::::0;84813:22:::1;::::0;;;:13:::1;:22;::::0;;;;;:33;-1:-1:-1;84813:33:0::1;84805:86;;;::::0;-1:-1:-1;;;84805:86:0;;18454:2:1;84805:86:0::1;::::0;::::1;18436:21:1::0;18493:2;18473:18;;;18466:30;18532:34;18512:18;;;18505:62;-1:-1:-1;;;18583:18:1;;;18576:38;18631:19;;84805:86:0::1;18252:404:1::0;84805:86:0::1;84942:10;::::0;84932:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;84954:10:::1;84932:33:::0;;;;;;;;:43:::1;::::0;84968:7;;84932:43:::1;:::i;:::-;84920:7;::::0;84906:22:::1;::::0;;;:13:::1;:22;::::0;;;;;:69:::1;;84898:112;;;::::0;-1:-1:-1;;;84898:112:0;;18863:2:1;84898:112:0::1;::::0;::::1;18845:21:1::0;18902:2;18882:18;;;18875:30;18941:32;18921:18;;;18914:60;18991:18;;84898:112:0::1;18661:354:1::0;84898:112:0::1;85052:7;85038:11;;:21;;;;:::i;:::-;85025:9;:34;85017:71;;;::::0;-1:-1:-1;;;85017:71:0;;19222:2:1;85017:71:0::1;::::0;::::1;19204:21:1::0;19261:2;19241:18;;;19234:30;19300:26;19280:18;;;19273:54;19344:18;;85017:71:0::1;19020:348:1::0;85017:71:0::1;85135:8;::::0;55446:7;55473:16;;;:12;:16;;;;;;85104:25:::1;::::0;:7;:25:::1;:::i;:::-;85103:41;;:58;;;-1:-1:-1::0;85148:8:0::1;::::0;:13;85103:58:::1;85095:83;;;::::0;-1:-1:-1;;;85095:83:0;;19575:2:1;85095:83:0::1;::::0;::::1;19557:21:1::0;19614:2;19594:18;;;19587:30;-1:-1:-1;;;19633:18:1;;;19626:42;19685:18;;85095:83:0::1;19373:336:1::0;85095:83:0::1;85195:10;::::0;85185:21:::1;::::0;;;:9:::1;:21;::::0;;;;;;;85207:10:::1;85185:33:::0;;;;;;;:44;;85222:7;;85185:21;:44:::1;::::0;85222:7;;85185:44:::1;:::i;:::-;;;;;;;;85236:34;85242:10;85254:2;85258:7;85236:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;67536:20:::0;66930:1;68056:7;:22;67873:213;83262:302;83482:4;71916:42;73064:45;:49;;;;:77;;-1:-1:-1;73117:24:0;;;;73064:77;73060:567;;;73381:10;-1:-1:-1;;;;;73373:18:0;;;73369:85;;83499:57:::1;83527:4;83533:2;83537:3;83542:7;83551:4;83499:27;:57::i;:::-;73432:7:::0;;73369:85;73473:69;;-1:-1:-1;;;73473:69:0;;73524:4;73473:69;;;19926:34:1;73531:10:0;19976:18:1;;;19969:43;71916:42:0;;73473;;19861:18:1;;73473:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73468:148;;73570:30;;-1:-1:-1;;;73570:30:0;;73589:10;73570:30;;;8177:51:1;8150:18;;73570:30:0;7999:235:1;73468:148:0;83499:57:::1;83527:4;83533:2;83537:3;83542:7;83551:4;83499:27;:57::i;:::-;83262:302:::0;;;;;;:::o;86320:140::-;59124:32;736:10;59124:18;:32::i;:::-;86419:18:::1;::::0;;;:13:::1;:18;::::0;;;;:35;86320:140::o;24873:524::-;25029:16;25090:3;:10;25071:8;:15;:29;25063:83;;;;-1:-1:-1;;;25063:83:0;;20475:2:1;25063:83:0;;;20457:21:1;20514:2;20494:18;;;20487:30;20553:34;20533:18;;;20526:62;-1:-1:-1;;;20604:18:1;;;20597:39;20653:19;;25063:83:0;20273: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;83831:98::-;59124:32;736:10;59124:18;:32::i;:::-;83904:17:::1;83916:4;83904:11;:17::i;83722:101::-:0;59124:32;736:10;59124:18;:32::i;:::-;-1:-1:-1;;;;;83791:17:0;;;::::1;;::::0;;;:13:::1;:17;::::0;;;;:24;;-1:-1:-1;;83791:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;83722:101::o;86464:156::-;59124:32;736:10;59124:18;:32::i;:::-;68347:23;;;;:13;:23;;;;;;:37;80771:157::o;2753:103::-;1991:13;:11;:13::i;:::-;2818:30:::1;2845:1;2818:18;:30::i;:::-;2753:103::o:0;86645:110::-;59124:32;736:10;59124:18;:32::i;:::-;86726:15:::1;:23:::0;;-1:-1:-1;;86726:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;86645:110::o;86778:88::-;59124:32;736:10;59124:18;:32::i;:::-;86846:6:::1;:14:::0;;-1:-1:-1;;86846:14:0::1;::::0;::::1;;::::0;;;::::1;::::0;;86778:88::o;87099:255::-;59124:32;736:10;59124:18;:32::i;:::-;87250:9:::1;87245:102;87269:4;:11;87265:1;:15;87245:102;;;87302:33;87308:4;87313:1;87308:7;;;;;;;;:::i;:::-;;;;;;;87317:2;87321:6;87328:1;87321:9;;;;;;;;:::i;:::-;;;;;;;87302:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;87282:3:::0;::::1;::::0;::::1;:::i;:::-;;;;87245:102;;;;87099:255:::0;;;:::o;84099:271::-;59124:32;736:10;59124:18;:32::i;:::-;84232:12:::1;84236:7;84232:3;:12::i;:::-;84226:26:::0;:31;84218:62:::1;;;::::0;-1:-1:-1;;;84218:62:0;;21157:2:1;84218:62:0::1;::::0;::::1;21139:21:1::0;21196:2;21176:18;;;21169:30;-1:-1:-1;;;21215:18:1;;;21208:48;21273:18;;84218:62:0::1;20955:342:1::0;84218:62:0::1;84291:33;84297:10;84309:7;84318:1;84291:33;;;;;;;;;;;::::0;:5:::1;:33::i;85280:103::-:0;59124:32;736:10;59124:18;:32::i;:::-;85357:8:::1;:20:::0;85280:103::o;87362:153::-;59124:32;736:10;59124:18;:32::i;:::-;87486:21:::1;87492:2;87496;87500:6;87486:5;:21::i;79847:31::-:0;;;;;;;:::i;82390:239::-;82494:8;71916:42;73838:45;:49;;;;:77;;-1:-1:-1;73891:24:0;;;;73838:77;73834:253;;;73937:67;;-1:-1:-1;;;73937:67:0;;73988:4;73937:67;;;19926:34:1;-1:-1:-1;;;;;19996:15:1;;19976:18;;;19969:43;71916:42:0;;73937;;19861:18:1;;73937:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73932:144;;74032:28;;-1:-1:-1;;;74032:28:0;;-1:-1:-1;;;;;8195:32:1;;74032:28:0;;;8177:51:1;8150:18;;74032:28:0;7999:235:1;73932:144:0;82515:43:::1;82539:8;82549;82515:23;:43::i;:::-;82569:52;736:10:::0;82602:8:::1;82612;82569:18;:52::i;88241:117::-:0;1991:13;:11;:13::i;:::-;88319:31:::1;88339:10;88319:19;:31::i;86185:131::-:0;59124:32;736:10;59124:18;:32::i;:::-;86276:15:::1;:34:::0;86185:131::o;82079:122::-;59124:32;736:10;59124:18;:32::i;:::-;82161:24:::1;:32:::0;;-1:-1:-1;;82161:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;82079:122::o;68527:434::-;68674:26;;-1:-1:-1;;21451:2:1;21447:15;;;21443:53;68674:26:0;;;21431:66:1;68631:4:0;;;;21513:12:1;;68674:26:0;;;;;;;;;;;;68664:37;;;;;;68648:53;;68717:9;68712:192;68736:6;:13;68732:1;:17;68712:192;;;68787:6;68794:1;68787:9;;;;;;;;:::i;:::-;;;;;;;68779:5;:17;:113;;68874:6;68881:1;68874:9;;;;;;;;:::i;:::-;;;;;;;68885:5;68857:34;;;;;;;;21693:19:1;;;21737:2;21728:12;;21721:28;21774:2;21765:12;;21536:247;68857:34:0;;;;;;;;;;;;;68847:45;;;;;;68779:113;;;68826:5;68833:6;68840:1;68833:9;;;;;;;;:::i;:::-;;;;;;;68809:34;;;;;;;;21693:19:1;;;21737:2;21728:12;;21721:28;21774:2;21765:12;;21536:247;68809:34:0;;;;;;;;;;;;;68799:45;;;;;;68779:113;68771:121;-1:-1:-1;68751:3:0;;;;:::i;:::-;;;;68712:192;;;-1:-1:-1;68930:23:0;;;;:13;:23;;;;;;68921:32;;-1:-1:-1;68527:434:0;;;;;:::o;81143:113::-;81197:13;81230:20;:18;:20::i;:::-;81223:27;;81143:113;:::o;82817:252::-;82984:4;71916:42;73064:45;:49;;;;:77;;-1:-1:-1;73117:24:0;;;;73064:77;73060:567;;;73381:10;-1:-1:-1;;;;;73373:18:0;;;73369:85;;83006:55:::1;83029:4;83035:2;83039:7;83048:6;83056:4;83006:22;:55::i;73369:85::-:0;73473:69;;-1:-1:-1;;;73473:69:0;;73524:4;73473:69;;;19926:34:1;73531:10:0;19976:18:1;;;19969:43;71916:42:0;;73473;;19861:18:1;;73473:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73468:148;;73570:30;;-1:-1:-1;;;73570:30:0;;73589:10;73570:30;;;8177:51:1;8150:18;;73570:30:0;7999:235:1;73468:148:0;83006:55:::1;83029:4;83035:2;83039:7;83048:6;83056:4;83006: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;;21990:2:1;3092:73:0::1;::::0;::::1;21972:21:1::0;22029:2;22009:18;;;22002:30;22068:34;22048:18;;;22041:62;-1:-1:-1;;;22119:18:1;;;22112:36;22165:19;;3092:73:0::1;21788:402:1::0;3092:73:0::1;3176:28;3195:8;3176:18;:28::i;85808:99::-:0;59124:32;736:10;59124:18;:32::i;:::-;85883:7:::1;:18:::0;85808: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;;22538:2:1;54791:55:0;;;22520:21:1;;;22557:18;;;22550:30;22616:34;22596:18;;;22589:62;22668:18;;54791:55:0;22336:356:1;24221:105:0;24281:13;24314:4;24307:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24221:105;;;:::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;;22899:2:1;56515:69:0;;;22881:21:1;22938:2;22918:18;;;22911:30;22977:34;22957:18;;;22950:62;-1:-1:-1;;;23028:18:1;;;23021:38;23076:19;;56515:69:0;22697:404:1;56515:69:0;56636:16;;;;:12;:16;;;;;;56655:15;;56636:34;;56355:3;;;:::i;:::-;;;56319:386;;;;55792:931;;;;;;:::o;4803:326::-;-1:-1:-1;;;;;5098:19:0;;:23;;;4803:326::o;76817:215::-;76919:4;-1:-1:-1;;;;;;76943:41:0;;-1:-1:-1;;;76943:41:0;;:81;;;76988:36;77012:11;76988: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;78179:332::-;77895:5;-1:-1:-1;;;;;78282:33:0;;;;78274:88;;;;-1:-1:-1;;;78274:88:0;;23924:2:1;78274:88:0;;;23906:21:1;23963:2;23943:18;;;23936:30;24002:34;23982:18;;;23975:62;-1:-1:-1;;;24053:18:1;;;24046:40;24103:19;;78274:88:0;23722:406:1;78274:88:0;-1:-1:-1;;;;;78381:22:0;;78373:60;;;;-1:-1:-1;;;78373:60:0;;24335:2:1;78373:60:0;;;24317:21:1;24374:2;24354:18;;;24347:30;24413:27;24393:18;;;24386:55;24458:18;;78373:60:0;24133:349:1;78373:60:0;78468:35;;;;;;;;;-1:-1:-1;;;;;78468:35:0;;;;;;-1:-1:-1;;;;;78468:35:0;;;;;;;;;;-1:-1:-1;;;78446:57:0;;;;:19;:57;78179:332::o;31118:729::-;-1:-1:-1;;;;;31271:16:0;;31263:62;;;;-1:-1:-1;;;31263:62:0;;24689:2:1;31263:62:0;;;24671:21:1;24728:2;24708:18;;;24701:30;24767:34;24747:18;;;24740:62;-1:-1:-1;;;24818:18:1;;;24811:31;24859:19;;31263:62:0;24487: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;;;25063:25:1;;;25119:2;25104:18;;25097:34;;;-1:-1:-1;;;;;31622:52:0;;;;31655:1;;31622:52;;;;;;25036:18:1;31622:52:0;;;;;;;31765:74;31796:8;31814:1;31818:2;31822;31826:6;31834:4;31765:30;:74::i;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;;27422:2:1;2326:68:0;;;27404:21:1;;;27441:18;;;27434:30;27500:34;27480:18;;;27473:62;27552:18;;2326:68:0;27220: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;67572:293::-;66974:1;67706:7;;:19;67698:63;;;;-1:-1:-1;;;67698:63:0;;28412:2:1;67698:63:0;;;28394:21:1;28451:2;28431:18;;;28424:30;28490:33;28470:18;;;28463:61;28541:18;;67698:63:0;28210:355:1;67698:63:0;66974:1;67839:7;:18;67572:293::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;33361:808::-;-1:-1:-1;;;;;33488:18:0;;33480:66;;;;-1:-1:-1;;;33480:66:0;;29187:2:1;33480:66:0;;;29169:21:1;29226:2;29206:18;;;29199:30;29265:34;29245:18;;;29238:62;-1:-1:-1;;;29316:18:1;;;29309:33;29359:19;;33480:66:0;28985: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;;29591:2:1;33852:70:0;;;29573:21:1;29630:2;29610:18;;;29603:30;29669:34;29649:18;;;29642:62;-1:-1:-1;;;29720:18:1;;;29713:34;29764:19;;33852:70:0;29389:400:1;33852:70:0;33958:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33958:19:0;;;;;;;;;;;;33980:20;;;33958:42;;34029:54;;25063:25:1;;;25104:18;;;25097:34;;;33958:19:0;;34029:54;;;;;;25036:18:1;34029:54:0;;;;;;;34096:65;;;;;;;;;34140:1;34096:65;;;83262: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;;29996:2:1;35669:71:0;;;29978:21:1;30035:2;30015:18;;;30008:30;30074:34;30054:18;;;30047:62;-1:-1:-1;;;30125:18:1;;;30118:39;30174:19;;35669:71:0;29794: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;81282:567::-;81335:13;81358:16;;81403:32;81358:16;77895:5;81403:11;:32::i;:::-;81357:78;;;;81544:283;81656:33;81673:15;81656:16;:33::i;:::-;81731:51;81767:8;-1:-1:-1;;;;;81751:26:0;81779:2;81731:19;:51::i;:::-;81590:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81544:13;:283::i;:::-;81475:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;81453:390;;;;81282: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;87523:488::-;2178:6;;-1:-1:-1;;;;;87784:19:0;;;2178:6;;87784:19;;:54;;-1:-1:-1;;;;;;87807:23:0;;;;;;:13;:23;;;;;;;;:31;;:23;:31;87784:54;:72;;;-1:-1:-1;87842:6:0;;;;:14;;:6;:14;87784:72;:94;;;-1:-1:-1;;;;;;87860:18:0;;;87784:94;87762:164;;;;-1:-1:-1;;;87762:164:0;;31927:2:1;87762:164:0;;;31909:21:1;31966:2;31946:18;;;31939:30;-1:-1:-1;;;31985:18:1;;;31978:50;32045:18;;87762:164:0;31725:344:1;87762:164:0;87937:66;87964:8;87974:4;87980:2;87984:3;87989:7;87998:4;87937: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;;33956:2:1;38872:62:0;;;33938:21:1;33995:2;33975:18;;;33968:30;34034:34;34014:18;;;34007:62;-1:-1:-1;;;34085:18:1;;;34078:50;34145:19;;38872:62:0;33754: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;;34786:2:1;28859:81:0;;;34768:21:1;34825:2;34805:18;;;34798:30;34864:34;34844:18;;;34837:62;-1:-1:-1;;;34915:18:1;;;34908:38;34963:19;;28859:81:0;34584: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;;;25063:25:1;;;25119:2;25104:18;;25097:34;;;-1:-1:-1;;;;;28089:46:0;;;;;;;;;;;;;;25036: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;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:484::-;5934:6;5942;5950;6003:2;5991:9;5982:7;5978:23;5974:32;5971:52;;;6019:1;6016;6009:12;5971:52;6055:9;6042:23;6032:33;;6112:2;6101:9;6097:18;6084:32;6074:42;;6167:2;6156:9;6152:18;6139:32;-1:-1:-1;;;;;6186:6:1;6183:30;6180:50;;;6226:1;6223;6216:12;6180:50;6249:61;6302:7;6293:6;6282:9;6278:22;6249:61;:::i;:::-;6239:71;;;5832:484;;;;;:::o;7050:944::-;7204:6;7212;7220;7228;7236;7289:3;7277:9;7268:7;7264:23;7260:33;7257:53;;;7306:1;7303;7296:12;7257:53;7329:29;7348:9;7329:29;:::i;:::-;7319:39;;7377:38;7411:2;7400:9;7396:18;7377:38;:::i;:::-;7367:48;;7466:2;7455:9;7451:18;7438:32;-1:-1:-1;;;;;7530:2:1;7522:6;7519:14;7516:34;;;7546:1;7543;7536:12;7516:34;7569:61;7622:7;7613:6;7602:9;7598:22;7569:61;:::i;:::-;7559:71;;7683:2;7672:9;7668:18;7655:32;7639:48;;7712:2;7702:8;7699:16;7696:36;;;7728:1;7725;7718:12;7696:36;7751:63;7806:7;7795:8;7784:9;7780:24;7751:63;:::i;:::-;7741:73;;7867:3;7856:9;7852:19;7839:33;7823:49;;7897:2;7887:8;7884:16;7881:36;;;7913:1;7910;7903:12;7881:36;;7936:52;7980:7;7969:8;7958:9;7954:24;7936:52;:::i;:::-;7926:62;;;7050:944;;;;;;;;:::o;8239:730::-;8293:5;8346:3;8339:4;8331:6;8327:17;8323:27;8313:55;;8364:1;8361;8354:12;8313:55;8400:6;8387:20;8426:4;8449:43;8489:2;8449:43;:::i;:::-;8521:2;8515:9;8533:31;8561:2;8553:6;8533:31;:::i;:::-;8599:18;;;8691:1;8687:10;;;;8675:23;;8671:32;;;8633:15;;;;-1:-1:-1;8715:15:1;;;8712:35;;;8743:1;8740;8733:12;8712:35;8779:2;8771:6;8767:15;8791:148;8807:6;8802:3;8799:15;8791:148;;;8873:23;8892:3;8873:23;:::i;:::-;8861:36;;8917:12;;;;8824;;8791:148;;8974:595;9092:6;9100;9153:2;9141:9;9132:7;9128:23;9124:32;9121:52;;;9169:1;9166;9159:12;9121:52;9209:9;9196:23;-1:-1:-1;;;;;9279:2:1;9271:6;9268:14;9265:34;;;9295:1;9292;9285:12;9265:34;9318:61;9371:7;9362:6;9351:9;9347:22;9318:61;:::i;:::-;9308:71;;9432:2;9421:9;9417:18;9404:32;9388:48;;9461:2;9451:8;9448:16;9445:36;;;9477:1;9474;9467:12;9445:36;;9500:63;9555:7;9544:8;9533:9;9529:24;9500:63;:::i;9574:435::-;9627:3;9665:5;9659:12;9692:6;9687:3;9680:19;9718:4;9747:2;9742:3;9738:12;9731:19;;9784:2;9777:5;9773:14;9805:1;9815:169;9829:6;9826:1;9823:13;9815:169;;;9890:13;;9878:26;;9924:12;;;;9959:15;;;;9851:1;9844:9;9815:169;;;-1:-1:-1;10000:3:1;;9574:435;-1:-1:-1;;;;;9574:435:1:o;10014:261::-;10193:2;10182:9;10175:21;10156:4;10213:56;10265:2;10254:9;10250:18;10242:6;10213:56;:::i;10280:322::-;10349:6;10402:2;10390:9;10381:7;10377:23;10373:32;10370:52;;;10418:1;10415;10408:12;10370:52;10458:9;10445:23;-1:-1:-1;;;;;10483:6:1;10480:30;10477:50;;;10523:1;10520;10513:12;10477:50;10546;10588:7;10579:6;10568:9;10564:22;10546:50;:::i;:::-;10536:60;10280:322;-1:-1:-1;;;;10280:322:1:o;10607:118::-;10693:5;10686:13;10679:21;10672:5;10669:32;10659:60;;10715:1;10712;10705:12;10730:315;10795:6;10803;10856:2;10844:9;10835:7;10831:23;10827:32;10824:52;;;10872:1;10869;10862:12;10824:52;10895:29;10914:9;10895:29;:::i;:::-;10885:39;;10974:2;10963:9;10959:18;10946:32;10987:28;11009:5;10987:28;:::i;11303:241::-;11359:6;11412:2;11400:9;11391:7;11387:23;11383:32;11380:52;;;11428:1;11425;11418:12;11380:52;11467:9;11454:23;11486:28;11508:5;11486:28;:::i;11549:663::-;11676:6;11684;11692;11745:2;11733:9;11724:7;11720:23;11716:32;11713:52;;;11761:1;11758;11751:12;11713:52;11801:9;11788:23;-1:-1:-1;;;;;11871:2:1;11863:6;11860:14;11857:34;;;11887:1;11884;11877:12;11857:34;11910:61;11963:7;11954:6;11943:9;11939:22;11910:61;:::i;:::-;11900:71;;12018:2;12007:9;12003:18;11990:32;11980:42;;12075:2;12064:9;12060:18;12047:32;12031:48;;12104:2;12094:8;12091:16;12088:36;;;12120:1;12117;12110:12;12088:36;;12143:63;12198:7;12187:8;12176:9;12172:24;12143:63;:::i;12425:254::-;12493:6;12501;12554:2;12542:9;12533:7;12529:23;12525:32;12522:52;;;12570:1;12567;12560:12;12522:52;12606:9;12593:23;12583:33;;12635:38;12669:2;12658:9;12654:18;12635:38;:::i;:::-;12625:48;;12425:254;;;;;:::o;12684:490::-;12786:6;12794;12802;12855:2;12843:9;12834:7;12830:23;12826:32;12823:52;;;12871:1;12868;12861:12;12823:52;12894:29;12913:9;12894:29;:::i;:::-;12884:39;;12970:2;12959:9;12955:18;12942:32;12932:42;;13025:2;13014:9;13010:18;12997:32;-1:-1:-1;;;;;13044:6:1;13041:30;13038:50;;;13084:1;13081;13074:12;13179:260;13247:6;13255;13308:2;13296:9;13287:7;13283:23;13279:32;13276:52;;;13324:1;13321;13314:12;13276:52;13347:29;13366:9;13347:29;:::i;:::-;13337:39;;13395:38;13429:2;13418:9;13414:18;13395:38;:::i;13444:607::-;13548:6;13556;13564;13572;13580;13633:3;13621:9;13612:7;13608:23;13604:33;13601:53;;;13650:1;13647;13640:12;13601:53;13673:29;13692:9;13673:29;:::i;:::-;13663:39;;13721:38;13755:2;13744:9;13740:18;13721:38;:::i;:::-;13711:48;;13806:2;13795:9;13791:18;13778:32;13768:42;;13857:2;13846:9;13842:18;13829:32;13819:42;;13912:3;13901:9;13897:19;13884:33;-1:-1:-1;;;;;13932:6:1;13929:30;13926:50;;;13972:1;13969;13962:12;13926:50;13995;14037:7;14028:6;14017:9;14013:22;13995:50;:::i;14467:380::-;14546:1;14542:12;;;;14589;;;14610:61;;14664:4;14656:6;14652:17;14642:27;;14610:61;14717:2;14709:6;14706:14;14686:18;14683:38;14680:161;;14763:10;14758:3;14754:20;14751:1;14744:31;14798:4;14795:1;14788:15;14826:4;14823:1;14816:15;14680:161;;14467:380;;;:::o;14978:1020::-;15154:3;15183:1;15216:6;15210:13;15246:36;15272:9;15246:36;:::i;:::-;15301:1;15318:18;;;15345:133;;;;15492:1;15487:356;;;;15311:532;;15345:133;-1:-1:-1;;15378:24:1;;15366:37;;15451:14;;15444:22;15432:35;;15423:45;;;-1:-1:-1;15345:133:1;;15487:356;15518:6;15515:1;15508:17;15548:4;15593:2;15590:1;15580:16;15618:1;15632:165;15646:6;15643:1;15640:13;15632:165;;;15724:14;;15711:11;;;15704:35;15767:16;;;;15661:10;;15632:165;;;15636:3;;;15826:6;15821:3;15817:16;15810:23;;15311:532;;;;;15874:6;15868:13;15890:68;15949:8;15944:3;15937:4;15929:6;15925:17;15890:68;:::i;:::-;15974:18;;14978:1020;-1:-1:-1;;;;14978:1020:1:o;16347:127::-;16408:10;16403:3;16399:20;16396:1;16389:31;16439:4;16436:1;16429:15;16463:4;16460:1;16453:15;16479:125;16544:9;;;16565:10;;;16562:36;;;16578:18;;:::i;16609:168::-;16682:9;;;16713;;16730:15;;;16724:22;;16710:37;16700:71;;16751:18;;:::i;16914:217::-;16954:1;16980;16970:132;;17024:10;17019:3;17015:20;17012:1;17005:31;17059:4;17056:1;17049:15;17087:4;17084:1;17077:15;16970:132;-1:-1:-1;17116:9:1;;16914:217::o;20023:245::-;20090:6;20143:2;20131:9;20122:7;20118:23;20114:32;20111:52;;;20159:1;20156;20149:12;20111:52;20191:9;20185:16;20210:28;20232:5;20210:28;:::i;20683:127::-;20744:10;20739:3;20735:20;20732:1;20725:31;20775:4;20772:1;20765:15;20799:4;20796:1;20789:15;20815:135;20854:3;20875:17;;;20872:43;;20895:18;;:::i;:::-;-1:-1:-1;20942:1:1;20931:13;;20815:135::o;22195:136::-;22234:3;22262:5;22252:39;;22271:18;;:::i;:::-;-1:-1:-1;;;22307:18:1;;22195:136::o;23106:611::-;-1:-1:-1;;;23464:3:1;23457:23;23439:3;23509:6;23503:13;23525:74;23592:6;23588:1;23583:3;23579:11;23572:4;23564:6;23560:17;23525:74;:::i;:::-;-1:-1:-1;;;23658:1:1;23618:16;;;;23650:10;;;23643:41;-1:-1:-1;23708:2:1;23700:11;;23106:611;-1:-1:-1;23106:611:1:o;25142:545::-;25244:2;25239:3;25236:11;25233:448;;;25280:1;25305:5;25301:2;25294:17;25350:4;25346:2;25336:19;25420:2;25408:10;25404:19;25401:1;25397:27;25391:4;25387:38;25456:4;25444:10;25441:20;25438:47;;;-1:-1:-1;25479:4:1;25438:47;25534:2;25529:3;25525:12;25522:1;25518:20;25512:4;25508:31;25498:41;;25589:82;25607:2;25600:5;25597:13;25589:82;;;25652:17;;;25633:1;25622:13;25589:82;;25863:1352;25989:3;25983:10;-1:-1:-1;;;;;26008:6:1;26005:30;26002:56;;;26038:18;;:::i;:::-;26067:97;26157:6;26117:38;26149:4;26143:11;26117:38;:::i;:::-;26111:4;26067:97;:::i;:::-;26219:4;;26283:2;26272:14;;26300:1;26295:663;;;;27002:1;27019:6;27016:89;;;-1:-1:-1;27071:19:1;;;27065:26;27016:89;-1:-1:-1;;25820:1:1;25816:11;;;25812:24;25808:29;25798:40;25844:1;25840:11;;;25795:57;27118:81;;26265:944;;26295:663;14925:1;14918:14;;;14962:4;14949:18;;-1:-1:-1;;26331:20:1;;;26449:236;26463:7;26460:1;26457:14;26449:236;;;26552:19;;;26546:26;26531:42;;26644:27;;;;26612:1;26600:14;;;;26479:19;;26449:236;;;26453:3;26713:6;26704:7;26701:19;26698:201;;;26774:19;;;26768:26;-1:-1:-1;;26857:1:1;26853:14;;;26869:3;26849:24;26845:37;26841:42;26826:58;26811:74;;26698:201;-1:-1:-1;;;;;26945:1:1;26929:14;;;26925:22;26912:36;;-1:-1:-1;25863:1352:1:o;27581:624::-;-1:-1:-1;;;27939:3:1;27932:23;27914:3;27984:6;27978:13;28000:74;28067:6;28063:1;28058:3;28054:11;28047:4;28039:6;28035:17;28000:74;:::i;:::-;28137:34;28133:1;28093:16;;;;28125:10;;;28118:54;-1:-1:-1;28196:2:1;28188:11;;27581:624;-1:-1:-1;27581:624:1:o;28570:410::-;28772:2;28754:21;;;28811:2;28791:18;;;28784:30;28850:34;28845:2;28830:18;;28823:62;-1:-1:-1;;;28916:2:1;28901:18;;28894:44;28970:3;28955:19;;28570:410::o;30204:1050::-;30716:66;30711:3;30704:79;30686:3;30812:6;30806:13;30828:75;30896:6;30891:2;30886:3;30882:12;30875:4;30867:6;30863:17;30828:75;:::i;:::-;-1:-1:-1;;;30962:2:1;30922:16;;;30954:11;;;30947:71;31043:13;;31065:76;31043:13;31127:2;31119:11;;31112:4;31100:17;;31065:76;:::i;:::-;-1:-1:-1;;;31201:2:1;31160:17;;;;31193:11;;;31186:35;31245:2;31237:11;;30204:1050;-1:-1:-1;;;;30204:1050:1:o;31259:461::-;31521:31;31516:3;31509:44;31491:3;31582:6;31576:13;31598:75;31666:6;31661:2;31656:3;31652:12;31645:4;31637:6;31633:17;31598:75;:::i;:::-;31693:16;;;;31711:2;31689:25;;31259:461;-1:-1:-1;;31259:461:1:o;32074:561::-;-1:-1:-1;;;;;32371:15:1;;;32353:34;;32423:15;;32418:2;32403:18;;32396:43;32470:2;32455:18;;32448:34;;;32513:2;32498:18;;32491:34;;;32333:3;32556;32541:19;;32534:32;;;32296:4;;32583:46;;32609:19;;32601:6;32583:46;:::i;:::-;32575:54;32074:561;-1:-1:-1;;;;;;;32074:561:1:o;32640:249::-;32709:6;32762:2;32750:9;32741:7;32737:23;32733:32;32730:52;;;32778:1;32775;32768:12;32730:52;32810:9;32804:16;32829:30;32853:5;32829:30;:::i;32894:179::-;32929:3;32971:1;32953:16;32950:23;32947:120;;;33017:1;33014;33011;32996:23;-1:-1:-1;33054:1:1;33048:8;33043:3;33039:18;32947:120;32894:179;:::o;33078:671::-;33117:3;33159:4;33141:16;33138:26;33135:39;;;33078:671;:::o;33135:39::-;33201:2;33195:9;-1:-1:-1;;33266:16:1;33262:25;;33259:1;33195:9;33238:50;33317:4;33311:11;33341:16;-1:-1:-1;;;;;33447:2:1;33440:4;33432:6;33428:17;33425:25;33420:2;33412:6;33409:14;33406:45;33403:58;;;33454:5;;;;;33078:671;:::o;33403:58::-;33491:6;33485:4;33481:17;33470:28;;33527:3;33521:10;33554:2;33546:6;33543:14;33540:27;;;33560:5;;;;;;33078:671;:::o;33540:27::-;33644:2;33625:16;33619:4;33615:27;33611:36;33604:4;33595:6;33590:3;33586:16;33582:27;33579:69;33576:82;;;33651:5;;;;;;33078:671;:::o;33576:82::-;33667:57;33718:4;33709:6;33701;33697:19;33693:30;33687:4;33667:57;:::i;:::-;-1:-1:-1;33740:3:1;;33078:671;-1:-1:-1;;;;;33078:671:1:o;34175:404::-;34377:2;34359:21;;;34416:2;34396:18;;;34389:30;34455:34;34450:2;34435:18;;34428:62;-1:-1:-1;;;34521:2:1;34506:18;;34499:38;34569:3;34554:19;;34175:404::o;34993:401::-;35195:2;35177:21;;;35234:2;35214:18;;;35207:30;35273:34;35268:2;35253:18;;35246:62;-1:-1:-1;;;35339:2:1;35324:18;;35317:35;35384:3;35369:19;;34993:401::o;35399:406::-;35601:2;35583:21;;;35640:2;35620:18;;;35613:30;35679:34;35674:2;35659:18;;35652:62;-1:-1:-1;;;35745:2:1;35730:18;;35723:40;35795:3;35780:19;;35399:406::o;35810:465::-;36067:2;36056:9;36049:21;36030:4;36093:56;36145:2;36134:9;36130:18;36122:6;36093:56;:::i;:::-;36197:9;36189:6;36185:22;36180:2;36169:9;36165:18;36158:50;36225:44;36262:6;36254;36225:44;:::i;:::-;36217:52;35810:465;-1:-1:-1;;;;;35810:465:1:o;36280:827::-;-1:-1:-1;;;;;36677:15:1;;;36659:34;;36729:15;;36724:2;36709:18;;36702:43;36639:3;36776:2;36761:18;;36754:31;;;36602:4;;36808:57;;36845:19;;36837:6;36808:57;:::i;:::-;36913:9;36905:6;36901:22;36896:2;36885:9;36881:18;36874:50;36947:44;36984:6;36976;36947:44;:::i;:::-;36933:58;;37040:9;37032:6;37028:22;37022:3;37011:9;37007:19;37000:51;37068:33;37094:6;37086;37068:33;:::i;:::-;37060:41;36280:827;-1:-1:-1;;;;;;;;36280:827:1:o

Swarm Source

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