ETH Price: $3,118.80 (+1.57%)
Gas: 5 Gwei

Token

SAN Music Notes (SANPASS)
 

Overview

Max Total Supply

149 SANPASS

Holders

81

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
shenmei.eth
0xc0c272c893dfe6a17c39f956ff65326233e83328
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Introducing 'SAN Music Notes,' exclusive mint passes for the upcoming Soundscape Avatar NFT and SANWEAR™ (Hyper Reality Audio Headphones). Both will play an important part in the coming SAN Soundscape.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SANPASS

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 33333 runs

Other Settings:
default evmVersion
File 1 of 21 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

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

File 2 of 21 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must 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 3 of 21 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * 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 4 of 21 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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 5 of 21 : Context.sol
// 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 6 of 21 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 21 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 21 : ISAN.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./SANSoulbindable.sol";

interface ISAN is SANSoulbindable {
    function tokenLevel(uint256 _tokenId)
        external
        view
        returns (SoulboundLevel _level);

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function batchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _tokenIDs
    ) external;

    function ownerOf(uint256 _tokenId) external view returns (address owner);
}

File 9 of 21 : ISANPASS.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

interface ISANPASS {
    struct factionCredits {
        uint8 chi;
        uint8 umi;
        uint8 sora;
        uint8 mecha;
        uint8 none;
    }

    enum Id {
        UNUSED,
        Chi,
        Umi,
        Sora,
        Mecha,
        None,
        VIP,
        Redvoxx
    }

    enum SaleState {
        Paused, // 0
        Open    // 1
    }

    event Sacrifice(
        address indexed sacrificer
    );

    event SaleStateChanged(
        SaleState newSaleState
    );

    error ExceedsMaxRoyaltiesPercentage();
    error SaleStateNotActive();
}

File 10 of 21 : SAN1155.sol
// SPDX-License-Identifier: MIT
// Based on OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     */
    function _mintSimple(
        address to,
        uint256 id,
        uint256 amount
    ) internal virtual {
        _balances[id][to] += amount;
        emit TransferSingle(_msgSender(), address(0), to, id, amount);
    }

    /**
     * @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 xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _mintBatchSimple(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        for (uint256 i = 0; i < ids.length; ++i) {
            _balances[ids[i]][to] += amounts[i];
        }
        emit TransferBatch(_msgSender(), address(0), to, ids, amounts);
    }

    /**
     * @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 11 of 21 : SAN1155Burnable.sol
// SPDX-License-Identifier: MIT
// Based on OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "./SAN1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract SAN1155Burnable is SAN1155 {
    function burn(address account, uint256 id, uint256 value) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 12 of 21 : SANMetadata.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

abstract contract SANMetadata {
    uint256[157] internal sanFactions = [
        8172118231391141287902840013113466638914952054539639771171260499640339993648,
        29430496281837262956462947599698477680114015847728529588968404981256659936273,
        25393357345252657687578348685524716277208190960890993650346451664004748415256,
        29633808514264345144814183736505347293089797980234916103205276024459315196450,
        30997794508970546932695339362737748626051520564294775271332235480990298149908,
        11088851274543046612534596707831127883620304102107090617791341461734175281432,
        8177327568511719525707267028046949619428579739711613370657212349738512499784,
        15947811451703475418972253741887238191481624435199846522869281518231147856945,
        7732193023099147176953953278980406430491563238064738280913434807607180661825,
        9279612382574686681127402412493149950275823556413062368439613207619681993091,
        22658516974125200663226834582367883215142918725578025433782700808299578135570,
        8206179891065982827427272001249707722201712208641054826683030142483053420835,
        7922661334880222342750658733499771493946070122641381176098344693785380001812,
        59936872091004013524380705450449207157309738970033980571097119443151256555907,
        59763727181727881726613243756862669986082819893133680704279900791580211118372,
        16313423641394527132297668070425006155613871900757179163005487788583621370920,
        32807710136091177259795693570944504261451327778937887755711694487830293202049,
        11086090568948432251399591338827340045964156117020709285395413555789900821521,
        32694677702357318909697182374101968047166310143660976387555175633629225423891,
        59741537974660048614959151045796085506410578882840771801801223085464541729042,
        30420697163066095140688690768034017312874453646077987860331771285596214018337,
        59317501176545182987983055501064816389561841843570449424820562612165178564930,
        18128080585176152444226794394735506793010239035707070698456805004017219474466,
        59820369748313283159604229631108345940410280779207928885706028620957823275521,
        9105032894229945979105849675996708476204746294421801896081683924030073348370,
        7724773588395726504537392581594837412617259706143598140956725063426284720776,
        9081712998843592744859719028837281468254819189086029483406152032589141133377,
        7719480896013179689619835903790787133686105740596302572778228651474042496017,
        29628424614224332540965429694860414685338676695152231766033395904753520097298,
        54511214746616474442643623328358672632929331478507643079965251961821340373640,
        22234453054840859553098624345198537305934422425002756478823506271941147509267,
        29520819839049765751463059447351288650979519592335532661942191210406976176420,
        32681867548114573527903866670953285211493413185659946403004534634388373186632,
        61550798859513052226319193038385183550975087594270352771153016437819051153474,
        15381343686555675198625837724496474335967578587758905414302559721898038010132,
        9135069567159577094657816353681206751158404281086690641252458890717686929537,
        9081871737332460493573653020044347955401455119847851222293132688375540757272,
        61550002222680535540868527270329878311101564686932243461766571283725338034979,
        7776011754646192775870497704013965991376921292084685393843908121745900577923,
        14956481243320019057128777023884867582768003464929639005082027454609225814305,
        29460857037130715708472147241790461336840822459574758422587740808722246801537,
        7804662192125122262488463525395677988217972393957152748229385215400958236737,
        16345571975134151524723856104597707298006513969748379071222127886997191201809,
        1930290801649354003037154680512703862422469877399048408699838160540681913409,
        9161552479798262294808714797135922551717114425339838233718338657275939459394,
        9163367650652110614221988545811969337436801931252679528384034495531713630529,
        30878310101257591734203548147473781811890367630001158517376791124879226704148,
        14968894461810922424526801024104035218241900763753304260242493607671296963617,
        7781312295208728700266849707569993668990375088979278286567528264856480532514,
        58831207122077829432536220416167288636416861121489561311154467846797017760840,
        8629531363070578469553808093148346916113633350920319245295629738366675993122,
        8184264015679463629736402535750205736372007151659699638958189898106081984836,
        58384150388973897156342146629786450514179565642402337055143132869417973661988,
        30086120942862244076439483773583852382575217475948796333584092944396241343524,
        29515347613248869922164729238111959970930414451867583705273448198710947774754,
        15861448982692692723094945921241832781274338385856927300603350689062250971970,
        58915641364356307619610933434887006328905727001204775738328257909291242047506,
        15439062559552472722262835875647857868931696304181565188403069953132124508436,
        58578168589112190418306744769771666958929054071653652686521159429823599313288,
        22651449666943389159509409546856775370255209959338661747655230479062751527971,
        15053993410547815546402806987002554811281051729197611836865456433392468379665,
        10885676359443946269573432145611928119760386413378449731493144620769641763348,
        58379284745630218013772971135911998638054713042276733123832144651092255605025,
        30081470261092880370672268486716293884403700016492353345477235669139595624737,
        15414471178988014762412703782285721036568728475467899549995815774396217369394,
        61635190852639421837480730153301989699953067529803927690300442917335623353473,
        59381087423755638584105705821127647667242377751690498835763970266719601234241,
        32597462216757577037690148587742963189226978300773147961076896020280702669076,
        7760441468815460772416197749933621753223477978656511026143624144710656987713,
        22647680391443324623972484993232894735679362650193453101335423707478540685587,
        58832639665131307539182567387683123701722501623388796428834748103299496940163,
        9161227342617692961930545348893115867939966098234397662221887383427943203880,
        29436584053262656794074259411899676108226457392972874221666853586799215915592,
        58919299378901958461615980459615630053215430822319726658496977311795323741202,
        9077184600677909997355458142920276892031239216190153190934761701037369856836,
        7922771752086562244729203399317346822523778506575454357856424035780865896996,
        30877662808841169336788975123896264785049837300333434552708488579143763575108,
        18320907613844533292751817027897276660470379544256007352663845968142972227857,
        29458869519200677288635797635943928076874674925272773781010981736119685908612,
        7816700541295837429166699168715118405651409126702046530381457977260871061793,
        8172117642971865382509551405586076598352517867362645145788848291509985350020,
        30884607582636238376688159537160509304780893845202319993972721250883615605800,
        15947686785944546719126033119591537898259928997172150328413734892491378861186,
        29432257111843840413687835110230446472769802505800917752116821178610230576259,
        58463651632201661056879485098512105112808060433249410096150653852887898227730,
        9133219926421052347829775587718240732621081384348791434033732748748164121154,
        14986514605368367630291343514865814426723169944001884025978078478769573888328,
        482815177440433400996510302924393273760071340059003585637486742121610314056,
        18184508400905165243301468164704948518441919840393895691552928340118211930177,
        7919285167096682777950670241738823581537981936347043761782765672151624270913,
        9076542808796807190701330266157019447791005655554515664774253695187794625554,
        11089181279244625167290053576865012756806028323784489085910951524519560417672,
        29430602807404152826132512338038980005611524257525931141525286363670086174754,
        58378511850967688060214862156809051706389268801674103609534274573460433307668,
        15409170638522879074807689126316470651451916816635672889374718809718937190673,
        7919126765520006992943528651317569738154716863411979750993340672372268671880,
        8212549798498744969233131531737736323503099404474953908075346663859304874627,
        30800175448038888869657646541091517237949490798475613948378233743061441202225,
        9104951177532444608725890968358270005567297754048593832611298965239231689860,
        29882913256535250203919092446015988626467535585540679822518815837706581586241,
        10916044048693906167811694920408005573788761400169615202936077671163041485860,
        29432256287670589846708071460951565705925576448437653848610899542031209890836,
        59832647697530342123789279541362402494717011505218214655869355735021545079588,
        8177092993497141878753483302460864944297130675028783581747737501834517419076,
        25360028719254451686922070844937595710971837034614379859117178333859680625681,
        58832716905629090012195868554020235741295226377871085382873782022547202904337,
        59820593246436527130453319037056164810099783636570531345200427056839272960577,
        9110143027612407915852016383999070166905443635773460386263721450519655490632,
        29517887484865341834141870728567969144663309147287764638522578900795306575908,
        7724884541087671635313643720744678003849405834964728681063716849751858287171,
        16354077946152720651098549421202572709864074079658255062534725168023274132001,
        32596728063821849205936785411072974252430948291212970494142995116040175960449,
        14961897358113198031895445545500928056207096895267923620456645746377023045912,
        7804620754703959264998146204200789105849810643720346027788960506044155529252,
        30789194745696896284545943566893102130995184126838261909030091587651733979778,
        7804329587912218274044180418544974872451058204566361903530580090573987844113,
        9108373148950256516445128993655813529536562471291678514171507847612133049106,
        7782092241325276821098579226724105734118240193667139527180479772775497875745,
        59740971600079947932652969114684696832392884803266147373072289599426157363489,
        32602090257247291584668853002254863775771923774410548599107217076355150790978,
        30364178391888833056055093622011911355261467501799516041604220402618874341432,
        52504091577161782951263159698826391888519489110675323940732900688282970689825,
        58468974144010741211088368073001205522620743909184176389097654687386950570305,
        58378851163755707925112702231548333772853514824967149444250921138712964335747,
        15044821921567160847671994771529826739865863916742587353197246753838834197122,
        61633820048253208237780679929353127804637823074835411164885089413827901202705,
        30082566425334100739577578187700861008818009426030746145927348935517654844433,
        29517197310632203257331820737207728388431425704929817372945201758670002853905,
        22843793919025490602889118250176824869815824329767152936366203540161674379537,
        7804662165064853769029125147403363242146447969830960339656245657144793318417,
        7719480386079208864888593181814689760106277073416509806999618945210533446721,
        23154808203569452641614975536642174799422931162952506746663755070477988664353,
        9077184239739900229384440911828367453293098337174049617466251011156143642696,
        7724884879147533867263510158513186707447765415668976955865282993571925082692,
        8624450307431717967847067438041044117314276770575310198945215619729579910161,
        11096251665219770268006938701094322433220939793517266342136515860347251425608,
        18207594204644815656864056905318972256083864277784189705883631433169115826194,
        7721399500515348348661107614326678699946111247309055324239508973234228905000,
        15421980793673256746047779094971433572297843431398115302727707946075653478465,
        22391702789909481066896063426322104521228219453666518491582627633227695735108,
        7719589950563992452580558762830223631705120467838110517193998308157743698193,
        16511656042692248558091511266205678535401041052836629397815776545433734105219,
        15166734326800087547408575599610078473919221186706417353106760413502458892676,
        9286901053021052224098792764795343822791182863527444981694086464759454270530,
        16516626150716496050644186894939428304696816162704363971122239221952139039809,
        18163526914763767899331791030754554122768168368131712130707894892794003818514,
        15025385256384236496728937731960083631951853718428290655414189941119032300561,
        59945725737492287429430450583399234769023828036754090083405292230104584360257,
        9076418494696298363416961832233152239097257296837549280690229793870547747972,
        58380630687368839487974706061173643230902433212080218288050159251844222779672,
        30093078214590859114762106918046306738439385700409745255103886459112651952712,
        8201828847250426851529542860056357012140382567961574638609781982361597253704,
        32596791009940788336351669824869748939752665749581006758247781131787358507283,
        59820590157961876402325001349477133615477905733350932598294127284781752533795,
        32625724888840686694879571288271770915486989677524507531858137882822428596248,
        30990622720003927274502257421688706802332158329987730486666196895749675159844,
        46270568071285715492
    ];
}

File 13 of 21 : SANPASS.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

/**                       ███████╗ █████╗ ███╗   ██╗
 *                        ██╔════╝██╔══██╗████╗  ██║
 *                        ███████╗███████║██╔██╗ ██║
 *                        ╚════██║██╔══██║██║╚██╗██║
 *                        ███████║██║  ██║██║ ╚████║
 *                        ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝
 *
 *                              █████████████╗
 *                              ╚════════════╝
 *                               ███████████╗
 *                               ╚══════════╝
 *                            █████████████████╗
 *                            ╚════════════════╝
 *
 *                     ██████╗  █████╗ ███████╗███████╗
 *                     ██╔══██╗██╔══██╗██╔════╝██╔════╝
 *                     ██████╔╝███████║███████╗███████╗
 *                     ██╔═══╝ ██╔══██║╚════██║╚════██║
 *                     ██║     ██║  ██║███████║███████║
 *                     ╚═╝     ╚═╝  ╚═╝╚══════╝╚══════╝
 */

