ETH Price: $3,622.42 (-2.36%)

Token

SamuraiBears (SB)
 

Overview

Max Total Supply

3,803 SB

Holders

531

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 SB
0x734cD106E18A334fB2ecCCE8Ceb2e53610AaDF29
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SamuraiBears

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-27
*/

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

pragma solidity 0.8.10;

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}


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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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 Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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

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

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

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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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


contract SamuraiBears is ERC721A, ERC2981, Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    string public baseURI = "ipfs://bafybeig6ougsfjf3kzf7mqqo7v5gem4aczcoc5devvitk2qcvf7anw575m/";

    uint256 public tokenPrice = 10000000000000000; //0.01 ETH

    uint public constant maxTokensPurchase = 20;

    uint public maxFreeTokensPerAddress = 5;

    uint256 public maxFreeTokens = 2222;
    
    uint256 public numberOfFreeTokensMinted = 0;

    uint256 public MAX_TOKENS = 3333;

    bool public saleIsActive = false;

    bool public freeMintIsActive = false;

    uint public percentRequiredAdditionalFee = 10;
    
    mapping (address => uint256) addressToNumberOfFreeTokensMinted;

    enum TokenURIMode {
        MODE_ONE,
        MODE_TWO
    }

    TokenURIMode private tokenUriMode = TokenURIMode.MODE_TWO;

    constructor(        
        string memory name,
        string memory symbol,
        address payable royaltyReceiver
    ) ERC721A(name, symbol) {
        _setDefaultRoyalty(royaltyReceiver, 250);
        _safeMint(msg.sender, 100);
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    } 

    function withdrawTo(address to, uint256 amount) public onlyOwner {
        require(amount <= address(this).balance, "Request would exceed balance of this contract");
        payable(to).transfer(amount);
    } 

    function reserveTokens(address to, uint numberOfTokens) public onlyOwner {        
        require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Request would exceed max supply of tokens");
        _safeMint(to, numberOfTokens);
    }         
    
    function setBaseURI(string memory newURI) public onlyOwner {
        baseURI = newURI;
    }    

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipFreeMintState() public onlyOwner {
        freeMintIsActive = !freeMintIsActive;
    }

    function openFreeMint(uint256 _maxFreeTokensPerAddress, uint256 _maxFreeTokens) public onlyOwner{
        saleIsActive = true;
        freeMintIsActive = true;
        maxFreeTokensPerAddress = _maxFreeTokensPerAddress;
        maxFreeTokens = _maxFreeTokens;
        numberOfFreeTokensMinted = 0;
    }
    
    function mintFreeToken(uint numberOfTokens) public payable nonReentrant {
        require(saleIsActive, "Sale must be active to mint token");
        require(freeMintIsActive, "Free mint must be active to mint token");
        require(numberOfTokens <= maxFreeTokensPerAddress, "Exceed max allow to free tokens per wallet");
        require(numberOfFreeTokensMinted.add(1) <= maxFreeTokens, "No free mints left");
        require(addressToNumberOfFreeTokensMinted[msg.sender].add(1) <= maxFreeTokensPerAddress, "No free mints left for this wallet");

        if(numberOfFreeTokensMinted.add(numberOfTokens) > maxFreeTokens){
            numberOfTokens = maxFreeTokens.sub( numberOfFreeTokensMinted );
        }
        if(addressToNumberOfFreeTokensMinted[msg.sender].add(numberOfTokens) > maxFreeTokensPerAddress){
            numberOfTokens = 1;
        }

        require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Exceed max supply of tokens");
        require(numberOfTokens > 0, "You must mint at least one token");
        
        if(percentRequiredAdditionalFee > 0 ){
            uint lottery = randomLottery(msg.sender);
            if(lottery <= percentRequiredAdditionalFee){
                require(msg.value >= tokenPrice, "You must pay an additional fee to complete this transaction.");
            }
        }

        _safeMint(msg.sender, numberOfTokens);

        addressToNumberOfFreeTokensMinted[msg.sender] = addressToNumberOfFreeTokensMinted[msg.sender].add( numberOfTokens );
        numberOfFreeTokensMinted = numberOfFreeTokensMinted.add(numberOfTokens);
        if(numberOfFreeTokensMinted >= maxFreeTokens){
            freeMintIsActive = false;
        }
    }

    function mintToken(uint numberOfTokens) public payable nonReentrant {
        require(saleIsActive, "Sale must be active to mint token");
        require(numberOfTokens <= maxTokensPurchase, "The number of tokens per request exceeds the allowed number");
        require(numberOfTokens > 0, "You must mint at least one token");
        require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(tokenPrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        
        _safeMint(msg.sender, numberOfTokens);
    }

    function setTokenPrice(uint256 newTokenPrice) public onlyOwner{
        tokenPrice = newTokenPrice;
    }

    function getTotalFreeMinted(address adr) public view returns(uint256) {
        return addressToNumberOfFreeTokensMinted[adr];
    }   

    function setMaxTokenFreePerAddress(uint256 _maxFreeTokensPerAddress) public onlyOwner{
        maxFreeTokensPerAddress = _maxFreeTokensPerAddress;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) 
    {
        require(_exists(_tokenId), "Token does not exist.");
        if (tokenUriMode == TokenURIMode.MODE_TWO) {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId)
            )
          ) : "";
        } else {
          return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              ".json"
            )
          ) : "";
        }
    }

    function setTokenURIMode(uint256 mode) external onlyOwner {
        if (mode == 2) {
            tokenUriMode = TokenURIMode.MODE_TWO;
        } else {
            tokenUriMode = TokenURIMode.MODE_ONE;
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }   

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    } 

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
      MAX_TOKENS = _maxSupply;
    }

    /**
    @notice Sets the contract-wide royalty info.
     */
    function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeBasisPoints);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function setPercentRequiredAdditionalFee(uint _percentRequiredAdditionalFee) public onlyOwner{
        percentRequiredAdditionalFee = _percentRequiredAdditionalFee;
    }

    function randomLottery(address adr) public pure returns (uint){
        return uint( keccak256(abi.encodePacked(adr, "1")) ) % 100;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address payable","name":"royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipFreeMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"getTotalFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeTokensPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintFreeToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfFreeTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeTokensPerAddress","type":"uint256"},{"internalType":"uint256","name":"_maxFreeTokens","type":"uint256"}],"name":"openFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentRequiredAdditionalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"randomLottery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeTokensPerAddress","type":"uint256"}],"name":"setMaxTokenFreePerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentRequiredAdditionalFee","type":"uint256"}],"name":"setPercentRequiredAdditionalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setTokenURIMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604381526020016200654960439139600c908051906020019062000035929190620009bd565b50662386f26fc10000600d556005600e556108ae600f556000601055610d056011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550600a6013556001601560006101000a81548160ff02191690836001811115620000bb57620000ba62000a6d565b5b0217905550348015620000cd57600080fd5b506040516200658c3803806200658c8339818101604052810190620000f3919062000c9e565b828281600290805190602001906200010d929190620009bd565b50806003908051906020019062000126929190620009bd565b50620001376200019660201b60201c565b60008190555050506200015f620001536200019b60201b60201c565b620001a360201b60201c565b6001600b819055506200017a8160fa6200026960201b60201c565b6200018d3360646200040d60201b60201c565b50505062001038565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002796200043360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d19062000dbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200034d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003449062000e31565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6200042f8282604051806020016040528060008152506200043d60201b60201c565b5050565b6000612710905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620004ab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415620004e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620004fc60008583866200082c60201b60201c565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050620006ca8673ffffffffffffffffffffffffffffffffffffffff166200083260201b620026ac1760201c565b156200079c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200074860008784806001019550876200085560201b60201c565b6200077f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620006d15782600054146200079657600080fd5b62000808565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200079d575b816000819055505050620008266000858386620009b760201b60201c565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620008836200019b60201b60201c565b8786866040518563ffffffff1660e01b8152600401620008a7949392919062000ef0565b6020604051808303816000875af1925050508015620008e657506040513d601f19601f82011682018060405250810190620008e3919062000fa1565b60015b62000964573d806000811462000919576040519150601f19603f3d011682016040523d82523d6000602084013e6200091e565b606091505b506000815114156200095c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620009cb9062001002565b90600052602060002090601f016020900481019282620009ef576000855562000a3b565b82601f1062000a0a57805160ff191683800117855562000a3b565b8280016001018555821562000a3b579182015b8281111562000a3a57825182559160200191906001019062000a1d565b5b50905062000a4a919062000a4e565b5090565b5b8082111562000a6957600081600090555060010162000a4f565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000b058262000aba565b810181811067ffffffffffffffff8211171562000b275762000b2662000acb565b5b80604052505050565b600062000b3c62000a9c565b905062000b4a828262000afa565b919050565b600067ffffffffffffffff82111562000b6d5762000b6c62000acb565b5b62000b788262000aba565b9050602081019050919050565b60005b8381101562000ba557808201518184015260208101905062000b88565b8381111562000bb5576000848401525b50505050565b600062000bd262000bcc8462000b4f565b62000b30565b90508281526020810184848401111562000bf15762000bf062000ab5565b5b62000bfe84828562000b85565b509392505050565b600082601f83011262000c1e5762000c1d62000ab0565b5b815162000c3084826020860162000bbb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c668262000c39565b9050919050565b62000c788162000c59565b811462000c8457600080fd5b50565b60008151905062000c988162000c6d565b92915050565b60008060006060848603121562000cba5762000cb962000aa6565b5b600084015167ffffffffffffffff81111562000cdb5762000cda62000aab565b5b62000ce98682870162000c06565b935050602084015167ffffffffffffffff81111562000d0d5762000d0c62000aab565b5b62000d1b8682870162000c06565b925050604062000d2e8682870162000c87565b9150509250925092565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000da7602a8362000d38565b915062000db48262000d49565b604082019050919050565b6000602082019050818103600083015262000dda8162000d98565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000e1960198362000d38565b915062000e268262000de1565b602082019050919050565b6000602082019050818103600083015262000e4c8162000e0a565b9050919050565b600062000e608262000c39565b9050919050565b62000e728162000e53565b82525050565b6000819050919050565b62000e8d8162000e78565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000ebc8262000e93565b62000ec8818562000e9e565b935062000eda81856020860162000b85565b62000ee58162000aba565b840191505092915050565b600060808201905062000f07600083018762000e67565b62000f16602083018662000e67565b62000f25604083018562000e82565b818103606083015262000f39818462000eaf565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000f7b8162000f44565b811462000f8757600080fd5b50565b60008151905062000f9b8162000f70565b92915050565b60006020828403121562000fba5762000fb962000aa6565b5b600062000fca8482850162000f8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200101b57607f821691505b6020821081141562001032576200103162000fd3565b5b50919050565b61550180620010486000396000f3fe60806040526004361061027d5760003560e01c806378cf19e91161014f578063a22cb465116100c1578063db94b1ff1161007a578063db94b1ff14610953578063dc33e6811461096a578063e985e9c5146109a7578063eb8d2444146109e4578063f2fde38b14610a0f578063f47c84c514610a385761027d565b8063a22cb46514610863578063b88d4fde1461088c578063bc6c3544146108b5578063c634d032146108de578063c87b56dd146108fa578063d295162f146109375761027d565b80638de10ea1116101135780638de10ea114610753578063900c71f51461077c57806393115f4f146107a55780639551cc28146107d057806395d89b41146107fb578063982024f8146108265761027d565b806378cf19e91461066c5780637d73ff74146106955780637ff9b596146106c05780638b168d95146106eb5780638da5cb5b146107285761027d565b806335ee0fd2116101f35780636c0360eb116101ac5780636c0360eb146105705780636d88b4371461059b5780636f0570f8146105c45780636f8b44b0146105ef57806370a0823114610618578063715018a6146106555761027d565b806335ee0fd2146104765780633ccfd60b146104a157806342842e0e146104b857806355f804b3146104e15780636352211e1461050a5780636a61e5fc146105475761027d565b806318160ddd1161024557806318160ddd14610379578063205c2878146103a457806323b872dd146103cd5780632a55205a146103f657806334918dfd1461043457806334ebb9461461044b5761027d565b806301ffc9a71461028257806302fa7c47146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613cd5565b610a63565b6040516102b69190613d1d565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613dda565b610a75565b005b3480156102f457600080fd5b506102fd610aff565b60405161030a9190613eb3565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613f0b565b610b91565b6040516103479190613f47565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613f62565b610c0d565b005b34801561038557600080fd5b5061038e610d12565b60405161039b9190613fb1565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613f62565b610d29565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613fcc565b610e33565b005b34801561040257600080fd5b5061041d6004803603810190610418919061401f565b610e43565b60405161042b92919061405f565b60405180910390f35b34801561044057600080fd5b5061044961102e565b005b34801561045757600080fd5b506104606110d6565b60405161046d9190613fb1565b60405180910390f35b34801561048257600080fd5b5061048b6110dc565b6040516104989190613d1d565b60405180910390f35b3480156104ad57600080fd5b506104b66110ef565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613fcc565b6111ba565b005b3480156104ed57600080fd5b50610508600480360381019061050391906141bd565b6111da565b005b34801561051657600080fd5b50610531600480360381019061052c9190613f0b565b611270565b60405161053e9190613f47565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613f0b565b611286565b005b34801561057c57600080fd5b5061058561130c565b6040516105929190613eb3565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd919061401f565b61139a565b005b3480156105d057600080fd5b506105d9611466565b6040516105e69190613fb1565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613f0b565b61146c565b005b34801561062457600080fd5b5061063f600480360381019061063a9190614206565b6114f2565b60405161064c9190613fb1565b60405180910390f35b34801561066157600080fd5b5061066a6115c2565b005b34801561067857600080fd5b50610693600480360381019061068e9190613f62565b61164a565b005b3480156106a157600080fd5b506106aa611732565b6040516106b79190613fb1565b60405180910390f35b3480156106cc57600080fd5b506106d5611738565b6040516106e29190613fb1565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190614206565b61173e565b60405161071f9190613fb1565b60405180910390f35b34801561073457600080fd5b5061073d611787565b60405161074a9190613f47565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613f0b565b6117b1565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613f0b565b611837565b005b3480156107b157600080fd5b506107ba61191b565b6040516107c79190613fb1565b60405180910390f35b3480156107dc57600080fd5b506107e5611921565b6040516107f29190613fb1565b60405180910390f35b34801561080757600080fd5b50610810611926565b60405161081d9190613eb3565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190614206565b6119b8565b60405161085a9190613fb1565b60405180910390f35b34801561086f57600080fd5b5061088a6004803603810190610885919061425f565b6119f7565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614340565b611b6f565b005b3480156108c157600080fd5b506108dc60048036038101906108d79190613f0b565b611be7565b005b6108f860048036038101906108f39190613f0b565b611c6d565b005b34801561090657600080fd5b50610921600480360381019061091c9190613f0b565b611e5b565b60405161092e9190613eb3565b60405180910390f35b610951600480360381019061094c9190613f0b565b611f9d565b005b34801561095f57600080fd5b5061096861244d565b005b34801561097657600080fd5b50610991600480360381019061098c9190614206565b6124f5565b60405161099e9190613fb1565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906143c3565b612507565b6040516109db9190613d1d565b60405180910390f35b3480156109f057600080fd5b506109f961259b565b604051610a069190613d1d565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614206565b6125ae565b005b348015610a4457600080fd5b50610a4d6126a6565b604051610a5a9190613fb1565b60405180910390f35b6000610a6e826126cf565b9050919050565b610a7d612749565b73ffffffffffffffffffffffffffffffffffffffff16610a9b611787565b73ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae89061444f565b60405180910390fd5b610afb8282612751565b5050565b606060028054610b0e9061449e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3a9061449e565b8015610b875780601f10610b5c57610100808354040283529160200191610b87565b820191906000526020600020905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b6000610b9c826128e7565b610bd2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1882611270565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c80576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9f612749565b73ffffffffffffffffffffffffffffffffffffffff1614610d0257610ccb81610cc6612749565b612507565b610d01576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610d0d838383612935565b505050565b6000610d1c6129e7565b6001546000540303905090565b610d31612749565b73ffffffffffffffffffffffffffffffffffffffff16610d4f611787565b73ffffffffffffffffffffffffffffffffffffffff1614610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c9061444f565b60405180910390fd5b47811115610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614542565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e2e573d6000803e3d6000fd5b505050565b610e3e8383836129ec565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610fd95760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fe3612ea2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661100f9190614591565b611019919061461a565b90508160000151819350935050509250929050565b611036612749565b73ffffffffffffffffffffffffffffffffffffffff16611054611787565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a19061444f565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b600e5481565b601260019054906101000a900460ff1681565b6110f7612749565b73ffffffffffffffffffffffffffffffffffffffff16611115611787565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111629061444f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b6573d6000803e3d6000fd5b5050565b6111d583838360405180602001604052806000815250611b6f565b505050565b6111e2612749565b73ffffffffffffffffffffffffffffffffffffffff16611200611787565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d9061444f565b60405180910390fd5b80600c908051906020019061126c929190613b83565b5050565b600061127b82612eac565b600001519050919050565b61128e612749565b73ffffffffffffffffffffffffffffffffffffffff166112ac611787565b73ffffffffffffffffffffffffffffffffffffffff1614611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061444f565b60405180910390fd5b80600d8190555050565b600c80546113199061449e565b80601f01602080910402602001604051908101604052809291908181526020018280546113459061449e565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b505050505081565b6113a2612749565b73ffffffffffffffffffffffffffffffffffffffff166113c0611787565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d9061444f565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff02191690831515021790555081600e8190555080600f8190555060006010819055505050565b600f5481565b611474612749565b73ffffffffffffffffffffffffffffffffffffffff16611492611787565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df9061444f565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115ca612749565b73ffffffffffffffffffffffffffffffffffffffff166115e8611787565b73ffffffffffffffffffffffffffffffffffffffff161461163e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116359061444f565b60405180910390fd5b6116486000613137565b565b611652612749565b73ffffffffffffffffffffffffffffffffffffffff16611670611787565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd9061444f565b60405180910390fd5b6011546116e3826116d5610d12565b6131fd90919063ffffffff16565b1115611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906146bd565b60405180910390fd5b61172e828261325b565b5050565b60105481565b600d5481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b9612749565b73ffffffffffffffffffffffffffffffffffffffff166117d7611787565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118249061444f565b60405180910390fd5b8060138190555050565b61183f612749565b73ffffffffffffffffffffffffffffffffffffffff1661185d611787565b73ffffffffffffffffffffffffffffffffffffffff16146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa9061444f565b60405180910390fd5b60028114156118ec576001601560006101000a81548160ff021916908360018111156118e2576118e16146dd565b5b0217905550611918565b6000601560006101000a81548160ff02191690836001811115611912576119116146dd565b5b02179055505b50565b60135481565b601481565b6060600380546119359061449e565b80601f01602080910402602001604051908101604052809291908181526020018280546119619061449e565b80156119ae5780601f10611983576101008083540402835291602001916119ae565b820191906000526020600020905b81548152906001019060200180831161199157829003601f168201915b5050505050905090565b60006064826040516020016119cd91906147ab565b6040516020818303038152906040528051906020012060001c6119f091906147d1565b9050919050565b6119ff612749565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a71612749565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b1e612749565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b639190613d1d565b60405180910390a35050565b611b7a8484846129ec565b611b998373ffffffffffffffffffffffffffffffffffffffff166126ac565b15611be157611baa84848484613279565b611be0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611bef612749565b73ffffffffffffffffffffffffffffffffffffffff16611c0d611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a9061444f565b60405180910390fd5b80600e8190555050565b6002600b541415611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa9061484e565b60405180910390fd5b6002600b81905550601260009054906101000a900460ff16611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d01906148e0565b60405180910390fd5b6014811115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590614972565b60405180910390fd5b60008111611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906149de565b60405180910390fd5b601154611dae82611da0610d12565b6131fd90919063ffffffff16565b1115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614a70565b60405180910390fd5b34611e0582600d546133ca90919063ffffffff16565b1115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614adc565b60405180910390fd5b611e50338261325b565b6001600b8190555050565b6060611e66826128e7565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614b48565b60405180910390fd5b600180811115611eb857611eb76146dd565b5b601560009054906101000a900460ff166001811115611eda57611ed96146dd565b5b1415611f3e576000600c8054611eef9061449e565b905011611f0b5760405180602001604052806000815250611f37565b600c611f1683613445565b604051602001611f27929190614c2d565b6040516020818303038152906040525b9050611f98565b6000600c8054611f4d9061449e565b905011611f695760405180602001604052806000815250611f95565b600c611f7483613445565b604051602001611f85929190614c9d565b6040516020818303038152906040525b90505b919050565b6002600b541415611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda9061484e565b60405180910390fd5b6002600b81905550601260009054906101000a900460ff1661203a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612031906148e0565b60405180910390fd5b601260019054906101000a900460ff16612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614d3e565b60405180910390fd5b600e548111156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614dd0565b60405180910390fd5b600f546120e760016010546131fd90919063ffffffff16565b1115612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614e3c565b60405180910390fd5b600e5461217e6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b11156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614ece565b60405180910390fd5b600f546121d7826010546131fd90919063ffffffff16565b11156121f7576121f4601054600f546135a690919063ffffffff16565b90505b600e5461224c82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b111561225757600190505b60115461227482612266610d12565b6131fd90919063ffffffff16565b11156122b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ac90614f3a565b60405180910390fd5b600081116122f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ef906149de565b60405180910390fd5b6000601354111561236157600061230e336119b8565b9050601354811161235f57600d5434101561235e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235590614fcc565b60405180910390fd5b5b505b61236b338261325b565b6123bd81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612415816010546131fd90919063ffffffff16565b601081905550600f5460105410612442576000601260016101000a81548160ff0219169083151502179055505b6001600b8190555050565b612455612749565b73ffffffffffffffffffffffffffffffffffffffff16612473611787565b73ffffffffffffffffffffffffffffffffffffffff16146124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c09061444f565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b6000612500826135ff565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900460ff1681565b6125b6612749565b73ffffffffffffffffffffffffffffffffffffffff166125d4611787565b73ffffffffffffffffffffffffffffffffffffffff161461262a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126219061444f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561269a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126919061505e565b60405180910390fd5b6126a381613137565b50565b60115481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612742575061274182613669565b5b9050919050565b600033905090565b612759612ea2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae906150f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061515c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816128f26129e7565b11158015612901575060005482105b801561292e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006129f782612eac565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a62576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a83612749565b73ffffffffffffffffffffffffffffffffffffffff161480612ab25750612ab185612aac612749565b612507565b5b80612af75750612ac0612749565b73ffffffffffffffffffffffffffffffffffffffff16612adf84610b91565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b30576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b97576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba4858585600161374b565b612bb060008487612935565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e30576000548214612e2f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9b8585856001613751565b5050505050565b6000612710905090565b612eb4613c09565b600082905080612ec26129e7565b11613100576000548110156130ff576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130fd57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fe1578092505050613132565b5b6001156130fc57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130f7578092505050613132565b612fe2565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080828461320c919061517c565b905083811015613251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132489061521e565b60405180910390fd5b8091505092915050565b613275828260405180602001604052806000815250613757565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261329f612749565b8786866040518563ffffffff1660e01b81526004016132c19493929190615293565b6020604051808303816000875af19250505080156132fd57506040513d601f19601f820116820180604052508101906132fa91906152f4565b60015b613377573d806000811461332d576040519150601f19603f3d011682016040523d82523d6000602084013e613332565b606091505b5060008151141561336f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000808314156133dd576000905061343f565b600082846133eb9190614591565b90508284826133fa919061461a565b1461343a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343190615393565b60405180910390fd5b809150505b92915050565b6060600082141561348d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a1565b600082905060005b600082146134bf5780806134a8906153b3565b915050600a826134b8919061461a565b9150613495565b60008167ffffffffffffffff8111156134db576134da614092565b5b6040519080825280601f01601f19166020018201604052801561350d5781602001600182028036833780820191505090505b5090505b6000851461359a5760018261352691906153fc565b9150600a8561353591906147d1565b6030613541919061517c565b60f81b81838151811061355757613556615430565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613593919061461a565b9450613511565b8093505050505b919050565b6000828211156135eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e2906154ab565b60405180910390fd5b81836135f791906153fc565b905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061373457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613744575061374382613b19565b5b9050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156137ff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61380c600085838661374b565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506139cd8673ffffffffffffffffffffffffffffffffffffffff166126ac565b15613a92575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a426000878480600101955087613279565b613a78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106139d3578260005414613a8d57600080fd5b613afd565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613a93575b816000819055505050613b136000858386613751565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613b8f9061449e565b90600052602060002090601f016020900481019282613bb15760008555613bf8565b82601f10613bca57805160ff1916838001178555613bf8565b82800160010185558215613bf8579182015b82811115613bf7578251825591602001919060010190613bdc565b5b509050613c059190613c4c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c65576000816000905550600101613c4d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cb281613c7d565b8114613cbd57600080fd5b50565b600081359050613ccf81613ca9565b92915050565b600060208284031215613ceb57613cea613c73565b5b6000613cf984828501613cc0565b91505092915050565b60008115159050919050565b613d1781613d02565b82525050565b6000602082019050613d326000830184613d0e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6382613d38565b9050919050565b613d7381613d58565b8114613d7e57600080fd5b50565b600081359050613d9081613d6a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613db781613d96565b8114613dc257600080fd5b50565b600081359050613dd481613dae565b92915050565b60008060408385031215613df157613df0613c73565b5b6000613dff85828601613d81565b9250506020613e1085828601613dc5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e54578082015181840152602081019050613e39565b83811115613e63576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e8582613e1a565b613e8f8185613e25565b9350613e9f818560208601613e36565b613ea881613e69565b840191505092915050565b60006020820190508181036000830152613ecd8184613e7a565b905092915050565b6000819050919050565b613ee881613ed5565b8114613ef357600080fd5b50565b600081359050613f0581613edf565b92915050565b600060208284031215613f2157613f20613c73565b5b6000613f2f84828501613ef6565b91505092915050565b613f4181613d58565b82525050565b6000602082019050613f5c6000830184613f38565b92915050565b60008060408385031215613f7957613f78613c73565b5b6000613f8785828601613d81565b9250506020613f9885828601613ef6565b9150509250929050565b613fab81613ed5565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b600080600060608486031215613fe557613fe4613c73565b5b6000613ff386828701613d81565b935050602061400486828701613d81565b925050604061401586828701613ef6565b9150509250925092565b6000806040838503121561403657614035613c73565b5b600061404485828601613ef6565b925050602061405585828601613ef6565b9150509250929050565b60006040820190506140746000830185613f38565b6140816020830184613fa2565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140ca82613e69565b810181811067ffffffffffffffff821117156140e9576140e8614092565b5b80604052505050565b60006140fc613c69565b905061410882826140c1565b919050565b600067ffffffffffffffff82111561412857614127614092565b5b61413182613e69565b9050602081019050919050565b82818337600083830152505050565b600061416061415b8461410d565b6140f2565b90508281526020810184848401111561417c5761417b61408d565b5b61418784828561413e565b509392505050565b600082601f8301126141a4576141a3614088565b5b81356141b484826020860161414d565b91505092915050565b6000602082840312156141d3576141d2613c73565b5b600082013567ffffffffffffffff8111156141f1576141f0613c78565b5b6141fd8482850161418f565b91505092915050565b60006020828403121561421c5761421b613c73565b5b600061422a84828501613d81565b91505092915050565b61423c81613d02565b811461424757600080fd5b50565b60008135905061425981614233565b92915050565b6000806040838503121561427657614275613c73565b5b600061428485828601613d81565b92505060206142958582860161424a565b9150509250929050565b600067ffffffffffffffff8211156142ba576142b9614092565b5b6142c382613e69565b9050602081019050919050565b60006142e36142de8461429f565b6140f2565b9050828152602081018484840111156142ff576142fe61408d565b5b61430a84828561413e565b509392505050565b600082601f83011261432757614326614088565b5b81356143378482602086016142d0565b91505092915050565b6000806000806080858703121561435a57614359613c73565b5b600061436887828801613d81565b945050602061437987828801613d81565b935050604061438a87828801613ef6565b925050606085013567ffffffffffffffff8111156143ab576143aa613c78565b5b6143b787828801614312565b91505092959194509250565b600080604083850312156143da576143d9613c73565b5b60006143e885828601613d81565b92505060206143f985828601613d81565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614439602083613e25565b915061444482614403565b602082019050919050565b600060208201905081810360008301526144688161442c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144b657607f821691505b602082108114156144ca576144c961446f565b5b50919050565b7f5265717565737420776f756c64206578636565642062616c616e6365206f662060008201527f7468697320636f6e747261637400000000000000000000000000000000000000602082015250565b600061452c602d83613e25565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061459c82613ed5565b91506145a783613ed5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145e0576145df614562565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462582613ed5565b915061463083613ed5565b9250826146405761463f6145eb565b5b828204905092915050565b7f5265717565737420776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b60006146a7602983613e25565b91506146b28261464b565b604082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008160601b9050919050565b60006147248261470c565b9050919050565b600061473682614719565b9050919050565b61474e61474982613d58565b61472b565b82525050565b600081905092915050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b6000614795600183614754565b91506147a08261475f565b600182019050919050565b60006147b7828461473d565b6014820191506147c682614788565b915081905092915050565b60006147dc82613ed5565b91506147e783613ed5565b9250826147f7576147f66145eb565b5b828206905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614838601f83613e25565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ca602183613e25565b91506148d58261486e565b604082019050919050565b600060208201905081810360008301526148f9816148bd565b9050919050565b7f546865206e756d626572206f6620746f6b656e7320706572207265717565737460008201527f20657863656564732074686520616c6c6f776564206e756d6265720000000000602082015250565b600061495c603b83613e25565b915061496782614900565b604082019050919050565b6000602082019050818103600083015261498b8161494f565b9050919050565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e600082015250565b60006149c8602083613e25565b91506149d382614992565b602082019050919050565b600060208201905081810360008301526149f7816149bb565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613e25565b9150614a65826149fe565b604082019050919050565b60006020820190508181036000830152614a8981614a4d565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614ac6601f83613e25565b9150614ad182614a90565b602082019050919050565b60006020820190508181036000830152614af581614ab9565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614b32601583613e25565b9150614b3d82614afc565b602082019050919050565b60006020820190508181036000830152614b6181614b25565b9050919050565b60008190508160005260206000209050919050565b60008154614b8a8161449e565b614b948186614754565b94506001821660008114614baf5760018114614bc057614bf3565b60ff19831686528186019350614bf3565b614bc985614b68565b60005b83811015614beb57815481890152600182019150602081019050614bcc565b838801955050505b50505092915050565b6000614c0782613e1a565b614c118185614754565b9350614c21818560208601613e36565b80840191505092915050565b6000614c398285614b7d565b9150614c458284614bfc565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614c87600583614754565b9150614c9282614c51565b600582019050919050565b6000614ca98285614b7d565b9150614cb58284614bfc565b9150614cc082614c7a565b91508190509392505050565b7f46726565206d696e74206d7573742062652061637469766520746f206d696e7460008201527f20746f6b656e0000000000000000000000000000000000000000000000000000602082015250565b6000614d28602683613e25565b9150614d3382614ccc565b604082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b7f457863656564206d617820616c6c6f7720746f206672656520746f6b656e732060008201527f7065722077616c6c657400000000000000000000000000000000000000000000602082015250565b6000614dba602a83613e25565b9150614dc582614d5e565b604082019050919050565b60006020820190508181036000830152614de981614dad565b9050919050565b7f4e6f2066726565206d696e7473206c6566740000000000000000000000000000600082015250565b6000614e26601283613e25565b9150614e3182614df0565b602082019050919050565b60006020820190508181036000830152614e5581614e19565b9050919050565b7f4e6f2066726565206d696e7473206c65667420666f7220746869732077616c6c60008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb8602283613e25565b9150614ec382614e5c565b604082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b6000614f24601b83613e25565b9150614f2f82614eee565b602082019050919050565b60006020820190508181036000830152614f5381614f17565b9050919050565b7f596f75206d7573742070617920616e206164646974696f6e616c20666565207460008201527f6f20636f6d706c6574652074686973207472616e73616374696f6e2e00000000602082015250565b6000614fb6603c83613e25565b9150614fc182614f5a565b604082019050919050565b60006020820190508181036000830152614fe581614fa9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615048602683613e25565b915061505382614fec565b604082019050919050565b600060208201905081810360008301526150778161503b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006150da602a83613e25565b91506150e58261507e565b604082019050919050565b60006020820190508181036000830152615109816150cd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615146601983613e25565b915061515182615110565b602082019050919050565b6000602082019050818103600083015261517581615139565b9050919050565b600061518782613ed5565b915061519283613ed5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151c7576151c6614562565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615208601b83613e25565b9150615213826151d2565b602082019050919050565b60006020820190508181036000830152615237816151fb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152658261523e565b61526f8185615249565b935061527f818560208601613e36565b61528881613e69565b840191505092915050565b60006080820190506152a86000830187613f38565b6152b56020830186613f38565b6152c26040830185613fa2565b81810360608301526152d4818461525a565b905095945050505050565b6000815190506152ee81613ca9565b92915050565b60006020828403121561530a57615309613c73565b5b6000615318848285016152df565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061537d602183613e25565b915061538882615321565b604082019050919050565b600060208201905081810360008301526153ac81615370565b9050919050565b60006153be82613ed5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153f1576153f0614562565b5b600182019050919050565b600061540782613ed5565b915061541283613ed5565b92508282101561542557615424614562565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b6000615495601e83613e25565b91506154a08261545f565b602082019050919050565b600060208201905081810360008301526154c481615488565b905091905056fea2646970667358221220e4ba938f06f60ae1ef131fcd6420ad6a3f9d353a66848eed13c983b04002ede664736f6c634300080a0033697066733a2f2f6261667962656967366f756773666a66336b7a66376d71716f37763567656d3461637a636f63356465767669746b327163766637616e773537356d2f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000500abbb4346185997a6a5ddb4d4d67e31a1fdfd5000000000000000000000000000000000000000000000000000000000000000c53616d757261694265617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025342000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806378cf19e91161014f578063a22cb465116100c1578063db94b1ff1161007a578063db94b1ff14610953578063dc33e6811461096a578063e985e9c5146109a7578063eb8d2444146109e4578063f2fde38b14610a0f578063f47c84c514610a385761027d565b8063a22cb46514610863578063b88d4fde1461088c578063bc6c3544146108b5578063c634d032146108de578063c87b56dd146108fa578063d295162f146109375761027d565b80638de10ea1116101135780638de10ea114610753578063900c71f51461077c57806393115f4f146107a55780639551cc28146107d057806395d89b41146107fb578063982024f8146108265761027d565b806378cf19e91461066c5780637d73ff74146106955780637ff9b596146106c05780638b168d95146106eb5780638da5cb5b146107285761027d565b806335ee0fd2116101f35780636c0360eb116101ac5780636c0360eb146105705780636d88b4371461059b5780636f0570f8146105c45780636f8b44b0146105ef57806370a0823114610618578063715018a6146106555761027d565b806335ee0fd2146104765780633ccfd60b146104a157806342842e0e146104b857806355f804b3146104e15780636352211e1461050a5780636a61e5fc146105475761027d565b806318160ddd1161024557806318160ddd14610379578063205c2878146103a457806323b872dd146103cd5780632a55205a146103f657806334918dfd1461043457806334ebb9461461044b5761027d565b806301ffc9a71461028257806302fa7c47146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613cd5565b610a63565b6040516102b69190613d1d565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613dda565b610a75565b005b3480156102f457600080fd5b506102fd610aff565b60405161030a9190613eb3565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613f0b565b610b91565b6040516103479190613f47565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613f62565b610c0d565b005b34801561038557600080fd5b5061038e610d12565b60405161039b9190613fb1565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613f62565b610d29565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613fcc565b610e33565b005b34801561040257600080fd5b5061041d6004803603810190610418919061401f565b610e43565b60405161042b92919061405f565b60405180910390f35b34801561044057600080fd5b5061044961102e565b005b34801561045757600080fd5b506104606110d6565b60405161046d9190613fb1565b60405180910390f35b34801561048257600080fd5b5061048b6110dc565b6040516104989190613d1d565b60405180910390f35b3480156104ad57600080fd5b506104b66110ef565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613fcc565b6111ba565b005b3480156104ed57600080fd5b50610508600480360381019061050391906141bd565b6111da565b005b34801561051657600080fd5b50610531600480360381019061052c9190613f0b565b611270565b60405161053e9190613f47565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613f0b565b611286565b005b34801561057c57600080fd5b5061058561130c565b6040516105929190613eb3565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd919061401f565b61139a565b005b3480156105d057600080fd5b506105d9611466565b6040516105e69190613fb1565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613f0b565b61146c565b005b34801561062457600080fd5b5061063f600480360381019061063a9190614206565b6114f2565b60405161064c9190613fb1565b60405180910390f35b34801561066157600080fd5b5061066a6115c2565b005b34801561067857600080fd5b50610693600480360381019061068e9190613f62565b61164a565b005b3480156106a157600080fd5b506106aa611732565b6040516106b79190613fb1565b60405180910390f35b3480156106cc57600080fd5b506106d5611738565b6040516106e29190613fb1565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190614206565b61173e565b60405161071f9190613fb1565b60405180910390f35b34801561073457600080fd5b5061073d611787565b60405161074a9190613f47565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613f0b565b6117b1565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613f0b565b611837565b005b3480156107b157600080fd5b506107ba61191b565b6040516107c79190613fb1565b60405180910390f35b3480156107dc57600080fd5b506107e5611921565b6040516107f29190613fb1565b60405180910390f35b34801561080757600080fd5b50610810611926565b60405161081d9190613eb3565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190614206565b6119b8565b60405161085a9190613fb1565b60405180910390f35b34801561086f57600080fd5b5061088a6004803603810190610885919061425f565b6119f7565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614340565b611b6f565b005b3480156108c157600080fd5b506108dc60048036038101906108d79190613f0b565b611be7565b005b6108f860048036038101906108f39190613f0b565b611c6d565b005b34801561090657600080fd5b50610921600480360381019061091c9190613f0b565b611e5b565b60405161092e9190613eb3565b60405180910390f35b610951600480360381019061094c9190613f0b565b611f9d565b005b34801561095f57600080fd5b5061096861244d565b005b34801561097657600080fd5b50610991600480360381019061098c9190614206565b6124f5565b60405161099e9190613fb1565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906143c3565b612507565b6040516109db9190613d1d565b60405180910390f35b3480156109f057600080fd5b506109f961259b565b604051610a069190613d1d565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614206565b6125ae565b005b348015610a4457600080fd5b50610a4d6126a6565b604051610a5a9190613fb1565b60405180910390f35b6000610a6e826126cf565b9050919050565b610a7d612749565b73ffffffffffffffffffffffffffffffffffffffff16610a9b611787565b73ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae89061444f565b60405180910390fd5b610afb8282612751565b5050565b606060028054610b0e9061449e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3a9061449e565b8015610b875780601f10610b5c57610100808354040283529160200191610b87565b820191906000526020600020905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b6000610b9c826128e7565b610bd2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1882611270565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c80576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c9f612749565b73ffffffffffffffffffffffffffffffffffffffff1614610d0257610ccb81610cc6612749565b612507565b610d01576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610d0d838383612935565b505050565b6000610d1c6129e7565b6001546000540303905090565b610d31612749565b73ffffffffffffffffffffffffffffffffffffffff16610d4f611787565b73ffffffffffffffffffffffffffffffffffffffff1614610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c9061444f565b60405180910390fd5b47811115610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614542565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e2e573d6000803e3d6000fd5b505050565b610e3e8383836129ec565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610fd95760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fe3612ea2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661100f9190614591565b611019919061461a565b90508160000151819350935050509250929050565b611036612749565b73ffffffffffffffffffffffffffffffffffffffff16611054611787565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a19061444f565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b600e5481565b601260019054906101000a900460ff1681565b6110f7612749565b73ffffffffffffffffffffffffffffffffffffffff16611115611787565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111629061444f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b6573d6000803e3d6000fd5b5050565b6111d583838360405180602001604052806000815250611b6f565b505050565b6111e2612749565b73ffffffffffffffffffffffffffffffffffffffff16611200611787565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d9061444f565b60405180910390fd5b80600c908051906020019061126c929190613b83565b5050565b600061127b82612eac565b600001519050919050565b61128e612749565b73ffffffffffffffffffffffffffffffffffffffff166112ac611787565b73ffffffffffffffffffffffffffffffffffffffff1614611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061444f565b60405180910390fd5b80600d8190555050565b600c80546113199061449e565b80601f01602080910402602001604051908101604052809291908181526020018280546113459061449e565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b505050505081565b6113a2612749565b73ffffffffffffffffffffffffffffffffffffffff166113c0611787565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d9061444f565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff02191690831515021790555081600e8190555080600f8190555060006010819055505050565b600f5481565b611474612749565b73ffffffffffffffffffffffffffffffffffffffff16611492611787565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df9061444f565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115ca612749565b73ffffffffffffffffffffffffffffffffffffffff166115e8611787565b73ffffffffffffffffffffffffffffffffffffffff161461163e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116359061444f565b60405180910390fd5b6116486000613137565b565b611652612749565b73ffffffffffffffffffffffffffffffffffffffff16611670611787565b73ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd9061444f565b60405180910390fd5b6011546116e3826116d5610d12565b6131fd90919063ffffffff16565b1115611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906146bd565b60405180910390fd5b61172e828261325b565b5050565b60105481565b600d5481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b9612749565b73ffffffffffffffffffffffffffffffffffffffff166117d7611787565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118249061444f565b60405180910390fd5b8060138190555050565b61183f612749565b73ffffffffffffffffffffffffffffffffffffffff1661185d611787565b73ffffffffffffffffffffffffffffffffffffffff16146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa9061444f565b60405180910390fd5b60028114156118ec576001601560006101000a81548160ff021916908360018111156118e2576118e16146dd565b5b0217905550611918565b6000601560006101000a81548160ff02191690836001811115611912576119116146dd565b5b02179055505b50565b60135481565b601481565b6060600380546119359061449e565b80601f01602080910402602001604051908101604052809291908181526020018280546119619061449e565b80156119ae5780601f10611983576101008083540402835291602001916119ae565b820191906000526020600020905b81548152906001019060200180831161199157829003601f168201915b5050505050905090565b60006064826040516020016119cd91906147ab565b6040516020818303038152906040528051906020012060001c6119f091906147d1565b9050919050565b6119ff612749565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a71612749565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b1e612749565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b639190613d1d565b60405180910390a35050565b611b7a8484846129ec565b611b998373ffffffffffffffffffffffffffffffffffffffff166126ac565b15611be157611baa84848484613279565b611be0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611bef612749565b73ffffffffffffffffffffffffffffffffffffffff16611c0d611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a9061444f565b60405180910390fd5b80600e8190555050565b6002600b541415611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa9061484e565b60405180910390fd5b6002600b81905550601260009054906101000a900460ff16611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d01906148e0565b60405180910390fd5b6014811115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590614972565b60405180910390fd5b60008111611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906149de565b60405180910390fd5b601154611dae82611da0610d12565b6131fd90919063ffffffff16565b1115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614a70565b60405180910390fd5b34611e0582600d546133ca90919063ffffffff16565b1115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614adc565b60405180910390fd5b611e50338261325b565b6001600b8190555050565b6060611e66826128e7565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614b48565b60405180910390fd5b600180811115611eb857611eb76146dd565b5b601560009054906101000a900460ff166001811115611eda57611ed96146dd565b5b1415611f3e576000600c8054611eef9061449e565b905011611f0b5760405180602001604052806000815250611f37565b600c611f1683613445565b604051602001611f27929190614c2d565b6040516020818303038152906040525b9050611f98565b6000600c8054611f4d9061449e565b905011611f695760405180602001604052806000815250611f95565b600c611f7483613445565b604051602001611f85929190614c9d565b6040516020818303038152906040525b90505b919050565b6002600b541415611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda9061484e565b60405180910390fd5b6002600b81905550601260009054906101000a900460ff1661203a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612031906148e0565b60405180910390fd5b601260019054906101000a900460ff16612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090614d3e565b60405180910390fd5b600e548111156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614dd0565b60405180910390fd5b600f546120e760016010546131fd90919063ffffffff16565b1115612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614e3c565b60405180910390fd5b600e5461217e6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b11156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614ece565b60405180910390fd5b600f546121d7826010546131fd90919063ffffffff16565b11156121f7576121f4601054600f546135a690919063ffffffff16565b90505b600e5461224c82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b111561225757600190505b60115461227482612266610d12565b6131fd90919063ffffffff16565b11156122b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ac90614f3a565b60405180910390fd5b600081116122f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ef906149de565b60405180910390fd5b6000601354111561236157600061230e336119b8565b9050601354811161235f57600d5434101561235e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235590614fcc565b60405180910390fd5b5b505b61236b338261325b565b6123bd81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131fd90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612415816010546131fd90919063ffffffff16565b601081905550600f5460105410612442576000601260016101000a81548160ff0219169083151502179055505b6001600b8190555050565b612455612749565b73ffffffffffffffffffffffffffffffffffffffff16612473611787565b73ffffffffffffffffffffffffffffffffffffffff16146124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c09061444f565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b6000612500826135ff565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260009054906101000a900460ff1681565b6125b6612749565b73ffffffffffffffffffffffffffffffffffffffff166125d4611787565b73ffffffffffffffffffffffffffffffffffffffff161461262a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126219061444f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561269a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126919061505e565b60405180910390fd5b6126a381613137565b50565b60115481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612742575061274182613669565b5b9050919050565b600033905090565b612759612ea2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae906150f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061515c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816128f26129e7565b11158015612901575060005482105b801561292e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006129f782612eac565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a62576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a83612749565b73ffffffffffffffffffffffffffffffffffffffff161480612ab25750612ab185612aac612749565b612507565b5b80612af75750612ac0612749565b73ffffffffffffffffffffffffffffffffffffffff16612adf84610b91565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b30576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b97576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba4858585600161374b565b612bb060008487612935565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e30576000548214612e2f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9b8585856001613751565b5050505050565b6000612710905090565b612eb4613c09565b600082905080612ec26129e7565b11613100576000548110156130ff576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130fd57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fe1578092505050613132565b5b6001156130fc57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130f7578092505050613132565b612fe2565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080828461320c919061517c565b905083811015613251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132489061521e565b60405180910390fd5b8091505092915050565b613275828260405180602001604052806000815250613757565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261329f612749565b8786866040518563ffffffff1660e01b81526004016132c19493929190615293565b6020604051808303816000875af19250505080156132fd57506040513d601f19601f820116820180604052508101906132fa91906152f4565b60015b613377573d806000811461332d576040519150601f19603f3d011682016040523d82523d6000602084013e613332565b606091505b5060008151141561336f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000808314156133dd576000905061343f565b600082846133eb9190614591565b90508284826133fa919061461a565b1461343a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343190615393565b60405180910390fd5b809150505b92915050565b6060600082141561348d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a1565b600082905060005b600082146134bf5780806134a8906153b3565b915050600a826134b8919061461a565b9150613495565b60008167ffffffffffffffff8111156134db576134da614092565b5b6040519080825280601f01601f19166020018201604052801561350d5781602001600182028036833780820191505090505b5090505b6000851461359a5760018261352691906153fc565b9150600a8561353591906147d1565b6030613541919061517c565b60f81b81838151811061355757613556615430565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613593919061461a565b9450613511565b8093505050505b919050565b6000828211156135eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e2906154ab565b60405180910390fd5b81836135f791906153fc565b905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061373457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613744575061374382613b19565b5b9050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156137ff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61380c600085838661374b565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506139cd8673ffffffffffffffffffffffffffffffffffffffff166126ac565b15613a92575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a426000878480600101955087613279565b613a78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106139d3578260005414613a8d57600080fd5b613afd565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613a93575b816000819055505050613b136000858386613751565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613b8f9061449e565b90600052602060002090601f016020900481019282613bb15760008555613bf8565b82601f10613bca57805160ff1916838001178555613bf8565b82800160010185558215613bf8579182015b82811115613bf7578251825591602001919060010190613bdc565b5b509050613c059190613c4c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c65576000816000905550600101613c4d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cb281613c7d565b8114613cbd57600080fd5b50565b600081359050613ccf81613ca9565b92915050565b600060208284031215613ceb57613cea613c73565b5b6000613cf984828501613cc0565b91505092915050565b60008115159050919050565b613d1781613d02565b82525050565b6000602082019050613d326000830184613d0e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6382613d38565b9050919050565b613d7381613d58565b8114613d7e57600080fd5b50565b600081359050613d9081613d6a565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613db781613d96565b8114613dc257600080fd5b50565b600081359050613dd481613dae565b92915050565b60008060408385031215613df157613df0613c73565b5b6000613dff85828601613d81565b9250506020613e1085828601613dc5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e54578082015181840152602081019050613e39565b83811115613e63576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e8582613e1a565b613e8f8185613e25565b9350613e9f818560208601613e36565b613ea881613e69565b840191505092915050565b60006020820190508181036000830152613ecd8184613e7a565b905092915050565b6000819050919050565b613ee881613ed5565b8114613ef357600080fd5b50565b600081359050613f0581613edf565b92915050565b600060208284031215613f2157613f20613c73565b5b6000613f2f84828501613ef6565b91505092915050565b613f4181613d58565b82525050565b6000602082019050613f5c6000830184613f38565b92915050565b60008060408385031215613f7957613f78613c73565b5b6000613f8785828601613d81565b9250506020613f9885828601613ef6565b9150509250929050565b613fab81613ed5565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b600080600060608486031215613fe557613fe4613c73565b5b6000613ff386828701613d81565b935050602061400486828701613d81565b925050604061401586828701613ef6565b9150509250925092565b6000806040838503121561403657614035613c73565b5b600061404485828601613ef6565b925050602061405585828601613ef6565b9150509250929050565b60006040820190506140746000830185613f38565b6140816020830184613fa2565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140ca82613e69565b810181811067ffffffffffffffff821117156140e9576140e8614092565b5b80604052505050565b60006140fc613c69565b905061410882826140c1565b919050565b600067ffffffffffffffff82111561412857614127614092565b5b61413182613e69565b9050602081019050919050565b82818337600083830152505050565b600061416061415b8461410d565b6140f2565b90508281526020810184848401111561417c5761417b61408d565b5b61418784828561413e565b509392505050565b600082601f8301126141a4576141a3614088565b5b81356141b484826020860161414d565b91505092915050565b6000602082840312156141d3576141d2613c73565b5b600082013567ffffffffffffffff8111156141f1576141f0613c78565b5b6141fd8482850161418f565b91505092915050565b60006020828403121561421c5761421b613c73565b5b600061422a84828501613d81565b91505092915050565b61423c81613d02565b811461424757600080fd5b50565b60008135905061425981614233565b92915050565b6000806040838503121561427657614275613c73565b5b600061428485828601613d81565b92505060206142958582860161424a565b9150509250929050565b600067ffffffffffffffff8211156142ba576142b9614092565b5b6142c382613e69565b9050602081019050919050565b60006142e36142de8461429f565b6140f2565b9050828152602081018484840111156142ff576142fe61408d565b5b61430a84828561413e565b509392505050565b600082601f83011261432757614326614088565b5b81356143378482602086016142d0565b91505092915050565b6000806000806080858703121561435a57614359613c73565b5b600061436887828801613d81565b945050602061437987828801613d81565b935050604061438a87828801613ef6565b925050606085013567ffffffffffffffff8111156143ab576143aa613c78565b5b6143b787828801614312565b91505092959194509250565b600080604083850312156143da576143d9613c73565b5b60006143e885828601613d81565b92505060206143f985828601613d81565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614439602083613e25565b915061444482614403565b602082019050919050565b600060208201905081810360008301526144688161442c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144b657607f821691505b602082108114156144ca576144c961446f565b5b50919050565b7f5265717565737420776f756c64206578636565642062616c616e6365206f662060008201527f7468697320636f6e747261637400000000000000000000000000000000000000602082015250565b600061452c602d83613e25565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061459c82613ed5565b91506145a783613ed5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145e0576145df614562565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462582613ed5565b915061463083613ed5565b9250826146405761463f6145eb565b5b828204905092915050565b7f5265717565737420776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b60006146a7602983613e25565b91506146b28261464b565b604082019050919050565b600060208201905081810360008301526146d68161469a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008160601b9050919050565b60006147248261470c565b9050919050565b600061473682614719565b9050919050565b61474e61474982613d58565b61472b565b82525050565b600081905092915050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b6000614795600183614754565b91506147a08261475f565b600182019050919050565b60006147b7828461473d565b6014820191506147c682614788565b915081905092915050565b60006147dc82613ed5565b91506147e783613ed5565b9250826147f7576147f66145eb565b5b828206905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614838601f83613e25565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ca602183613e25565b91506148d58261486e565b604082019050919050565b600060208201905081810360008301526148f9816148bd565b9050919050565b7f546865206e756d626572206f6620746f6b656e7320706572207265717565737460008201527f20657863656564732074686520616c6c6f776564206e756d6265720000000000602082015250565b600061495c603b83613e25565b915061496782614900565b604082019050919050565b6000602082019050818103600083015261498b8161494f565b9050919050565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e600082015250565b60006149c8602083613e25565b91506149d382614992565b602082019050919050565b600060208201905081810360008301526149f7816149bb565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613e25565b9150614a65826149fe565b604082019050919050565b60006020820190508181036000830152614a8981614a4d565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614ac6601f83613e25565b9150614ad182614a90565b602082019050919050565b60006020820190508181036000830152614af581614ab9565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614b32601583613e25565b9150614b3d82614afc565b602082019050919050565b60006020820190508181036000830152614b6181614b25565b9050919050565b60008190508160005260206000209050919050565b60008154614b8a8161449e565b614b948186614754565b94506001821660008114614baf5760018114614bc057614bf3565b60ff19831686528186019350614bf3565b614bc985614b68565b60005b83811015614beb57815481890152600182019150602081019050614bcc565b838801955050505b50505092915050565b6000614c0782613e1a565b614c118185614754565b9350614c21818560208601613e36565b80840191505092915050565b6000614c398285614b7d565b9150614c458284614bfc565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614c87600583614754565b9150614c9282614c51565b600582019050919050565b6000614ca98285614b7d565b9150614cb58284614bfc565b9150614cc082614c7a565b91508190509392505050565b7f46726565206d696e74206d7573742062652061637469766520746f206d696e7460008201527f20746f6b656e0000000000000000000000000000000000000000000000000000602082015250565b6000614d28602683613e25565b9150614d3382614ccc565b604082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b7f457863656564206d617820616c6c6f7720746f206672656520746f6b656e732060008201527f7065722077616c6c657400000000000000000000000000000000000000000000602082015250565b6000614dba602a83613e25565b9150614dc582614d5e565b604082019050919050565b60006020820190508181036000830152614de981614dad565b9050919050565b7f4e6f2066726565206d696e7473206c6566740000000000000000000000000000600082015250565b6000614e26601283613e25565b9150614e3182614df0565b602082019050919050565b60006020820190508181036000830152614e5581614e19565b9050919050565b7f4e6f2066726565206d696e7473206c65667420666f7220746869732077616c6c60008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb8602283613e25565b9150614ec382614e5c565b604082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b6000614f24601b83613e25565b9150614f2f82614eee565b602082019050919050565b60006020820190508181036000830152614f5381614f17565b9050919050565b7f596f75206d7573742070617920616e206164646974696f6e616c20666565207460008201527f6f20636f6d706c6574652074686973207472616e73616374696f6e2e00000000602082015250565b6000614fb6603c83613e25565b9150614fc182614f5a565b604082019050919050565b60006020820190508181036000830152614fe581614fa9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615048602683613e25565b915061505382614fec565b604082019050919050565b600060208201905081810360008301526150778161503b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006150da602a83613e25565b91506150e58261507e565b604082019050919050565b60006020820190508181036000830152615109816150cd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615146601983613e25565b915061515182615110565b602082019050919050565b6000602082019050818103600083015261517581615139565b9050919050565b600061518782613ed5565b915061519283613ed5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151c7576151c6614562565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615208601b83613e25565b9150615213826151d2565b602082019050919050565b60006020820190508181036000830152615237816151fb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152658261523e565b61526f8185615249565b935061527f818560208601613e36565b61528881613e69565b840191505092915050565b60006080820190506152a86000830187613f38565b6152b56020830186613f38565b6152c26040830185613fa2565b81810360608301526152d4818461525a565b905095945050505050565b6000815190506152ee81613ca9565b92915050565b60006020828403121561530a57615309613c73565b5b6000615318848285016152df565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061537d602183613e25565b915061538882615321565b604082019050919050565b600060208201905081810360008301526153ac81615370565b9050919050565b60006153be82613ed5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153f1576153f0614562565b5b600182019050919050565b600061540782613ed5565b915061541283613ed5565b92508282101561542557615424614562565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b6000615495601e83613e25565b91506154a08261545f565b602082019050919050565b600060208201905081810360008301526154c481615488565b905091905056fea2646970667358221220e4ba938f06f60ae1ef131fcd6420ad6a3f9d353a66848eed13c983b04002ede664736f6c634300080a0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000500abbb4346185997a6a5ddb4d4d67e31a1fdfd5000000000000000000000000000000000000000000000000000000000000000c53616d757261694265617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025342000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): SamuraiBears
