ETH Price: $3,298.09 (-3.73%)
Gas: 8 Gwei

Token

MagicGMCoffee (MGC)
 

Overview

Max Total Supply

285 MGC

Holders

202

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*完美的世界.eth
Balance
2 MGC
0x5a81868992ffcf4200a85972c60151690af39006
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:
MagicGMCoffee

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 7 : coffee.sol
// SPDX-License-Identifier: MIT

/**
   _____                 .__           ________    _____    _________         _____  _____              
  /     \ _____     ____ |__| ____    /  _____/   /     \   \_   ___ \  _____/ ____\/ ____\____   ____  
 /  \ /  \\__  \   / ___\|  |/ ___\  /   \  ___  /  \ /  \  /    \  \/ /  _ \   __\\   __\/ __ \_/ __ \ 
/    Y    \/ __ \_/ /_/  >  \  \___  \    \_\  \/    Y    \ \     \___(  <_> )  |   |  | \  ___/\  ___/ 
\____|__  (____  /\___  /|__|\___  >  \______  /\____|__  /  \______  /\____/|__|   |__|  \___  >\___  >
        \/     \//_____/         \/          \/         \/          \/                        \/     \/ 

 @powered by: amadeus-nft.io
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract MagicGMCoffee is Ownable, ERC721A, ReentrancyGuard {
    constructor(
    ) ERC721A("MagicGMCoffee", "MGC") {}
    
    uint256 public collectionSize = 1000;

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    // For marketing etc.
    function reserveMintBatch(uint256[] calldata quantities, address[] calldata tos) external onlyOwner {
        for(uint256 i = 0; i < quantities.length; i++){
            require(
                totalSupply() + quantities[i] <= collectionSize,
                "Too many already minted before dev mint."
            );
            _safeMint(tos[i], quantities[i]);
        }
    }

    // metadata URI
    string private _baseTokenURI;

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        address amadeusAddress = address(0x718a7438297Ac14382F25802bb18422A4DadD31b);
        uint256 royaltyForAmadeus = address(this).balance / 100 * 5;
        uint256 remain = address(this).balance - royaltyForAmadeus;
        (bool success, ) = amadeusAddress.call{value: royaltyForAmadeus}("");
        require(success, "Transfer failed.");
        (success, ) = msg.sender.call{value: remain}("");
        require(success, "Transfer failed.");
    }

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

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return _ownershipOf(tokenId);
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
    //public sale
    bool public publicSaleStatus = true;
    uint256 public publicPrice = 0.010000 ether;
    uint256 public amountForPublicSale = 1000;
    // per mint public sale limitation
    uint256 public immutable publicSalePerMint = 2;

    function publicSaleMint(uint256 quantity) external payable callerIsUser {
        require(publicSaleStatus, "Public Sale not Start");
        require(totalSupply() + quantity <= collectionSize, "Reached max supply");
        require(_numberMinted(msg.sender) <= 2, "Reached max amount per address");
        require(quantity <= publicSalePerMint, "reached max amount per mint");

        _safeMint(msg.sender, quantity);
        amountForPublicSale -= quantity;
        refundIfOver(uint256(publicPrice) * quantity);
    }

    function setPublicSaleStatus(bool status) external onlyOwner {
        publicSaleStatus = status;
    }
}

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 3 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

File 4 of 7 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 5 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

File 7 of 7 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * 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();

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"amountForPublicSale","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":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"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":"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":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"reserveMintBatch","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526103e8600a556001600c60006101000a81548160ff021916908315150217905550662386f26fc10000600d556103e8600e5560026080908152503480156200004b57600080fd5b506040518060400160405280600d81526020017f4d61676963474d436f66666565000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d47430000000000000000000000000000000000000000000000000000000000815250620000d8620000cc6200013060201b60201c565b6200013860201b60201c565b8160039080519060200190620000f092919062000201565b5080600490805190602001906200010992919062000201565b506200011a620001fc60201b60201c565b6001819055505050600160098190555062000316565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200020f90620002b1565b90600052602060002090601f0160209004810192826200023357600085556200027f565b82601f106200024e57805160ff19168380011785556200027f565b828001600101855582156200027f579182015b828111156200027e57825182559160200191906001019062000261565b5b5090506200028e919062000292565b5090565b5b80821115620002ad57600081600090555060010162000293565b5090565b60006002820490506001821680620002ca57607f821691505b60208210811415620002e157620002e0620002e7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6080516136c86200033960003960008181610d1201526116cc01526136c86000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b3ab66b011610095578063c87b56dd11610064578063c87b56dd1461060d578063dc33e6811461064a578063e985e9c514610687578063f2fde38b146106c4576101c2565b8063b3ab66b014610574578063b423fe6714610590578063b6c693e5146105b9578063b88d4fde146105e4576101c2565b80639dc74e63116100d15780639dc74e63146104de578063a22cb46514610509578063a945bf8014610532578063ac4460021461055d576101c2565b80638da5cb5b1461044b5780639231ab2a1461047657806395d89b41146104b3576101c2565b80633cd475371161016457806355f804b31161013e57806355f804b3146103915780636352211e146103ba57806370a08231146103f7578063715018a614610434576101c2565b80633cd475371461031457806342842e0e1461033d57806345c0f53314610366576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780633ba5ae24146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612980565b6106ed565b6040516101fb9190612df9565b60405180910390f35b34801561021057600080fd5b5061021961077f565b6040516102269190612e14565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a27565b610811565b6040516102639190612d92565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612892565b610890565b005b3480156102a157600080fd5b506102aa6109d4565b6040516102b79190612fb1565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061277c565b6109eb565b005b3480156102f557600080fd5b506102fe610d10565b60405161030b9190612fb1565b60405180910390f35b34801561032057600080fd5b5061033b600480360381019061033691906128d2565b610d34565b005b34801561034957600080fd5b50610364600480360381019061035f919061277c565b610e92565b005b34801561037257600080fd5b5061037b610eb2565b6040516103889190612fb1565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906129da565b610eb8565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190612a27565b610f4a565b6040516103ee9190612d92565b60405180910390f35b34801561040357600080fd5b5061041e6004803603810190610419919061270f565b610f5c565b60405161042b9190612fb1565b60405180910390f35b34801561044057600080fd5b50610449611015565b005b34801561045757600080fd5b5061046061109d565b60405161046d9190612d92565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190612a27565b6110c6565b6040516104aa9190612f96565b60405180910390f35b3480156104bf57600080fd5b506104c86110de565b6040516104d59190612e14565b60405180910390f35b3480156104ea57600080fd5b506104f3611170565b6040516105009190612fb1565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190612852565b611176565b005b34801561053e57600080fd5b506105476112ee565b6040516105549190612fb1565b60405180910390f35b34801561056957600080fd5b506105726112f4565b005b61058e60048036038101906105899190612a27565b61156a565b005b34801561059c57600080fd5b506105b760048036038101906105b29190612953565b611769565b005b3480156105c557600080fd5b506105ce611802565b6040516105db9190612df9565b60405180910390f35b3480156105f057600080fd5b5061060b600480360381019061060691906127cf565b611815565b005b34801561061957600080fd5b50610634600480360381019061062f9190612a27565b611888565b6040516106419190612e14565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c919061270f565b611927565b60405161067e9190612fb1565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a9919061273c565b611939565b6040516106bb9190612df9565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e6919061270f565b6119cd565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461078e9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba9061325e565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081c82611ac5565b610852576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089b82610f4a565b90508073ffffffffffffffffffffffffffffffffffffffff166108bc611b24565b73ffffffffffffffffffffffffffffffffffffffff161461091f576108e8816108e3611b24565b611939565b61091e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109de611b2c565b6002546001540303905090565b60006109f682611b31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a6984611bff565b91509150610a7f8187610a7a611b24565b611c26565b610acb57610a9486610a8f611b24565b611939565b610aca576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b32576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3f8686866001611c6a565b8015610b4a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c1885610bf4888887611c70565b7c020000000000000000000000000000000000000000000000000000000017611c98565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ca0576000600185019050600060056000838152602001908152602001600020541415610c9e576001548114610c9d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d088686866001611cc3565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d3c611cc9565b73ffffffffffffffffffffffffffffffffffffffff16610d5a61109d565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612ed6565b60405180910390fd5b60005b84849050811015610e8b57600a54858583818110610dd457610dd3613397565b5b90506020020135610de36109d4565b610ded9190613070565b1115610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590612eb6565b60405180910390fd5b610e78838383818110610e4457610e43613397565b5b9050602002016020810190610e59919061270f565b868684818110610e6c57610e6b613397565b5b90506020020135611cd1565b8080610e83906132c1565b915050610db3565b5050505050565b610ead83838360405180602001604052806000815250611815565b505050565b600a5481565b610ec0611cc9565b73ffffffffffffffffffffffffffffffffffffffff16610ede61109d565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90612ed6565b60405180910390fd5b8181600b9190610f45929190612442565b505050565b6000610f5582611b31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61101d611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661103b61109d565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890612ed6565b60405180910390fd5b61109b6000611cef565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110ce6124c8565b6110d782611db3565b9050919050565b6060600480546110ed9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546111199061325e565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b5050505050905090565b600e5481565b61117e611b24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111f0611b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129d611b24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e29190612df9565b60405180910390a35050565b600d5481565b6112fc611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661131a61109d565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790612ed6565b60405180910390fd5b600260095414156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612f76565b60405180910390fd5b6002600981905550600073718a7438297ac14382f25802bb18422a4dadd31b9050600060056064476113e891906130c6565b6113f291906130f7565b9050600081476114029190613151565b905060008373ffffffffffffffffffffffffffffffffffffffff168360405161142a90612d7d565b60006040518083038185875af1925050503d8060008114611467576040519150601f19603f3d011682016040523d82523d6000602084013e61146c565b606091505b50509050806114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790612f16565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16826040516114d490612d7d565b60006040518083038185875af1925050503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5050809150508061155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390612f16565b60405180910390fd5b505050506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90612e76565b60405180910390fd5b600c60009054906101000a900460ff16611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e90612f56565b60405180910390fd5b600a54816116336109d4565b61163d9190613070565b111561167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590612e56565b60405180910390fd5b600261168933611dd3565b11156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190612e96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490612ef6565b60405180910390fd5b6117373382611cd1565b80600e60008282546117499190613151565b9250508190555061176681600d5461176191906130f7565b611e2a565b50565b611771611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661178f61109d565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90612ed6565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1681565b6118208484846109eb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118825761184b84848484611ecb565b611881576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061189382611ac5565b6118c9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118d361202b565b90506000815114156118f4576040518060200160405280600081525061191f565b806118fe846120bd565b60405160200161190f929190612d59565b6040516020818303038152906040525b915050919050565b600061193282611dd3565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d5611cc9565b73ffffffffffffffffffffffffffffffffffffffff166119f361109d565b73ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090612ed6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090612e36565b60405180910390fd5b611ac281611cef565b50565b600081611ad0611b2c565b11158015611adf575060015482105b8015611b1d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611b40611b2c565b11611bc857600154811015611bc75760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bc5575b6000811415611bbb576005600083600190039350838152602001908152602001600020549050611b90565b8092505050611bfa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c87868684612117565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b611ceb828260405180602001604052806000815250612120565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611dbb6124c8565b611dcc611dc783611b31565b6121be565b9050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b80341015611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490612f36565b60405180910390fd5b80341115611ec8573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611e9b9190613151565b9081150290604051600060405180830381858888f19350505050158015611ec6573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ef1611b24565b8786866040518563ffffffff1660e01b8152600401611f139493929190612dad565b602060405180830381600087803b158015611f2d57600080fd5b505af1925050508015611f5e57506040513d601f19601f82011682018060405250810190611f5b91906129ad565b60015b611fd8573d8060008114611f8e576040519150601f19603f3d011682016040523d82523d6000602084013e611f93565b606091505b50600081511415611fd0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461203a9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546120669061325e565b80156120b35780601f10612088576101008083540402835291602001916120b3565b820191906000526020600020905b81548152906001019060200180831161209657829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561210357600183039250600a81066030018353600a810490506120e3565b508181036020830392508083525050919050565b60009392505050565b61212a8383612274565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121b95760006001549050600083820390505b61216b6000868380600101945086611ecb565b6121a1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121585781600154146121b657600080fd5b50505b505050565b6121c66124c8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000600154905060008214156122b6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122c36000848385611c6a565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061233a8361232b6000866000611c70565b61233485612432565b17611c98565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146123db57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506123a0565b506000821415612417576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061242d6000848385611cc3565b505050565b60006001821460e11b9050919050565b82805461244e9061325e565b90600052602060002090601f01602090048101928261247057600085556124b7565b82601f1061248957803560ff19168380011785556124b7565b828001600101855582156124b7579182015b828111156124b657823582559160200191906001019061249b565b5b5090506124c49190612517565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612530576000816000905550600101612518565b5090565b600061254761254284612ff1565b612fcc565b90508281526020810184848401111561256357612562613404565b5b61256e84828561321c565b509392505050565b60008135905061258581613636565b92915050565b60008083601f8401126125a1576125a06133fa565b5b8235905067ffffffffffffffff8111156125be576125bd6133f5565b5b6020830191508360208202830111156125da576125d96133ff565b5b9250929050565b60008083601f8401126125f7576125f66133fa565b5b8235905067ffffffffffffffff811115612614576126136133f5565b5b6020830191508360208202830111156126305761262f6133ff565b5b9250929050565b6000813590506126468161364d565b92915050565b60008135905061265b81613664565b92915050565b60008151905061267081613664565b92915050565b600082601f83011261268b5761268a6133fa565b5b813561269b848260208601612534565b91505092915050565b60008083601f8401126126ba576126b96133fa565b5b8235905067ffffffffffffffff8111156126d7576126d66133f5565b5b6020830191508360018202830111156126f3576126f26133ff565b5b9250929050565b6000813590506127098161367b565b92915050565b6000602082840312156127255761272461340e565b5b600061273384828501612576565b91505092915050565b600080604083850312156127535761275261340e565b5b600061276185828601612576565b925050602061277285828601612576565b9150509250929050565b6000806000606084860312156127955761279461340e565b5b60006127a386828701612576565b93505060206127b486828701612576565b92505060406127c5868287016126fa565b9150509250925092565b600080600080608085870312156127e9576127e861340e565b5b60006127f787828801612576565b945050602061280887828801612576565b9350506040612819878288016126fa565b925050606085013567ffffffffffffffff81111561283a57612839613409565b5b61284687828801612676565b91505092959194509250565b600080604083850312156128695761286861340e565b5b600061287785828601612576565b925050602061288885828601612637565b9150509250929050565b600080604083850312156128a9576128a861340e565b5b60006128b785828601612576565b92505060206128c8858286016126fa565b9150509250929050565b600080600080604085870312156128ec576128eb61340e565b5b600085013567ffffffffffffffff81111561290a57612909613409565b5b612916878288016125e1565b9450945050602085013567ffffffffffffffff81111561293957612938613409565b5b6129458782880161258b565b925092505092959194509250565b6000602082840312156129695761296861340e565b5b600061297784828501612637565b91505092915050565b6000602082840312156129965761299561340e565b5b60006129a48482850161264c565b91505092915050565b6000602082840312156129c3576129c261340e565b5b60006129d184828501612661565b91505092915050565b600080602083850312156129f1576129f061340e565b5b600083013567ffffffffffffffff811115612a0f57612a0e613409565b5b612a1b858286016126a4565b92509250509250929050565b600060208284031215612a3d57612a3c61340e565b5b6000612a4b848285016126fa565b91505092915050565b612a5d81613185565b82525050565b612a6c81613185565b82525050565b612a7b81613197565b82525050565b612a8a81613197565b82525050565b6000612a9b82613022565b612aa58185613038565b9350612ab581856020860161322b565b612abe81613413565b840191505092915050565b6000612ad48261302d565b612ade8185613054565b9350612aee81856020860161322b565b612af781613413565b840191505092915050565b6000612b0d8261302d565b612b178185613065565b9350612b2781856020860161322b565b80840191505092915050565b6000612b40602683613054565b9150612b4b82613424565b604082019050919050565b6000612b63601283613054565b9150612b6e82613473565b602082019050919050565b6000612b86601e83613054565b9150612b918261349c565b602082019050919050565b6000612ba9601e83613054565b9150612bb4826134c5565b602082019050919050565b6000612bcc602883613054565b9150612bd7826134ee565b604082019050919050565b6000612bef602083613054565b9150612bfa8261353d565b602082019050919050565b6000612c12601b83613054565b9150612c1d82613566565b602082019050919050565b6000612c35600083613049565b9150612c408261358f565b600082019050919050565b6000612c58601083613054565b9150612c6382613592565b602082019050919050565b6000612c7b601683613054565b9150612c86826135bb565b602082019050919050565b6000612c9e601583613054565b9150612ca9826135e4565b602082019050919050565b6000612cc1601f83613054565b9150612ccc8261360d565b602082019050919050565b608082016000820151612ced6000850182612a54565b506020820151612d006020850182612d4a565b506040820151612d136040850182612a72565b506060820151612d266060850182612d2c565b50505050565b612d35816131ef565b82525050565b612d44816131fe565b82525050565b612d5381613208565b82525050565b6000612d658285612b02565b9150612d718284612b02565b91508190509392505050565b6000612d8882612c28565b9150819050919050565b6000602082019050612da76000830184612a63565b92915050565b6000608082019050612dc26000830187612a63565b612dcf6020830186612a63565b612ddc6040830185612d3b565b8181036060830152612dee8184612a90565b905095945050505050565b6000602082019050612e0e6000830184612a81565b92915050565b60006020820190508181036000830152612e2e8184612ac9565b905092915050565b60006020820190508181036000830152612e4f81612b33565b9050919050565b60006020820190508181036000830152612e6f81612b56565b9050919050565b60006020820190508181036000830152612e8f81612b79565b9050919050565b60006020820190508181036000830152612eaf81612b9c565b9050919050565b60006020820190508181036000830152612ecf81612bbf565b9050919050565b60006020820190508181036000830152612eef81612be2565b9050919050565b60006020820190508181036000830152612f0f81612c05565b9050919050565b60006020820190508181036000830152612f2f81612c4b565b9050919050565b60006020820190508181036000830152612f4f81612c6e565b9050919050565b60006020820190508181036000830152612f6f81612c91565b9050919050565b60006020820190508181036000830152612f8f81612cb4565b9050919050565b6000608082019050612fab6000830184612cd7565b92915050565b6000602082019050612fc66000830184612d3b565b92915050565b6000612fd6612fe7565b9050612fe28282613290565b919050565b6000604051905090565b600067ffffffffffffffff82111561300c5761300b6133c6565b5b61301582613413565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061307b826131fe565b9150613086836131fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130bb576130ba61330a565b5b828201905092915050565b60006130d1826131fe565b91506130dc836131fe565b9250826130ec576130eb613339565b5b828204905092915050565b6000613102826131fe565b915061310d836131fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131465761314561330a565b5b828202905092915050565b600061315c826131fe565b9150613167836131fe565b92508282101561317a5761317961330a565b5b828203905092915050565b6000613190826131cf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561324957808201518184015260208101905061322e565b83811115613258576000848401525b50505050565b6000600282049050600182168061327657607f821691505b6020821081141561328a57613289613368565b5b50919050565b61329982613413565b810181811067ffffffffffffffff821117156132b8576132b76133c6565b5b80604052505050565b60006132cc826131fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132ff576132fe61330a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f52656163686564206d617820616d6f756e742070657220616464726573730000600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e742e000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f72656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f5075626c69632053616c65206e6f742053746172740000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61363f81613185565b811461364a57600080fd5b50565b61365681613197565b811461366157600080fd5b50565b61366d816131a3565b811461367857600080fd5b50565b613684816131fe565b811461368f57600080fd5b5056fea2646970667358221220014ea0749e2cc2b6c24fd92236dabb6f7734f88801d12d613a84ee8842a7e7e364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b3ab66b011610095578063c87b56dd11610064578063c87b56dd1461060d578063dc33e6811461064a578063e985e9c514610687578063f2fde38b146106c4576101c2565b8063b3ab66b014610574578063b423fe6714610590578063b6c693e5146105b9578063b88d4fde146105e4576101c2565b80639dc74e63116100d15780639dc74e63146104de578063a22cb46514610509578063a945bf8014610532578063ac4460021461055d576101c2565b80638da5cb5b1461044b5780639231ab2a1461047657806395d89b41146104b3576101c2565b80633cd475371161016457806355f804b31161013e57806355f804b3146103915780636352211e146103ba57806370a08231146103f7578063715018a614610434576101c2565b80633cd475371461031457806342842e0e1461033d57806345c0f53314610366576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780633ba5ae24146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612980565b6106ed565b6040516101fb9190612df9565b60405180910390f35b34801561021057600080fd5b5061021961077f565b6040516102269190612e14565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a27565b610811565b6040516102639190612d92565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612892565b610890565b005b3480156102a157600080fd5b506102aa6109d4565b6040516102b79190612fb1565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061277c565b6109eb565b005b3480156102f557600080fd5b506102fe610d10565b60405161030b9190612fb1565b60405180910390f35b34801561032057600080fd5b5061033b600480360381019061033691906128d2565b610d34565b005b34801561034957600080fd5b50610364600480360381019061035f919061277c565b610e92565b005b34801561037257600080fd5b5061037b610eb2565b6040516103889190612fb1565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906129da565b610eb8565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190612a27565b610f4a565b6040516103ee9190612d92565b60405180910390f35b34801561040357600080fd5b5061041e6004803603810190610419919061270f565b610f5c565b60405161042b9190612fb1565b60405180910390f35b34801561044057600080fd5b50610449611015565b005b34801561045757600080fd5b5061046061109d565b60405161046d9190612d92565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190612a27565b6110c6565b6040516104aa9190612f96565b60405180910390f35b3480156104bf57600080fd5b506104c86110de565b6040516104d59190612e14565b60405180910390f35b3480156104ea57600080fd5b506104f3611170565b6040516105009190612fb1565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190612852565b611176565b005b34801561053e57600080fd5b506105476112ee565b6040516105549190612fb1565b60405180910390f35b34801561056957600080fd5b506105726112f4565b005b61058e60048036038101906105899190612a27565b61156a565b005b34801561059c57600080fd5b506105b760048036038101906105b29190612953565b611769565b005b3480156105c557600080fd5b506105ce611802565b6040516105db9190612df9565b60405180910390f35b3480156105f057600080fd5b5061060b600480360381019061060691906127cf565b611815565b005b34801561061957600080fd5b50610634600480360381019061062f9190612a27565b611888565b6040516106419190612e14565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c919061270f565b611927565b60405161067e9190612fb1565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a9919061273c565b611939565b6040516106bb9190612df9565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e6919061270f565b6119cd565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461078e9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba9061325e565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081c82611ac5565b610852576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089b82610f4a565b90508073ffffffffffffffffffffffffffffffffffffffff166108bc611b24565b73ffffffffffffffffffffffffffffffffffffffff161461091f576108e8816108e3611b24565b611939565b61091e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109de611b2c565b6002546001540303905090565b60006109f682611b31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a6984611bff565b91509150610a7f8187610a7a611b24565b611c26565b610acb57610a9486610a8f611b24565b611939565b610aca576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b32576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3f8686866001611c6a565b8015610b4a57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c1885610bf4888887611c70565b7c020000000000000000000000000000000000000000000000000000000017611c98565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ca0576000600185019050600060056000838152602001908152602001600020541415610c9e576001548114610c9d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d088686866001611cc3565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000281565b610d3c611cc9565b73ffffffffffffffffffffffffffffffffffffffff16610d5a61109d565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612ed6565b60405180910390fd5b60005b84849050811015610e8b57600a54858583818110610dd457610dd3613397565b5b90506020020135610de36109d4565b610ded9190613070565b1115610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590612eb6565b60405180910390fd5b610e78838383818110610e4457610e43613397565b5b9050602002016020810190610e59919061270f565b868684818110610e6c57610e6b613397565b5b90506020020135611cd1565b8080610e83906132c1565b915050610db3565b5050505050565b610ead83838360405180602001604052806000815250611815565b505050565b600a5481565b610ec0611cc9565b73ffffffffffffffffffffffffffffffffffffffff16610ede61109d565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90612ed6565b60405180910390fd5b8181600b9190610f45929190612442565b505050565b6000610f5582611b31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61101d611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661103b61109d565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890612ed6565b60405180910390fd5b61109b6000611cef565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110ce6124c8565b6110d782611db3565b9050919050565b6060600480546110ed9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546111199061325e565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b5050505050905090565b600e5481565b61117e611b24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111f0611b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129d611b24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e29190612df9565b60405180910390a35050565b600d5481565b6112fc611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661131a61109d565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790612ed6565b60405180910390fd5b600260095414156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612f76565b60405180910390fd5b6002600981905550600073718a7438297ac14382f25802bb18422a4dadd31b9050600060056064476113e891906130c6565b6113f291906130f7565b9050600081476114029190613151565b905060008373ffffffffffffffffffffffffffffffffffffffff168360405161142a90612d7d565b60006040518083038185875af1925050503d8060008114611467576040519150601f19603f3d011682016040523d82523d6000602084013e61146c565b606091505b50509050806114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790612f16565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16826040516114d490612d7d565b60006040518083038185875af1925050503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5050809150508061155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390612f16565b60405180910390fd5b505050506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90612e76565b60405180910390fd5b600c60009054906101000a900460ff16611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e90612f56565b60405180910390fd5b600a54816116336109d4565b61163d9190613070565b111561167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590612e56565b60405180910390fd5b600261168933611dd3565b11156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190612e96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000281111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490612ef6565b60405180910390fd5b6117373382611cd1565b80600e60008282546117499190613151565b9250508190555061176681600d5461176191906130f7565b611e2a565b50565b611771611cc9565b73ffffffffffffffffffffffffffffffffffffffff1661178f61109d565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90612ed6565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff1681565b6118208484846109eb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118825761184b84848484611ecb565b611881576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061189382611ac5565b6118c9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118d361202b565b90506000815114156118f4576040518060200160405280600081525061191f565b806118fe846120bd565b60405160200161190f929190612d59565b6040516020818303038152906040525b915050919050565b600061193282611dd3565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d5611cc9565b73ffffffffffffffffffffffffffffffffffffffff166119f361109d565b73ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090612ed6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090612e36565b60405180910390fd5b611ac281611cef565b50565b600081611ad0611b2c565b11158015611adf575060015482105b8015611b1d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611b40611b2c565b11611bc857600154811015611bc75760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bc5575b6000811415611bbb576005600083600190039350838152602001908152602001600020549050611b90565b8092505050611bfa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c87868684612117565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b611ceb828260405180602001604052806000815250612120565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611dbb6124c8565b611dcc611dc783611b31565b6121be565b9050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b80341015611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490612f36565b60405180910390fd5b80341115611ec8573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611e9b9190613151565b9081150290604051600060405180830381858888f19350505050158015611ec6573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ef1611b24565b8786866040518563ffffffff1660e01b8152600401611f139493929190612dad565b602060405180830381600087803b158015611f2d57600080fd5b505af1925050508015611f5e57506040513d601f19601f82011682018060405250810190611f5b91906129ad565b60015b611fd8573d8060008114611f8e576040519150601f19603f3d011682016040523d82523d6000602084013e611f93565b606091505b50600081511415611fd0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461203a9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546120669061325e565b80156120b35780601f10612088576101008083540402835291602001916120b3565b820191906000526020600020905b81548152906001019060200180831161209657829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561210357600183039250600a81066030018353600a810490506120e3565b508181036020830392508083525050919050565b60009392505050565b61212a8383612274565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121b95760006001549050600083820390505b61216b6000868380600101945086611ecb565b6121a1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121585781600154146121b657600080fd5b50505b505050565b6121c66124c8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000600154905060008214156122b6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122c36000848385611c6a565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061233a8361232b6000866000611c70565b61233485612432565b17611c98565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146123db57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506123a0565b506000821415612417576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061242d6000848385611cc3565b505050565b60006001821460e11b9050919050565b82805461244e9061325e565b90600052602060002090601f01602090048101928261247057600085556124b7565b82601f1061248957803560ff19168380011785556124b7565b828001600101855582156124b7579182015b828111156124b657823582559160200191906001019061249b565b5b5090506124c49190612517565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612530576000816000905550600101612518565b5090565b600061254761254284612ff1565b612fcc565b90508281526020810184848401111561256357612562613404565b5b61256e84828561321c565b509392505050565b60008135905061258581613636565b92915050565b60008083601f8401126125a1576125a06133fa565b5b8235905067ffffffffffffffff8111156125be576125bd6133f5565b5b6020830191508360208202830111156125da576125d96133ff565b5b9250929050565b60008083601f8401126125f7576125f66133fa565b5b8235905067ffffffffffffffff811115612614576126136133f5565b5b6020830191508360208202830111156126305761262f6133ff565b5b9250929050565b6000813590506126468161364d565b92915050565b60008135905061265b81613664565b92915050565b60008151905061267081613664565b92915050565b600082601f83011261268b5761268a6133fa565b5b813561269b848260208601612534565b91505092915050565b60008083601f8401126126ba576126b96133fa565b5b8235905067ffffffffffffffff8111156126d7576126d66133f5565b5b6020830191508360018202830111156126f3576126f26133ff565b5b9250929050565b6000813590506127098161367b565b92915050565b6000602082840312156127255761272461340e565b5b600061273384828501612576565b91505092915050565b600080604083850312156127535761275261340e565b5b600061276185828601612576565b925050602061277285828601612576565b9150509250929050565b6000806000606084860312156127955761279461340e565b5b60006127a386828701612576565b93505060206127b486828701612576565b92505060406127c5868287016126fa565b9150509250925092565b600080600080608085870312156127e9576127e861340e565b5b60006127f787828801612576565b945050602061280887828801612576565b9350506040612819878288016126fa565b925050606085013567ffffffffffffffff81111561283a57612839613409565b5b61284687828801612676565b91505092959194509250565b600080604083850312156128695761286861340e565b5b600061287785828601612576565b925050602061288885828601612637565b9150509250929050565b600080604083850312156128a9576128a861340e565b5b60006128b785828601612576565b92505060206128c8858286016126fa565b9150509250929050565b600080600080604085870312156128ec576128eb61340e565b5b600085013567ffffffffffffffff81111561290a57612909613409565b5b612916878288016125e1565b9450945050602085013567ffffffffffffffff81111561293957612938613409565b5b6129458782880161258b565b925092505092959194509250565b6000602082840312156129695761296861340e565b5b600061297784828501612637565b91505092915050565b6000602082840312156129965761299561340e565b5b60006129a48482850161264c565b91505092915050565b6000602082840312156129c3576129c261340e565b5b60006129d184828501612661565b91505092915050565b600080602083850312156129f1576129f061340e565b5b600083013567ffffffffffffffff811115612a0f57612a0e613409565b5b612a1b858286016126a4565b92509250509250929050565b600060208284031215612a3d57612a3c61340e565b5b6000612a4b848285016126fa565b91505092915050565b612a5d81613185565b82525050565b612a6c81613185565b82525050565b612a7b81613197565b82525050565b612a8a81613197565b82525050565b6000612a9b82613022565b612aa58185613038565b9350612ab581856020860161322b565b612abe81613413565b840191505092915050565b6000612ad48261302d565b612ade8185613054565b9350612aee81856020860161322b565b612af781613413565b840191505092915050565b6000612b0d8261302d565b612b178185613065565b9350612b2781856020860161322b565b80840191505092915050565b6000612b40602683613054565b9150612b4b82613424565b604082019050919050565b6000612b63601283613054565b9150612b6e82613473565b602082019050919050565b6000612b86601e83613054565b9150612b918261349c565b602082019050919050565b6000612ba9601e83613054565b9150612bb4826134c5565b602082019050919050565b6000612bcc602883613054565b9150612bd7826134ee565b604082019050919050565b6000612bef602083613054565b9150612bfa8261353d565b602082019050919050565b6000612c12601b83613054565b9150612c1d82613566565b602082019050919050565b6000612c35600083613049565b9150612c408261358f565b600082019050919050565b6000612c58601083613054565b9150612c6382613592565b602082019050919050565b6000612c7b601683613054565b9150612c86826135bb565b602082019050919050565b6000612c9e601583613054565b9150612ca9826135e4565b602082019050919050565b6000612cc1601f83613054565b9150612ccc8261360d565b602082019050919050565b608082016000820151612ced6000850182612a54565b506020820151612d006020850182612d4a565b506040820151612d136040850182612a72565b506060820151612d266060850182612d2c565b50505050565b612d35816131ef565b82525050565b612d44816131fe565b82525050565b612d5381613208565b82525050565b6000612d658285612b02565b9150612d718284612b02565b91508190509392505050565b6000612d8882612c28565b9150819050919050565b6000602082019050612da76000830184612a63565b92915050565b6000608082019050612dc26000830187612a63565b612dcf6020830186612a63565b612ddc6040830185612d3b565b8181036060830152612dee8184612a90565b905095945050505050565b6000602082019050612e0e6000830184612a81565b92915050565b60006020820190508181036000830152612e2e8184612ac9565b905092915050565b60006020820190508181036000830152612e4f81612b33565b9050919050565b60006020820190508181036000830152612e6f81612b56565b9050919050565b60006020820190508181036000830152612e8f81612b79565b9050919050565b60006020820190508181036000830152612eaf81612b9c565b9050919050565b60006020820190508181036000830152612ecf81612bbf565b9050919050565b60006020820190508181036000830152612eef81612be2565b9050919050565b60006020820190508181036000830152612f0f81612c05565b9050919050565b60006020820190508181036000830152612f2f81612c4b565b9050919050565b60006020820190508181036000830152612f4f81612c6e565b9050919050565b60006020820190508181036000830152612f6f81612c91565b9050919050565b60006020820190508181036000830152612f8f81612cb4565b9050919050565b6000608082019050612fab6000830184612cd7565b92915050565b6000602082019050612fc66000830184612d3b565b92915050565b6000612fd6612fe7565b9050612fe28282613290565b919050565b6000604051905090565b600067ffffffffffffffff82111561300c5761300b6133c6565b5b61301582613413565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061307b826131fe565b9150613086836131fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130bb576130ba61330a565b5b828201905092915050565b60006130d1826131fe565b91506130dc836131fe565b9250826130ec576130eb613339565b5b828204905092915050565b6000613102826131fe565b915061310d836131fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131465761314561330a565b5b828202905092915050565b600061315c826131fe565b9150613167836131fe565b92508282101561317a5761317961330a565b5b828203905092915050565b6000613190826131cf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561324957808201518184015260208101905061322e565b83811115613258576000848401525b50505050565b6000600282049050600182168061327657607f821691505b6020821081141561328a57613289613368565b5b50919050565b61329982613413565b810181811067ffffffffffffffff821117156132b8576132b76133c6565b5b80604052505050565b60006132cc826131fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132ff576132fe61330a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f52656163686564206d617820616d6f756e742070657220616464726573730000600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e742e000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f72656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f5075626c69632053616c65206e6f742053746172740000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61363f81613185565b811461364a57600080fd5b50565b61365681613197565b811461366157600080fd5b50565b61366d816131a3565b811461367857600080fd5b50565b613684816131fe565b811461368f57600080fd5b5056fea2646970667358221220014ea0749e2cc2b6c24fd92236dabb6f7734f88801d12d613a84ee8842a7e7e364736f6c63430008070033

Deployed Bytecode Sourcemap

955:2950:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9112:630:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5851:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:2756;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3203:46:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1289:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22765:179:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1088:36:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11348:150:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7002:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;1036:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2630:136:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3115:41:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16850:303:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3065:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1978:523;;;;;;;;;;;;;:::i;:::-;;3258:531;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3797:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3023:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23525:388:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10368:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2509:113:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9112:630:5;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;9996:98::-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;5851:317::-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;19918:2756::-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;3203:46:4:-;;;:::o;1289:387::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1404:9:4::1;1400:269;1423:10;;:17;;1419:1;:21;1400:269;;;1520:14;;1503:10;;1514:1;1503:13;;;;;;;:::i;:::-;;;;;;;;1487;:11;:13::i;:::-;:29;;;;:::i;:::-;:47;;1461:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;1625:32;1635:3;;1639:1;1635:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;1643:10;;1654:1;1643:13;;;;;;;:::i;:::-;;;;;;;;1625:9;:32::i;:::-;1442:3;;;;;:::i;:::-;;;;1400:269;;;;1289:387:::0;;;;:::o;22765:179:5:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;1088:36:4:-;;;;:::o;1864:106::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1955:7:4::1;;1939:13;:23;;;;;;;:::i;:::-;;1864:106:::0;;:::o;11348:150:5:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;7002:230::-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1036:85::-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2630:136:4:-;2696:21;;:::i;:::-;2737;2750:7;2737:12;:21::i;:::-;2730:28;;2630:136;;;:::o;10165:102:5:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;3115:41:4:-;;;;:::o;16850:303:5:-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;3065:43:4:-;;;;:::o;1978:523::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2046:22:4::2;2079:42;2046:76;;2133:25;2191:1;2185:3;2161:21;:27;;;;:::i;:::-;:31;;;;:::i;:::-;2133:59;;2203:14;2244:17;2220:21;:41;;;;:::i;:::-;2203:58;;2273:12;2291:14;:19;;2318:17;2291:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2272:68;;;2359:7;2351:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2412:10;:15;;2435:6;2412:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2398:48;;;;;2465:7;2457:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2035:466;;;;1701:1:1::1;2628:7;:22;;;;1978:523:4:o:0;3258:531::-;1189:10;1176:23;;:9;:23;;;1168:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3349:16:::1;;;;;;;;;;;3341:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3438:14;;3426:8;3410:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;3402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3523:1;3494:25;3508:10;3494:13;:25::i;:::-;:30;;3486:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3590:17;3578:8;:29;;3570:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3652:31;3662:10;3674:8;3652:9;:31::i;:::-;3717:8;3694:19;;:31;;;;;;;:::i;:::-;;;;;;;;3736:45;3772:8;3757:11;;3749:31;;;;:::i;:::-;3736:12;:45::i;:::-;3258:531:::0;:::o;3797:105::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:6:4::1;3869:16;;:25;;;;;;;;;;;;;;;;;;3797:105:::0;:::o;3023:35::-;;;;;;;;;;;;;:::o;23525:388:5:-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;10368:313::-;10441:13;10471:16;10479:7;10471;:16::i;:::-;10466:59;;10496:29;;;;;;;;;;;;;;10466:59;10536:21;10560:10;:8;:10::i;:::-;10536:34;;10612:1;10593:7;10587:21;:26;;:87;;;;;;;;;;;;;;;;;10640:7;10649:18;10659:7;10649:9;:18::i;:::-;10623:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10587:87;10580:94;;;10368:313;;;:::o;2509:113:4:-;2567:7;2594:20;2608:5;2594:13;:20::i;:::-;2587:27;;2509:113;;;:::o;17303:162:5:-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;17714:277:5:-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;5383:90::-;5439:7;5383:90;:::o;12472:1249::-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;;13467:111;13484:1;13474:6;:11;13467:111;;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;32908:110:5:-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;11681:164:5:-;11751:21;;:::i;:::-;11791:47;11810:27;11829:7;11810:18;:27::i;:::-;11791:18;:47::i;:::-;11784:54;;11681:164;;;:::o;7309:176::-;7370:7;1317:13;1452:2;7397:18;:25;7416:5;7397:25;;;;;;;;;;;;;;;;:50;;7396:82;7389:89;;7309:176;;;:::o;2774:224:4:-;2851:5;2838:9;:18;;2830:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2910:5;2898:9;:17;2894:97;;;2940:10;2932:28;;:47;2973:5;2961:9;:17;;;;:::i;:::-;2932:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2894:97;2774:224;:::o;25939:697:5:-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;1742:114:4:-;1802:13;1835;1828:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1742:114;:::o;39122:1961:5:-;39187:17;39600:3;39593:4;39587:11;39583:21;39576:28;;39689:3;39683:4;39676:17;39792:3;40240:5;40368:1;40363:3;40359:11;40352:18;;40536:2;40530:4;40526:13;40522:2;40518:22;40513:3;40505:36;40576:2;40570:4;40566:13;40558:21;;40134:715;40594:4;40134:715;;;40780:1;40775:3;40771:11;40764:18;;40830:2;40824:4;40820:13;40816:2;40812:22;40807:3;40799:36;40687:2;40681:4;40677:13;40669:21;;40134:715;;;40138:455;40886:3;40881;40877:13;40999:2;40994:3;40990:12;40983:19;;41060:6;41055:3;41048:19;39225:1852;;39122:1961;;;:::o;37960:143::-;38093:6;37960:143;;;;;:::o;32160:669::-;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;32362:1;32344:2;:14;;;:19;32340:473;;32383:11;32397:13;;32383:27;;32428:13;32450:8;32444:3;:14;32428:30;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;;;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;32764:34;32365:448;;32340:473;32160:669;;;:::o;13815:361::-;13881:31;;:::i;:::-;13957:6;13924:9;:14;;:41;;;;;;;;;;;1961:3;14009:6;:33;;13975:9;:24;;:68;;;;;;;;;;;14100:1;2075:8;14072:6;:24;:29;;14053:9;:16;;:48;;;;;;;;;;;2470:3;14140:6;:28;;14111:9;:19;;:58;;;;;;;;;;;13815:361;;;:::o;27082:2396::-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;14794:318::-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:7:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1176:::-;1249:8;1259:6;1309:3;1302:4;1294:6;1290:17;1286:27;1276:122;;1317:79;;:::i;:::-;1276:122;1430:6;1417:20;1407:30;;1460:18;1452:6;1449:30;1446:117;;;1482:79;;:::i;:::-;1446:117;1596:4;1588:6;1584:17;1572:29;;1650:3;1642:4;1634:6;1630:17;1620:8;1616:32;1613:41;1610:128;;;1657:79;;:::i;:::-;1610:128;1176:568;;;;;:::o;1750:133::-;1793:5;1831:6;1818:20;1809:29;;1847:30;1871:5;1847:30;:::i;:::-;1750:133;;;;:::o;1889:137::-;1934:5;1972:6;1959:20;1950:29;;1988:32;2014:5;1988:32;:::i;:::-;1889:137;;;;:::o;2032:141::-;2088:5;2119:6;2113:13;2104:22;;2135:32;2161:5;2135:32;:::i;:::-;2032:141;;;;:::o;2192:338::-;2247:5;2296:3;2289:4;2281:6;2277:17;2273:27;2263:122;;2304:79;;:::i;:::-;2263:122;2421:6;2408:20;2446:78;2520:3;2512:6;2505:4;2497:6;2493:17;2446:78;:::i;:::-;2437:87;;2253:277;2192:338;;;;:::o;2550:553::-;2608:8;2618:6;2668:3;2661:4;2653:6;2649:17;2645:27;2635:122;;2676:79;;:::i;:::-;2635:122;2789:6;2776:20;2766:30;;2819:18;2811:6;2808:30;2805:117;;;2841:79;;:::i;:::-;2805:117;2955:4;2947:6;2943:17;2931:29;;3009:3;3001:4;2993:6;2989:17;2979:8;2975:32;2972:41;2969:128;;;3016:79;;:::i;:::-;2969:128;2550:553;;;;;:::o;3109:139::-;3155:5;3193:6;3180:20;3171:29;;3209:33;3236:5;3209:33;:::i;:::-;3109:139;;;;:::o;3254:329::-;3313:6;3362:2;3350:9;3341:7;3337:23;3333:32;3330:119;;;3368:79;;:::i;:::-;3330:119;3488:1;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3459:117;3254:329;;;;:::o;3589:474::-;3657:6;3665;3714:2;3702:9;3693:7;3689:23;3685:32;3682:119;;;3720:79;;:::i;:::-;3682:119;3840:1;3865:53;3910:7;3901:6;3890:9;3886:22;3865:53;:::i;:::-;3855:63;;3811:117;3967:2;3993:53;4038:7;4029:6;4018:9;4014:22;3993:53;:::i;:::-;3983:63;;3938:118;3589:474;;;;;:::o;4069:619::-;4146:6;4154;4162;4211:2;4199:9;4190:7;4186:23;4182:32;4179:119;;;4217:79;;:::i;:::-;4179:119;4337:1;4362:53;4407:7;4398:6;4387:9;4383:22;4362:53;:::i;:::-;4352:63;;4308:117;4464:2;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4435:118;4592:2;4618:53;4663:7;4654:6;4643:9;4639:22;4618:53;:::i;:::-;4608:63;;4563:118;4069:619;;;;;:::o;4694:943::-;4789:6;4797;4805;4813;4862:3;4850:9;4841:7;4837:23;4833:33;4830:120;;;4869:79;;:::i;:::-;4830:120;4989:1;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4960:117;5116:2;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5087:118;5244:2;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5215:118;5400:2;5389:9;5385:18;5372:32;5431:18;5423:6;5420:30;5417:117;;;5453:79;;:::i;:::-;5417:117;5558:62;5612:7;5603:6;5592:9;5588:22;5558:62;:::i;:::-;5548:72;;5343:287;4694:943;;;;;;;:::o;5643:468::-;5708:6;5716;5765:2;5753:9;5744:7;5740:23;5736:32;5733:119;;;5771:79;;:::i;:::-;5733:119;5891:1;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5862:117;6018:2;6044:50;6086:7;6077:6;6066:9;6062:22;6044:50;:::i;:::-;6034:60;;5989:115;5643:468;;;;;:::o;6117:474::-;6185:6;6193;6242:2;6230:9;6221:7;6217:23;6213:32;6210:119;;;6248:79;;:::i;:::-;6210:119;6368:1;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6339:117;6495:2;6521:53;6566:7;6557:6;6546:9;6542:22;6521:53;:::i;:::-;6511:63;;6466:118;6117:474;;;;;:::o;6597:934::-;6719:6;6727;6735;6743;6792:2;6780:9;6771:7;6767:23;6763:32;6760:119;;;6798:79;;:::i;:::-;6760:119;6946:1;6935:9;6931:17;6918:31;6976:18;6968:6;6965:30;6962:117;;;6998:79;;:::i;:::-;6962:117;7111:80;7183:7;7174:6;7163:9;7159:22;7111:80;:::i;:::-;7093:98;;;;6889:312;7268:2;7257:9;7253:18;7240:32;7299:18;7291:6;7288:30;7285:117;;;7321:79;;:::i;:::-;7285:117;7434:80;7506:7;7497:6;7486:9;7482:22;7434:80;:::i;:::-;7416:98;;;;7211:313;6597:934;;;;;;;:::o;7537:323::-;7593:6;7642:2;7630:9;7621:7;7617:23;7613:32;7610:119;;;7648:79;;:::i;:::-;7610:119;7768:1;7793:50;7835:7;7826:6;7815:9;7811:22;7793:50;:::i;:::-;7783:60;;7739:114;7537:323;;;;:::o;7866:327::-;7924:6;7973:2;7961:9;7952:7;7948:23;7944:32;7941:119;;;7979:79;;:::i;:::-;7941:119;8099:1;8124:52;8168:7;8159:6;8148:9;8144:22;8124:52;:::i;:::-;8114:62;;8070:116;7866:327;;;;:::o;8199:349::-;8268:6;8317:2;8305:9;8296:7;8292:23;8288:32;8285:119;;;8323:79;;:::i;:::-;8285:119;8443:1;8468:63;8523:7;8514:6;8503:9;8499:22;8468:63;:::i;:::-;8458:73;;8414:127;8199:349;;;;:::o;8554:529::-;8625:6;8633;8682:2;8670:9;8661:7;8657:23;8653:32;8650:119;;;8688:79;;:::i;:::-;8650:119;8836:1;8825:9;8821:17;8808:31;8866:18;8858:6;8855:30;8852:117;;;8888:79;;:::i;:::-;8852:117;9001:65;9058:7;9049:6;9038:9;9034:22;9001:65;:::i;:::-;8983:83;;;;8779:297;8554:529;;;;;:::o;9089:329::-;9148:6;9197:2;9185:9;9176:7;9172:23;9168:32;9165:119;;;9203:79;;:::i;:::-;9165:119;9323:1;9348:53;9393:7;9384:6;9373:9;9369:22;9348:53;:::i;:::-;9338:63;;9294:117;9089:329;;;;:::o;9424:108::-;9501:24;9519:5;9501:24;:::i;:::-;9496:3;9489:37;9424:108;;:::o;9538:118::-;9625:24;9643:5;9625:24;:::i;:::-;9620:3;9613:37;9538:118;;:::o;9662:99::-;9733:21;9748:5;9733:21;:::i;:::-;9728:3;9721:34;9662:99;;:::o;9767:109::-;9848:21;9863:5;9848:21;:::i;:::-;9843:3;9836:34;9767:109;;:::o;9882:360::-;9968:3;9996:38;10028:5;9996:38;:::i;:::-;10050:70;10113:6;10108:3;10050:70;:::i;:::-;10043:77;;10129:52;10174:6;10169:3;10162:4;10155:5;10151:16;10129:52;:::i;:::-;10206:29;10228:6;10206:29;:::i;:::-;10201:3;10197:39;10190:46;;9972:270;9882:360;;;;:::o;10248:364::-;10336:3;10364:39;10397:5;10364:39;:::i;:::-;10419:71;10483:6;10478:3;10419:71;:::i;:::-;10412:78;;10499:52;10544:6;10539:3;10532:4;10525:5;10521:16;10499:52;:::i;:::-;10576:29;10598:6;10576:29;:::i;:::-;10571:3;10567:39;10560:46;;10340:272;10248:364;;;;:::o;10618:377::-;10724:3;10752:39;10785:5;10752:39;:::i;:::-;10807:89;10889:6;10884:3;10807:89;:::i;:::-;10800:96;;10905:52;10950:6;10945:3;10938:4;10931:5;10927:16;10905:52;:::i;:::-;10982:6;10977:3;10973:16;10966:23;;10728:267;10618:377;;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11745:366;;;:::o;12117:::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12117:366;;;:::o;12489:::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12489:366;;;:::o;12861:::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;12861:366;;;:::o;13233:::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13233:366;;;:::o;13605:398::-;13764:3;13785:83;13866:1;13861:3;13785:83;:::i;:::-;13778:90;;13877:93;13966:3;13877:93;:::i;:::-;13995:1;13990:3;13986:11;13979:18;;13605:398;;;:::o;14009:366::-;14151:3;14172:67;14236:2;14231:3;14172:67;:::i;:::-;14165:74;;14248:93;14337:3;14248:93;:::i;:::-;14366:2;14361:3;14357:12;14350:19;;14009:366;;;:::o;14381:::-;14523:3;14544:67;14608:2;14603:3;14544:67;:::i;:::-;14537:74;;14620:93;14709:3;14620:93;:::i;:::-;14738:2;14733:3;14729:12;14722:19;;14381:366;;;:::o;14753:::-;14895:3;14916:67;14980:2;14975:3;14916:67;:::i;:::-;14909:74;;14992:93;15081:3;14992:93;:::i;:::-;15110:2;15105:3;15101:12;15094:19;;14753:366;;;:::o;15125:::-;15267:3;15288:67;15352:2;15347:3;15288:67;:::i;:::-;15281:74;;15364:93;15453:3;15364:93;:::i;:::-;15482:2;15477:3;15473:12;15466:19;;15125:366;;;:::o;15569:876::-;15730:4;15725:3;15721:14;15817:4;15810:5;15806:16;15800:23;15836:63;15893:4;15888:3;15884:14;15870:12;15836:63;:::i;:::-;15745:164;16001:4;15994:5;15990:16;15984:23;16020:61;16075:4;16070:3;16066:14;16052:12;16020:61;:::i;:::-;15919:172;16175:4;16168:5;16164:16;16158:23;16194:57;16245:4;16240:3;16236:14;16222:12;16194:57;:::i;:::-;16101:160;16348:4;16341:5;16337:16;16331:23;16367:61;16422:4;16417:3;16413:14;16399:12;16367:61;:::i;:::-;16271:167;15699:746;15569:876;;:::o;16451:105::-;16526:23;16543:5;16526:23;:::i;:::-;16521:3;16514:36;16451:105;;:::o;16562:118::-;16649:24;16667:5;16649:24;:::i;:::-;16644:3;16637:37;16562:118;;:::o;16686:105::-;16761:23;16778:5;16761:23;:::i;:::-;16756:3;16749:36;16686:105;;:::o;16797:435::-;16977:3;16999:95;17090:3;17081:6;16999:95;:::i;:::-;16992:102;;17111:95;17202:3;17193:6;17111:95;:::i;:::-;17104:102;;17223:3;17216:10;;16797:435;;;;;:::o;17238:379::-;17422:3;17444:147;17587:3;17444:147;:::i;:::-;17437:154;;17608:3;17601:10;;17238:379;;;:::o;17623:222::-;17716:4;17754:2;17743:9;17739:18;17731:26;;17767:71;17835:1;17824:9;17820:17;17811:6;17767:71;:::i;:::-;17623:222;;;;:::o;17851:640::-;18046:4;18084:3;18073:9;18069:19;18061:27;;18098:71;18166:1;18155:9;18151:17;18142:6;18098:71;:::i;:::-;18179:72;18247:2;18236:9;18232:18;18223:6;18179:72;:::i;:::-;18261;18329:2;18318:9;18314:18;18305:6;18261:72;:::i;:::-;18380:9;18374:4;18370:20;18365:2;18354:9;18350:18;18343:48;18408:76;18479:4;18470:6;18408:76;:::i;:::-;18400:84;;17851:640;;;;;;;:::o;18497:210::-;18584:4;18622:2;18611:9;18607:18;18599:26;;18635:65;18697:1;18686:9;18682:17;18673:6;18635:65;:::i;:::-;18497:210;;;;:::o;18713:313::-;18826:4;18864:2;18853:9;18849:18;18841:26;;18913:9;18907:4;18903:20;18899:1;18888:9;18884:17;18877:47;18941:78;19014:4;19005:6;18941:78;:::i;:::-;18933:86;;18713:313;;;;:::o;19032:419::-;19198:4;19236:2;19225:9;19221:18;19213:26;;19285:9;19279:4;19275:20;19271:1;19260:9;19256:17;19249:47;19313:131;19439:4;19313:131;:::i;:::-;19305:139;;19032:419;;;:::o;19457:::-;19623:4;19661:2;19650:9;19646:18;19638:26;;19710:9;19704:4;19700:20;19696:1;19685:9;19681:17;19674:47;19738:131;19864:4;19738:131;:::i;:::-;19730:139;;19457:419;;;:::o;19882:::-;20048:4;20086:2;20075:9;20071:18;20063:26;;20135:9;20129:4;20125:20;20121:1;20110:9;20106:17;20099:47;20163:131;20289:4;20163:131;:::i;:::-;20155:139;;19882:419;;;:::o;20307:::-;20473:4;20511:2;20500:9;20496:18;20488:26;;20560:9;20554:4;20550:20;20546:1;20535:9;20531:17;20524:47;20588:131;20714:4;20588:131;:::i;:::-;20580:139;;20307:419;;;:::o;20732:::-;20898:4;20936:2;20925:9;20921:18;20913:26;;20985:9;20979:4;20975:20;20971:1;20960:9;20956:17;20949:47;21013:131;21139:4;21013:131;:::i;:::-;21005:139;;20732:419;;;:::o;21157:::-;21323:4;21361:2;21350:9;21346:18;21338:26;;21410:9;21404:4;21400:20;21396:1;21385:9;21381:17;21374:47;21438:131;21564:4;21438:131;:::i;:::-;21430:139;;21157:419;;;:::o;21582:::-;21748:4;21786:2;21775:9;21771:18;21763:26;;21835:9;21829:4;21825:20;21821:1;21810:9;21806:17;21799:47;21863:131;21989:4;21863:131;:::i;:::-;21855:139;;21582:419;;;:::o;22007:::-;22173:4;22211:2;22200:9;22196:18;22188:26;;22260:9;22254:4;22250:20;22246:1;22235:9;22231:17;22224:47;22288:131;22414:4;22288:131;:::i;:::-;22280:139;;22007:419;;;:::o;22432:::-;22598:4;22636:2;22625:9;22621:18;22613:26;;22685:9;22679:4;22675:20;22671:1;22660:9;22656:17;22649:47;22713:131;22839:4;22713:131;:::i;:::-;22705:139;;22432:419;;;:::o;22857:::-;23023:4;23061:2;23050:9;23046:18;23038:26;;23110:9;23104:4;23100:20;23096:1;23085:9;23081:17;23074:47;23138:131;23264:4;23138:131;:::i;:::-;23130:139;;22857:419;;;:::o;23282:::-;23448:4;23486:2;23475:9;23471:18;23463:26;;23535:9;23529:4;23525:20;23521:1;23510:9;23506:17;23499:47;23563:131;23689:4;23563:131;:::i;:::-;23555:139;;23282:419;;;:::o;23707:351::-;23864:4;23902:3;23891:9;23887:19;23879:27;;23916:135;24048:1;24037:9;24033:17;24024:6;23916:135;:::i;:::-;23707:351;;;;:::o;24064:222::-;24157:4;24195:2;24184:9;24180:18;24172:26;;24208:71;24276:1;24265:9;24261:17;24252:6;24208:71;:::i;:::-;24064:222;;;;:::o;24292:129::-;24326:6;24353:20;;:::i;:::-;24343:30;;24382:33;24410:4;24402:6;24382:33;:::i;:::-;24292:129;;;:::o;24427:75::-;24460:6;24493:2;24487:9;24477:19;;24427:75;:::o;24508:307::-;24569:4;24659:18;24651:6;24648:30;24645:56;;;24681:18;;:::i;:::-;24645:56;24719:29;24741:6;24719:29;:::i;:::-;24711:37;;24803:4;24797;24793:15;24785:23;;24508:307;;;:::o;24821:98::-;24872:6;24906:5;24900:12;24890:22;;24821:98;;;:::o;24925:99::-;24977:6;25011:5;25005:12;24995:22;;24925:99;;;:::o;25030:168::-;25113:11;25147:6;25142:3;25135:19;25187:4;25182:3;25178:14;25163:29;;25030:168;;;;:::o;25204:147::-;25305:11;25342:3;25327:18;;25204:147;;;;:::o;25357:169::-;25441:11;25475:6;25470:3;25463:19;25515:4;25510:3;25506:14;25491:29;;25357:169;;;;:::o;25532:148::-;25634:11;25671:3;25656:18;;25532:148;;;;:::o;25686:305::-;25726:3;25745:20;25763:1;25745:20;:::i;:::-;25740:25;;25779:20;25797:1;25779:20;:::i;:::-;25774:25;;25933:1;25865:66;25861:74;25858:1;25855:81;25852:107;;;25939:18;;:::i;:::-;25852:107;25983:1;25980;25976:9;25969:16;;25686:305;;;;:::o;25997:185::-;26037:1;26054:20;26072:1;26054:20;:::i;:::-;26049:25;;26088:20;26106:1;26088:20;:::i;:::-;26083:25;;26127:1;26117:35;;26132:18;;:::i;:::-;26117:35;26174:1;26171;26167:9;26162:14;;25997:185;;;;:::o;26188:348::-;26228:7;26251:20;26269:1;26251:20;:::i;:::-;26246:25;;26285:20;26303:1;26285:20;:::i;:::-;26280:25;;26473:1;26405:66;26401:74;26398:1;26395:81;26390:1;26383:9;26376:17;26372:105;26369:131;;;26480:18;;:::i;:::-;26369:131;26528:1;26525;26521:9;26510:20;;26188:348;;;;:::o;26542:191::-;26582:4;26602:20;26620:1;26602:20;:::i;:::-;26597:25;;26636:20;26654:1;26636:20;:::i;:::-;26631:25;;26675:1;26672;26669:8;26666:34;;;26680:18;;:::i;:::-;26666:34;26725:1;26722;26718:9;26710:17;;26542:191;;;;:::o;26739:96::-;26776:7;26805:24;26823:5;26805:24;:::i;:::-;26794:35;;26739:96;;;:::o;26841:90::-;26875:7;26918:5;26911:13;26904:21;26893:32;;26841:90;;;:::o;26937:149::-;26973:7;27013:66;27006:5;27002:78;26991:89;;26937:149;;;:::o;27092:126::-;27129:7;27169:42;27162:5;27158:54;27147:65;;27092:126;;;:::o;27224:91::-;27260:7;27300:8;27293:5;27289:20;27278:31;;27224:91;;;:::o;27321:77::-;27358:7;27387:5;27376:16;;27321:77;;;:::o;27404:101::-;27440:7;27480:18;27473:5;27469:30;27458:41;;27404:101;;;:::o;27511:154::-;27595:6;27590:3;27585;27572:30;27657:1;27648:6;27643:3;27639:16;27632:27;27511:154;;;:::o;27671:307::-;27739:1;27749:113;27763:6;27760:1;27757:13;27749:113;;;27848:1;27843:3;27839:11;27833:18;27829:1;27824:3;27820:11;27813:39;27785:2;27782:1;27778:10;27773:15;;27749:113;;;27880:6;27877:1;27874:13;27871:101;;;27960:1;27951:6;27946:3;27942:16;27935:27;27871:101;27720:258;27671:307;;;:::o;27984:320::-;28028:6;28065:1;28059:4;28055:12;28045:22;;28112:1;28106:4;28102:12;28133:18;28123:81;;28189:4;28181:6;28177:17;28167:27;;28123:81;28251:2;28243:6;28240:14;28220:18;28217:38;28214:84;;;28270:18;;:::i;:::-;28214:84;28035:269;27984:320;;;:::o;28310:281::-;28393:27;28415:4;28393:27;:::i;:::-;28385:6;28381:40;28523:6;28511:10;28508:22;28487:18;28475:10;28472:34;28469:62;28466:88;;;28534:18;;:::i;:::-;28466:88;28574:10;28570:2;28563:22;28353:238;28310:281;;:::o;28597:233::-;28636:3;28659:24;28677:5;28659:24;:::i;:::-;28650:33;;28705:66;28698:5;28695:77;28692:103;;;28775:18;;:::i;:::-;28692:103;28822:1;28815:5;28811:13;28804:20;;28597:233;;;:::o;28836:180::-;28884:77;28881:1;28874:88;28981:4;28978:1;28971:15;29005:4;29002:1;28995:15;29022:180;29070:77;29067:1;29060:88;29167:4;29164:1;29157:15;29191:4;29188:1;29181:15;29208:180;29256:77;29253:1;29246:88;29353:4;29350:1;29343:15;29377:4;29374:1;29367:15;29394:180;29442:77;29439:1;29432:88;29539:4;29536:1;29529:15;29563:4;29560:1;29553:15;29580:180;29628:77;29625:1;29618:88;29725:4;29722:1;29715:15;29749:4;29746:1;29739:15;29766:117;29875:1;29872;29865:12;29889:117;29998:1;29995;29988:12;30012:117;30121:1;30118;30111:12;30135:117;30244:1;30241;30234:12;30258:117;30367:1;30364;30357:12;30381:117;30490:1;30487;30480:12;30504:102;30545:6;30596:2;30592:7;30587:2;30580:5;30576:14;30572:28;30562:38;;30504:102;;;:::o;30612:225::-;30752:34;30748:1;30740:6;30736:14;30729:58;30821:8;30816:2;30808:6;30804:15;30797:33;30612:225;:::o;30843:168::-;30983:20;30979:1;30971:6;30967:14;30960:44;30843:168;:::o;31017:180::-;31157:32;31153:1;31145:6;31141:14;31134:56;31017:180;:::o;31203:::-;31343:32;31339:1;31331:6;31327:14;31320:56;31203:180;:::o;31389:227::-;31529:34;31525:1;31517:6;31513:14;31506:58;31598:10;31593:2;31585:6;31581:15;31574:35;31389:227;:::o;31622:182::-;31762:34;31758:1;31750:6;31746:14;31739:58;31622:182;:::o;31810:177::-;31950:29;31946:1;31938:6;31934:14;31927:53;31810:177;:::o;31993:114::-;;:::o;32113:166::-;32253:18;32249:1;32241:6;32237:14;32230:42;32113:166;:::o;32285:172::-;32425:24;32421:1;32413:6;32409:14;32402:48;32285:172;:::o;32463:171::-;32603:23;32599:1;32591:6;32587:14;32580:47;32463:171;:::o;32640:181::-;32780:33;32776:1;32768:6;32764:14;32757:57;32640:181;:::o;32827:122::-;32900:24;32918:5;32900:24;:::i;:::-;32893:5;32890:35;32880:63;;32939:1;32936;32929:12;32880:63;32827:122;:::o;32955:116::-;33025:21;33040:5;33025:21;:::i;:::-;33018:5;33015:32;33005:60;;33061:1;33058;33051:12;33005:60;32955:116;:::o;33077:120::-;33149:23;33166:5;33149:23;:::i;:::-;33142:5;33139:34;33129:62;;33187:1;33184;33177:12;33129:62;33077:120;:::o;33203:122::-;33276:24;33294:5;33276:24;:::i;:::-;33269:5;33266:35;33256:63;;33315:1;33312;33305:12;33256:63;33203:122;:::o

Swarm Source

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