import "./token/ERC2981ContractWideRoyalties.sol";
import "./token/TokenRescuer.sol";
import "./ISAN.sol";
import "./ISANPASS.sol";
import "./SAN1155Burnable.sol";
import "./SANMetadata.sol";
import "./SANSoulbindable.sol";

/**
 * @title SAN Concert Pass
 * @author Aaron Hanson <[email protected]> @CoffeeConverter
 * @notice https://sansound.io
 */
contract SANPASS is
    ISANPASS,
    SAN1155Burnable,
    ERC2981ContractWideRoyalties,
    TokenRescuer,
    SANMetadata,
    SANSoulbindable
{
    uint256 public constant MAX_ROYALTIES_PCT = 333; // 3.33%

    address public constant BURN_ADDRESS =
        0x000000000000000000000000000000000000dEaD;

    uint256 private constant MaskChi   = 1<<0;
    uint256 private constant MaskUmi   = 1<<1;
    uint256 private constant MaskSora  = 1<<2;
    uint256 private constant MaskMecha = 1<<3;

    ISAN public immutable SAN;

    string public contractURI;

    SaleState public saleState;

    mapping(address => factionCredits) public userFactionCredits;

    constructor(
        string memory _contractURI,
        string memory _baseURI,
        address _royaltiesReceiver,
        uint256 _royaltiesPercent,
        address _sanContract
    )
        SAN1155(_baseURI)
    {
        contractURI = _contractURI;
        setRoyalties(
            _royaltiesReceiver,
            _royaltiesPercent
        );
        SAN = ISAN(_sanContract);
    }

    /**
     * @notice Mints SANPASS tokens by burning SAN Origin tokens.
     * @param _tokenIds The list of SAN Origin tokens to burn.
     */
    function mintPasses(
        uint256[] calldata _tokenIds
    )
        external
    {
        if (saleState != SaleState.Open) revert SaleStateNotActive();

        factionCredits memory credits = userFactionCredits[_msgSender()];

        unchecked {
            for (uint i; i < _tokenIds.length; ++i) {
                uint256 factions = sanTokenFactions(_tokenIds[i]);
                if (factions == 0) ++credits.none;
                else if (0 < factions & MaskMecha) ++credits.mecha;
                else {
                    if (0 < factions & MaskChi) ++credits.chi;
                    if (0 < factions & MaskUmi) ++credits.umi;
                    if (0 < factions & MaskSora) ++credits.sora;
                }
            }
        }

        unchecked {
            uint256 mintChi = credits.chi / 3;
            uint256 mintUmi = credits.umi / 3;
            uint256 mintSora = credits.sora / 3;
            uint256 mintMecha = credits.mecha / 3;
            uint256 mintNone = credits.none / 3;
            uint256 idCount = (mintChi == 0 ? 0 : 1) + (mintUmi == 0 ? 0 : 1) +
                (mintSora == 0 ? 0 : 1) + (mintMecha == 0 ? 0 : 1) +
                (mintNone == 0 ? 0 : 1);
            if (1 == idCount) {
                if (mintChi != 0) {
                    _mintSimple(_msgSender(), uint256(Id.Chi), mintChi);
                    credits.chi = credits.chi % 3;
                }
                else if (mintUmi != 0) {
                    _mintSimple(_msgSender(), uint256(Id.Umi), mintUmi);
                    credits.umi = credits.umi % 3;
                }
                else if (mintSora != 0) {
                    _mintSimple(_msgSender(), uint256(Id.Sora), mintSora);
                    credits.sora = credits.sora % 3;
                }
                else if (mintMecha != 0) {
                    _mintSimple(_msgSender(), uint256(Id.Mecha), mintMecha);
                    credits.mecha = credits.mecha % 3;
                }
                else {
                    _mintSimple(_msgSender(), uint256(Id.None), mintNone);
                    credits.none = credits.none % 3;
                }
            }
            else if (1 < idCount) {
                uint256[] memory ids = new uint256[](idCount);
                uint256[] memory amounts = new uint256[](idCount);
                uint256 curIndex;
                if (mintChi != 0) {
                    ids[curIndex] = uint256(Id.Chi);
                    amounts[curIndex++] = mintChi;
                    credits.chi = credits.chi % 3;
                }
                if (mintUmi != 0) {
                    ids[curIndex] = uint256(Id.Umi);
                    amounts[curIndex++] = mintUmi;
                    credits.umi = credits.umi % 3;
                }
                if (mintSora != 0) {
                    ids[curIndex] = uint256(Id.Sora);
                    amounts[curIndex++] = mintSora;
                    credits.sora = credits.sora % 3;
                }
                if (mintMecha != 0) {
                    ids[curIndex] = uint256(Id.Mecha);
                    amounts[curIndex++] = mintMecha;
                    credits.mecha = credits.mecha % 3;
                }
                if (mintNone != 0) {
                    ids[curIndex] = uint256(Id.None);
                    amounts[curIndex] = mintNone;
                    credits.none = credits.none % 3;
                }
                _mintBatchSimple(_msgSender(), ids, amounts);
            }
        }

        userFactionCredits[_msgSender()] = credits;
        SAN.batchTransferFrom(_msgSender(), BURN_ADDRESS, _tokenIds);
        emit Sacrifice(_msgSender());
    }

    /**
     * @notice (only owner) Mints VIP tokens to a list of recipients.
     * @param _recipients The list of token recipients.
     * @param _amounts The list of token amounts.
     */
    function airdropVIP(
        address[] calldata _recipients,
        uint256[] calldata _amounts
    )
        external
        onlyOwner
    {
        if (_recipients.length != _amounts.length) revert ArrayLengthMismatch();
        unchecked {
            for (uint i; i < _recipients.length; ++i) {
                _mintSimple(
                    _recipients[i],
                    uint256(Id.VIP),
                    _amounts[i]
                );
            }
        }
    }

    /**
     * @notice (only owner) Mints Redvoxx tokens to a list of recipients.
     * @param _recipients The list of token recipients.
     * @param _amounts The list of token amounts.
     */
    function airdropRedvoxx(
        address[] calldata _recipients,
        uint256[] calldata _amounts
    )
        external
        onlyOwner
    {
        if (_recipients.length != _amounts.length) revert ArrayLengthMismatch();
        unchecked {
            for (uint i; i < _recipients.length; ++i) {
                _mintSimple(
                    _recipients[i],
                    uint256(Id.Redvoxx),
                    _amounts[i]
                );
            }
        }
    }

    /**
     * @notice (only owner) Sets the contract URI for contract metadata.
     * @param _newContractURI The new contract URI.
     */
    function setContractURI(
        string calldata _newContractURI
    )
        external
        onlyOwner
    {
        contractURI = _newContractURI;
    }

    /**
     * @notice (only owner) Sets the saleState to `_newSaleState`.
     * @param _newSaleState The new sale state
     * (0=Paused, 1=Open).
     */
    function setSaleState(
        SaleState _newSaleState
    )
        external
        onlyOwner
    {
        saleState = _newSaleState;
        emit SaleStateChanged(_newSaleState);
    }

    /**
     * @notice (only owner) Sets the token URI for token metadata.
     * @param _newURI The new URI.
     */
    function setURI(
        string calldata _newURI
    )
        external
        onlyOwner
    {
        _setURI(_newURI);
    }

    /**
     * @notice (only owner) Sets ERC-2981 royalties recipient and percentage.
     * @param _recipient The address to which to send royalties.
     * @param _value The royalties percentage (two decimals, e.g. 1000 = 10%).
     */
    function setRoyalties(
        address _recipient,
        uint256 _value
    )
        public
        onlyOwner
    {
        if (_value > MAX_ROYALTIES_PCT) revert ExceedsMaxRoyaltiesPercentage();

        _setRoyalties(
            _recipient,
            _value
        );
    }

    /**
     * @notice Looks up all factions for a SAN token ID.
     * @param _sanTokenId The SAN token ID to check.
     * @return factions_ Bitfield of five bits indication the factions.
     */
    function sanTokenFactions(
        uint256 _sanTokenId
    )
        public
        view
        returns (uint256 factions_)
    {
        uint256 bucket = _sanTokenId >> 6;
        factions_ = sanFactions[bucket] >> ((_sanTokenId & 63) * 4) & 0xf;
    }

    /**
     * @inheritdoc ERC165
     */
    function supportsInterface(
        bytes4 _interfaceId
    )
        public
        view
        override (SAN1155, ERC2981Base)
        returns (bool)
    {
        return super.supportsInterface(_interfaceId);
    }

    string[119] public _takeThisEngineerMayItServeYouWell = [
        "201110", "010110", "000110", "012010", "210100", "220110", "120110",
        "001110", "100110", "210100", "220110", "020110", "121010", "210100",
        "102010", "200110", "121010", "210100", "002010", "022010", "120110",
        "001110", "100110", "210100", "202010", "001110", "020110", "220110",
        "101000", "010110", "112010", "210100", "120110", "100110", "212010",
        "220110", "111110", "212010", "020110", "210100", "202010", "020110",
        "202010", "212010", "201110", "210100", "102010", "202010", "002010",
        "022010", "012010", "022010", "020110", "002010", "121010", "120110",
        "101000", "100110", "020110", "121010", "201110", "120110", "210100",
        "002010", "022010", "220110", "110110", "111110", "020110", "002010",
        "210100", "121010", "210100", "202010", "200110", "022010", "201110",
        "220110", "200110", "202010", "210100", "120110", "202010", "220110",
        "010110", "200110", "101000", "100110", "020110", "010110", "012010",
        "120110", "200110", "121010", "020110", "220110", "210100", "120110",
        "200110", "010110", "022010", "220110", "002010", "121010", "012010",
        "210100", "000110", "000110", "121010", "210100", "012010", "010110",
        "210100", "120110", "220110", "120110", "121010", "202010", "221010"
    ];
}