Arg [1] : symbol (string): SB
Arg [2] : royaltyReceiver (address): 0x500aBbb4346185997A6a5Ddb4D4d67e31A1fDFd5

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000500abbb4346185997a6a5ddb4d4d67e31a1fdfd5
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 53616d7572616942656172730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 5342000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

75785:7165:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82416:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82238:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45085:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46589:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46151:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41210:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77059:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47454:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70525:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;77648:89;;;;;;;;;;;;;:::i;:::-;;76114:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76344:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76910:140;;;;;;;;;;;;;:::i;:::-;;47695:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77542:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44893:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80525:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75895:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77854:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76162:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82061:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42339:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12543:103;;;;;;;;;;;;;:::i;:::-;;77280:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76210:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75997:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80640:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11892:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82628:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81589:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76389:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76062:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45254:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82808:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46865:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47951:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80785:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79911:606;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80947:634;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78175:1728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77745:101;;;;;;;;;;;;;:::i;:::-;;81939:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47223:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76303:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12801:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76262:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82416:204;82547:4;82576:36;82600:11;82576:23;:36::i;:::-;82569:43;;82416:204;;;:::o;82238:170::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82356:44:::1;82375:8;82385:14;82356:18;:44::i;:::-;82238:170:::0;;:::o;45085:100::-;45139:13;45172:5;45165:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45085:100;:::o;46589:204::-;46657:7;46682:16;46690:7;46682;:16::i;:::-;46677:64;;46707:34;;;;;;;;;;;;;;46677:64;46761:15;:24;46777:7;46761:24;;;;;;;;;;;;;;;;;;;;;46754:31;;46589:204;;;:::o;46151:372::-;46224:13;46240:24;46256:7;46240:15;:24::i;:::-;46224:40;;46285:5;46279:11;;:2;:11;;;46275:48;;;46299:24;;;;;;;;;;;;;;46275:48;46356:5;46340:21;;:12;:10;:12::i;:::-;:21;;;46336:139;;46367:37;46384:5;46391:12;:10;:12::i;:::-;46367:16;:37::i;:::-;46363:112;;46428:35;;;;;;;;;;;;;;46363:112;46336:139;46487:28;46496:2;46500:7;46509:5;46487:8;:28::i;:::-;46213:310;46151:372;;:::o;41210:312::-;41263:7;41488:15;:13;:15::i;:::-;41473:12;;41457:13;;:28;:46;41450:53;;41210:312;:::o;77059:212::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77153:21:::1;77143:6;:31;;77135:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;77243:2;77235:20;;:28;77256:6;77235:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77059:212:::0;;:::o;47454:170::-;47588:28;47598:4;47604:2;47608:7;47588:9;:28::i;:::-;47454:170;;;:::o;70525:494::-;70669:7;70678;70703:26;70732:17;:27;70750:8;70732:27;;;;;;;;;;;70703:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70804:1;70776:30;;:7;:16;;;:30;;;70772:92;;;70833:19;70823:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70772:92;70876:21;70941:17;:15;:17::i;:::-;70900:58;;70914:7;:23;;;70901:36;;:10;:36;;;;:::i;:::-;70900:58;;;;:::i;:::-;70876:82;;70979:7;:16;;;70997:13;70971:40;;;;;;70525:494;;;;;:::o;77648:89::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77717:12:::1;;;;;;;;;;;77716:13;77701:12;;:28;;;;;;;;;;;;;;;;;;77648:89::o:0;76114:39::-;;;;:::o;76344:36::-;;;;;;;;;;;;;:::o;76910:140::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76958:12:::1;76973:21;76958:36;;77013:10;77005:28;;:37;77034:7;77005:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76947:103;76910:140::o:0;47695:185::-;47833:39;47850:4;47856:2;47860:7;47833:39;;;;;;;;;;;;:16;:39::i;:::-;47695:185;;;:::o;77542:94::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77622:6:::1;77612:7;:16;;;;;;;;;;;;:::i;:::-;;77542:94:::0;:::o;44893:125::-;44957:7;44984:21;44997:7;44984:12;:21::i;:::-;:26;;;44977:33;;44893:125;;;:::o;80525:107::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80611:13:::1;80598:10;:26;;;;80525:107:::0;:::o;75895:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77854:309::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77976:4:::1;77961:12;;:19;;;;;;;;;;;;;;;;;;78010:4;77991:16;;:23;;;;;;;;;;;;;;;;;;78051:24;78025:23;:50;;;;78102:14;78086:13;:30;;;;78154:1;78127:24;:28;;;;77854:309:::0;;:::o;76162:35::-;;;;:::o;82061:101::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82144:10:::1;82131;:23;;;;82061:101:::0;:::o;42339:206::-;42403:7;42444:1;42427:19;;:5;:19;;;42423:60;;;42455:28;;;;;;;;;;;;;;42423:60;42509:12;:19;42522:5;42509:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42501:36;;42494:43;;42339:206;;;:::o;12543:103::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12608:30:::1;12635:1;12608:18;:30::i;:::-;12543:103::o:0;77280:241::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77417:10:::1;;77380:33;77398:14;77380:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;77372:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;77484:29;77494:2;77498:14;77484:9;:29::i;:::-;77280:241:::0;;:::o;76210:43::-;;;;:::o;75997:45::-;;;;:::o;80640:134::-;80701:7;80728:33;:38;80762:3;80728:38;;;;;;;;;;;;;;;;80721:45;;80640:134;;;:::o;11892:87::-;11938:7;11965:6;;;;;;;;;;;11958:13;;11892:87;:::o;82628:172::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82763:29:::1;82732:28;:60;;;;82628:172:::0;:::o;81589:223::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81670:1:::1;81662:4;:9;81658:147;;;81703:21;81688:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;81658:147;;;81772:21;81757:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;81658:147;81589:223:::0;:::o;76389:45::-;;;;:::o;76062:43::-;76103:2;76062:43;:::o;45254:104::-;45310:13;45343:7;45336:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45254:104;:::o;82808:139::-;82865:4;82936:3;82921;82904:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;82894:37;;;;;;82888:45;;:51;;;;:::i;:::-;82881:58;;82808:139;;;:::o;46865:287::-;46976:12;:10;:12::i;:::-;46964:24;;:8;:24;;;46960:54;;;46997:17;;;;;;;;;;;;;;46960:54;47072:8;47027:18;:32;47046:12;:10;:12::i;:::-;47027:32;;;;;;;;;;;;;;;:42;47060:8;47027:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;47125:8;47096:48;;47111:12;:10;:12::i;:::-;47096:48;;;47135:8;47096:48;;;;;;:::i;:::-;;;;;;;;46865:287;;:::o;47951:370::-;48118:28;48128:4;48134:2;48138:7;48118:9;:28::i;:::-;48161:15;:2;:13;;;:15::i;:::-;48157:157;;;48182:56;48213:4;48219:2;48223:7;48232:5;48182:30;:56::i;:::-;48178:136;;48262:40;;;;;;;;;;;;;;48178:136;48157:157;47951:370;;;;:::o;80785:154::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80907:24:::1;80881:23;:50;;;;80785:154:::0;:::o;79911:606::-;74836:1;75434:7;;:19;;75426:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74836:1;75567:7;:18;;;;79998:12:::1;;;;;;;;;;;79990:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;76103:2;80067:14;:35;;80059:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;80202:1;80185:14;:18;80177:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;80296:10;;80259:33;80277:14;80259:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;80251:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;80406:9;80372:30;80387:14;80372:10;;:14;;:30;;;;:::i;:::-;:43;;80364:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;80472:37;80482:10;80494:14;80472:9;:37::i;:::-;74792:1:::0;75746:7;:22;;;;79911:606;:::o;80947:634::-;81013:13;81053:17;81061:8;81053:7;:17::i;:::-;81045:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;81127:21;81111:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;81107:467;;;81194:1;81176:7;81170:21;;;;;:::i;:::-;;;:25;:165;;;;;;;;;;;;;;;;;81252:7;81276:26;81293:8;81276:16;:26::i;:::-;81219:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81170:165;81163:172;;;;81107:467;81397:1;81379:7;81373:21;;;;;:::i;:::-;;;:25;:189;;;;;;;;;;;;;;;;;81455:7;81479:26;81496:8;81479:16;:26::i;:::-;81422:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81373:189;81366:196;;80947:634;;;;:::o;78175:1728::-;74836:1;75434:7;;:19;;75426:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74836:1;75567:7;:18;;;;78266:12:::1;;;;;;;;;;;78258:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;78335:16;;;;;;;;;;;78327:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;78431:23;;78413:14;:41;;78405:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;78555:13;;78520:31;78549:1;78520:24;;:28;;:31;;;;:::i;:::-;:48;;78512:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;78666:23;;78610:52;78660:1;78610:33;:45;78644:10;78610:45;;;;;;;;;;;;;;;;:49;;:52;;;;:::i;:::-;:79;;78602:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;78791:13;;78744:44;78773:14;78744:24;;:28;;:44;;;;:::i;:::-;:60;78741:153;;;78837:45;78856:24;;78837:13;;:17;;:45;;;;:::i;:::-;78820:62;;78741:153;78975:23;;78907:65;78957:14;78907:33;:45;78941:10;78907:45;;;;;;;;;;;;;;;;:49;;:65;;;;:::i;:::-;:91;78904:140;;;79031:1;79014:18;;78904:140;79101:10;;79064:33;79082:14;79064:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;79056:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;79179:1;79162:14;:18;79154:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;79272:1;79241:28;;:32;79238:292;;;79290:12;79305:25;79319:10;79305:13;:25::i;:::-;79290:40;;79359:28;;79348:7;:39;79345:174;;79428:10;;79415:9;:23;;79407:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;79345:174;79275:255;79238:292;79542:37;79552:10;79564:14;79542:9;:37::i;:::-;79640:67;79691:14;79640:33;:45;79674:10;79640:45;;;;;;;;;;;;;;;;:49;;:67;;;;:::i;:::-;79592:33;:45;79626:10;79592:45;;;;;;;;;;;;;;;:115;;;;79745:44;79774:14;79745:24;;:28;;:44;;;;:::i;:::-;79718:24;:71;;;;79831:13;;79803:24;;:41;79800:96;;79879:5;79860:16;;:24;;;;;;;;;;;;;;;;;;79800:96;74792:1:::0;75746:7;:22;;;;78175:1728;:::o;77745:101::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77822:16:::1;;;;;;;;;;;77821:17;77802:16;;:36;;;;;;;;;;;;;;;;;;77745:101::o:0;81939:113::-;81997:7;82024:20;82038:5;82024:13;:20::i;:::-;82017:27;;81939:113;;;:::o;47223:164::-;47320:4;47344:18;:25;47363:5;47344:25;;;;;;;;;;;;;;;:35;47370:8;47344:35;;;;;;;;;;;;;;;;;;;;;;;;;47337:42;;47223:164;;;;:::o;76303:32::-;;;;;;;;;;;;;:::o;12801:201::-;12123:12;:10;:12::i;:::-;12112:23;;:7;:5;:7::i;:::-;:23;;;12104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12910:1:::1;12890:22;;:8;:22;;;;12882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12966:28;12985:8;12966:18;:28::i;:::-;12801:201:::0;:::o;76262:32::-;;;;:::o;14510:326::-;14570:4;14827:1;14805:7;:19;;;:23;14798:30;;14510:326;;;:::o;70255:215::-;70357:4;70396:26;70381:41;;;:11;:41;;;;:81;;;;70426:36;70450:11;70426:23;:36::i;:::-;70381:81;70374:88;;70255:215;;;:::o;726:98::-;779:7;806:10;799:17;;726:98;:::o;71669:332::-;71788:17;:15;:17::i;:::-;71772:33;;:12;:33;;;;71764:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;71891:1;71871:22;;:8;:22;;;;71863:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;71958:35;;;;;;;;71970:8;71958:35;;;;;;71980:12;71958:35;;;;;71936:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71669:332;;:::o;48576:174::-;48633:4;48676:7;48657:15;:13;:15::i;:::-;:26;;:53;;;;;48697:13;;48687:7;:23;48657:53;:85;;;;;48715:11;:20;48727:7;48715:20;;;;;;;;;;;:27;;;;;;;;;;;;48714:28;48657:85;48650:92;;48576:174;;;:::o;57798:196::-;57940:2;57913:15;:24;57929:7;57913:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57978:7;57974:2;57958:28;;57967:5;57958:28;;;;;;;;;;;;57798:196;;;:::o;40984:92::-;41040:7;40984:92;:::o;52746:2130::-;52861:35;52899:21;52912:7;52899:12;:21::i;:::-;52861:59;;52959:4;52937:26;;:13;:18;;;:26;;;52933:67;;52972:28;;;;;;;;;;;;;;52933:67;53013:22;53055:4;53039:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;53076:36;53093:4;53099:12;:10;:12::i;:::-;53076:16;:36::i;:::-;53039:73;:126;;;;53153:12;:10;:12::i;:::-;53129:36;;:20;53141:7;53129:11;:20::i;:::-;:36;;;53039:126;53013:153;;53184:17;53179:66;;53210:35;;;;;;;;;;;;;;53179:66;53274:1;53260:16;;:2;:16;;;53256:52;;;53285:23;;;;;;;;;;;;;;53256:52;53321:43;53343:4;53349:2;53353:7;53362:1;53321:21;:43::i;:::-;53429:35;53446:1;53450:7;53459:4;53429:8;:35::i;:::-;53790:1;53760:12;:18;53773:4;53760:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53834:1;53806:12;:16;53819:2;53806:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53852:31;53886:11;:20;53898:7;53886:20;;;;;;;;;;;53852:54;;53937:2;53921:8;:13;;;:18;;;;;;;;;;;;;;;;;;53987:15;53954:8;:23;;;:49;;;;;;;;;;;;;;;;;;54255:19;54287:1;54277:7;:11;54255:33;;54303:31;54337:11;:24;54349:11;54337:24;;;;;;;;;;;54303:58;;54405:1;54380:27;;:8;:13;;;;;;;;;;;;:27;;;54376:384;;;54590:13;;54575:11;:28;54571:174;;54644:4;54628:8;:13;;;:20;;;;;;;;;;;;;;;;;;54697:13;:28;;;54671:8;:23;;;:54;;;;;;;;;;;;;;;;;;54571:174;54376:384;53735:1036;;;54807:7;54803:2;54788:27;;54797:4;54788:27;;;;;;;;;;;;54826:42;54847:4;54853:2;54857:7;54866:1;54826:20;:42::i;:::-;52850:2026;;52746:2130;;;:::o;71301:97::-;71359:6;71385:5;71378:12;;71301:97;:::o;43720:1111::-;43782:21;;:::i;:::-;43816:12;43831:7;43816:22;;43899:4;43880:15;:13;:15::i;:::-;:23;43876:888;;43916:13;;43909:4;:20;43905:859;;;43950:31;43984:11;:17;43996:4;43984:17;;;;;;;;;;;43950:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44025:9;:16;;;44020:729;;44096:1;44070:28;;:9;:14;;;:28;;;44066:101;;44134:9;44127:16;;;;;;44066:101;44469:261;44476:4;44469:261;;;44509:6;;;;;;;;44554:11;:17;44566:4;44554:17;;;;;;;;;;;44542:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44628:1;44602:28;;:9;:14;;;:28;;;44598:109;;44670:9;44663:16;;;;;;44598:109;44469:261;;;44020:729;43931:833;43905:859;43876:888;44792:31;;;;;;;;;;;;;;43720:1111;;;;:::o;13162:191::-;13236:16;13255:6;;;;;;;;;;;13236:25;;13281:8;13272:6;;:17;;;;;;;;;;;;;;;;;;13336:8;13305:40;;13326:8;13305:40;;;;;;;;;;;;13225:128;13162:191;:::o;63488:179::-;63546:7;63566:9;63582:1;63578;:5;;;;:::i;:::-;63566:17;;63607:1;63602;:6;;63594:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63658:1;63651:8;;;63488:179;;;;:::o;48834:104::-;48903:27;48913:2;48917:8;48903:27;;;;;;;;;;;;:9;:27::i;:::-;48834:104;;:::o;58486:667::-;58649:4;58686:2;58670:36;;;58707:12;:10;:12::i;:::-;58721:4;58727:7;58736:5;58670:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58666:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58921:1;58904:6;:13;:18;58900:235;;;58950:40;;;;;;;;;;;;;;58900:235;59093:6;59087:13;59078:6;59074:2;59070:15;59063:38;58666:480;58799:45;;;58789:55;;;:6;:55;;;;58782:62;;;58486:667;;;;;;:::o;64367:220::-;64425:7;64454:1;64449;:6;64445:20;;;64464:1;64457:8;;;;64445:20;64476:9;64492:1;64488;:5;;;;:::i;:::-;64476:17;;64521:1;64516;64512;:5;;;;:::i;:::-;:10;64504:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;64578:1;64571:8;;;64367:220;;;;;:::o;22064:723::-;22120:13;22350:1;22341:5;:10;22337:53;;;22368:10;;;;;;;;;;;;;;;;;;;;;22337:53;22400:12;22415:5;22400:20;;22431:14;22456:78;22471:1;22463:4;:9;22456:78;;22489:8;;;;;:::i;:::-;;;;22520:2;22512:10;;;;;:::i;:::-;;;22456:78;;;22544:19;22576:6;22566:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22544:39;;22594:154;22610:1;22601:5;:10;22594:154;;22638:1;22628:11;;;;;:::i;:::-;;;22705:2;22697:5;:10;;;;:::i;:::-;22684:2;:24;;;;:::i;:::-;22671:39;;22654:6;22661;22654:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22734:2;22725:11;;;;;:::i;:::-;;;22594:154;;;22772:6;22758:21;;;;;22064:723;;;;:::o;63950:158::-;64008:7;64041:1;64036;:6;;64028:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64099:1;64095;:5;;;;:::i;:::-;64088:12;;63950:158;;;;:::o;42627:137::-;42688:7;42723:12;:19;42736:5;42723:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;42715:41;;42708:48;;42627:137;;;:::o;41970:305::-;42072:4;42124:25;42109:40;;;:11;:40;;;;:105;;;;42181:33;42166:48;;;:11;:48;;;;42109:105;:158;;;;42231:36;42255:11;42231:23;:36::i;:::-;42109:158;42089:178;;41970:305;;;:::o;59801:159::-;;;;;:::o;60619:158::-;;;;;:::o;49311:1749::-;49434:20;49457:13;;49434:36;;49499:1;49485:16;;:2;:16;;;49481:48;;;49510:19;;;;;;;;;;;;;;49481:48;49556:1;49544:8;:13;49540:44;;;49566:18;;;;;;;;;;;;;;49540:44;49597:61;49627:1;49631:2;49635:12;49649:8;49597:21;:61::i;:::-;49970:8;49935:12;:16;49948:2;49935:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50034:8;49994:12;:16;50007:2;49994:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50093:2;50060:11;:25;50072:12;50060:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50160:15;50110:11;:25;50122:12;50110:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50193:20;50216:12;50193:35;;50243:11;50272:8;50257:12;:23;50243:37;;50301:15;:2;:13;;;:15::i;:::-;50297:631;;;50337:313;50393:12;50389:2;50368:38;;50385:1;50368:38;;;;;;;;;;;;50434:69;50473:1;50477:2;50481:14;;;;;;50497:5;50434:30;:69::i;:::-;50429:174;;50539:40;;;;;;;;;;;;;;50429:174;50645:3;50630:12;:18;50337:313;;50731:12;50714:13;;:29;50710:43;;50745:8;;;50710:43;50297:631;;;50794:119;50850:14;;;;;;50846:2;50825:40;;50842:1;50825:40;;;;;;;;;;;;50908:3;50893:12;:18;50794:119;;50297:631;50958:12;50942:13;:28;;;;49910:1072;;50992:60;51021:1;51025:2;51029:12;51043:8;50992:20;:60::i;:::-;49423:1637;49311:1749;;;:::o;10750:157::-;10835:4;10874:25;10859:40;;;:11;:40;;;;10852:47;;10750:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:307::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3344:1;3339:3;3335:11;3329:18;3325:1;3320:3;3316:11;3309:39;3281:2;3278:1;3274:10;3269:15;;3245:113;;;3376:6;3373:1;3370:13;3367:101;;;3456:1;3447:6;3442:3;3438:16;3431:27;3367:101;3216:258;3167:307;;;:::o;3480:102::-;3521:6;3572:2;3568:7;3563:2;3556:5;3552:14;3548:28;3538:38;;3480:102;;;:::o;3588:364::-;3676:3;3704:39;3737:5;3704:39;:::i;:::-;3759:71;3823:6;3818:3;3759:71;:::i;:::-;3752:78;;3839:52;3884:6;3879:3;3872:4;3865:5;3861:16;3839:52;:::i;:::-;3916:29;3938:6;3916:29;:::i;:::-;3911:3;3907:39;3900:46;;3680:272;3588:364;;;;:::o;3958:313::-;4071:4;4109:2;4098:9;4094:18;4086:26;;4158:9;4152:4;4148:20;4144:1;4133:9;4129:17;4122:47;4186:78;4259:4;4250:6;4186:78;:::i;:::-;4178:86;;3958:313;;;;:::o;4277:77::-;4314:7;4343:5;4332:16;;4277:77;;;:::o;4360:122::-;4433:24;4451:5;4433:24;:::i;:::-;4426:5;4423:35;4413:63;;4472:1;4469;4462:12;4413:63;4360:122;:::o;4488:139::-;4534:5;4572:6;4559:20;4550:29;;4588:33;4615:5;4588:33;:::i;:::-;4488:139;;;;:::o;4633:329::-;4692:6;4741:2;4729:9;4720:7;4716:23;4712:32;4709:119;;;4747:79;;:::i;:::-;4709:119;4867:1;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4838:117;4633:329;;;;:::o;4968:118::-;5055:24;5073:5;5055:24;:::i;:::-;5050:3;5043:37;4968:118;;:::o;5092:222::-;5185:4;5223:2;5212:9;5208:18;5200:26;;5236:71;5304:1;5293:9;5289:17;5280:6;5236:71;:::i;:::-;5092:222;;;;:::o;5320:474::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:53;5769:7;5760:6;5749:9;5745:22;5724:53;:::i;:::-;5714:63;;5669:118;5320:474;;;;;:::o;5800:118::-;5887:24;5905:5;5887:24;:::i;:::-;5882:3;5875:37;5800:118;;:::o;5924:222::-;6017:4;6055:2;6044:9;6040:18;6032:26;;6068:71;6136:1;6125:9;6121:17;6112:6;6068:71;:::i;:::-;5924:222;;;;:::o;6152:619::-;6229:6;6237;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6420:1;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6391:117;6547:2;6573:53;6618:7;6609:6;6598:9;6594:22;6573:53;:::i;:::-;6563:63;;6518:118;6675:2;6701:53;6746:7;6737:6;6726:9;6722:22;6701:53;:::i;:::-;6691:63;;6646:118;6152:619;;;;;:::o;6777:474::-;6845:6;6853;6902:2;6890:9;6881:7;6877:23;6873:32;6870:119;;;6908:79;;:::i;:::-;6870:119;7028:1;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6999:117;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6777:474;;;;;:::o;7257:332::-;7378:4;7416:2;7405:9;7401:18;7393:26;;7429:71;7497:1;7486:9;7482:17;7473:6;7429:71;:::i;:::-;7510:72;7578:2;7567:9;7563:18;7554:6;7510:72;:::i;:::-;7257:332;;;;;:::o;7595:117::-;7704:1;7701;7694:12;7718:117;7827:1;7824;7817:12;7841:180;7889:77;7886:1;7879:88;7986:4;7983:1;7976:15;8010:4;8007:1;8000:15;8027:281;8110:27;8132:4;8110:27;:::i;:::-;8102:6;8098:40;8240:6;8228:10;8225:22;8204:18;8192:10;8189:34;8186:62;8183:88;;;8251:18;;:::i;:::-;8183:88;8291:10;8287:2;8280:22;8070:238;8027:281;;:::o;8314:129::-;8348:6;8375:20;;:::i;:::-;8365:30;;8404:33;8432:4;8424:6;8404:33;:::i;:::-;8314:129;;;:::o;8449:308::-;8511:4;8601:18;8593:6;8590:30;8587:56;;;8623:18;;:::i;:::-;8587:56;8661:29;8683:6;8661:29;:::i;:::-;8653:37;;8745:4;8739;8735:15;8727:23;;8449:308;;;:::o;8763:154::-;8847:6;8842:3;8837;8824:30;8909:1;8900:6;8895:3;8891:16;8884:27;8763:154;;;:::o;8923:412::-;9001:5;9026:66;9042:49;9084:6;9042:49;:::i;:::-;9026:66;:::i;:::-;9017:75;;9115:6;9108:5;9101:21;9153:4;9146:5;9142:16;9191:3;9182:6;9177:3;9173:16;9170:25;9167:112;;;9198:79;;:::i;:::-;9167:112;9288:41;9322:6;9317:3;9312;9288:41;:::i;:::-;9007:328;8923:412;;;;;:::o;9355:340::-;9411:5;9460:3;9453:4;9445:6;9441:17;9437:27;9427:122;;9468:79;;:::i;:::-;9427:122;9585:6;9572:20;9610:79;9685:3;9677:6;9670:4;9662:6;9658:17;9610:79;:::i;:::-;9601:88;;9417:278;9355:340;;;;:::o;9701:509::-;9770:6;9819:2;9807:9;9798:7;9794:23;9790:32;9787:119;;;9825:79;;:::i;:::-;9787:119;9973:1;9962:9;9958:17;9945:31;10003:18;9995:6;9992:30;9989:117;;;10025:79;;:::i;:::-;9989:117;10130:63;10185:7;10176:6;10165:9;10161:22;10130:63;:::i;:::-;10120:73;;9916:287;9701:509;;;;:::o;10216:329::-;10275:6;10324:2;10312:9;10303:7;10299:23;10295:32;10292:119;;;10330:79;;:::i;:::-;10292:119;10450:1;10475:53;10520:7;10511:6;10500:9;10496:22;10475:53;:::i;:::-;10465:63;;10421:117;10216:329;;;;:::o;10551:116::-;10621:21;10636:5;10621:21;:::i;:::-;10614:5;10611:32;10601:60;;10657:1;10654;10647:12;10601:60;10551:116;:::o;10673:133::-;10716:5;10754:6;10741:20;10732:29;;10770:30;10794:5;10770:30;:::i;:::-;10673:133;;;;:::o;10812:468::-;10877:6;10885;10934:2;10922:9;10913:7;10909:23;10905:32;10902:119;;;10940:79;;:::i;:::-;10902:119;11060:1;11085:53;11130:7;11121:6;11110:9;11106:22;11085:53;:::i;:::-;11075:63;;11031:117;11187:2;11213:50;11255:7;11246:6;11235:9;11231:22;11213:50;:::i;:::-;11203:60;;11158:115;10812:468;;;;;:::o;11286:307::-;11347:4;11437:18;11429:6;11426:30;11423:56;;;11459:18;;:::i;:::-;11423:56;11497:29;11519:6;11497:29;:::i;:::-;11489:37;;11581:4;11575;11571:15;11563:23;;11286:307;;;:::o;11599:410::-;11676:5;11701:65;11717:48;11758:6;11717:48;:::i;:::-;11701:65;:::i;:::-;11692:74;;11789:6;11782:5;11775:21;11827:4;11820:5;11816:16;11865:3;11856:6;11851:3;11847:16;11844:25;11841:112;;;11872:79;;:::i;:::-;11841:112;11962:41;11996:6;11991:3;11986;11962:41;:::i;:::-;11682:327;11599:410;;;;;:::o;12028:338::-;12083:5;12132:3;12125:4;12117:6;12113:17;12109:27;12099:122;;12140:79;;:::i;:::-;12099:122;12257:6;12244:20;12282:78;12356:3;12348:6;12341:4;12333:6;12329:17;12282:78;:::i;:::-;12273:87;;12089:277;12028:338;;;;:::o;12372:943::-;12467:6;12475;12483;12491;12540:3;12528:9;12519:7;12515:23;12511:33;12508:120;;;12547:79;;:::i;:::-;12508:120;12667:1;12692:53;12737:7;12728:6;12717:9;12713:22;12692:53;:::i;:::-;12682:63;;12638:117;12794:2;12820:53;12865:7;12856:6;12845:9;12841:22;12820:53;:::i;:::-;12810:63;;12765:118;12922:2;12948:53;12993:7;12984:6;12973:9;12969:22;12948:53;:::i;:::-;12938:63;;12893:118;13078:2;13067:9;13063:18;13050:32;13109:18;13101:6;13098:30;13095:117;;;13131:79;;:::i;:::-;13095:117;13236:62;13290:7;13281:6;13270:9;13266:22;13236:62;:::i;:::-;13226:72;;13021:287;12372:943;;;;;;;:::o;13321:474::-;13389:6;13397;13446:2;13434:9;13425:7;13421:23;13417:32;13414:119;;;13452:79;;:::i;:::-;13414:119;13572:1;13597:53;13642:7;13633:6;13622:9;13618:22;13597:53;:::i;:::-;13587:63;;13543:117;13699:2;13725:53;13770:7;13761:6;13750:9;13746:22;13725:53;:::i;:::-;13715:63;;13670:118;13321:474;;;;;:::o;13801:182::-;13941:34;13937:1;13929:6;13925:14;13918:58;13801:182;:::o;13989:366::-;14131:3;14152:67;14216:2;14211:3;14152:67;:::i;:::-;14145:74;;14228:93;14317:3;14228:93;:::i;:::-;14346:2;14341:3;14337:12;14330:19;;13989:366;;;:::o;14361:419::-;14527:4;14565:2;14554:9;14550:18;14542:26;;14614:9;14608:4;14604:20;14600:1;14589:9;14585:17;14578:47;14642:131;14768:4;14642:131;:::i;:::-;14634:139;;14361:419;;;:::o;14786:180::-;14834:77;14831:1;14824:88;14931:4;14928:1;14921:15;14955:4;14952:1;14945:15;14972:320;15016:6;15053:1;15047:4;15043:12;15033:22;;15100:1;15094:4;15090:12;15121:18;15111:81;;15177:4;15169:6;15165:17;15155:27;;15111:81;15239:2;15231:6;15228:14;15208:18;15205:38;15202:84;;;15258:18;;:::i;:::-;15202:84;15023:269;14972:320;;;:::o;15298:232::-;15438:34;15434:1;15426:6;15422:14;15415:58;15507:15;15502:2;15494:6;15490:15;15483:40;15298:232;:::o;15536:366::-;15678:3;15699:67;15763:2;15758:3;15699:67;:::i;:::-;15692:74;;15775:93;15864:3;15775:93;:::i;:::-;15893:2;15888:3;15884:12;15877:19;;15536:366;;;:::o;15908:419::-;16074:4;16112:2;16101:9;16097:18;16089:26;;16161:9;16155:4;16151:20;16147:1;16136:9;16132:17;16125:47;16189:131;16315:4;16189:131;:::i;:::-;16181:139;;15908:419;;;:::o;16333:180::-;16381:77;16378:1;16371:88;16478:4;16475:1;16468:15;16502:4;16499:1;16492:15;16519:348;16559:7;16582:20;16600:1;16582:20;:::i;:::-;16577:25;;16616:20;16634:1;16616:20;:::i;:::-;16611:25;;16804:1;16736:66;16732:74;16729:1;16726:81;16721:1;16714:9;16707:17;16703:105;16700:131;;;16811:18;;:::i;:::-;16700:131;16859:1;16856;16852:9;16841:20;;16519:348;;;;:::o;16873:180::-;16921:77;16918:1;16911:88;17018:4;17015:1;17008:15;17042:4;17039:1;17032:15;17059:185;17099:1;17116:20;17134:1;17116:20;:::i;:::-;17111:25;;17150:20;17168:1;17150:20;:::i;:::-;17145:25;;17189:1;17179:35;;17194:18;;:::i;:::-;17179:35;17236:1;17233;17229:9;17224:14;;17059:185;;;;:::o;17250:228::-;17390:34;17386:1;17378:6;17374:14;17367:58;17459:11;17454:2;17446:6;17442:15;17435:36;17250:228;:::o;17484:366::-;17626:3;17647:67;17711:2;17706:3;17647:67;:::i;:::-;17640:74;;17723:93;17812:3;17723:93;:::i;:::-;17841:2;17836:3;17832:12;17825:19;;17484:366;;;:::o;17856:419::-;18022:4;18060:2;18049:9;18045:18;18037:26;;18109:9;18103:4;18099:20;18095:1;18084:9;18080:17;18073:47;18137:131;18263:4;18137:131;:::i;:::-;18129:139;;17856:419;;;:::o;18281:180::-;18329:77;18326:1;18319:88;18426:4;18423:1;18416:15;18450:4;18447:1;18440:15;18467:94;18500:8;18548:5;18544:2;18540:14;18519:35;;18467:94;;;:::o;18567:::-;18606:7;18635:20;18649:5;18635:20;:::i;:::-;18624:31;;18567:94;;;:::o;18667:100::-;18706:7;18735:26;18755:5;18735:26;:::i;:::-;18724:37;;18667:100;;;:::o;18773:157::-;18878:45;18898:24;18916:5;18898:24;:::i;:::-;18878:45;:::i;:::-;18873:3;18866:58;18773:157;;:::o;18936:148::-;19038:11;19075:3;19060:18;;18936:148;;;;:::o;19090:151::-;19230:3;19226:1;19218:6;19214:14;19207:27;19090:151;:::o;19247:400::-;19407:3;19428:84;19510:1;19505:3;19428:84;:::i;:::-;19421:91;;19521:93;19610:3;19521:93;:::i;:::-;19639:1;19634:3;19630:11;19623:18;;19247:400;;;:::o;19653:522::-;19866:3;19881:75;19952:3;19943:6;19881:75;:::i;:::-;19981:2;19976:3;19972:12;19965:19;;20001:148;20145:3;20001:148;:::i;:::-;19994:155;;20166:3;20159:10;;19653:522;;;;:::o;20181:176::-;20213:1;20230:20;20248:1;20230:20;:::i;:::-;20225:25;;20264:20;20282:1;20264:20;:::i;:::-;20259:25;;20303:1;20293:35;;20308:18;;:::i;:::-;20293:35;20349:1;20346;20342:9;20337:14;;20181:176;;;;:::o;20363:181::-;20503:33;20499:1;20491:6;20487:14;20480:57;20363:181;:::o;20550:366::-;20692:3;20713:67;20777:2;20772:3;20713:67;:::i;:::-;20706:74;;20789:93;20878:3;20789:93;:::i;:::-;20907:2;20902:3;20898:12;20891:19;;20550:366;;;:::o;20922:419::-;21088:4;21126:2;21115:9;21111:18;21103:26;;21175:9;21169:4;21165:20;21161:1;21150:9;21146:17;21139:47;21203:131;21329:4;21203:131;:::i;:::-;21195:139;;20922:419;;;:::o;21347:220::-;21487:34;21483:1;21475:6;21471:14;21464:58;21556:3;21551:2;21543:6;21539:15;21532:28;21347:220;:::o;21573:366::-;21715:3;21736:67;21800:2;21795:3;21736:67;:::i;:::-;21729:74;;21812:93;21901:3;21812:93;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21573:366;;;:::o;21945:419::-;22111:4;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:131;22352:4;22226:131;:::i;:::-;22218:139;;21945:419;;;:::o;22370:246::-;22510:34;22506:1;22498:6;22494:14;22487:58;22579:29;22574:2;22566:6;22562:15;22555:54;22370:246;:::o;22622:366::-;22764:3;22785:67;22849:2;22844:3;22785:67;:::i;:::-;22778:74;;22861:93;22950:3;22861:93;:::i;:::-;22979:2;22974:3;22970:12;22963:19;;22622:366;;;:::o;22994:419::-;23160:4;23198:2;23187:9;23183:18;23175:26;;23247:9;23241:4;23237:20;23233:1;23222:9;23218:17;23211:47;23275:131;23401:4;23275:131;:::i;:::-;23267:139;;22994:419;;;:::o;23419:182::-;23559:34;23555:1;23547:6;23543:14;23536:58;23419:182;:::o;23607:366::-;23749:3;23770:67;23834:2;23829:3;23770:67;:::i;:::-;23763:74;;23846:93;23935:3;23846:93;:::i;:::-;23964:2;23959:3;23955:12;23948:19;;23607:366;;;:::o;23979:419::-;24145:4;24183:2;24172:9;24168:18;24160:26;;24232:9;24226:4;24222:20;24218:1;24207:9;24203:17;24196:47;24260:131;24386:4;24260:131;:::i;:::-;24252:139;;23979:419;;;:::o;24404:229::-;24544:34;24540:1;24532:6;24528:14;24521:58;24613:12;24608:2;24600:6;24596:15;24589:37;24404:229;:::o;24639:366::-;24781:3;24802:67;24866:2;24861:3;24802:67;:::i;:::-;24795:74;;24878:93;24967:3;24878:93;:::i;:::-;24996:2;24991:3;24987:12;24980:19;;24639:366;;;:::o;25011:419::-;25177:4;25215:2;25204:9;25200:18;25192:26;;25264:9;25258:4;25254:20;25250:1;25239:9;25235:17;25228:47;25292:131;25418:4;25292:131;:::i;:::-;25284:139;;25011:419;;;:::o;25436:181::-;25576:33;25572:1;25564:6;25560:14;25553:57;25436:181;:::o;25623:366::-;25765:3;25786:67;25850:2;25845:3;25786:67;:::i;:::-;25779:74;;25862:93;25951:3;25862:93;:::i;:::-;25980:2;25975:3;25971:12;25964:19;;25623:366;;;:::o;25995:419::-;26161:4;26199:2;26188:9;26184:18;26176:26;;26248:9;26242:4;26238:20;26234:1;26223:9;26219:17;26212:47;26276:131;26402:4;26276:131;:::i;:::-;26268:139;;25995:419;;;:::o;26420:171::-;26560:23;26556:1;26548:6;26544:14;26537:47;26420:171;:::o;26597:366::-;26739:3;26760:67;26824:2;26819:3;26760:67;:::i;:::-;26753:74;;26836:93;26925:3;26836:93;:::i;:::-;26954:2;26949:3;26945:12;26938:19;;26597:366;;;:::o;26969:419::-;27135:4;27173:2;27162:9;27158:18;27150:26;;27222:9;27216:4;27212:20;27208:1;27197:9;27193:17;27186:47;27250:131;27376:4;27250:131;:::i;:::-;27242:139;;26969:419;;;:::o;27394:141::-;27443:4;27466:3;27458:11;;27489:3;27486:1;27479:14;27523:4;27520:1;27510:18;27502:26;;27394:141;;;:::o;27565:845::-;27668:3;27705:5;27699:12;27734:36;27760:9;27734:36;:::i;:::-;27786:89;27868:6;27863:3;27786:89;:::i;:::-;27779:96;;27906:1;27895:9;27891:17;27922:1;27917:137;;;;28068:1;28063:341;;;;27884:520;;27917:137;28001:4;27997:9;27986;27982:25;27977:3;27970:38;28037:6;28032:3;28028:16;28021:23;;27917:137;;28063:341;28130:38;28162:5;28130:38;:::i;:::-;28190:1;28204:154;28218:6;28215:1;28212:13;28204:154;;;28292:7;28286:14;28282:1;28277:3;28273:11;28266:35;28342:1;28333:7;28329:15;28318:26;;28240:4;28237:1;28233:12;28228:17;;28204:154;;;28387:6;28382:3;28378:16;28371:23;;28070:334;;27884:520;;27672:738;;27565:845;;;;:::o;28416:377::-;28522:3;28550:39;28583:5;28550:39;:::i;:::-;28605:89;28687:6;28682:3;28605:89;:::i;:::-;28598:96;;28703:52;28748:6;28743:3;28736:4;28729:5;28725:16;28703:52;:::i;:::-;28780:6;28775:3;28771:16;28764:23;;28526:267;28416:377;;;;:::o;28799:429::-;28976:3;28998:92;29086:3;29077:6;28998:92;:::i;:::-;28991:99;;29107:95;29198:3;29189:6;29107:95;:::i;:::-;29100:102;;29219:3;29212:10;;28799:429;;;;;:::o;29234:155::-;29374:7;29370:1;29362:6;29358:14;29351:31;29234:155;:::o;29395:400::-;29555:3;29576:84;29658:1;29653:3;29576:84;:::i;:::-;29569:91;;29669:93;29758:3;29669:93;:::i;:::-;29787:1;29782:3;29778:11;29771:18;;29395:400;;;:::o;29801:695::-;30079:3;30101:92;30189:3;30180:6;30101:92;:::i;:::-;30094:99;;30210:95;30301:3;30292:6;30210:95;:::i;:::-;30203:102;;30322:148;30466:3;30322:148;:::i;:::-;30315:155;;30487:3;30480:10;;29801:695;;;;;:::o;30502:225::-;30642:34;30638:1;30630:6;30626:14;30619:58;30711:8;30706:2;30698:6;30694:15;30687:33;30502:225;:::o;30733:366::-;30875:3;30896:67;30960:2;30955:3;30896:67;:::i;:::-;30889:74;;30972:93;31061:3;30972:93;:::i;:::-;31090:2;31085:3;31081:12;31074:19;;30733:366;;;:::o;31105:419::-;31271:4;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31105:419;;;:::o;31530:229::-;31670:34;31666:1;31658:6;31654:14;31647:58;31739:12;31734:2;31726:6;31722:15;31715:37;31530:229;:::o;31765:366::-;31907:3;31928:67;31992:2;31987:3;31928:67;:::i;:::-;31921:74;;32004:93;32093:3;32004:93;:::i;:::-;32122:2;32117:3;32113:12;32106:19;;31765:366;;;:::o;32137:419::-;32303:4;32341:2;32330:9;32326:18;32318:26;;32390:9;32384:4;32380:20;32376:1;32365:9;32361:17;32354:47;32418:131;32544:4;32418:131;:::i;:::-;32410:139;;32137:419;;;:::o;32562:168::-;32702:20;32698:1;32690:6;32686:14;32679:44;32562:168;:::o;32736:366::-;32878:3;32899:67;32963:2;32958:3;32899:67;:::i;:::-;32892:74;;32975:93;33064:3;32975:93;:::i;:::-;33093:2;33088:3;33084:12;33077:19;;32736:366;;;:::o;33108:419::-;33274:4;33312:2;33301:9;33297:18;33289:26;;33361:9;33355:4;33351:20;33347:1;33336:9;33332:17;33325:47;33389:131;33515:4;33389:131;:::i;:::-;33381:139;;33108:419;;;:::o;33533:221::-;33673:34;33669:1;33661:6;33657:14;33650:58;33742:4;33737:2;33729:6;33725:15;33718:29;33533:221;:::o;33760:366::-;33902:3;33923:67;33987:2;33982:3;33923:67;:::i;:::-;33916:74;;33999:93;34088:3;33999:93;:::i;:::-;34117:2;34112:3;34108:12;34101:19;;33760:366;;;:::o;34132:419::-;34298:4;34336:2;34325:9;34321:18;34313:26;;34385:9;34379:4;34375:20;34371:1;34360:9;34356:17;34349:47;34413:131;34539:4;34413:131;:::i;:::-;34405:139;;34132:419;;;:::o;34557:177::-;34697:29;34693:1;34685:6;34681:14;34674:53;34557:177;:::o;34740:366::-;34882:3;34903:67;34967:2;34962:3;34903:67;:::i;:::-;34896:74;;34979:93;35068:3;34979:93;:::i;:::-;35097:2;35092:3;35088:12;35081:19;;34740:366;;;:::o;35112:419::-;35278:4;35316:2;35305:9;35301:18;35293:26;;35365:9;35359:4;35355:20;35351:1;35340:9;35336:17;35329:47;35393:131;35519:4;35393:131;:::i;:::-;35385:139;;35112:419;;;:::o;35537:247::-;35677:34;35673:1;35665:6;35661:14;35654:58;35746:30;35741:2;35733:6;35729:15;35722:55;35537:247;:::o;35790:366::-;35932:3;35953:67;36017:2;36012:3;35953:67;:::i;:::-;35946:74;;36029:93;36118:3;36029:93;:::i;:::-;36147:2;36142:3;36138:12;36131:19;;35790:366;;;:::o;36162:419::-;36328:4;36366:2;36355:9;36351:18;36343:26;;36415:9;36409:4;36405:20;36401:1;36390:9;36386:17;36379:47;36443:131;36569:4;36443:131;:::i;:::-;36435:139;;36162:419;;;:::o;36587:225::-;36727:34;36723:1;36715:6;36711:14;36704:58;36796:8;36791:2;36783:6;36779:15;36772:33;36587:225;:::o;36818:366::-;36960:3;36981:67;37045:2;37040:3;36981:67;:::i;:::-;36974:74;;37057:93;37146:3;37057:93;:::i;:::-;37175:2;37170:3;37166:12;37159:19;;36818:366;;;:::o;37190:419::-;37356:4;37394:2;37383:9;37379:18;37371:26;;37443:9;37437:4;37433:20;37429:1;37418:9;37414:17;37407:47;37471:131;37597:4;37471:131;:::i;:::-;37463:139;;37190:419;;;:::o;37615:229::-;37755:34;37751:1;37743:6;37739:14;37732:58;37824:12;37819:2;37811:6;37807:15;37800:37;37615:229;:::o;37850:366::-;37992:3;38013:67;38077:2;38072:3;38013:67;:::i;:::-;38006:74;;38089:93;38178:3;38089:93;:::i;:::-;38207:2;38202:3;38198:12;38191:19;;37850:366;;;:::o;38222:419::-;38388:4;38426:2;38415:9;38411:18;38403:26;;38475:9;38469:4;38465:20;38461:1;38450:9;38446:17;38439:47;38503:131;38629:4;38503:131;:::i;:::-;38495:139;;38222:419;;;:::o;38647:175::-;38787:27;38783:1;38775:6;38771:14;38764:51;38647:175;:::o;38828:366::-;38970:3;38991:67;39055:2;39050:3;38991:67;:::i;:::-;38984:74;;39067:93;39156:3;39067:93;:::i;:::-;39185:2;39180:3;39176:12;39169:19;;38828:366;;;:::o;39200:419::-;39366:4;39404:2;39393:9;39389:18;39381:26;;39453:9;39447:4;39443:20;39439:1;39428:9;39424:17;39417:47;39481:131;39607:4;39481:131;:::i;:::-;39473:139;;39200:419;;;:::o;39625:305::-;39665:3;39684:20;39702:1;39684:20;:::i;:::-;39679:25;;39718:20;39736:1;39718:20;:::i;:::-;39713:25;;39872:1;39804:66;39800:74;39797:1;39794:81;39791:107;;;39878:18;;:::i;:::-;39791:107;39922:1;39919;39915:9;39908:16;;39625:305;;;;:::o;39936:177::-;40076:29;40072:1;40064:6;40060:14;40053:53;39936:177;:::o;40119:366::-;40261:3;40282:67;40346:2;40341:3;40282:67;:::i;:::-;40275:74;;40358:93;40447:3;40358:93;:::i;:::-;40476:2;40471:3;40467:12;40460:19;;40119:366;;;:::o;40491:419::-;40657:4;40695:2;40684:9;40680:18;40672:26;;40744:9;40738:4;40734:20;40730:1;40719:9;40715:17;40708:47;40772:131;40898:4;40772:131;:::i;:::-;40764:139;;40491:419;;;:::o;40916:98::-;40967:6;41001:5;40995:12;40985:22;;40916:98;;;:::o;41020:168::-;41103:11;41137:6;41132:3;41125:19;41177:4;41172:3;41168:14;41153:29;;41020:168;;;;:::o;41194:360::-;41280:3;41308:38;41340:5;41308:38;:::i;:::-;41362:70;41425:6;41420:3;41362:70;:::i;:::-;41355:77;;41441:52;41486:6;41481:3;41474:4;41467:5;41463:16;41441:52;:::i;:::-;41518:29;41540:6;41518:29;:::i;:::-;41513:3;41509:39;41502:46;;41284:270;41194:360;;;;:::o;41560:640::-;41755:4;41793:3;41782:9;41778:19;41770:27;;41807:71;41875:1;41864:9;41860:17;41851:6;41807:71;:::i;:::-;41888:72;41956:2;41945:9;41941:18;41932:6;41888:72;:::i;:::-;41970;42038:2;42027:9;42023:18;42014:6;41970:72;:::i;:::-;42089:9;42083:4;42079:20;42074:2;42063:9;42059:18;42052:48;42117:76;42188:4;42179:6;42117:76;:::i;:::-;42109:84;;41560:640;;;;;;;:::o;42206:141::-;42262:5;42293:6;42287:13;42278:22;;42309:32;42335:5;42309:32;:::i;:::-;42206:141;;;;:::o;42353:349::-;42422:6;42471:2;42459:9;42450:7;42446:23;42442:32;42439:119;;;42477:79;;:::i;:::-;42439:119;42597:1;42622:63;42677:7;42668:6;42657:9;42653:22;42622:63;:::i;:::-;42612:73;;42568:127;42353:349;;;;:::o;42708:220::-;42848:34;42844:1;42836:6;42832:14;42825:58;42917:3;42912:2;42904:6;42900:15;42893:28;42708:220;:::o;42934:366::-;43076:3;43097:67;43161:2;43156:3;43097:67;:::i;:::-;43090:74;;43173:93;43262:3;43173:93;:::i;:::-;43291:2;43286:3;43282:12;43275:19;;42934:366;;;:::o;43306:419::-;43472:4;43510:2;43499:9;43495:18;43487:26;;43559:9;43553:4;43549:20;43545:1;43534:9;43530:17;43523:47;43587:131;43713:4;43587:131;:::i;:::-;43579:139;;43306:419;;;:::o;43731:233::-;43770:3;43793:24;43811:5;43793:24;:::i;:::-;43784:33;;43839:66;43832:5;43829:77;43826:103;;;43909:18;;:::i;:::-;43826:103;43956:1;43949:5;43945:13;43938:20;;43731:233;;;:::o;43970:191::-;44010:4;44030:20;44048:1;44030:20;:::i;:::-;44025:25;;44064:20;44082:1;44064:20;:::i;:::-;44059:25;;44103:1;44100;44097:8;44094:34;;;44108:18;;:::i;:::-;44094:34;44153:1;44150;44146:9;44138:17;;43970:191;;;;:::o;44167:180::-;44215:77;44212:1;44205:88;44312:4;44309:1;44302:15;44336:4;44333:1;44326:15;44353:180;44493:32;44489:1;44481:6;44477:14;44470:56;44353:180;:::o;44539:366::-;44681:3;44702:67;44766:2;44761:3;44702:67;:::i;:::-;44695:74;;44778:93;44867:3;44778:93;:::i;:::-;44896:2;44891:3;44887:12;44880:19;;44539:366;;;:::o;44911:419::-;45077:4;45115:2;45104:9;45100:18;45092:26;;45164:9;45158:4;45154:20;45150:1;45139:9;45135:17;45128:47;45192:131;45318:4;45192:131;:::i;:::-;45184:139;;44911:419;;;:::o

Swarm Source

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