File 14 of 21 : SANSoulbindable.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface SANSoulbindable {
    enum SoulboundLevel { Unbound, One, Two, Three, Four }
}

File 15 of 21 : ERC2981Base.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "./IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
	struct RoyaltyInfo {
		address recipient;
		uint24 amount;
	}

	/// @inheritdoc	ERC165
	function supportsInterface(bytes4 interfaceId)
		public
		view
		virtual
		override
		returns (bool)
	{
		return
			interfaceId == type(IERC2981Royalties).interfaceId ||
			super.supportsInterface(interfaceId);
	}
}

File 16 of 21 : ERC2981ContractWideRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

import "./ERC2981Base.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981ContractWideRoyalties is ERC2981Base {
	RoyaltyInfo private _royalties;

	/// @dev Sets token royalties
	/// @param _recipient recipient of the royalties
	/// @param _value percentage (using 2 decimals - 10000 = 100, 0 = 0)
	function _setRoyalties(
		address _recipient,
		uint256 _value
	)
		internal
	{
		// unneeded since the derived contract has a lower _value limit
		// require(_value <= 10000, "ERC2981Royalties: Too high");
		_royalties = RoyaltyInfo(_recipient, uint24(_value));
	}

	/// @inheritdoc	IERC2981Royalties
	function royaltyInfo(
		uint256,
		uint256 _value
	)
		external
		view
		override
		returns (address receiver, uint256 royaltyAmount)
	{
		RoyaltyInfo memory royalties = _royalties;
		receiver = royalties.recipient;
		royaltyAmount = (_value * royalties.amount) / 10000;
	}
}

File 17 of 21 : IERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
	/// @notice Called with the sale price to determine how much royalty
	///         is owed and to whom.
	/// @param _tokenId - the NFT asset queried for royalty information
	/// @param _value - the sale price of the NFT asset specified by _tokenId
	/// @return _receiver - address of who should be sent the royalty payment
	/// @return _royaltyAmount - the royalty payment amount for value sale price
	function royaltyInfo(uint256 _tokenId, uint256 _value)
		external
		view
		returns (address _receiver, uint256 _royaltyAmount);
}

File 18 of 21 : IStuckTokens.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface IStuckERC20 {
    function transfer(
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IStuckERC721 {
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}

File 19 of 21 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "./IStuckTokens.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IStuckERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IStuckERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 20 of 21 : TokenRescuer.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "./IStuckTokens.sol";
import "./SafeERC20.sol";
import "../utils/Ownable.sol";

error ArrayLengthMismatch();

contract TokenRescuer is Ownable {
    using SafeERC20 for IStuckERC20;

    function rescueBatchERC20(
        address _token,
        address[] calldata _receivers,
        uint256[] calldata _amounts
    )
        external
        onlyOwner
    {
        if (_receivers.length != _amounts.length) revert ArrayLengthMismatch();
        unchecked {
            for (uint i; i < _receivers.length; i += 1) {
                _rescueERC20(_token, _receivers[i], _amounts[i]);
            }
        }
    }

    function rescueERC20(
        address _token,
        address _receiver,
        uint256 _amount
    )
        external
        onlyOwner
    {
        _rescueERC20(_token, _receiver, _amount);
    }

    function rescueBatchERC721(
        address _token,
        address[] calldata _receivers,
        uint256[][] calldata _tokenIDs
    )
        external
        onlyOwner
    {
        if (_receivers.length != _tokenIDs.length) revert ArrayLengthMismatch();
        unchecked {
            for (uint i; i < _receivers.length; i += 1) {
                uint256[] memory tokenIDs = _tokenIDs[i];
                for (uint j; j < tokenIDs.length; j += 1) {
                    _rescueERC721(_token, _receivers[i], tokenIDs[j]);
                }
            }
        }
    }

    function rescueERC721(
        address _token,
        address _receiver,
        uint256 _tokenID
    )
        external
        onlyOwner
    {
        _rescueERC721(_token, _receiver, _tokenID);
    }

    function _rescueERC20(
        address _token,
        address _receiver,
        uint256 _amount
    )
        private
    {
        IStuckERC20(_token).safeTransfer(_receiver, _amount);
    }

    function _rescueERC721(
        address _token,
        address _receiver,
        uint256 _tokenID
    )
        private
    {
        IStuckERC721(_token).safeTransferFrom(
            address(this),
            _receiver,
            _tokenID
        );
    }
}

File 21 of 21 : Ownable.sol
// SPDX-License-Identifier: MIT
// Based on OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
// With renounceOwnership() removed

pragma solidity ^0.8.12;

import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 33333
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_royaltiesReceiver","type":"address"},{"internalType":"uint256","name":"_royaltiesPercent","type":"uint256"},{"internalType":"address","name":"_sanContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"ExceedsMaxRoyaltiesPercentage","type":"error"},{"inputs":[],"name":"SaleStateNotActive","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":"sacrificer","type":"address"}],"name":"Sacrifice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum ISANPASS.SaleState","name":"newSaleState","type":"uint8"}],"name":"SaleStateChanged","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":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROYALTIES_PCT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAN","outputs":[{"internalType":"contract ISAN","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_takeThisEngineerMayItServeYouWell","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdropRedvoxx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdropVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"rescueBatchERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[][]","name":"_tokenIDs","type":"uint256[][]"}],"name":"rescueBatchERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum ISANPASS.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sanTokenId","type":"uint256"}],"name":"sanTokenFactions","outputs":[{"internalType":"uint256","name":"factions_","type":"uint256"}],"stateMutability":"view","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":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ISANPASS.SaleState","name":"_newSaleState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userFactionCredits","outputs":[{"internalType":"uint8","name":"chi","type":"uint8"},{"internalType":"uint8","name":"umi","type":"uint8"},{"internalType":"uint8","name":"sora","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"none","type":"uint8"}],"stateMutability":"view","type":"function"}]

6114406040527f121141481488888112418112282441211421128214432134128444141141143060a09081527f411112124384814818131344231838184121214138848482421213182288241160c0527f382421848422412183111244111181128421242441124114414148148144111860e0527f4184242818121412111812121412142144841811411411421231812148413222610100527f4488214481122814218481212111818122442214111812408324411422241414610120527f1884114184141142113841414234422822424243244322411281131831841118610140527f1214341122128142281321121111114144848141814824214182114244134448610160527f2342243344411814188281114114418411112111118344414114814344114431610180527f11184423322114111811418181111442884182241422148821211814284814416101a0527f14841311412122818212448132811412814214121884288118414281213141836101c0527f32184421424111248411884881383428411181821411244222114142211814126101e0527f1224888141824112312442248224441422118141411382818141318281182123610200527f1184114188112112348214421348441884221411282312114424482311241814610220527f8483114221118114111814344118412122831111118111123224241481441183610240527f8421122481341421141812441181148111112111142414411414113281218124610260527f2411121118242824284444212442322281411484881821828114114184122428610280527f48888182448113444484314441112414241211438181223824414428811144816102a0527f18828141411421118112181812128224182828184244344834444111244434116102c0527f48488824488428818244111318211141248444118118211211441448124414136102e0527f8414832112442124218428822442124481128012244821242311111242141112610300527f4341812241231421811111121812144821448414421421323111241821824121610320527f8324841213124434444888121212424414124142114182181182112422182142610340527f2814214811221244112841184111844411488312114111111841181221811422610360527f8441212211824224211112811111181113181181213122482212822241181201610380527f14214418228828414121211121112384822281248181442144321143118421126103a0527f11141121114484114428444411181421224123184144243224431841424412886103c0527f14141141241114483411811141881244481411484812481138814844838248416103e0527f1111124432311341821121381114223181123811114811811421112111142411610400527f4181181424811881882841118882411481421148238111841448181114183812610420527f7884411232284481124381413284144411818428421181112318211314481288610440527f3128412448284444318214412442428483824111842111188148182441144213610460527f4144312134112243411411111418412411148223424812888114818412444124610480527f48414811411214484841148114213112144424181111311481141211412128486104a0527f88148481182422144181214424421228448821144244414443123441141118426104c0527f22018832148112488321114181111282444148123283414121828211214821146104e0527f1432442241314184111841134444312418812212241211884241883281841881610500527f1414284114244124222114424221181142123844221144818421824111223318610520527f8814111431211441488212211128233123243821418888111813244231144323610540527f1131111248114424211442422411282844823821111418121312114484222483610560527f2111118234218842212814881411281121318244112111111211231814821121610580527f41224111443811484281884114883418141322111141181813184181141418816105a0527f11414842121822818124218121121241113348411114111412413224181418416105c0527f24234411111442482218811122141232324331011148112221284211411114116105e0527f0444818124141411431488281182812841412444843241812121422211244441610600527f1441414414421182141818124214244411114241144121118421182321111142610620527f1442484482122824848114114412131414411124124241282221884241211141610640527f4444811181121118481431241418243421141241221281112112223111481114610660527f2118181211411844341214181241473188418181441211818214211481183421610680527f11341112421172841381111182841423212111888422111114218211111448226106a0527f82114881188432448241281441114414121181111281822113121112411444486106c0527f13142444183211481118481811318114121413111248442883431824118442226106e0527f1218211842118814341241211228424888811442183112142122121112814144610700527f8114421141214421221148281132421441128114312141482481141132114124610720527f4284241884123441221811828842114218488111224418481411422288141424610740527f4141184111412232281423841148248448842242111441441412284412188122610760527f2311431141124111121411111148114214111121182812214444832441218342610780527f82411241342232283211121141234241138411248111111181223888112148126107a0527f22223322114112128248241321841811221811181248412121212231242111146107c0527f81821188447418181211113414133122414414181141421341841124418181886107e0527f3214442444211211221484122122441148242448138812184184112132344423610800527f2148422182141111214248141414483148181244118844811121181834184811610820527f1811131111841114141121848111428422112121114114114111838221181214610840527f8111811483222243141411438824481421418142881441841341231183248121610860527f4281824124442231111314841418432114422441211811112821432242128121610880527f22144811112482211483421842144134284441448448141422844144213123326108a0527f88444822181281224141412281844414818444144822314138421314822144816108c0527f83488123112828431211248412424427244814211111284441111142242311416108e0527f4811828183112428448122141281441482211222411883124181128412241114610900527f1128411448241121282422111123181441488128441428184421832333421241610920527f3212220211441123111121141221814111441142881114232184882121141113610940527f8212181112212114144214442112884414248144124311281412228841181283610960527f1441122812222124811423238413118114141181182122421881441322338428610980527f41148422418214844814144111484224114144842811241114811813148232486109a0527f82432444811118811812412844841111144121281821421811248442121224126109c0527f14118121848134124122414181211421411114111442422421188384281213446109e0527f1184214122214844483181288412824111184112214134242318184214113224610a00527f4444234818144112421121311122811281841481148411824411448138414144610a20527f2881442813113881182142431888481822118412113181122441414144241111610a40527f4121211821118414138141424211212842241148812842841224181442148884610a60527f1148188142312141314141221143214118243141212484111818111812811121610a80527f1211413241288221244281442812122231421431828412124223841414181184610aa0527f4448118412211181488823814411114412122181112128132138418181284428610ac0527f2342122328184422182424212181434311111114111444828148121188112482610ae0527f4112113314224211141311311841811412284112211838141481414124414483610b00527f8141411242124111423884184822122422232482143281414844411411218412610b20527f1431382344412221212821212421144331411211141184282241481882134242610b40527f2122111184181113214111811422312181411414838818411421141184848148610b60527f0111438242111182828142181421813184124113148471112414214812418148610b80527f2834112814221841284241438222443414222322113118118118444221442841610ba0527f1182281482284224218412841118114442241811221442314232121484114441610bc0527f1411242422381112122111114281438412121441381814228114422818118412610be0527f1884411212142231818148811121481882482228424414414888824811111188610c00527f4111218184413121211811288844141881411382142311211142181211444822610c20527f8111111841814423882242211121424141181443248121848142124222188814610c40527f2211481118111812121441424242221188811142448112412411823844118111610c60527f1182112111414112212888124111822141123812814241481422441324812388610c80527f1228237241122113842242141411123814111821811183111488414211214283610ca0527f4418481224241414442114182131111181214811211341822113484181124831610cc0527f1421384118184384311811884314411881411182414411431211428111443484610ce0527f4211212884181281218414281244121134842441121218111143111188423141610d00527f1822431144123114221218828448243188814811124818411412141181411424610d20527f4112111482241114143234421123212884118482211314142411221822148414610d40527f8448141884141242448121424814414184411133311142444811121241304324610d60527f1214121443214123834113841422242112282432888142234424811214881444610d80527f3811448112184188418211211241441111432314111111113121242124442411610da0527f8212234214824212444144418211811411181141443123412448342118241111610dc0527f8441418413144231844141144410113112444122381241211424843112841241610de0527f1424288184414124344824134411181482121811412441224842122814122448610e00527f4142884224411141114148414811314288848114488818222321212241188824610e20527f1114213488121181212414214322828882318323214122118442214282131243610e40527f2428148111212242422311422281324341412422128214134481111222121221610e60527f4811182244214811141288282428113482314141812414142418144181334181610e80527f2114224111118482122181181111418448444411411184824141821122144118610ea0527f1141424112412141814414481212214821412811414812814841141113318824610ec0527f4412111141281188112244118218228412411824444224218422317118428282610ee0527f1141181118421441814124114118241822141811111242181281281284811011610f00527f1423281111844448221281218218148411421428314814112413828414448312610f20527f1134821411418142181211881841412841111842442241222118228441244121610f40527f8414311112124144841142121412121211228121443438114412118481844121610f60527f4814211113113184111882281113242141211411348841211811111211124142610f80527f4321841484842824184214881713184148142848181482181824422111222838610fa0527f7414434224842244128228221114111242124821214212211141321418431121610fc0527f8144444131883348244111421124114444444112414124824488142418221141610fe0527f8111424211121244412824131121211818242214884113818181882811418883611000527f2143114413221223111821211111442243442441221112412321124284412282611020527f8843818422282481142181111112134418114422121123121144831218432111611040527f4282211422144222424211144214418222822848221444441112448241118411611060527f4142244228112882111444812181141441142111424414441214284421841811611080527f32812111184843444842183141888243111144411214112823244141141881116110a0527f11414841112444148114412118112441141143488841818141447418121144116110c0527f11111231481442244144488211121212422131124241411124134121414284416110e0527f3331283211118814141328281111141448111113114812114182142421221421611100527f1411811421318128182811121132141114141311812411431424122111421848611120527f1114214112241241281111111118181148848431111114212811884888144244611140527f1311441144282424134224244348488188248143112114113821414212112411611160527f1888418143182481141228414148214441484211411418823112448118818148611180527f28412214218223184414348244273412443441143428441311444111421848126111a0527f11122841313828212114244324441818112211234414341483482428224144286111c0527f22188824282181412842114138148481812311218111441248241121383118416111e0527f3181413120811121188131418184412211484418833112141382312182414144611200527f1111221141112211134441243212123148311111488482122124831418341111611220527f2481442184118244112211814448442824288111411234411211124284284883611240527f2188114282122448412821424144428141242111111224142238441813811184611260527f1488332111212148318881481213414143113181312244124881224211148442611280527f24841441118431818112488111218183411831112422114441144848114114416112a0527f28283121811221818118321211881124114842812118222111248142111388126112c0527f21381112182311242121121348841441338144118188118121141284114114116112e0527f8488141221184418144814182181111131481441414144211141284141811141611300527f1411122111418112211113311111181143112281211834244841282441178484611320527f8112441844182181114141844482321111212218184884241818811124418118611340527f4288142411188888428811321118141121011141844288112831111811231248611360527f1222121412318443824344281184844414483811442218114842884441441848611380527f48112141114448181214128248448212414844184214122181843414118111136113a0527f84414111844244844184213318121418811831414421141484122824844443236113c0527f48218182488221414118114118181842241441121823248881112884118418186113e0527f4484122411148111814314481244211214414211411443342132811211141124611400526802822214824484322461142052620016ae90600590609d6200292f565b5060405180610ee001604052806040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503130323031360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503030313131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503131323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503131313131360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503231323031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503130323031360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503131303131360d41b81525081526020016040518060400160405280600681526020016503131313131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503230313131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503130313030360d41b81525081526020016040518060400160405280600681526020016503130303131360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503032303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503230303131360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503032323031360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503030323031360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503030303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503031323031360d41b81525081526020016040518060400160405280600681526020016503031303131360d41b81525081526020016040518060400160405280600681526020016503231303130360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503232303131360d41b81525081526020016040518060400160405280600681526020016503132303131360d41b81525081526020016040518060400160405280600681526020016503132313031360d41b81525081526020016040518060400160405280600681526020016503230323031360d41b81525081526020016040518060400160405280600681526020016503232313031360d41b81525081525060a59060776200278792919062002972565b5034801562002794575f80fd5b506040516200735838038062007358833981016040819052620027b79162002b0d565b83620027c38162002801565b50620027cf3362002813565b60a2620027dd868262002c2c565b50620027ea838362002864565b6001600160a01b03166080525062002cf492505050565b60026200280f828262002c2c565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6004546001600160a01b03163314620028c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b61014d811115620028e7576040516303e231b960e01b815260040160405180910390fd5b604080518082019091526001600160a01b03831680825262ffffff83166020909201829052600380546001600160b81b031916909117600160a01b9092029190911790555050565b82609d810192821562002960579160200282015b828111156200296057825182559160200191906001019062002943565b506200296e929150620029be565b5090565b8260778101928215620029b0579160200282015b82811115620029b057825182906200299f908262002c2c565b509160200191906001019062002986565b506200296e929150620029d4565b5b808211156200296e575f8155600101620029bf565b808211156200296e575f620029ea8282620029f4565b50600101620029d4565b50805462002a029062002ba0565b5f825580601f1062002a12575050565b601f0160209004905f5260205f209081019062002a309190620029be565b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262002a57575f80fd5b81516001600160401b038082111562002a745762002a7462002a33565b604051601f8301601f19908116603f0116810190828211818310171562002a9f5762002a9f62002a33565b8160405283815260209250868385880101111562002abb575f80fd5b5f91505b8382101562002ade578582018301518183018401529082019062002abf565b5f93810190920192909252949350505050565b80516001600160a01b038116811462002b08575f80fd5b919050565b5f805f805f60a0868803121562002b22575f80fd5b85516001600160401b038082111562002b39575f80fd5b62002b4789838a0162002a47565b9650602088015191508082111562002b5d575f80fd5b5062002b6c8882890162002a47565b94505062002b7d6040870162002af1565b92506060860151915062002b946080870162002af1565b90509295509295909350565b600181811c9082168062002bb557607f821691505b60208210810362002bd457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562002c27575f81815260208120601f850160051c8101602086101562002c025750805b601f850160051c820191505b8181101562002c235782815560010162002c0e565b5050505b505050565b81516001600160401b0381111562002c485762002c4862002a33565b62002c608162002c59845462002ba0565b8462002bda565b602080601f83116001811462002c96575f841562002c7e5750858301515b5f19600386901b1c1916600185901b17855562002c23565b5f85815260208120601f198616915b8281101562002cc65788860151825594840194600190910190840162002ca5565b508582101562002ce457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805161464462002d145f395f81816102cb0152610fa101526146445ff3fe608060405234801561000f575f80fd5b50600436106101e6575f3560e01c80637312808b11610109578063e8a3d4851161009e578063f242432a1161006e578063f242432a1461053f578063f2fde38b14610552578063f5298aca14610565578063fccc281314610578575f80fd5b8063e8a3d485146104d3578063e985e9c5146104db578063ede9dddd14610523578063f02678e91461052c575f80fd5b8063938e3d7b116100d9578063938e3d7b14610487578063a19b6ea11461049a578063a22cb465146104ad578063b2118a8d146104c0575f80fd5b80637312808b146104305780637df325e1146104435780638c7ea24b146104565780638da5cb5b14610469575f80fd5b806319f297b71161017f5780635a67de071161014f5780635a67de07146103dd578063603f4d52146103f05780636b20c4541461040a57806372e017121461041d575f80fd5b806319f297b7146103585780632a55205a1461036b5780632eb2c2d6146103aa5780634e1273f4146103bd575f80fd5b80630c2ab324116101ba5780630c2ab324146102c65780630e89341c146103125780631558c155146103325780631746114814610345575f80fd5b8062fdd58e146101ea57806301ffc9a71461021057806302fe5305146102335780630a835c9214610248575b5f80fd5b6101fd6101f83660046136d3565b610581565b6040519081526020015b60405180910390f35b61022361021e366004613728565b61065f565b6040519015158152602001610207565b61024661024136600461374a565b610669565b005b6102926102563660046137b6565b60a46020525f908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610207565b6102ed7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610207565b6103256103203660046137cf565b61072c565b6040516102079190613851565b6102466103403660046138ab565b6107be565b610246610353366004613912565b6108dc565b6102466103663660046138ab565b61106c565b61037e610379366004613951565b611169565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610207565b6102466103b8366004613b08565b6111db565b6103d06103cb366004613bab565b61129d565b6040516102079190613c9f565b6102466103eb366004613cb1565b6113f3565b60a3546103fd9060ff1681565b6040516102079190613cfc565b610246610418366004613d3b565b6114ef565b6101fd61042b3660046137cf565b6115b4565b61024661043e366004613daa565b6115e9565b610246610451366004613e25565b611706565b6102466104643660046136d3565b611792565b60045473ffffffffffffffffffffffffffffffffffffffff166102ed565b61024661049536600461374a565b6118cd565b6103256104a83660046137cf565b61195b565b6102466104bb366004613e6b565b6119f8565b6102466104ce366004613e25565b611a03565b610325611a8f565b6102236104e9366004613ea0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6101fd61014d81565b61024661053a366004613daa565b611a9c565b61024661054d366004613ed1565b611c1d565b6102466105603660046137b6565b611cdf565b610246610573366004613f31565b611e0f565b6102ed61dead81565b5f73ffffffffffffffffffffffffffffffffffffffff831661062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b505f8181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b5f61065982611ecf565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61072882828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f2492505050565b5050565b60606002805461073b90613f61565b80601f016020809104026020016040519081016040528092919081815260200182805461076790613f61565b80156107b25780601f10610789576101008083540402835291602001916107b2565b820191905f5260205f20905b81548152906001019060200180831161079557829003601f168201915b50505050509050919050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114610878576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d5576108cd85858381811061089757610897613fb2565b90506020020160208101906108ac91906137b6565b60065b8585858181106108c1576108c1613fb2565b90506020020135611f30565b60010161087a565b5050505050565b600160a35460ff1660018111156108f5576108f5613ccf565b1461092c576040517fd2ab239f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260a460209081526040808320815160a081018352905460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204831660608201526401000000009091049091166080820152905b82811015610a3b575f6109b68585848181106109aa576109aa613fb2565b905060200201356115b4565b9050805f036109d25760808301805160010160ff169052610a32565b60088116156109ee5760608301805160010160ff169052610a32565b6001811615610a0257825160010160ff1683525b6002811615610a1a5760208301805160010160ff1690525b6004811615610a325760408301805160010160ff1690525b5060010161098c565b5080516020820151604083015160608401516080850151600360ff95861681900486169594851681900485169493841681900484169392831681900483169291821604165f8115610a8d576001610a8f565b5f5b8315610a9c576001610a9e565b5f5b8515610aab576001610aad565b5f5b8715610aba576001610abc565b5f5b8915610ac9576001610acb565b5f5b0101010160ff16905080600103610bd7578515610b0157610aee33600188611f30565b865160039060ff160660ff168752610e7f565b8415610b3857610b1333600287611f30565b6003876020015160ff1681610b2a57610b2a613fdf565b0660ff166020880152610e7f565b8315610b6f57610b4a33600386611f30565b6003876040015160ff1681610b6157610b61613fdf565b0660ff166040880152610e7f565b8215610ba657610b8133600485611f30565b6003876060015160ff1681610b9857610b98613fdf565b0660ff166060880152610e7f565b610bb233600584611f30565b6003876080015160ff1681610bc957610bc9613fdf565b0660ff166080880152610e7f565b8060011015610e7f575f8167ffffffffffffffff811115610bfa57610bfa613971565b604051908082528060200260200182016040528015610c23578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c4057610c40613971565b604051908082528060200260200182016040528015610c69578160200160208202803683370190505b5090505f8815610cc6576001838281518110610c8757610c87613fb2565b60200260200101818152505088828280600101935081518110610cac57610cac613fb2565b6020908102919091010152895160039060ff160660ff168a525b8715610d32576002838281518110610ce057610ce0613fb2565b60200260200101818152505087828280600101935081518110610d0557610d05613fb2565b60200260200101818152505060038a6020015160ff1681610d2857610d28613fdf565b0660ff1660208b01525b8615610d9e576003838281518110610d4c57610d4c613fb2565b60200260200101818152505086828280600101935081518110610d7157610d71613fb2565b60200260200101818152505060038a6040015160ff1681610d9457610d94613fdf565b0660ff1660408b01525b8515610e0a576004838281518110610db857610db8613fb2565b60200260200101818152505085828280600101935081518110610ddd57610ddd613fb2565b60200260200101818152505060038a6060015160ff1681610e0057610e00613fdf565b0660ff1660608b01525b8415610e70576005838281518110610e2457610e24613fb2565b60200260200101818152505084828281518110610e4357610e43613fb2565b60200260200101818152505060038a6080015160ff1681610e6657610e66613fdf565b0660ff1660808b01525b610e7b338484611fcc565b5050505b5050505050508060a45f610e903390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182015f20845181549486015193860151606087015160809097015160ff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9882166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9383166201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff978316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909916929094169190911796909617949094161792909217939093169190911790557f00000000000000000000000000000000000000000000000000000000000000001663f3993d11610fcd3390565b61dead86866040518563ffffffff1660e01b8152600401610ff1949392919061400c565b5f604051808303815f87803b158015611008575f80fd5b505af115801561101a573d5f803e3d5ffd5b505050506110253390565b73ffffffffffffffffffffffffffffffffffffffff167fbcdecc1a9f4b8ca5f0e29df5f18f1c855d85216b93dbcab280c0978ff1a103d060405160405180910390a2505050565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611126576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d55761116185858381811061114557611145613fb2565b905060200201602081019061115a91906137b6565b60076108af565b600101611128565b6040805180820190915260035473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910462ffffff166020830181905290915f91612710906111c790866140b1565b6111d191906140c8565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8516331480611204575061120485336104e9565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d585858585856120da565b60608151835114611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610621565b5f835167ffffffffffffffff81111561134b5761134b613971565b604051908082528060200260200182016040528015611374578160200160208202803683370190505b5090505f5b84518110156113eb576113be85828151811061139757611397613fb2565b60200260200101518583815181106113b1576113b1613fb2565b6020026020010151610581565b8282815181106113d0576113d0613fb2565b60209081029190910101526113e481614100565b9050611379565b509392505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a380548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183818111156114b0576114b0613ccf565b02179055507f92a17b827ee9d42ea9454bb4ca941a1800870e6d01c0842d09ba23ccc0190ee1816040516114e49190613cfc565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8316331480611518575061151883336104e9565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612407565b505050565b5f600682901c6115c8603f841660046140b1565b600582609d81106115db576115db613fb2565b0154600f911c169392505050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b8281146116a3576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe576116f6868686848181106116c3576116c3613fb2565b90506020020160208101906116d891906137b6565b8585858181106116ea576116ea613fb2565b90506020020135612728565b6001016116a5565b505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612749565b60045473ffffffffffffffffffffffffffffffffffffffff163314611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61014d81111561184f576040517f03e231b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831680825262ffffff83166020909201829052600380547fffffffffffffffffff000000000000000000000000000000000000000000000016909117740100000000000000000000000000000000000000009092029190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a26115af82848361417c565b60a5816077811061196a575f80fd5b01805490915061197990613f61565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613f61565b80156119f05780601f106119c7576101008083540402835291602001916119f0565b820191905f5260205f20905b8154815290600101906020018083116119d357829003601f168201915b505050505081565b6107283383836127d7565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612728565b60a2805461197990613f61565b60045473ffffffffffffffffffffffffffffffffffffffff163314611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611b56576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe575f838383818110611b7357611b73613fb2565b9050602002810190611b859190614293565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509394505050505b8151811015611c1357611c0b88888886818110611bd757611bd7613fb2565b9050602002016020810190611bec91906137b6565b848481518110611bfe57611bfe613fb2565b6020026020010151612749565b600101611bb8565b5050600101611b58565b73ffffffffffffffffffffffffffffffffffffffff8516331480611c465750611c4685336104e9565b611cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d58585858585612929565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b73ffffffffffffffffffffffffffffffffffffffff8116611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610621565b611e0c81612b63565b50565b73ffffffffffffffffffffffffffffffffffffffff8316331480611e385750611e3883336104e9565b611ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612bd9565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610659575061065982612dde565b600261072882826142f7565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054839290611f6c90849061440f565b9091555050604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516915f9133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b5f5b825181101561207957818181518110611fe957611fe9613fb2565b60200260200101515f8085848151811061200557612005613fb2565b602002602001015181526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612063919061440f565b90915550612072905081614100565b9050611fce565b5073ffffffffffffffffffffffffffffffffffffffff83165f3373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8585604051611fbf929190614422565b815183511461216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff841661220e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f5b845181101561237a575f85828151811061222d5761222d613fb2565b602002602001015190505f85838151811061224a5761224a613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061235f90849061440f565b925050819055505050508061237390614100565b9050612211565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123f1929190614422565b60405180910390a46116fe818787878787612ec0565b73ffffffffffffffffffffffffffffffffffffffff83166124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b805182511461253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b60408051602081019091525f9081905233905b8351811015612695575f84828151811061256a5761256a613fb2565b602002602001015190505f84838151811061258757612587613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f9283526020838152604080852073ffffffffffffffffffffffffffffffffffffffff8b168652909152909220910390558061268d81614100565b91505061254e565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161270c929190614422565b60405180910390a460408051602081019091525f905250505050565b6115af73ffffffffffffffffffffffffffffffffffffffff84168383613149565b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906342842e0e906064015f604051808303815f87803b1580156127bc575f80fd5b505af11580156127ce573d5f803e3d5ffd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f6129d7856131d6565b90505f6129e3856131d6565b90505f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015612aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8781526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290612aeb90849061440f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b58848a8a8a8a8a61321f565b505050505050505050565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8316612c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b335f612c87846131d6565b90505f612c93846131d6565b60408051602080820183525f9182905288825281815282822073ffffffffffffffffffffffffffffffffffffffff8b1683529052205490915084811015612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90526127ce565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480612e7057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061065957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610659565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612f37908990899088908890889060040161444f565b6020604051808303815f875af1925050508015612f8f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f8c918101906144b9565b60015b61307857612f9b6144d4565b806308c379a003612fee5750612faf6144ed565b80612fba5750612ff0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106219190613851565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610621565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115af9084906133cb565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061320e5761320e613fb2565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906132969089908990889088908890600401614594565b6020604051808303815f875af19250505080156132ee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526132eb918101906144b9565b60015b6132fa57612f9b6144d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b5f61342c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134d69092919063ffffffff16565b8051909150156115af578080602001905181019061344a91906145d8565b6115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610621565b60606134e484845f856134ec565b949350505050565b60608247101561357e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610621565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516135a691906145f3565b5f6040518083038185875af1925050503d805f81146135e0576040519150601f19603f3d011682016040523d82523d5f602084013e6135e5565b606091505b50915091506135f687838387613601565b979650505050505050565b606083156136965782515f0361368f5773ffffffffffffffffffffffffffffffffffffffff85163b61368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610621565b50816134e4565b6134e48383815115612fba5781518083602001fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146136ce575f80fd5b919050565b5f80604083850312156136e4575f80fd5b6136ed836136ab565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e0c575f80fd5b5f60208284031215613738575f80fd5b8135613743816136fb565b9392505050565b5f806020838503121561375b575f80fd5b823567ffffffffffffffff80821115613772575f80fd5b818501915085601f830112613785575f80fd5b813581811115613793575f80fd5b8660208285010111156137a4575f80fd5b60209290920196919550909350505050565b5f602082840312156137c6575f80fd5b613743826136ab565b5f602082840312156137df575f80fd5b5035919050565b5f5b838110156138005781810151838201526020016137e8565b50505f910152565b5f815180845261381f8160208601602086016137e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6137436020830184613808565b5f8083601f840112613873575f80fd5b50813567ffffffffffffffff81111561388a575f80fd5b6020830191508360208260051b85010111156138a4575f80fd5b9250929050565b5f805f80604085870312156138be575f80fd5b843567ffffffffffffffff808211156138d5575f80fd5b6138e188838901613863565b909650945060208701359150808211156138f9575f80fd5b5061390687828801613863565b95989497509550505050565b5f8060208385031215613923575f80fd5b823567ffffffffffffffff811115613939575f80fd5b61394585828601613863565b90969095509350505050565b5f8060408385031215613962575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156139e2576139e2613971565b6040525050565b5f67ffffffffffffffff821115613a0257613a02613971565b5060051b60200190565b5f82601f830112613a1b575f80fd5b81356020613a28826139e9565b604051613a35828261399e565b83815260059390931b8501820192828101915086841115613a54575f80fd5b8286015b84811015613a6f5780358352918301918301613a58565b509695505050505050565b5f82601f830112613a89575f80fd5b813567ffffffffffffffff811115613aa357613aa3613971565b604051613ad860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018261399e565b818152846020838601011115613aec575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b1c575f80fd5b613b25866136ab565b9450613b33602087016136ab565b9350604086013567ffffffffffffffff80821115613b4f575f80fd5b613b5b89838a01613a0c565b94506060880135915080821115613b70575f80fd5b613b7c89838a01613a0c565b93506080880135915080821115613b91575f80fd5b50613b9e88828901613a7a565b9150509295509295909350565b5f8060408385031215613bbc575f80fd5b823567ffffffffffffffff80821115613bd3575f80fd5b818501915085601f830112613be6575f80fd5b81356020613bf3826139e9565b604051613c00828261399e565b83815260059390931b8501820192828101915089841115613c1f575f80fd5b948201945b83861015613c4457613c35866136ab565b82529482019490820190613c24565b96505086013592505080821115613c59575f80fd5b506111d185828601613a0c565b5f8151808452602080850194508084015f5b83811015613c9457815187529582019590820190600101613c78565b509495945050505050565b602081525f6137436020830184613c66565b5f60208284031215613cc1575f80fd5b813560028110613743575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160028310613d35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f805f60608486031215613d4d575f80fd5b613d56846136ab565b9250602084013567ffffffffffffffff80821115613d72575f80fd5b613d7e87838801613a0c565b93506040860135915080821115613d93575f80fd5b50613da086828701613a0c565b9150509250925092565b5f805f805f60608688031215613dbe575f80fd5b613dc7866136ab565b9450602086013567ffffffffffffffff80821115613de3575f80fd5b613def89838a01613863565b90965094506040880135915080821115613e07575f80fd5b50613e1488828901613863565b969995985093965092949392505050565b5f805f60608486031215613e37575f80fd5b613e40846136ab565b9250613e4e602085016136ab565b9150604084013590509250925092565b8015158114611e0c575f80fd5b5f8060408385031215613e7c575f80fd5b613e85836136ab565b91506020830135613e9581613e5e565b809150509250929050565b5f8060408385031215613eb1575f80fd5b613eba836136ab565b9150613ec8602084016136ab565b90509250929050565b5f805f805f60a08688031215613ee5575f80fd5b613eee866136ab565b9450613efc602087016136ab565b93506040860135925060608601359150608086013567ffffffffffffffff811115613f25575f80fd5b613b9e88828901613a7a565b5f805f60608486031215613f43575f80fd5b613f4c846136ab565b95602085013595506040909401359392505050565b600181811c90821680613f7557607f821691505b602082108103613fac577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614069575f80fd5b8260051b808560808501379190910160800195945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761065957610659614084565b5f826140fb577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361413057614130614084565b5060010190565b601f8211156115af575f81815260208120601f850160051c8101602086101561415d5750805b601f850160051c820191505b818110156116fe57828155600101614169565b67ffffffffffffffff83111561419457614194613971565b6141a8836141a28354613f61565b83614137565b5f601f8411600181146141f8575f85156141c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556108d5565b5f838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142465786850135825560209485019460019092019101614226565b5086821015614281577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142c6575f80fd5b83018035915067ffffffffffffffff8211156142e0575f80fd5b6020019150600581901b36038213156138a4575f80fd5b815167ffffffffffffffff81111561431157614311613971565b6143258161431f8454613f61565b84614137565b602080601f831160018114614377575f84156143415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556116fe565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143c3578886015182559484019460019091019084016143a4565b50858210156143ff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561065957610659614084565b604081525f6144346040830185613c66565b82810360208401526144468185613c66565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261448760a0830186613c66565b82810360608401526144998186613c66565b905082810360808401526144ad8185613808565b98975050505050505050565b5f602082840312156144c9575f80fd5b8151613743816136fb565b5f60033d11156144ea5760045f803e505f5160e01c5b90565b5f60443d10156144fa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561454857505050505090565b82850191508151818111156145605750505050505090565b843d870101602082850101111561457a5750505050505090565b6145896020828601018761399e565b509095945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526135f660a0830184613808565b5f602082840312156145e8575f80fd5b815161374381613e5e565b5f82516146048184602087016137e6565b919091019291505056fea2646970667358221220aa807317cf30e3556c177951e9174d894b769beb4ba6ae102a5d14a128cf84ab64736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f000000000000000000000000000000000000000000000000000000000000014d00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5061414c777472724e6e50785151484c72785a725453667a3836484c41764876327476786e6b337461414d450000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d594a484c336e324e684d3663787146727a43655558636844595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101e6575f3560e01c80637312808b11610109578063e8a3d4851161009e578063f242432a1161006e578063f242432a1461053f578063f2fde38b14610552578063f5298aca14610565578063fccc281314610578575f80fd5b8063e8a3d485146104d3578063e985e9c5146104db578063ede9dddd14610523578063f02678e91461052c575f80fd5b8063938e3d7b116100d9578063938e3d7b14610487578063a19b6ea11461049a578063a22cb465146104ad578063b2118a8d146104c0575f80fd5b80637312808b146104305780637df325e1146104435780638c7ea24b146104565780638da5cb5b14610469575f80fd5b806319f297b71161017f5780635a67de071161014f5780635a67de07146103dd578063603f4d52146103f05780636b20c4541461040a57806372e017121461041d575f80fd5b806319f297b7146103585780632a55205a1461036b5780632eb2c2d6146103aa5780634e1273f4146103bd575f80fd5b80630c2ab324116101ba5780630c2ab324146102c65780630e89341c146103125780631558c155146103325780631746114814610345575f80fd5b8062fdd58e146101ea57806301ffc9a71461021057806302fe5305146102335780630a835c9214610248575b5f80fd5b6101fd6101f83660046136d3565b610581565b6040519081526020015b60405180910390f35b61022361021e366004613728565b61065f565b6040519015158152602001610207565b61024661024136600461374a565b610669565b005b6102926102563660046137b6565b60a46020525f908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610207565b6102ed7f00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610207565b6103256103203660046137cf565b61072c565b6040516102079190613851565b6102466103403660046138ab565b6107be565b610246610353366004613912565b6108dc565b6102466103663660046138ab565b61106c565b61037e610379366004613951565b611169565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610207565b6102466103b8366004613b08565b6111db565b6103d06103cb366004613bab565b61129d565b6040516102079190613c9f565b6102466103eb366004613cb1565b6113f3565b60a3546103fd9060ff1681565b6040516102079190613cfc565b610246610418366004613d3b565b6114ef565b6101fd61042b3660046137cf565b6115b4565b61024661043e366004613daa565b6115e9565b610246610451366004613e25565b611706565b6102466104643660046136d3565b611792565b60045473ffffffffffffffffffffffffffffffffffffffff166102ed565b61024661049536600461374a565b6118cd565b6103256104a83660046137cf565b61195b565b6102466104bb366004613e6b565b6119f8565b6102466104ce366004613e25565b611a03565b610325611a8f565b6102236104e9366004613ea0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6101fd61014d81565b61024661053a366004613daa565b611a9c565b61024661054d366004613ed1565b611c1d565b6102466105603660046137b6565b611cdf565b610246610573366004613f31565b611e0f565b6102ed61dead81565b5f73ffffffffffffffffffffffffffffffffffffffff831661062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b505f8181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b5f61065982611ecf565b60045473ffffffffffffffffffffffffffffffffffffffff1633146106ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61072882828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f2492505050565b5050565b60606002805461073b90613f61565b80601f016020809104026020016040519081016040528092919081815260200182805461076790613f61565b80156107b25780601f10610789576101008083540402835291602001916107b2565b820191905f5260205f20905b81548152906001019060200180831161079557829003601f168201915b50505050509050919050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114610878576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d5576108cd85858381811061089757610897613fb2565b90506020020160208101906108ac91906137b6565b60065b8585858181106108c1576108c1613fb2565b90506020020135611f30565b60010161087a565b5050505050565b600160a35460ff1660018111156108f5576108f5613ccf565b1461092c576040517fd2ab239f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260a460209081526040808320815160a081018352905460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204831660608201526401000000009091049091166080820152905b82811015610a3b575f6109b68585848181106109aa576109aa613fb2565b905060200201356115b4565b9050805f036109d25760808301805160010160ff169052610a32565b60088116156109ee5760608301805160010160ff169052610a32565b6001811615610a0257825160010160ff1683525b6002811615610a1a5760208301805160010160ff1690525b6004811615610a325760408301805160010160ff1690525b5060010161098c565b5080516020820151604083015160608401516080850151600360ff95861681900486169594851681900485169493841681900484169392831681900483169291821604165f8115610a8d576001610a8f565b5f5b8315610a9c576001610a9e565b5f5b8515610aab576001610aad565b5f5b8715610aba576001610abc565b5f5b8915610ac9576001610acb565b5f5b0101010160ff16905080600103610bd7578515610b0157610aee33600188611f30565b865160039060ff160660ff168752610e7f565b8415610b3857610b1333600287611f30565b6003876020015160ff1681610b2a57610b2a613fdf565b0660ff166020880152610e7f565b8315610b6f57610b4a33600386611f30565b6003876040015160ff1681610b6157610b61613fdf565b0660ff166040880152610e7f565b8215610ba657610b8133600485611f30565b6003876060015160ff1681610b9857610b98613fdf565b0660ff166060880152610e7f565b610bb233600584611f30565b6003876080015160ff1681610bc957610bc9613fdf565b0660ff166080880152610e7f565b8060011015610e7f575f8167ffffffffffffffff811115610bfa57610bfa613971565b604051908082528060200260200182016040528015610c23578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c4057610c40613971565b604051908082528060200260200182016040528015610c69578160200160208202803683370190505b5090505f8815610cc6576001838281518110610c8757610c87613fb2565b60200260200101818152505088828280600101935081518110610cac57610cac613fb2565b6020908102919091010152895160039060ff160660ff168a525b8715610d32576002838281518110610ce057610ce0613fb2565b60200260200101818152505087828280600101935081518110610d0557610d05613fb2565b60200260200101818152505060038a6020015160ff1681610d2857610d28613fdf565b0660ff1660208b01525b8615610d9e576003838281518110610d4c57610d4c613fb2565b60200260200101818152505086828280600101935081518110610d7157610d71613fb2565b60200260200101818152505060038a6040015160ff1681610d9457610d94613fdf565b0660ff1660408b01525b8515610e0a576004838281518110610db857610db8613fb2565b60200260200101818152505085828280600101935081518110610ddd57610ddd613fb2565b60200260200101818152505060038a6060015160ff1681610e0057610e00613fdf565b0660ff1660608b01525b8415610e70576005838281518110610e2457610e24613fb2565b60200260200101818152505084828281518110610e4357610e43613fb2565b60200260200101818152505060038a6080015160ff1681610e6657610e66613fdf565b0660ff1660808b01525b610e7b338484611fcc565b5050505b5050505050508060a45f610e903390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182015f20845181549486015193860151606087015160809097015160ff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff9882166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9383166201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff978316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909916929094169190911796909617949094161792909217939093169190911790557f00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be1663f3993d11610fcd3390565b61dead86866040518563ffffffff1660e01b8152600401610ff1949392919061400c565b5f604051808303815f87803b158015611008575f80fd5b505af115801561101a573d5f803e3d5ffd5b505050506110253390565b73ffffffffffffffffffffffffffffffffffffffff167fbcdecc1a9f4b8ca5f0e29df5f18f1c855d85216b93dbcab280c0978ff1a103d060405160405180910390a2505050565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611126576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156108d55761116185858381811061114557611145613fb2565b905060200201602081019061115a91906137b6565b60076108af565b600101611128565b6040805180820190915260035473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910462ffffff166020830181905290915f91612710906111c790866140b1565b6111d191906140c8565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8516331480611204575061120485336104e9565b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d585858585856120da565b60608151835114611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610621565b5f835167ffffffffffffffff81111561134b5761134b613971565b604051908082528060200260200182016040528015611374578160200160208202803683370190505b5090505f5b84518110156113eb576113be85828151811061139757611397613fb2565b60200260200101518583815181106113b1576113b1613fb2565b6020026020010151610581565b8282815181106113d0576113d0613fb2565b60209081029190910101526113e481614100565b9050611379565b509392505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a380548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183818111156114b0576114b0613ccf565b02179055507f92a17b827ee9d42ea9454bb4ca941a1800870e6d01c0842d09ba23ccc0190ee1816040516114e49190613cfc565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8316331480611518575061151883336104e9565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612407565b505050565b5f600682901c6115c8603f841660046140b1565b600582609d81106115db576115db613fb2565b0154600f911c169392505050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b8281146116a3576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe576116f6868686848181106116c3576116c3613fb2565b90506020020160208101906116d891906137b6565b8585858181106116ea576116ea613fb2565b90506020020135612728565b6001016116a5565b505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612749565b60045473ffffffffffffffffffffffffffffffffffffffff163314611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b61014d81111561184f576040517f03e231b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831680825262ffffff83166020909201829052600380547fffffffffffffffffff000000000000000000000000000000000000000000000016909117740100000000000000000000000000000000000000009092029190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff16331461194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b60a26115af82848361417c565b60a5816077811061196a575f80fd5b01805490915061197990613f61565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613f61565b80156119f05780601f106119c7576101008083540402835291602001916119f0565b820191905f5260205f20905b8154815290600101906020018083116119d357829003601f168201915b505050505081565b6107283383836127d7565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b6115af838383612728565b60a2805461197990613f61565b60045473ffffffffffffffffffffffffffffffffffffffff163314611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b828114611b56576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156116fe575f838383818110611b7357611b73613fb2565b9050602002810190611b859190614293565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509394505050505b8151811015611c1357611c0b88888886818110611bd757611bd7613fb2565b9050602002016020810190611bec91906137b6565b848481518110611bfe57611bfe613fb2565b6020026020010151612749565b600101611bb8565b5050600101611b58565b73ffffffffffffffffffffffffffffffffffffffff8516331480611c465750611c4685336104e9565b611cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6108d58585858585612929565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610621565b73ffffffffffffffffffffffffffffffffffffffff8116611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610621565b611e0c81612b63565b50565b73ffffffffffffffffffffffffffffffffffffffff8316331480611e385750611e3883336104e9565b611ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610621565b6115af838383612bd9565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610659575061065982612dde565b600261072882826142f7565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054839290611f6c90849061440f565b9091555050604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516915f9133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b5f5b825181101561207957818181518110611fe957611fe9613fb2565b60200260200101515f8085848151811061200557612005613fb2565b602002602001015181526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612063919061440f565b90915550612072905081614100565b9050611fce565b5073ffffffffffffffffffffffffffffffffffffffff83165f3373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8585604051611fbf929190614422565b815183511461216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff841661220e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f5b845181101561237a575f85828151811061222d5761222d613fb2565b602002602001015190505f85838151811061224a5761224a613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e168352909352919091205490915081811015612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061235f90849061440f565b925050819055505050508061237390614100565b9050612211565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516123f1929190614422565b60405180910390a46116fe818787878787612ec0565b73ffffffffffffffffffffffffffffffffffffffff83166124aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b805182511461253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610621565b60408051602081019091525f9081905233905b8351811015612695575f84828151811061256a5761256a613fb2565b602002602001015190505f84838151811061258757612587613fb2565b6020908102919091018101515f848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f9283526020838152604080852073ffffffffffffffffffffffffffffffffffffffff8b168652909152909220910390558061268d81614100565b91505061254e565b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161270c929190614422565b60405180910390a460408051602081019091525f905250505050565b6115af73ffffffffffffffffffffffffffffffffffffffff84168383613149565b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906342842e0e906064015f604051808303815f87803b1580156127bc575f80fd5b505af11580156127ce573d5f803e3d5ffd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610621565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610621565b335f6129d7856131d6565b90505f6129e3856131d6565b90505f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015612aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610621565b5f8781526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290612aeb90849061440f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b58848a8a8a8a8a61321f565b505050505050505050565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8316612c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610621565b335f612c87846131d6565b90505f612c93846131d6565b60408051602080820183525f9182905288825281815282822073ffffffffffffffffffffffffffffffffffffffff8b1683529052205490915084811015612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610621565b5f8681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90526127ce565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480612e7057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061065957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610659565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612f37908990899088908890889060040161444f565b6020604051808303815f875af1925050508015612f8f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f8c918101906144b9565b60015b61307857612f9b6144d4565b806308c379a003612fee5750612faf6144ed565b80612fba5750612ff0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106219190613851565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610621565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115af9084906133cb565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061320e5761320e613fb2565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b156116fe576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906132969089908990889088908890600401614594565b6020604051808303815f875af19250505080156132ee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526132eb918101906144b9565b60015b6132fa57612f9b6144d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610621565b5f61342c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134d69092919063ffffffff16565b8051909150156115af578080602001905181019061344a91906145d8565b6115af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610621565b60606134e484845f856134ec565b949350505050565b60608247101561357e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610621565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516135a691906145f3565b5f6040518083038185875af1925050503d805f81146135e0576040519150601f19603f3d011682016040523d82523d5f602084013e6135e5565b606091505b50915091506135f687838387613601565b979650505050505050565b606083156136965782515f0361368f5773ffffffffffffffffffffffffffffffffffffffff85163b61368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610621565b50816134e4565b6134e48383815115612fba5781518083602001fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146136ce575f80fd5b919050565b5f80604083850312156136e4575f80fd5b6136ed836136ab565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e0c575f80fd5b5f60208284031215613738575f80fd5b8135613743816136fb565b9392505050565b5f806020838503121561375b575f80fd5b823567ffffffffffffffff80821115613772575f80fd5b818501915085601f830112613785575f80fd5b813581811115613793575f80fd5b8660208285010111156137a4575f80fd5b60209290920196919550909350505050565b5f602082840312156137c6575f80fd5b613743826136ab565b5f602082840312156137df575f80fd5b5035919050565b5f5b838110156138005781810151838201526020016137e8565b50505f910152565b5f815180845261381f8160208601602086016137e6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6137436020830184613808565b5f8083601f840112613873575f80fd5b50813567ffffffffffffffff81111561388a575f80fd5b6020830191508360208260051b85010111156138a4575f80fd5b9250929050565b5f805f80604085870312156138be575f80fd5b843567ffffffffffffffff808211156138d5575f80fd5b6138e188838901613863565b909650945060208701359150808211156138f9575f80fd5b5061390687828801613863565b95989497509550505050565b5f8060208385031215613923575f80fd5b823567ffffffffffffffff811115613939575f80fd5b61394585828601613863565b90969095509350505050565b5f8060408385031215613962575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156139e2576139e2613971565b6040525050565b5f67ffffffffffffffff821115613a0257613a02613971565b5060051b60200190565b5f82601f830112613a1b575f80fd5b81356020613a28826139e9565b604051613a35828261399e565b83815260059390931b8501820192828101915086841115613a54575f80fd5b8286015b84811015613a6f5780358352918301918301613a58565b509695505050505050565b5f82601f830112613a89575f80fd5b813567ffffffffffffffff811115613aa357613aa3613971565b604051613ad860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018261399e565b818152846020838601011115613aec575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b1c575f80fd5b613b25866136ab565b9450613b33602087016136ab565b9350604086013567ffffffffffffffff80821115613b4f575f80fd5b613b5b89838a01613a0c565b94506060880135915080821115613b70575f80fd5b613b7c89838a01613a0c565b93506080880135915080821115613b91575f80fd5b50613b9e88828901613a7a565b9150509295509295909350565b5f8060408385031215613bbc575f80fd5b823567ffffffffffffffff80821115613bd3575f80fd5b818501915085601f830112613be6575f80fd5b81356020613bf3826139e9565b604051613c00828261399e565b83815260059390931b8501820192828101915089841115613c1f575f80fd5b948201945b83861015613c4457613c35866136ab565b82529482019490820190613c24565b96505086013592505080821115613c59575f80fd5b506111d185828601613a0c565b5f8151808452602080850194508084015f5b83811015613c9457815187529582019590820190600101613c78565b509495945050505050565b602081525f6137436020830184613c66565b5f60208284031215613cc1575f80fd5b813560028110613743575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160028310613d35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b5f805f60608486031215613d4d575f80fd5b613d56846136ab565b9250602084013567ffffffffffffffff80821115613d72575f80fd5b613d7e87838801613a0c565b93506040860135915080821115613d93575f80fd5b50613da086828701613a0c565b9150509250925092565b5f805f805f60608688031215613dbe575f80fd5b613dc7866136ab565b9450602086013567ffffffffffffffff80821115613de3575f80fd5b613def89838a01613863565b90965094506040880135915080821115613e07575f80fd5b50613e1488828901613863565b969995985093965092949392505050565b5f805f60608486031215613e37575f80fd5b613e40846136ab565b9250613e4e602085016136ab565b9150604084013590509250925092565b8015158114611e0c575f80fd5b5f8060408385031215613e7c575f80fd5b613e85836136ab565b91506020830135613e9581613e5e565b809150509250929050565b5f8060408385031215613eb1575f80fd5b613eba836136ab565b9150613ec8602084016136ab565b90509250929050565b5f805f805f60a08688031215613ee5575f80fd5b613eee866136ab565b9450613efc602087016136ab565b93506040860135925060608601359150608086013567ffffffffffffffff811115613f25575f80fd5b613b9e88828901613a7a565b5f805f60608486031215613f43575f80fd5b613f4c846136ab565b95602085013595506040909401359392505050565b600181811c90821680613f7557607f821691505b602082108103613fac577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614069575f80fd5b8260051b808560808501379190910160800195945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761065957610659614084565b5f826140fb577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361413057614130614084565b5060010190565b601f8211156115af575f81815260208120601f850160051c8101602086101561415d5750805b601f850160051c820191505b818110156116fe57828155600101614169565b67ffffffffffffffff83111561419457614194613971565b6141a8836141a28354613f61565b83614137565b5f601f8411600181146141f8575f85156141c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556108d5565b5f838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156142465786850135825560209485019460019092019101614226565b5086821015614281577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142c6575f80fd5b83018035915067ffffffffffffffff8211156142e0575f80fd5b6020019150600581901b36038213156138a4575f80fd5b815167ffffffffffffffff81111561431157614311613971565b6143258161431f8454613f61565b84614137565b602080601f831160018114614377575f84156143415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556116fe565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143c3578886015182559484019460019091019084016143a4565b50858210156143ff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561065957610659614084565b604081525f6144346040830185613c66565b82810360208401526144468185613c66565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261448760a0830186613c66565b82810360608401526144998186613c66565b905082810360808401526144ad8185613808565b98975050505050505050565b5f602082840312156144c9575f80fd5b8151613743816136fb565b5f60033d11156144ea5760045f803e505f5160e01c5b90565b5f60443d10156144fa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561454857505050505090565b82850191508151818111156145605750505050505090565b843d870101602082850101111561457a5750505050505090565b6145896020828601018761399e565b509095945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526135f660a0830184613808565b5f602082840312156145e8575f80fd5b815161374381613e5e565b5f82516146048184602087016137e6565b919091019291505056fea2646970667358221220aa807317cf30e3556c177951e9174d894b769beb4ba6ae102a5d14a128cf84ab64736f6c63430008140033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f000000000000000000000000000000000000000000000000000000000000014d00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be0000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5061414c777472724e6e50785151484c72785a725453667a3836484c41764876327476786e6b337461414d450000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d594a484c336e324e684d3663787146727a43655558636844595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00

-----Decoded View---------------
Arg [0] : _contractURI (string): ipfs://QmPaALwtrrNnPxQQHLrxZrTSfz86HLAvHv2tvxnk3taAME
Arg [1] : _baseURI (string): ipfs://QmYJHL3n2NhM6cxqFrzCeUXchDYY4PG5bZudFNTgEopf5Y/{id}.json
Arg [2] : _royaltiesReceiver (address): 0x50AD8FDBC19ea06fD9383F1262Ce691DC53FA99f
Arg [3] : _royaltiesPercent (uint256): 333
Arg [4] : _sanContract (address): 0x33333333333371718A3C2bB63E5F3b94C9bC13bE

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000050ad8fdbc19ea06fd9383f1262ce691dc53fa99f
Arg [3] : 000000000000000000000000000000000000000000000000000000000000014d
Arg [4] : 00000000000000000000000033333333333371718a3c2bb63e5f3b94c9bc13be
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d5061414c777472724e6e50785151484c72785a72545366
Arg [7] : 7a3836484c41764876327476786e6b337461414d450000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [9] : 697066733a2f2f516d594a484c336e324e684d3663787146727a436555586368
Arg [10] : 44595934504735625a7564464e5467456f706635592f7b69647d2e6a736f6e00


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.