ETH Price: $2,512.64 (-0.19%)
Gas: 5.63 Gwei

Token

indiGoKids (INDIGO)
 

Overview

Max Total Supply

249 INDIGO

Holders

94

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
IndigoKids

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-24
*/

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


// 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: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
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();

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

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

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

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

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

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

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

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

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

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

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

    // ==============================
    //        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 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

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

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 {
        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;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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 '';
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function 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) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try 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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

    /**
     * @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 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 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 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. 48 is the ASCII index of '0'.
                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: Indigo.sol



pragma solidity ^0.8.0;




contract IndigoKids is ERC721A, Ownable {
    using Strings for uint256;

    enum Status { CLOSED, PRESALE_LIVE, SALE_LIVE }

    uint256 public maxSupply = 5555;
    uint256 public mintPrice = 0.077 ether;
    uint256 public discountPrice = 0.4851 ether;
    Status public state;
    bool public revealed;
    string public baseURI;
    string public provenance;

    uint256 public constant MAX_PER_TX = 7;

    address private constant SHAREHOLDER_ONE = 0xda29D9087078f1AdBf10dA0dc4ff772905b5C26A;
    address private constant SHAREHOLDER_TWO = 0xb48EAc36770023163766C52AA60be800C0B7aA63;
    address private constant SHAREHOLDER_THREE = 0xe4446D52e2bdB3E31470643Ab1753a4c2aEee3eA;
    address private constant SHAREHOLDER_FOUR = 0xAdc50a8Ef4Fb5Ea6413e05a6FFbB2AeFEd25683B;
    address private constant DEVELOPER = 0x44f6498D1403321890F3f2917E00F22dBDE3577a;
    
    address private _signer = 0x75ab02A1dB5297bE9B33E131c7B33563200521De;

    mapping(address => bool) private admins;
    mapping(uint256 => bool) private _usedNonces;
 
    constructor() ERC721A("indiGoKids", "INDIGO") {
        // -- remove these lines if you want token ID 0 to exist --
        _safeMint(address(this), 1);
        _burn(0);
        // --
    }

    function reserveTeamTokens(address[] memory to, uint256[] memory quantity) external onlyOwner {
        for(uint i = 0; i < to.length; i++) {
            _safeMint(to[i], quantity[i]);
        }
    }

    function mint(uint256 quantity, uint256 nonce, bytes calldata signature) external payable {
        require((state == Status.SALE_LIVE || state == Status.PRESALE_LIVE), "INDIGO//SALE_NOT_LIVE");
        require(msg.sender == tx.origin, "INDIGO//ONLY_EOA");
        require(quantity <= MAX_PER_TX);
        require(totalSupply() + quantity <= maxSupply, "INDIGO//SOLD_OUT");
        require(msg.value >= (quantity == 7 ? discountPrice : (mintPrice) * quantity), "INDIGO//INSUFFICIENT_ETH");

        if(state == Status.PRESALE_LIVE) {
            require(!_usedNonces[nonce], "INDIGO//NONCE_USED");
            require(ECDSA.recover(keccak256(abi.encodePacked(msg.sender, nonce)), signature) == _signer, "INDIGO//FAILED_SIGNATURE");
            require(_numberMinted(msg.sender) + quantity <= 7, "INDIGO//ALREADY_MINTED_MAX");
            _usedNonces[nonce] = true;
        }

        _safeMint(msg.sender, quantity);
    }

    function nonceUsed(uint256 nonce) external view returns (bool) {
        return _usedNonces[nonce];
    }

    function setMintPrice(uint256 _price) external onlyOwner {
        require(_price <= mintPrice);
        mintPrice = _price;
    }

    function setMaxSupply(uint256 _supply) external onlyOwner {
        require(_supply <= 5555);
        maxSupply = _supply;
    }

    function setSaleState(Status _state) external onlyOwner {
        state = _state;
    }

    function setProvenanceHash(string memory _provenance) external onlyOwner {
        require(bytes(provenance).length == 0);
        provenance = _provenance;
    }

    function updateBaseURI(string memory newURI) external onlyOwner {
        baseURI = newURI;
    }

    function withdraw() external onlyOwner {
        // pay 5% to dev
        payable(DEVELOPER).transfer(address(this).balance * 1 / 20);
        // split remaining to  shareholders
        uint256 balance = address(this).balance;
        payable(SHAREHOLDER_ONE).transfer(balance * 375 / 1000);
        payable(SHAREHOLDER_TWO).transfer(balance * 375 / 1000);
        payable(SHAREHOLDER_THREE).transfer(balance * 125 / 1000);
        // get share + any left over dust
        payable(SHAREHOLDER_FOUR).transfer(address(this).balance);
    }

    function setSigner(address signer) external onlyOwner {
        _signer = signer;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, _tokenId.toString()));
    }

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

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":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPrice","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":"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"nonceUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"reserveTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IndigoKids.Status","name":"_state","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum IndigoKids.Status","name":"","type":"uint8"}],"stateMutability":"view","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":[{"internalType":"string","name":"newURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b36009556701118f178fb48000600a556706bb6be13c8ac000600b557375ab02a1db5297be9b33e131c7b33563200521de600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008457600080fd5b506040518060400160405280600a81526020017f696e6469476f4b696473000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f494e4449474f000000000000000000000000000000000000000000000000000081525081600290805190602001906200010992919062000bc0565b5080600390805190602001906200012292919062000bc0565b50620001336200018660201b60201c565b60008190555050506200015b6200014f6200018b60201b60201c565b6200019360201b60201c565b6200016e3060016200025960201b60201c565b6200018060006200027f60201b60201c565b62000ec1565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200027b8282604051806020016040528060008152506200029560201b60201c565b5050565b620002928160006200034660201b60201c565b50565b620002a78383620005f160201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200034157600080549050600083820390505b620002f06000868380600101945086620007f060201b60201c565b62000327576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620002d55781600054146200033e57600080fd5b50505b505050565b600062000359836200096260201b60201c565b90506000819050600080620003748662000a3e60201b60201c565b9150915084156200040057620003a181846200039562000a6060201b60201c565b62000a6860201b60201c565b620003ff57620003c783620003bb62000a6060201b60201c565b62000aac60201b60201c565b620003fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6200041683600088600162000b4060201b60201c565b80156200042257600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620004da83620004908560008862000b4660201b60201c565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171762000b7660201b60201c565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415620005655760006001870190506000600460008381526020019081526020016000205414156200056357600054811462000562578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005d783600088600162000ba160201b60201c565b600160008154809291906001019190505550505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200065f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156200069b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006b0600084838562000b4060201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200073f8362000721600086600062000b4660201b60201c565b620007328562000ba760201b60201c565b1762000b7660201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200076357806000819055505050620007eb600084838562000ba160201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200081e62000a6060201b60201c565b8786866040518563ffffffff1660e01b815260040162000842949392919062000d1c565b602060405180830381600087803b1580156200085d57600080fd5b505af19250505080156200089157506040513d601f19601f820116820180604052508101906200088e919062000c87565b60015b6200090f573d8060008114620008c4576040519150601f19603f3d011682016040523d82523d6000602084013e620008c9565b606091505b5060008151141562000907576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905080620009796200018660201b60201c565b1162000a075760005481101562000a065760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141562000a04575b6000811415620009f9576004600083600190039350838152602001908152602001600020549050620009cc565b809250505062000a39565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b50505050565b60008060e883901c905060e862000b6586868462000bb760201b60201c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60009392505050565b82805462000bce9062000e2c565b90600052602060002090601f01602090048101928262000bf2576000855562000c3e565b82601f1062000c0d57805160ff191683800117855562000c3e565b8280016001018555821562000c3e579182015b8281111562000c3d57825182559160200191906001019062000c20565b5b50905062000c4d919062000c51565b5090565b5b8082111562000c6c57600081600090555060010162000c52565b5090565b60008151905062000c818162000ea7565b92915050565b60006020828403121562000ca05762000c9f62000e91565b5b600062000cb08482850162000c70565b91505092915050565b62000cc48162000d8c565b82525050565b600062000cd78262000d70565b62000ce3818562000d7b565b935062000cf581856020860162000df6565b62000d008162000e96565b840191505092915050565b62000d168162000dec565b82525050565b600060808201905062000d33600083018762000cb9565b62000d42602083018662000cb9565b62000d51604083018562000d0b565b818103606083015262000d65818462000cca565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b600062000d998262000dcc565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000e1657808201518184015260208101905062000df9565b8381111562000e26576000848401525b50505050565b6000600282049050600182168062000e4557607f821691505b6020821081141562000e5c5762000e5b62000e62565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000eb28162000da0565b811462000ebe57600080fd5b50565b6145038062000ed16000396000f3fe6080604052600436106102045760003560e01c80636f8b44b011610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610732578063e985e9c51461075d578063f2fde38b1461079a578063f43a22dc146107c3578063f4a0a528146107ee57610204565b8063a22cb46514610678578063b88d4fde146106a1578063c19d93fb146106ca578063c87b56dd146106f557610204565b806384ad8e8f116100e757806384ad8e8f146105915780638da5cb5b146105bc578063931688cb146105e757806394d0d3a61461061057806395d89b411461064d57610204565b80636f8b44b0146104eb57806370a0823114610514578063715018a614610551578063791b17c71461056857610204565b806323b872dd1161019b5780635a67de071161016a5780635a67de07146104065780636352211e1461042f5780636817c76c1461046c5780636c0360eb146104975780636c19e783146104c257610204565b806323b872dd146103725780633ccfd60b1461039b57806342842e0e146103b257806351830227146103db57610204565b8063095ea7b3116101d7578063095ea7b3146102ca5780630f7309e8146102f3578063109695231461031e57806318160ddd1461034757610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308dc9f42146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906133a4565b610817565b60405161023d9190613960565b60405180910390f35b34801561025257600080fd5b5061025b6108a9565b60405161026891906139db565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613474565b61093b565b6040516102a591906138f9565b60405180910390f35b6102c860048036038101906102c391906134a1565b6109b7565b005b3480156102d657600080fd5b506102f160048036038101906102ec91906132ec565b610dd4565b005b3480156102ff57600080fd5b50610308610f15565b60405161031591906139db565b60405180910390f35b34801561032a57600080fd5b506103456004803603810190610340919061342b565b610fa3565b005b34801561035357600080fd5b5061035c611054565b6040516103699190613bbd565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906131d6565b61106b565b005b3480156103a757600080fd5b506103b0611390565b005b3480156103be57600080fd5b506103d960048036038101906103d491906131d6565b611640565b005b3480156103e757600080fd5b506103f0611660565b6040516103fd9190613960565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906133fe565b611673565b005b34801561043b57600080fd5b5061045660048036038101906104519190613474565b61171c565b60405161046391906138f9565b60405180910390f35b34801561047857600080fd5b5061048161172e565b60405161048e9190613bbd565b60405180910390f35b3480156104a357600080fd5b506104ac611734565b6040516104b991906139db565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613169565b6117c2565b005b3480156104f757600080fd5b50610512600480360381019061050d9190613474565b611882565b005b34801561052057600080fd5b5061053b60048036038101906105369190613169565b611917565b6040516105489190613bbd565b60405180910390f35b34801561055d57600080fd5b506105666119d0565b005b34801561057457600080fd5b5061058f600480360381019061058a919061332c565b611a58565b005b34801561059d57600080fd5b506105a6611b36565b6040516105b39190613bbd565b60405180910390f35b3480156105c857600080fd5b506105d1611b3c565b6040516105de91906138f9565b60405180910390f35b3480156105f357600080fd5b5061060e6004803603810190610609919061342b565b611b66565b005b34801561061c57600080fd5b5061063760048036038101906106329190613474565b611bfc565b6040516106449190613960565b60405180910390f35b34801561065957600080fd5b50610662611c26565b60405161066f91906139db565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906132ac565b611cb8565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613229565b611e30565b005b3480156106d657600080fd5b506106df611ea3565b6040516106ec91906139c0565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613474565b611eb6565b60405161072991906139db565b60405180910390f35b34801561073e57600080fd5b50610747611f32565b6040516107549190613bbd565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190613196565b611f38565b6040516107919190613960565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613169565b611fcc565b005b3480156107cf57600080fd5b506107d86120c4565b6040516107e59190613bbd565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613474565b6120c9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108b890613f16565b80601f01602080910402602001604051908101604052809291908181526020018280546108e490613f16565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b60006109468261215e565b61097c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6002808111156109ca576109c961407f565b5b600c60009054906101000a900460ff1660028111156109ec576109eb61407f565b5b1480610a2b575060016002811115610a0757610a0661407f565b5b600c60009054906101000a900460ff166002811115610a2957610a2861407f565b5b145b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190613abd565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90613b7d565b60405180910390fd5b6007841115610ae657600080fd5b60095484610af2611054565b610afc9190613d0f565b1115610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613add565b60405180910390fd5b60078414610b585783600a54610b539190613d96565b610b5c565b600b545b341015610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613b5d565b60405180910390fd5b60016002811115610bb257610bb161407f565b5b600c60009054906101000a900460ff166002811115610bd457610bd361407f565b5b1415610dc4576011600084815260200190815260200160002060009054906101000a900460ff1615610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290613a7d565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610cea3385604051602001610c8a9291906138a9565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506121bd565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613b1d565b60405180910390fd5b600784610d4c336121e4565b610d569190613d0f565b1115610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613b9d565b60405180910390fd5b60016011600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610dce338561223b565b50505050565b6000610ddf8261171c565b90508073ffffffffffffffffffffffffffffffffffffffff16610e00612259565b73ffffffffffffffffffffffffffffffffffffffff1614610e6357610e2c81610e27612259565b611f38565b610e62576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e8054610f2290613f16565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4e90613f16565b8015610f9b5780601f10610f7057610100808354040283529160200191610f9b565b820191906000526020600020905b815481529060010190602001808311610f7e57829003601f168201915b505050505081565b610fab612261565b73ffffffffffffffffffffffffffffffffffffffff16610fc9611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690613afd565b60405180910390fd5b6000600e805461102e90613f16565b90501461103a57600080fd5b80600e9080519060200190611050929190612dd6565b5050565b600061105e612269565b6001546000540303905090565b60006110768261226e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110e98461233c565b915091506110ff81876110fa612259565b61235e565b61114b576111148661110f612259565b611f38565b61114a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111b2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111bf86868660016123a2565b80156111ca57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611298856112748888876123a8565b7c0200000000000000000000000000000000000000000000000000000000176123d0565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561132057600060018501905060006004600083815260200190815260200160002054141561131e57600054811461131d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461138886868660016123fb565b505050505050565b611398612261565b73ffffffffffffffffffffffffffffffffffffffff166113b6611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613afd565b60405180910390fd5b7344f6498d1403321890f3f2917e00f22dbde3577a73ffffffffffffffffffffffffffffffffffffffff166108fc60146001476114499190613d96565b6114539190613d65565b9081150290604051600060405180830381858888f1935050505015801561147e573d6000803e3d6000fd5b50600047905073da29d9087078f1adbf10da0dc4ff772905b5c26a73ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610177846114c39190613d96565b6114cd9190613d65565b9081150290604051600060405180830381858888f193505050501580156114f8573d6000803e3d6000fd5b5073b48eac36770023163766c52aa60be800c0b7aa6373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610177846115389190613d96565b6115429190613d65565b9081150290604051600060405180830381858888f1935050505015801561156d573d6000803e3d6000fd5b5073e4446d52e2bdb3e31470643ab1753a4c2aeee3ea73ffffffffffffffffffffffffffffffffffffffff166108fc6103e8607d846115ac9190613d96565b6115b69190613d65565b9081150290604051600060405180830381858888f193505050501580156115e1573d6000803e3d6000fd5b5073adc50a8ef4fb5ea6413e05a6ffbb2aefed25683b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561163c573d6000803e3d6000fd5b5050565b61165b83838360405180602001604052806000815250611e30565b505050565b600c60019054906101000a900460ff1681565b61167b612261565b73ffffffffffffffffffffffffffffffffffffffff16611699611b3c565b73ffffffffffffffffffffffffffffffffffffffff16146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690613afd565b60405180910390fd5b80600c60006101000a81548160ff021916908360028111156117145761171361407f565b5b021790555050565b60006117278261226e565b9050919050565b600a5481565b600d805461174190613f16565b80601f016020809104026020016040519081016040528092919081815260200182805461176d90613f16565b80156117ba5780601f1061178f576101008083540402835291602001916117ba565b820191906000526020600020905b81548152906001019060200180831161179d57829003601f168201915b505050505081565b6117ca612261565b73ffffffffffffffffffffffffffffffffffffffff166117e8611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590613afd565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61188a612261565b73ffffffffffffffffffffffffffffffffffffffff166118a8611b3c565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613afd565b60405180910390fd5b6115b381111561190d57600080fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119d8612261565b73ffffffffffffffffffffffffffffffffffffffff166119f6611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390613afd565b60405180910390fd5b611a566000612401565b565b611a60612261565b73ffffffffffffffffffffffffffffffffffffffff16611a7e611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613afd565b60405180910390fd5b60005b8251811015611b3157611b1e838281518110611af657611af56140dd565b5b6020026020010151838381518110611b1157611b106140dd565b5b602002602001015161223b565b8080611b2990613f79565b915050611ad7565b505050565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b6e612261565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613afd565b60405180910390fd5b80600d9080519060200190611bf8929190612dd6565b5050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b606060038054611c3590613f16565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6190613f16565b8015611cae5780601f10611c8357610100808354040283529160200191611cae565b820191906000526020600020905b815481529060010190602001808311611c9157829003601f168201915b5050505050905090565b611cc0612259565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d25576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d32612259565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddf612259565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e249190613960565b60405180910390a35050565b611e3b84848461106b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e9d57611e66848484846124c7565b611e9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900460ff1681565b6060611ec18261215e565b611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790613b3d565b60405180910390fd5b600d611f0b83612627565b604051602001611f1c9291906138d5565b6040516020818303038152906040529050919050565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fd4612261565b73ffffffffffffffffffffffffffffffffffffffff16611ff2611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90613afd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90613a3d565b60405180910390fd5b6120c181612401565b50565b600781565b6120d1612261565b73ffffffffffffffffffffffffffffffffffffffff166120ef611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90613afd565b60405180910390fd5b600a5481111561215457600080fd5b80600a8190555050565b600081612169612269565b11158015612178575060005482105b80156121b6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008060006121cc8585612788565b915091506121d98161280b565b819250505092915050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6122558282604051806020016040528060008152506129e0565b5050565b600033905090565b600033905090565b600090565b6000808290508061227d612269565b11612305576000548110156123045760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612302575b60008114156122f85760046000836001900393508381526020019081526020016000205490506122cd565b8092505050612337565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123bf868684612a7d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ed612259565b8786866040518563ffffffff1660e01b815260040161250f9493929190613914565b602060405180830381600087803b15801561252957600080fd5b505af192505050801561255a57506040513d601f19601f8201168201806040525081019061255791906133d1565b60015b6125d4573d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b506000815114156125cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561266f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612783565b600082905060005b600082146126a157808061268a90613f79565b915050600a8261269a9190613d65565b9150612677565b60008167ffffffffffffffff8111156126bd576126bc61410c565b5b6040519080825280601f01601f1916602001820160405280156126ef5781602001600182028036833780820191505090505b5090505b6000851461277c576001826127089190613df0565b9150600a856127179190613ff0565b60306127239190613d0f565b60f81b818381518110612739576127386140dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127759190613d65565b94506126f3565b8093505050505b919050565b6000806041835114156127ca5760008060006020860151925060408601519150606086015160001a90506127be87828585612a86565b94509450505050612804565b6040835114156127fb5760008060208501519150604085015190506127f0868383612b93565b935093505050612804565b60006002915091505b9250929050565b6000600481111561281f5761281e61407f565b5b8160048111156128325761283161407f565b5b141561283d576129dd565b600160048111156128515761285061407f565b5b8160048111156128645761286361407f565b5b14156128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c906139fd565b60405180910390fd5b600260048111156128b9576128b861407f565b5b8160048111156128cc576128cb61407f565b5b141561290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290490613a1d565b60405180910390fd5b600360048111156129215761292061407f565b5b8160048111156129345761293361407f565b5b1415612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c90613a5d565b60405180910390fd5b6004808111156129885761298761407f565b5b81600481111561299b5761299a61407f565b5b14156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d390613a9d565b60405180910390fd5b5b50565b6129ea8383612bf2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a7857600080549050600083820390505b612a2a60008683806001019450866124c7565b612a60576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a17578160005414612a7557600080fd5b50505b505050565b60009392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612ac1576000600391509150612b8a565b601b8560ff1614158015612ad95750601c8560ff1614155b15612aeb576000600491509150612b8a565b600060018787878760405160008152602001604052604051612b10949392919061397b565b6020604051602081039080840390855afa158015612b32573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b8157600060019250925050612b8a565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612bd69190613d0f565b9050612be487828885612a86565b935093505050935093915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c9a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca760008483856123a2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d1e83612d0f60008660006123a8565b612d1885612dc6565b176123d0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d4257806000819055505050612dc160008483856123fb565b505050565b60006001821460e11b9050919050565b828054612de290613f16565b90600052602060002090601f016020900481019282612e045760008555612e4b565b82601f10612e1d57805160ff1916838001178555612e4b565b82800160010185558215612e4b579182015b82811115612e4a578251825591602001919060010190612e2f565b5b509050612e589190612e5c565b5090565b5b80821115612e75576000816000905550600101612e5d565b5090565b6000612e8c612e8784613bfd565b613bd8565b90508083825260208201905082856020860282011115612eaf57612eae614145565b5b60005b85811015612edf5781612ec58882612fdd565b845260208401935060208301925050600181019050612eb2565b5050509392505050565b6000612efc612ef784613c29565b613bd8565b90508083825260208201905082856020860282011115612f1f57612f1e614145565b5b60005b85811015612f4f5781612f358882613154565b845260208401935060208301925050600181019050612f22565b5050509392505050565b6000612f6c612f6784613c55565b613bd8565b905082815260208101848484011115612f8857612f8761414a565b5b612f93848285613ed4565b509392505050565b6000612fae612fa984613c86565b613bd8565b905082815260208101848484011115612fca57612fc961414a565b5b612fd5848285613ed4565b509392505050565b600081359050612fec81614461565b92915050565b600082601f83011261300757613006614140565b5b8135613017848260208601612e79565b91505092915050565b600082601f83011261303557613034614140565b5b8135613045848260208601612ee9565b91505092915050565b60008135905061305d81614478565b92915050565b6000813590506130728161448f565b92915050565b6000815190506130878161448f565b92915050565b60008083601f8401126130a3576130a2614140565b5b8235905067ffffffffffffffff8111156130c0576130bf61413b565b5b6020830191508360018202830111156130dc576130db614145565b5b9250929050565b600082601f8301126130f8576130f7614140565b5b8135613108848260208601612f59565b91505092915050565b600081359050613120816144a6565b92915050565b600082601f83011261313b5761313a614140565b5b813561314b848260208601612f9b565b91505092915050565b600081359050613163816144b6565b92915050565b60006020828403121561317f5761317e614154565b5b600061318d84828501612fdd565b91505092915050565b600080604083850312156131ad576131ac614154565b5b60006131bb85828601612fdd565b92505060206131cc85828601612fdd565b9150509250929050565b6000806000606084860312156131ef576131ee614154565b5b60006131fd86828701612fdd565b935050602061320e86828701612fdd565b925050604061321f86828701613154565b9150509250925092565b6000806000806080858703121561324357613242614154565b5b600061325187828801612fdd565b945050602061326287828801612fdd565b935050604061327387828801613154565b925050606085013567ffffffffffffffff8111156132945761329361414f565b5b6132a0878288016130e3565b91505092959194509250565b600080604083850312156132c3576132c2614154565b5b60006132d185828601612fdd565b92505060206132e28582860161304e565b9150509250929050565b6000806040838503121561330357613302614154565b5b600061331185828601612fdd565b925050602061332285828601613154565b9150509250929050565b6000806040838503121561334357613342614154565b5b600083013567ffffffffffffffff8111156133615761336061414f565b5b61336d85828601612ff2565b925050602083013567ffffffffffffffff81111561338e5761338d61414f565b5b61339a85828601613020565b9150509250929050565b6000602082840312156133ba576133b9614154565b5b60006133c884828501613063565b91505092915050565b6000602082840312156133e7576133e6614154565b5b60006133f584828501613078565b91505092915050565b60006020828403121561341457613413614154565b5b600061342284828501613111565b91505092915050565b60006020828403121561344157613440614154565b5b600082013567ffffffffffffffff81111561345f5761345e61414f565b5b61346b84828501613126565b91505092915050565b60006020828403121561348a57613489614154565b5b600061349884828501613154565b91505092915050565b600080600080606085870312156134bb576134ba614154565b5b60006134c987828801613154565b94505060206134da87828801613154565b935050604085013567ffffffffffffffff8111156134fb576134fa61414f565b5b6135078782880161308d565b925092505092959194509250565b61351e81613e24565b82525050565b61353561353082613e24565b613fc2565b82525050565b61354481613e36565b82525050565b61355381613e42565b82525050565b600061356482613ccc565b61356e8185613ce2565b935061357e818560208601613ee3565b61358781614159565b840191505092915050565b61359b81613ec2565b82525050565b60006135ac82613cd7565b6135b68185613cf3565b93506135c6818560208601613ee3565b6135cf81614159565b840191505092915050565b60006135e582613cd7565b6135ef8185613d04565b93506135ff818560208601613ee3565b80840191505092915050565b6000815461361881613f16565b6136228186613d04565b9450600182166000811461363d576001811461364e57613681565b60ff19831686528186019350613681565b61365785613cb7565b60005b838110156136795781548189015260018201915060208101905061365a565b838801955050505b50505092915050565b6000613697601883613cf3565b91506136a282614177565b602082019050919050565b60006136ba601f83613cf3565b91506136c5826141a0565b602082019050919050565b60006136dd602683613cf3565b91506136e8826141c9565b604082019050919050565b6000613700602283613cf3565b915061370b82614218565b604082019050919050565b6000613723601283613cf3565b915061372e82614267565b602082019050919050565b6000613746602283613cf3565b915061375182614290565b604082019050919050565b6000613769601583613cf3565b9150613774826142df565b602082019050919050565b600061378c601083613cf3565b915061379782614308565b602082019050919050565b60006137af602083613cf3565b91506137ba82614331565b602082019050919050565b60006137d2601883613cf3565b91506137dd8261435a565b602082019050919050565b60006137f5602f83613cf3565b915061380082614383565b604082019050919050565b6000613818601883613cf3565b9150613823826143d2565b602082019050919050565b600061383b601083613cf3565b9150613846826143fb565b602082019050919050565b600061385e601a83613cf3565b915061386982614424565b602082019050919050565b61387d81613eab565b82525050565b61389461388f82613eab565b613fe6565b82525050565b6138a381613eb5565b82525050565b60006138b58285613524565b6014820191506138c58284613883565b6020820191508190509392505050565b60006138e1828561360b565b91506138ed82846135da565b91508190509392505050565b600060208201905061390e6000830184613515565b92915050565b60006080820190506139296000830187613515565b6139366020830186613515565b6139436040830185613874565b81810360608301526139558184613559565b905095945050505050565b6000602082019050613975600083018461353b565b92915050565b6000608082019050613990600083018761354a565b61399d602083018661389a565b6139aa604083018561354a565b6139b7606083018461354a565b95945050505050565b60006020820190506139d56000830184613592565b92915050565b600060208201905081810360008301526139f581846135a1565b905092915050565b60006020820190508181036000830152613a168161368a565b9050919050565b60006020820190508181036000830152613a36816136ad565b9050919050565b60006020820190508181036000830152613a56816136d0565b9050919050565b60006020820190508181036000830152613a76816136f3565b9050919050565b60006020820190508181036000830152613a9681613716565b9050919050565b60006020820190508181036000830152613ab681613739565b9050919050565b60006020820190508181036000830152613ad68161375c565b9050919050565b60006020820190508181036000830152613af68161377f565b9050919050565b60006020820190508181036000830152613b16816137a2565b9050919050565b60006020820190508181036000830152613b36816137c5565b9050919050565b60006020820190508181036000830152613b56816137e8565b9050919050565b60006020820190508181036000830152613b768161380b565b9050919050565b60006020820190508181036000830152613b968161382e565b9050919050565b60006020820190508181036000830152613bb681613851565b9050919050565b6000602082019050613bd26000830184613874565b92915050565b6000613be2613bf3565b9050613bee8282613f48565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1857613c1761410c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c4457613c4361410c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c7057613c6f61410c565b5b613c7982614159565b9050602081019050919050565b600067ffffffffffffffff821115613ca157613ca061410c565b5b613caa82614159565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d1a82613eab565b9150613d2583613eab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d5a57613d59614021565b5b828201905092915050565b6000613d7082613eab565b9150613d7b83613eab565b925082613d8b57613d8a614050565b5b828204905092915050565b6000613da182613eab565b9150613dac83613eab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613de557613de4614021565b5b828202905092915050565b6000613dfb82613eab565b9150613e0683613eab565b925082821015613e1957613e18614021565b5b828203905092915050565b6000613e2f82613e8b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613e868261444d565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613ecd82613e78565b9050919050565b82818337600083830152505050565b60005b83811015613f01578082015181840152602081019050613ee6565b83811115613f10576000848401525b50505050565b60006002820490506001821680613f2e57607f821691505b60208210811415613f4257613f416140ae565b5b50919050565b613f5182614159565b810181811067ffffffffffffffff82111715613f7057613f6f61410c565b5b80604052505050565b6000613f8482613eab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fb757613fb6614021565b5b600182019050919050565b6000613fcd82613fd4565b9050919050565b6000613fdf8261416a565b9050919050565b6000819050919050565b6000613ffb82613eab565b915061400683613eab565b92508261401657614015614050565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4449474f2f2f4e4f4e43455f555345440000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4449474f2f2f53414c455f4e4f545f4c4956450000000000000000000000600082015250565b7f494e4449474f2f2f534f4c445f4f555400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f494e4449474f2f2f4641494c45445f5349474e41545552450000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f494e4449474f2f2f494e53554646494349454e545f4554480000000000000000600082015250565b7f494e4449474f2f2f4f4e4c595f454f4100000000000000000000000000000000600082015250565b7f494e4449474f2f2f414c52454144595f4d494e5445445f4d4158000000000000600082015250565b6003811061445e5761445d61407f565b5b50565b61446a81613e24565b811461447557600080fd5b50565b61448181613e36565b811461448c57600080fd5b50565b61449881613e4c565b81146144a357600080fd5b50565b600381106144b357600080fd5b50565b6144bf81613eab565b81146144ca57600080fd5b5056fea264697066735822122008c60cffb46c7c4acc405de6e621d5af239adefcbdcaaa980640f73a8797946464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636f8b44b011610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610732578063e985e9c51461075d578063f2fde38b1461079a578063f43a22dc146107c3578063f4a0a528146107ee57610204565b8063a22cb46514610678578063b88d4fde146106a1578063c19d93fb146106ca578063c87b56dd146106f557610204565b806384ad8e8f116100e757806384ad8e8f146105915780638da5cb5b146105bc578063931688cb146105e757806394d0d3a61461061057806395d89b411461064d57610204565b80636f8b44b0146104eb57806370a0823114610514578063715018a614610551578063791b17c71461056857610204565b806323b872dd1161019b5780635a67de071161016a5780635a67de07146104065780636352211e1461042f5780636817c76c1461046c5780636c0360eb146104975780636c19e783146104c257610204565b806323b872dd146103725780633ccfd60b1461039b57806342842e0e146103b257806351830227146103db57610204565b8063095ea7b3116101d7578063095ea7b3146102ca5780630f7309e8146102f3578063109695231461031e57806318160ddd1461034757610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308dc9f42146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906133a4565b610817565b60405161023d9190613960565b60405180910390f35b34801561025257600080fd5b5061025b6108a9565b60405161026891906139db565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613474565b61093b565b6040516102a591906138f9565b60405180910390f35b6102c860048036038101906102c391906134a1565b6109b7565b005b3480156102d657600080fd5b506102f160048036038101906102ec91906132ec565b610dd4565b005b3480156102ff57600080fd5b50610308610f15565b60405161031591906139db565b60405180910390f35b34801561032a57600080fd5b506103456004803603810190610340919061342b565b610fa3565b005b34801561035357600080fd5b5061035c611054565b6040516103699190613bbd565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906131d6565b61106b565b005b3480156103a757600080fd5b506103b0611390565b005b3480156103be57600080fd5b506103d960048036038101906103d491906131d6565b611640565b005b3480156103e757600080fd5b506103f0611660565b6040516103fd9190613960565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906133fe565b611673565b005b34801561043b57600080fd5b5061045660048036038101906104519190613474565b61171c565b60405161046391906138f9565b60405180910390f35b34801561047857600080fd5b5061048161172e565b60405161048e9190613bbd565b60405180910390f35b3480156104a357600080fd5b506104ac611734565b6040516104b991906139db565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613169565b6117c2565b005b3480156104f757600080fd5b50610512600480360381019061050d9190613474565b611882565b005b34801561052057600080fd5b5061053b60048036038101906105369190613169565b611917565b6040516105489190613bbd565b60405180910390f35b34801561055d57600080fd5b506105666119d0565b005b34801561057457600080fd5b5061058f600480360381019061058a919061332c565b611a58565b005b34801561059d57600080fd5b506105a6611b36565b6040516105b39190613bbd565b60405180910390f35b3480156105c857600080fd5b506105d1611b3c565b6040516105de91906138f9565b60405180910390f35b3480156105f357600080fd5b5061060e6004803603810190610609919061342b565b611b66565b005b34801561061c57600080fd5b5061063760048036038101906106329190613474565b611bfc565b6040516106449190613960565b60405180910390f35b34801561065957600080fd5b50610662611c26565b60405161066f91906139db565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906132ac565b611cb8565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613229565b611e30565b005b3480156106d657600080fd5b506106df611ea3565b6040516106ec91906139c0565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613474565b611eb6565b60405161072991906139db565b60405180910390f35b34801561073e57600080fd5b50610747611f32565b6040516107549190613bbd565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190613196565b611f38565b6040516107919190613960565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613169565b611fcc565b005b3480156107cf57600080fd5b506107d86120c4565b6040516107e59190613bbd565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613474565b6120c9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108b890613f16565b80601f01602080910402602001604051908101604052809291908181526020018280546108e490613f16565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b60006109468261215e565b61097c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6002808111156109ca576109c961407f565b5b600c60009054906101000a900460ff1660028111156109ec576109eb61407f565b5b1480610a2b575060016002811115610a0757610a0661407f565b5b600c60009054906101000a900460ff166002811115610a2957610a2861407f565b5b145b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190613abd565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90613b7d565b60405180910390fd5b6007841115610ae657600080fd5b60095484610af2611054565b610afc9190613d0f565b1115610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613add565b60405180910390fd5b60078414610b585783600a54610b539190613d96565b610b5c565b600b545b341015610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613b5d565b60405180910390fd5b60016002811115610bb257610bb161407f565b5b600c60009054906101000a900460ff166002811115610bd457610bd361407f565b5b1415610dc4576011600084815260200190815260200160002060009054906101000a900460ff1615610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290613a7d565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610cea3385604051602001610c8a9291906138a9565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506121bd565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613b1d565b60405180910390fd5b600784610d4c336121e4565b610d569190613d0f565b1115610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613b9d565b60405180910390fd5b60016011600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610dce338561223b565b50505050565b6000610ddf8261171c565b90508073ffffffffffffffffffffffffffffffffffffffff16610e00612259565b73ffffffffffffffffffffffffffffffffffffffff1614610e6357610e2c81610e27612259565b611f38565b610e62576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e8054610f2290613f16565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4e90613f16565b8015610f9b5780601f10610f7057610100808354040283529160200191610f9b565b820191906000526020600020905b815481529060010190602001808311610f7e57829003601f168201915b505050505081565b610fab612261565b73ffffffffffffffffffffffffffffffffffffffff16610fc9611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690613afd565b60405180910390fd5b6000600e805461102e90613f16565b90501461103a57600080fd5b80600e9080519060200190611050929190612dd6565b5050565b600061105e612269565b6001546000540303905090565b60006110768261226e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110e98461233c565b915091506110ff81876110fa612259565b61235e565b61114b576111148661110f612259565b611f38565b61114a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111b2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111bf86868660016123a2565b80156111ca57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611298856112748888876123a8565b7c0200000000000000000000000000000000000000000000000000000000176123d0565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561132057600060018501905060006004600083815260200190815260200160002054141561131e57600054811461131d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461138886868660016123fb565b505050505050565b611398612261565b73ffffffffffffffffffffffffffffffffffffffff166113b6611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613afd565b60405180910390fd5b7344f6498d1403321890f3f2917e00f22dbde3577a73ffffffffffffffffffffffffffffffffffffffff166108fc60146001476114499190613d96565b6114539190613d65565b9081150290604051600060405180830381858888f1935050505015801561147e573d6000803e3d6000fd5b50600047905073da29d9087078f1adbf10da0dc4ff772905b5c26a73ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610177846114c39190613d96565b6114cd9190613d65565b9081150290604051600060405180830381858888f193505050501580156114f8573d6000803e3d6000fd5b5073b48eac36770023163766c52aa60be800c0b7aa6373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610177846115389190613d96565b6115429190613d65565b9081150290604051600060405180830381858888f1935050505015801561156d573d6000803e3d6000fd5b5073e4446d52e2bdb3e31470643ab1753a4c2aeee3ea73ffffffffffffffffffffffffffffffffffffffff166108fc6103e8607d846115ac9190613d96565b6115b69190613d65565b9081150290604051600060405180830381858888f193505050501580156115e1573d6000803e3d6000fd5b5073adc50a8ef4fb5ea6413e05a6ffbb2aefed25683b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561163c573d6000803e3d6000fd5b5050565b61165b83838360405180602001604052806000815250611e30565b505050565b600c60019054906101000a900460ff1681565b61167b612261565b73ffffffffffffffffffffffffffffffffffffffff16611699611b3c565b73ffffffffffffffffffffffffffffffffffffffff16146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690613afd565b60405180910390fd5b80600c60006101000a81548160ff021916908360028111156117145761171361407f565b5b021790555050565b60006117278261226e565b9050919050565b600a5481565b600d805461174190613f16565b80601f016020809104026020016040519081016040528092919081815260200182805461176d90613f16565b80156117ba5780601f1061178f576101008083540402835291602001916117ba565b820191906000526020600020905b81548152906001019060200180831161179d57829003601f168201915b505050505081565b6117ca612261565b73ffffffffffffffffffffffffffffffffffffffff166117e8611b3c565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590613afd565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61188a612261565b73ffffffffffffffffffffffffffffffffffffffff166118a8611b3c565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613afd565b60405180910390fd5b6115b381111561190d57600080fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119d8612261565b73ffffffffffffffffffffffffffffffffffffffff166119f6611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390613afd565b60405180910390fd5b611a566000612401565b565b611a60612261565b73ffffffffffffffffffffffffffffffffffffffff16611a7e611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613afd565b60405180910390fd5b60005b8251811015611b3157611b1e838281518110611af657611af56140dd565b5b6020026020010151838381518110611b1157611b106140dd565b5b602002602001015161223b565b8080611b2990613f79565b915050611ad7565b505050565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b6e612261565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613afd565b60405180910390fd5b80600d9080519060200190611bf8929190612dd6565b5050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b606060038054611c3590613f16565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6190613f16565b8015611cae5780601f10611c8357610100808354040283529160200191611cae565b820191906000526020600020905b815481529060010190602001808311611c9157829003601f168201915b5050505050905090565b611cc0612259565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d25576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d32612259565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddf612259565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e249190613960565b60405180910390a35050565b611e3b84848461106b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e9d57611e66848484846124c7565b611e9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900460ff1681565b6060611ec18261215e565b611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790613b3d565b60405180910390fd5b600d611f0b83612627565b604051602001611f1c9291906138d5565b6040516020818303038152906040529050919050565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fd4612261565b73ffffffffffffffffffffffffffffffffffffffff16611ff2611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90613afd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90613a3d565b60405180910390fd5b6120c181612401565b50565b600781565b6120d1612261565b73ffffffffffffffffffffffffffffffffffffffff166120ef611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90613afd565b60405180910390fd5b600a5481111561215457600080fd5b80600a8190555050565b600081612169612269565b11158015612178575060005482105b80156121b6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008060006121cc8585612788565b915091506121d98161280b565b819250505092915050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6122558282604051806020016040528060008152506129e0565b5050565b600033905090565b600033905090565b600090565b6000808290508061227d612269565b11612305576000548110156123045760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612302575b60008114156122f85760046000836001900393508381526020019081526020016000205490506122cd565b8092505050612337565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123bf868684612a7d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ed612259565b8786866040518563ffffffff1660e01b815260040161250f9493929190613914565b602060405180830381600087803b15801561252957600080fd5b505af192505050801561255a57506040513d601f19601f8201168201806040525081019061255791906133d1565b60015b6125d4573d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b506000815114156125cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561266f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612783565b600082905060005b600082146126a157808061268a90613f79565b915050600a8261269a9190613d65565b9150612677565b60008167ffffffffffffffff8111156126bd576126bc61410c565b5b6040519080825280601f01601f1916602001820160405280156126ef5781602001600182028036833780820191505090505b5090505b6000851461277c576001826127089190613df0565b9150600a856127179190613ff0565b60306127239190613d0f565b60f81b818381518110612739576127386140dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127759190613d65565b94506126f3565b8093505050505b919050565b6000806041835114156127ca5760008060006020860151925060408601519150606086015160001a90506127be87828585612a86565b94509450505050612804565b6040835114156127fb5760008060208501519150604085015190506127f0868383612b93565b935093505050612804565b60006002915091505b9250929050565b6000600481111561281f5761281e61407f565b5b8160048111156128325761283161407f565b5b141561283d576129dd565b600160048111156128515761285061407f565b5b8160048111156128645761286361407f565b5b14156128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c906139fd565b60405180910390fd5b600260048111156128b9576128b861407f565b5b8160048111156128cc576128cb61407f565b5b141561290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290490613a1d565b60405180910390fd5b600360048111156129215761292061407f565b5b8160048111156129345761293361407f565b5b1415612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c90613a5d565b60405180910390fd5b6004808111156129885761298761407f565b5b81600481111561299b5761299a61407f565b5b14156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d390613a9d565b60405180910390fd5b5b50565b6129ea8383612bf2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a7857600080549050600083820390505b612a2a60008683806001019450866124c7565b612a60576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a17578160005414612a7557600080fd5b50505b505050565b60009392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612ac1576000600391509150612b8a565b601b8560ff1614158015612ad95750601c8560ff1614155b15612aeb576000600491509150612b8a565b600060018787878760405160008152602001604052604051612b10949392919061397b565b6020604051602081039080840390855afa158015612b32573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b8157600060019250925050612b8a565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612bd69190613d0f565b9050612be487828885612a86565b935093505050935093915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c9a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca760008483856123a2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d1e83612d0f60008660006123a8565b612d1885612dc6565b176123d0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d4257806000819055505050612dc160008483856123fb565b505050565b60006001821460e11b9050919050565b828054612de290613f16565b90600052602060002090601f016020900481019282612e045760008555612e4b565b82601f10612e1d57805160ff1916838001178555612e4b565b82800160010185558215612e4b579182015b82811115612e4a578251825591602001919060010190612e2f565b5b509050612e589190612e5c565b5090565b5b80821115612e75576000816000905550600101612e5d565b5090565b6000612e8c612e8784613bfd565b613bd8565b90508083825260208201905082856020860282011115612eaf57612eae614145565b5b60005b85811015612edf5781612ec58882612fdd565b845260208401935060208301925050600181019050612eb2565b5050509392505050565b6000612efc612ef784613c29565b613bd8565b90508083825260208201905082856020860282011115612f1f57612f1e614145565b5b60005b85811015612f4f5781612f358882613154565b845260208401935060208301925050600181019050612f22565b5050509392505050565b6000612f6c612f6784613c55565b613bd8565b905082815260208101848484011115612f8857612f8761414a565b5b612f93848285613ed4565b509392505050565b6000612fae612fa984613c86565b613bd8565b905082815260208101848484011115612fca57612fc961414a565b5b612fd5848285613ed4565b509392505050565b600081359050612fec81614461565b92915050565b600082601f83011261300757613006614140565b5b8135613017848260208601612e79565b91505092915050565b600082601f83011261303557613034614140565b5b8135613045848260208601612ee9565b91505092915050565b60008135905061305d81614478565b92915050565b6000813590506130728161448f565b92915050565b6000815190506130878161448f565b92915050565b60008083601f8401126130a3576130a2614140565b5b8235905067ffffffffffffffff8111156130c0576130bf61413b565b5b6020830191508360018202830111156130dc576130db614145565b5b9250929050565b600082601f8301126130f8576130f7614140565b5b8135613108848260208601612f59565b91505092915050565b600081359050613120816144a6565b92915050565b600082601f83011261313b5761313a614140565b5b813561314b848260208601612f9b565b91505092915050565b600081359050613163816144b6565b92915050565b60006020828403121561317f5761317e614154565b5b600061318d84828501612fdd565b91505092915050565b600080604083850312156131ad576131ac614154565b5b60006131bb85828601612fdd565b92505060206131cc85828601612fdd565b9150509250929050565b6000806000606084860312156131ef576131ee614154565b5b60006131fd86828701612fdd565b935050602061320e86828701612fdd565b925050604061321f86828701613154565b9150509250925092565b6000806000806080858703121561324357613242614154565b5b600061325187828801612fdd565b945050602061326287828801612fdd565b935050604061327387828801613154565b925050606085013567ffffffffffffffff8111156132945761329361414f565b5b6132a0878288016130e3565b91505092959194509250565b600080604083850312156132c3576132c2614154565b5b60006132d185828601612fdd565b92505060206132e28582860161304e565b9150509250929050565b6000806040838503121561330357613302614154565b5b600061331185828601612fdd565b925050602061332285828601613154565b9150509250929050565b6000806040838503121561334357613342614154565b5b600083013567ffffffffffffffff8111156133615761336061414f565b5b61336d85828601612ff2565b925050602083013567ffffffffffffffff81111561338e5761338d61414f565b5b61339a85828601613020565b9150509250929050565b6000602082840312156133ba576133b9614154565b5b60006133c884828501613063565b91505092915050565b6000602082840312156133e7576133e6614154565b5b60006133f584828501613078565b91505092915050565b60006020828403121561341457613413614154565b5b600061342284828501613111565b91505092915050565b60006020828403121561344157613440614154565b5b600082013567ffffffffffffffff81111561345f5761345e61414f565b5b61346b84828501613126565b91505092915050565b60006020828403121561348a57613489614154565b5b600061349884828501613154565b91505092915050565b600080600080606085870312156134bb576134ba614154565b5b60006134c987828801613154565b94505060206134da87828801613154565b935050604085013567ffffffffffffffff8111156134fb576134fa61414f565b5b6135078782880161308d565b925092505092959194509250565b61351e81613e24565b82525050565b61353561353082613e24565b613fc2565b82525050565b61354481613e36565b82525050565b61355381613e42565b82525050565b600061356482613ccc565b61356e8185613ce2565b935061357e818560208601613ee3565b61358781614159565b840191505092915050565b61359b81613ec2565b82525050565b60006135ac82613cd7565b6135b68185613cf3565b93506135c6818560208601613ee3565b6135cf81614159565b840191505092915050565b60006135e582613cd7565b6135ef8185613d04565b93506135ff818560208601613ee3565b80840191505092915050565b6000815461361881613f16565b6136228186613d04565b9450600182166000811461363d576001811461364e57613681565b60ff19831686528186019350613681565b61365785613cb7565b60005b838110156136795781548189015260018201915060208101905061365a565b838801955050505b50505092915050565b6000613697601883613cf3565b91506136a282614177565b602082019050919050565b60006136ba601f83613cf3565b91506136c5826141a0565b602082019050919050565b60006136dd602683613cf3565b91506136e8826141c9565b604082019050919050565b6000613700602283613cf3565b915061370b82614218565b604082019050919050565b6000613723601283613cf3565b915061372e82614267565b602082019050919050565b6000613746602283613cf3565b915061375182614290565b604082019050919050565b6000613769601583613cf3565b9150613774826142df565b602082019050919050565b600061378c601083613cf3565b915061379782614308565b602082019050919050565b60006137af602083613cf3565b91506137ba82614331565b602082019050919050565b60006137d2601883613cf3565b91506137dd8261435a565b602082019050919050565b60006137f5602f83613cf3565b915061380082614383565b604082019050919050565b6000613818601883613cf3565b9150613823826143d2565b602082019050919050565b600061383b601083613cf3565b9150613846826143fb565b602082019050919050565b600061385e601a83613cf3565b915061386982614424565b602082019050919050565b61387d81613eab565b82525050565b61389461388f82613eab565b613fe6565b82525050565b6138a381613eb5565b82525050565b60006138b58285613524565b6014820191506138c58284613883565b6020820191508190509392505050565b60006138e1828561360b565b91506138ed82846135da565b91508190509392505050565b600060208201905061390e6000830184613515565b92915050565b60006080820190506139296000830187613515565b6139366020830186613515565b6139436040830185613874565b81810360608301526139558184613559565b905095945050505050565b6000602082019050613975600083018461353b565b92915050565b6000608082019050613990600083018761354a565b61399d602083018661389a565b6139aa604083018561354a565b6139b7606083018461354a565b95945050505050565b60006020820190506139d56000830184613592565b92915050565b600060208201905081810360008301526139f581846135a1565b905092915050565b60006020820190508181036000830152613a168161368a565b9050919050565b60006020820190508181036000830152613a36816136ad565b9050919050565b60006020820190508181036000830152613a56816136d0565b9050919050565b60006020820190508181036000830152613a76816136f3565b9050919050565b60006020820190508181036000830152613a9681613716565b9050919050565b60006020820190508181036000830152613ab681613739565b9050919050565b60006020820190508181036000830152613ad68161375c565b9050919050565b60006020820190508181036000830152613af68161377f565b9050919050565b60006020820190508181036000830152613b16816137a2565b9050919050565b60006020820190508181036000830152613b36816137c5565b9050919050565b60006020820190508181036000830152613b56816137e8565b9050919050565b60006020820190508181036000830152613b768161380b565b9050919050565b60006020820190508181036000830152613b968161382e565b9050919050565b60006020820190508181036000830152613bb681613851565b9050919050565b6000602082019050613bd26000830184613874565b92915050565b6000613be2613bf3565b9050613bee8282613f48565b919050565b6000604051905090565b600067ffffffffffffffff821115613c1857613c1761410c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c4457613c4361410c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c7057613c6f61410c565b5b613c7982614159565b9050602081019050919050565b600067ffffffffffffffff821115613ca157613ca061410c565b5b613caa82614159565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d1a82613eab565b9150613d2583613eab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d5a57613d59614021565b5b828201905092915050565b6000613d7082613eab565b9150613d7b83613eab565b925082613d8b57613d8a614050565b5b828204905092915050565b6000613da182613eab565b9150613dac83613eab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613de557613de4614021565b5b828202905092915050565b6000613dfb82613eab565b9150613e0683613eab565b925082821015613e1957613e18614021565b5b828203905092915050565b6000613e2f82613e8b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613e868261444d565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613ecd82613e78565b9050919050565b82818337600083830152505050565b60005b83811015613f01578082015181840152602081019050613ee6565b83811115613f10576000848401525b50505050565b60006002820490506001821680613f2e57607f821691505b60208210811415613f4257613f416140ae565b5b50919050565b613f5182614159565b810181811067ffffffffffffffff82111715613f7057613f6f61410c565b5b80604052505050565b6000613f8482613eab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fb757613fb6614021565b5b600182019050919050565b6000613fcd82613fd4565b9050919050565b6000613fdf8261416a565b9050919050565b6000819050919050565b6000613ffb82613eab565b915061400683613eab565b92508261401657614015614050565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4449474f2f2f4e4f4e43455f555345440000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4449474f2f2f53414c455f4e4f545f4c4956450000000000000000000000600082015250565b7f494e4449474f2f2f534f4c445f4f555400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f494e4449474f2f2f4641494c45445f5349474e41545552450000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f494e4449474f2f2f494e53554646494349454e545f4554480000000000000000600082015250565b7f494e4449474f2f2f4f4e4c595f454f4100000000000000000000000000000000600082015250565b7f494e4449474f2f2f414c52454144595f4d494e5445445f4d4158000000000000600082015250565b6003811061445e5761445d61407f565b5b50565b61446a81613e24565b811461447557600080fd5b50565b61448181613e36565b811461448c57600080fd5b50565b61449881613e4c565b81146144a357600080fd5b50565b600381106144b357600080fd5b50565b6144bf81613eab565b81146144ca57600080fd5b5056fea264697066735822122008c60cffb46c7c4acc405de6e621d5af239adefcbdcaaa980640f73a8797946464736f6c63430008070033

Deployed Bytecode Sourcemap

59865:4216:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29673:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35320:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37266:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61350:937;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36814:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60215:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62787:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28727:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46531:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63067:549;;;;;;;;;;;;;:::i;:::-;;38156:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60160:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62690:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35109:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60039:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60187:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63624:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62551:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30352:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14264:103;;;;;;;;;;;;;:::i;:::-;;61138:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60084:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13613:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62960:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62295:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35489:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37542:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38412:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60134:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63721:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60001:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37921:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14522:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60248:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62410:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29673:615;29758:4;30073:10;30058:25;;:11;:25;;;;:102;;;;30150:10;30135:25;;:11;:25;;;;30058:102;:179;;;;30227:10;30212:25;;:11;:25;;;;30058:179;30038:199;;29673:615;;;:::o;35320:100::-;35374:13;35407:5;35400:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35320:100;:::o;37266:204::-;37334:7;37359:16;37367:7;37359;:16::i;:::-;37354:64;;37384:34;;;;;;;;;;;;;;37354:64;37438:15;:24;37454:7;37438:24;;;;;;;;;;;;;;;;;;;;;37431:31;;37266:204;;;:::o;61350:937::-;61469:16;61460:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;:57;;;;61498:19;61489:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;61460:57;61451:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;61577:9;61563:23;;:10;:23;;;61555:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;60285:1;61626:8;:22;;61618:31;;;;;;61696:9;;61684:8;61668:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;61660:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61771:1;61759:8;:13;:54;;61805:8;61792:9;;61791:22;;;;:::i;:::-;61759:54;;;61775:13;;61759:54;61745:9;:69;;61737:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;61868:19;61859:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;61856:380;;;61913:11;:18;61925:5;61913:18;;;;;;;;;;;;;;;;;;;;;61912:19;61904:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62053:7;;;;;;;;;;;61977:83;;:72;62018:10;62030:5;62001:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61991:46;;;;;;62039:9;;61977:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:72::i;:::-;:83;;;61969:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;62152:1;62140:8;62112:25;62126:10;62112:13;:25::i;:::-;:36;;;;:::i;:::-;:41;;62104:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;62220:4;62199:11;:18;62211:5;62199:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;61856:380;62248:31;62258:10;62270:8;62248:9;:31::i;:::-;61350:937;;;;:::o;36814:386::-;36887:13;36903:16;36911:7;36903;:16::i;:::-;36887:32;;36959:5;36936:28;;:19;:17;:19::i;:::-;:28;;;36932:175;;36984:44;37001:5;37008:19;:17;:19::i;:::-;36984:16;:44::i;:::-;36979:128;;37056:35;;;;;;;;;;;;;;36979:128;36932:175;37146:2;37119:15;:24;37135:7;37119:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37184:7;37180:2;37164:28;;37173:5;37164:28;;;;;;;;;;;;36876:324;36814:386;;:::o;60215:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62787:165::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62907:1:::1;62885:10;62879:24;;;;;:::i;:::-;;;:29;62871:38;;;::::0;::::1;;62933:11;62920:10;:24;;;;;;;;;;;;:::i;:::-;;62787:165:::0;:::o;28727:315::-;28780:7;29008:15;:13;:15::i;:::-;28993:12;;28977:13;;:28;:46;28970:53;;28727:315;:::o;46531:2800::-;46665:27;46695;46714:7;46695:18;:27::i;:::-;46665:57;;46780:4;46739:45;;46755:19;46739:45;;;46735:86;;46793:28;;;;;;;;;;;;;;46735:86;46835:27;46864:23;46891:28;46911:7;46891:19;:28::i;:::-;46834:85;;;;47019:62;47038:15;47055:4;47061:19;:17;:19::i;:::-;47019:18;:62::i;:::-;47014:174;;47101:43;47118:4;47124:19;:17;:19::i;:::-;47101:16;:43::i;:::-;47096:92;;47153:35;;;;;;;;;;;;;;47096:92;47014:174;47219:1;47205:16;;:2;:16;;;47201:52;;;47230:23;;;;;;;;;;;;;;47201:52;47266:43;47288:4;47294:2;47298:7;47307:1;47266:21;:43::i;:::-;47402:15;47399:160;;;47542:1;47521:19;47514:30;47399:160;47937:18;:24;47956:4;47937:24;;;;;;;;;;;;;;;;47935:26;;;;;;;;;;;;48006:18;:22;48025:2;48006:22;;;;;;;;;;;;;;;;48004:24;;;;;;;;;;;48328:145;48365:2;48413:45;48428:4;48434:2;48438:19;48413:14;:45::i;:::-;25955:8;48386:72;48328:18;:145::i;:::-;48299:17;:26;48317:7;48299:26;;;;;;;;;;;:174;;;;48643:1;25955:8;48593:19;:46;:51;48589:626;;;48665:19;48697:1;48687:7;:11;48665:33;;48854:1;48820:17;:30;48838:11;48820:30;;;;;;;;;;;;:35;48816:384;;;48958:13;;48943:11;:28;48939:242;;49138:19;49105:17;:30;49123:11;49105:30;;;;;;;;;;;:52;;;;48939:242;48816:384;48646:569;48589:626;49262:7;49258:2;49243:27;;49252:4;49243:27;;;;;;;;;;;;49281:42;49302:4;49308:2;49312:7;49321:1;49281:20;:42::i;:::-;46654:2677;;;46531:2800;;;:::o;63067:549::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60703:42:::1;63143:27;;:59;63199:2;63195:1;63171:21;:25;;;;:::i;:::-;:30;;;;:::i;:::-;63143:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;63258:15;63276:21;63258:39;;60338:42;63308:33;;:55;63358:4;63352:3;63342:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;63308:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60430:42;63374:33;;:55;63424:4;63418:3;63408:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;63374:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60524:42;63440:35;;:57;63492:4;63486:3;63476:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;63440:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60617:42;63551:34;;:57;63586:21;63551:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;63106:510;63067:549::o:0;38156:185::-;38294:39;38311:4;38317:2;38321:7;38294:39;;;;;;;;;;;;:16;:39::i;:::-;38156:185;;;:::o;60160:20::-;;;;;;;;;;;;;:::o;62690:89::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62765:6:::1;62757:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;62690:89:::0;:::o;35109:144::-;35173:7;35216:27;35235:7;35216:18;:27::i;:::-;35193:52;;35109:144;;;:::o;60039:38::-;;;;:::o;60187:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63624:89::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63699:6:::1;63689:7;;:16;;;;;;;;;;;;;;;;;;63624:89:::0;:::o;62551:131::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62639:4:::1;62628:7;:15;;62620:24;;;::::0;::::1;;62667:7;62655:9;:19;;;;62551:131:::0;:::o;30352:224::-;30416:7;30457:1;30440:19;;:5;:19;;;30436:60;;;30468:28;;;;;;;;;;;;;;30436:60;24907:13;30514:18;:25;30533:5;30514:25;;;;;;;;;;;;;;;;:54;30507:61;;30352:224;;;:::o;14264:103::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14329:30:::1;14356:1;14329:18;:30::i;:::-;14264:103::o:0;61138:204::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61247:6:::1;61243:92;61263:2;:9;61259:1;:13;61243:92;;;61294:29;61304:2;61307:1;61304:5;;;;;;;;:::i;:::-;;;;;;;;61311:8;61320:1;61311:11;;;;;;;;:::i;:::-;;;;;;;;61294:9;:29::i;:::-;61274:3;;;;;:::i;:::-;;;;61243:92;;;;61138:204:::0;;:::o;60084:43::-;;;;:::o;13613:87::-;13659:7;13686:6;;;;;;;;;;;13679:13;;13613:87;:::o;62960:99::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63045:6:::1;63035:7;:16;;;;;;;;;;;;:::i;:::-;;62960:99:::0;:::o;62295:107::-;62352:4;62376:11;:18;62388:5;62376:18;;;;;;;;;;;;;;;;;;;;;62369:25;;62295:107;;;:::o;35489:104::-;35545:13;35578:7;35571:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35489:104;:::o;37542:308::-;37653:19;:17;:19::i;:::-;37641:31;;:8;:31;;;37637:61;;;37681:17;;;;;;;;;;;;;;37637:61;37763:8;37711:18;:39;37730:19;:17;:19::i;:::-;37711:39;;;;;;;;;;;;;;;:49;37751:8;37711:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37823:8;37787:55;;37802:19;:17;:19::i;:::-;37787:55;;;37833:8;37787:55;;;;;;:::i;:::-;;;;;;;;37542:308;;:::o;38412:399::-;38579:31;38592:4;38598:2;38602:7;38579:12;:31::i;:::-;38643:1;38625:2;:14;;;:19;38621:183;;38664:56;38695:4;38701:2;38705:7;38714:5;38664:30;:56::i;:::-;38659:145;;38748:40;;;;;;;;;;;;;;38659:145;38621:183;38412:399;;;;:::o;60134:19::-;;;;;;;;;;;;;:::o;63721:249::-;63787:13;63821:17;63829:8;63821:7;:17::i;:::-;63813:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63932:7;63941:19;:8;:17;:19::i;:::-;63915:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63901:61;;63721:249;;;:::o;60001:31::-;;;;:::o;37921:164::-;38018:4;38042:18;:25;38061:5;38042:25;;;;;;;;;;;;;;;:35;38068:8;38042:35;;;;;;;;;;;;;;;;;;;;;;;;;38035:42;;37921:164;;;;:::o;14522:201::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14631:1:::1;14611:22;;:8;:22;;;;14603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14687:28;14706:8;14687:18;:28::i;:::-;14522:201:::0;:::o;60248:38::-;60285:1;60248:38;:::o;62410:133::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62496:9:::1;;62486:6;:19;;62478:28;;;::::0;::::1;;62529:6;62517:9;:18;;;;62410:133:::0;:::o;39066:273::-;39123:4;39179:7;39160:15;:13;:15::i;:::-;:26;;:66;;;;;39213:13;;39203:7;:23;39160:66;:152;;;;;39311:1;25677:8;39264:17;:26;39282:7;39264:26;;;;;;;;;;;;:43;:48;39160:152;39140:172;;39066:273;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;30658:176::-;30719:7;24907:13;25044:2;30747:18;:25;30766:5;30747:25;;;;;;;;;;;;;;;;:49;;30746:80;30739:87;;30658:176;;;:::o;39423:104::-;39492:27;39502:2;39506:8;39492:27;;;;;;;;;;;;:9;:27::i;:::-;39423:104;;:::o;57627:105::-;57687:7;57714:10;57707:17;;57627:105;:::o;12337:98::-;12390:7;12417:10;12410:17;;12337:98;:::o;28251:92::-;28307:7;28251:92;:::o;32026:1129::-;32093:7;32113:12;32128:7;32113:22;;32196:4;32177:15;:13;:15::i;:::-;:23;32173:915;;32230:13;;32223:4;:20;32219:869;;;32268:14;32285:17;:23;32303:4;32285:23;;;;;;;;;;;;32268:40;;32401:1;25677:8;32374:6;:23;:28;32370:699;;;32893:113;32910:1;32900:6;:11;32893:113;;;32953:17;:25;32971:6;;;;;;;32953:25;;;;;;;;;;;;32944:34;;32893:113;;;33039:6;33032:13;;;;;;32370:699;32245:843;32219:869;32173:915;33116:31;;;;;;;;;;;;;;32026:1129;;;;:::o;44867:652::-;44962:27;44991:23;45032:53;45088:15;45032:71;;45274:7;45268:4;45261:21;45309:22;45303:4;45296:36;45385:4;45379;45369:21;45346:44;;45481:19;45475:26;45456:45;;45212:300;44867:652;;;:::o;45632:645::-;45774:11;45936:15;45930:4;45926:26;45918:34;;46095:15;46084:9;46080:31;46067:44;;46242:15;46231:9;46228:30;46221:4;46210:9;46207:19;46204:55;46194:65;;45632:645;;;;;:::o;56460:159::-;;;;;:::o;54772:309::-;54907:7;54927:16;26078:3;54953:19;:40;;54927:67;;26078:3;55020:31;55031:4;55037:2;55041:9;55020:10;:31::i;:::-;55012:40;;:61;;55005:68;;;54772:309;;;;;:::o;34600:447::-;34680:14;34848:15;34841:5;34837:27;34828:36;;35022:5;35008:11;34984:22;34980:40;34977:51;34970:5;34967:62;34957:72;;34600:447;;;;:::o;57278:158::-;;;;;:::o;14883:191::-;14957:16;14976:6;;;;;;;;;;;14957:25;;15002:8;14993:6;;:17;;;;;;;;;;;;;;;;;;15057:8;15026:40;;15047:8;15026:40;;;;;;;;;;;;14946:128;14883:191;:::o;53282:716::-;53445:4;53491:2;53466:45;;;53512:19;:17;:19::i;:::-;53533:4;53539:7;53548:5;53466:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53462:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53766:1;53749:6;:13;:18;53745:235;;;53795:40;;;;;;;;;;;;;;53745:235;53938:6;53932:13;53923:6;53919:2;53915:15;53908:38;53462:529;53635:54;;;53625:64;;;:6;:64;;;;53618:71;;;53282:716;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;39943:681::-;40066:19;40072:2;40076:8;40066:5;:19::i;:::-;40145:1;40127:2;:14;;;:19;40123:483;;40167:11;40181:13;;40167:27;;40213:13;40235:8;40229:3;:14;40213:30;;40262:233;40293:62;40332:1;40336:2;40340:7;;;;;;40349:5;40293:30;:62::i;:::-;40288:167;;40391:40;;;;;;;;;;;;;;40288:167;40490:3;40482:5;:11;40262:233;;40577:3;40560:13;;:20;40556:34;;40582:8;;;40556:34;40148:458;;40123:483;39943:681;;;:::o;55657:147::-;55794:6;55657:147;;;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;40897:1529::-;40962:20;40985:13;;40962:36;;41027:1;41013:16;;:2;:16;;;41009:48;;;41038:19;;;;;;;;;;;;;;41009:48;41084:1;41072:8;:13;41068:44;;;41094:18;;;;;;;;;;;;;;41068:44;41125:61;41155:1;41159:2;41163:12;41177:8;41125:21;:61::i;:::-;41668:1;25044:2;41639:1;:25;;41638:31;41626:8;:44;41600:18;:22;41619:2;41600:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;41947:139;41984:2;42038:33;42061:1;42065:2;42069:1;42038:14;:33::i;:::-;42005:30;42026:8;42005:20;:30::i;:::-;:66;41947:18;:139::i;:::-;41913:17;:31;41931:12;41913:31;;;;;;;;;;;:173;;;;42103:15;42121:12;42103:30;;42148:11;42177:8;42162:12;:23;42148:37;;42200:101;42252:9;;;;;;42248:2;42227:35;;42244:1;42227:35;;;;;;;;;;;;42296:3;42286:7;:13;42200:101;;42333:3;42317:13;:19;;;;41374:974;;42358:60;42387:1;42391:2;42395:12;42409:8;42358:20;:60::i;:::-;40951:1475;40897:1529;;:::o;36430:322::-;36500:14;36731:1;36721:8;36718:15;36693:23;36689:45;36679:55;;36430:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:552::-;3761:8;3771:6;3821:3;3814:4;3806:6;3802:17;3798:27;3788:122;;3829:79;;:::i;:::-;3788:122;3942:6;3929:20;3919:30;;3972:18;3964:6;3961:30;3958:117;;;3994:79;;:::i;:::-;3958:117;4108:4;4100:6;4096:17;4084:29;;4162:3;4154:4;4146:6;4142:17;4132:8;4128:32;4125:41;4122:128;;;4169:79;;:::i;:::-;4122:128;3704:552;;;;;:::o;4275:338::-;4330:5;4379:3;4372:4;4364:6;4360:17;4356:27;4346:122;;4387:79;;:::i;:::-;4346:122;4504:6;4491:20;4529:78;4603:3;4595:6;4588:4;4580:6;4576:17;4529:78;:::i;:::-;4520:87;;4336:277;4275:338;;;;:::o;4619:161::-;4676:5;4714:6;4701:20;4692:29;;4730:44;4768:5;4730:44;:::i;:::-;4619:161;;;;:::o;4800:340::-;4856:5;4905:3;4898:4;4890:6;4886:17;4882:27;4872:122;;4913:79;;:::i;:::-;4872:122;5030:6;5017:20;5055:79;5130:3;5122:6;5115:4;5107:6;5103:17;5055:79;:::i;:::-;5046:88;;4862:278;4800:340;;;;:::o;5146:139::-;5192:5;5230:6;5217:20;5208:29;;5246:33;5273:5;5246:33;:::i;:::-;5146:139;;;;:::o;5291:329::-;5350:6;5399:2;5387:9;5378:7;5374:23;5370:32;5367:119;;;5405:79;;:::i;:::-;5367:119;5525:1;5550:53;5595:7;5586:6;5575:9;5571:22;5550:53;:::i;:::-;5540:63;;5496:117;5291:329;;;;:::o;5626:474::-;5694:6;5702;5751:2;5739:9;5730:7;5726:23;5722:32;5719:119;;;5757:79;;:::i;:::-;5719:119;5877:1;5902:53;5947:7;5938:6;5927:9;5923:22;5902:53;:::i;:::-;5892:63;;5848:117;6004:2;6030:53;6075:7;6066:6;6055:9;6051:22;6030:53;:::i;:::-;6020:63;;5975:118;5626:474;;;;;:::o;6106:619::-;6183:6;6191;6199;6248:2;6236:9;6227:7;6223:23;6219:32;6216:119;;;6254:79;;:::i;:::-;6216:119;6374:1;6399:53;6444:7;6435:6;6424:9;6420:22;6399:53;:::i;:::-;6389:63;;6345:117;6501:2;6527:53;6572:7;6563:6;6552:9;6548:22;6527:53;:::i;:::-;6517:63;;6472:118;6629:2;6655:53;6700:7;6691:6;6680:9;6676:22;6655:53;:::i;:::-;6645:63;;6600:118;6106:619;;;;;:::o;6731:943::-;6826:6;6834;6842;6850;6899:3;6887:9;6878:7;6874:23;6870:33;6867:120;;;6906:79;;:::i;:::-;6867:120;7026:1;7051:53;7096:7;7087:6;7076:9;7072:22;7051:53;:::i;:::-;7041:63;;6997:117;7153:2;7179:53;7224:7;7215:6;7204:9;7200:22;7179:53;:::i;:::-;7169:63;;7124:118;7281:2;7307:53;7352:7;7343:6;7332:9;7328:22;7307:53;:::i;:::-;7297:63;;7252:118;7437:2;7426:9;7422:18;7409:32;7468:18;7460:6;7457:30;7454:117;;;7490:79;;:::i;:::-;7454:117;7595:62;7649:7;7640:6;7629:9;7625:22;7595:62;:::i;:::-;7585:72;;7380:287;6731:943;;;;;;;:::o;7680:468::-;7745:6;7753;7802:2;7790:9;7781:7;7777:23;7773:32;7770:119;;;7808:79;;:::i;:::-;7770:119;7928:1;7953:53;7998:7;7989:6;7978:9;7974:22;7953:53;:::i;:::-;7943:63;;7899:117;8055:2;8081:50;8123:7;8114:6;8103:9;8099:22;8081:50;:::i;:::-;8071:60;;8026:115;7680:468;;;;;:::o;8154:474::-;8222:6;8230;8279:2;8267:9;8258:7;8254:23;8250:32;8247:119;;;8285:79;;:::i;:::-;8247:119;8405:1;8430:53;8475:7;8466:6;8455:9;8451:22;8430:53;:::i;:::-;8420:63;;8376:117;8532:2;8558:53;8603:7;8594:6;8583:9;8579:22;8558:53;:::i;:::-;8548:63;;8503:118;8154:474;;;;;:::o;8634:894::-;8752:6;8760;8809:2;8797:9;8788:7;8784:23;8780:32;8777:119;;;8815:79;;:::i;:::-;8777:119;8963:1;8952:9;8948:17;8935:31;8993:18;8985:6;8982:30;8979:117;;;9015:79;;:::i;:::-;8979:117;9120:78;9190:7;9181:6;9170:9;9166:22;9120:78;:::i;:::-;9110:88;;8906:302;9275:2;9264:9;9260:18;9247:32;9306:18;9298:6;9295:30;9292:117;;;9328:79;;:::i;:::-;9292:117;9433:78;9503:7;9494:6;9483:9;9479:22;9433:78;:::i;:::-;9423:88;;9218:303;8634:894;;;;;:::o;9534:327::-;9592:6;9641:2;9629:9;9620:7;9616:23;9612:32;9609:119;;;9647:79;;:::i;:::-;9609:119;9767:1;9792:52;9836:7;9827:6;9816:9;9812:22;9792:52;:::i;:::-;9782:62;;9738:116;9534:327;;;;:::o;9867:349::-;9936:6;9985:2;9973:9;9964:7;9960:23;9956:32;9953:119;;;9991:79;;:::i;:::-;9953:119;10111:1;10136:63;10191:7;10182:6;10171:9;10167:22;10136:63;:::i;:::-;10126:73;;10082:127;9867:349;;;;:::o;10222:351::-;10292:6;10341:2;10329:9;10320:7;10316:23;10312:32;10309:119;;;10347:79;;:::i;:::-;10309:119;10467:1;10492:64;10548:7;10539:6;10528:9;10524:22;10492:64;:::i;:::-;10482:74;;10438:128;10222:351;;;;:::o;10579:509::-;10648:6;10697:2;10685:9;10676:7;10672:23;10668:32;10665:119;;;10703:79;;:::i;:::-;10665:119;10851:1;10840:9;10836:17;10823:31;10881:18;10873:6;10870:30;10867:117;;;10903:79;;:::i;:::-;10867:117;11008:63;11063:7;11054:6;11043:9;11039:22;11008:63;:::i;:::-;10998:73;;10794:287;10579:509;;;;:::o;11094:329::-;11153:6;11202:2;11190:9;11181:7;11177:23;11173:32;11170:119;;;11208:79;;:::i;:::-;11170:119;11328:1;11353:53;11398:7;11389:6;11378:9;11374:22;11353:53;:::i;:::-;11343:63;;11299:117;11094:329;;;;:::o;11429:817::-;11517:6;11525;11533;11541;11590:2;11578:9;11569:7;11565:23;11561:32;11558:119;;;11596:79;;:::i;:::-;11558:119;11716:1;11741:53;11786:7;11777:6;11766:9;11762:22;11741:53;:::i;:::-;11731:63;;11687:117;11843:2;11869:53;11914:7;11905:6;11894:9;11890:22;11869:53;:::i;:::-;11859:63;;11814:118;11999:2;11988:9;11984:18;11971:32;12030:18;12022:6;12019:30;12016:117;;;12052:79;;:::i;:::-;12016:117;12165:64;12221:7;12212:6;12201:9;12197:22;12165:64;:::i;:::-;12147:82;;;;11942:297;11429:817;;;;;;;:::o;12252:118::-;12339:24;12357:5;12339:24;:::i;:::-;12334:3;12327:37;12252:118;;:::o;12376:157::-;12481:45;12501:24;12519:5;12501:24;:::i;:::-;12481:45;:::i;:::-;12476:3;12469:58;12376:157;;:::o;12539:109::-;12620:21;12635:5;12620:21;:::i;:::-;12615:3;12608:34;12539:109;;:::o;12654:118::-;12741:24;12759:5;12741:24;:::i;:::-;12736:3;12729:37;12654:118;;:::o;12778:360::-;12864:3;12892:38;12924:5;12892:38;:::i;:::-;12946:70;13009:6;13004:3;12946:70;:::i;:::-;12939:77;;13025:52;13070:6;13065:3;13058:4;13051:5;13047:16;13025:52;:::i;:::-;13102:29;13124:6;13102:29;:::i;:::-;13097:3;13093:39;13086:46;;12868:270;12778:360;;;;:::o;13144:149::-;13240:46;13280:5;13240:46;:::i;:::-;13235:3;13228:59;13144:149;;:::o;13299:364::-;13387:3;13415:39;13448:5;13415:39;:::i;:::-;13470:71;13534:6;13529:3;13470:71;:::i;:::-;13463:78;;13550:52;13595:6;13590:3;13583:4;13576:5;13572:16;13550:52;:::i;:::-;13627:29;13649:6;13627:29;:::i;:::-;13622:3;13618:39;13611:46;;13391:272;13299:364;;;;:::o;13669:377::-;13775:3;13803:39;13836:5;13803:39;:::i;:::-;13858:89;13940:6;13935:3;13858:89;:::i;:::-;13851:96;;13956:52;14001:6;13996:3;13989:4;13982:5;13978:16;13956:52;:::i;:::-;14033:6;14028:3;14024:16;14017:23;;13779:267;13669:377;;;;:::o;14076:845::-;14179:3;14216:5;14210:12;14245:36;14271:9;14245:36;:::i;:::-;14297:89;14379:6;14374:3;14297:89;:::i;:::-;14290:96;;14417:1;14406:9;14402:17;14433:1;14428:137;;;;14579:1;14574:341;;;;14395:520;;14428:137;14512:4;14508:9;14497;14493:25;14488:3;14481:38;14548:6;14543:3;14539:16;14532:23;;14428:137;;14574:341;14641:38;14673:5;14641:38;:::i;:::-;14701:1;14715:154;14729:6;14726:1;14723:13;14715:154;;;14803:7;14797:14;14793:1;14788:3;14784:11;14777:35;14853:1;14844:7;14840:15;14829:26;;14751:4;14748:1;14744:12;14739:17;;14715:154;;;14898:6;14893:3;14889:16;14882:23;;14581:334;;14395:520;;14183:738;;14076:845;;;;:::o;14927:366::-;15069:3;15090:67;15154:2;15149:3;15090:67;:::i;:::-;15083:74;;15166:93;15255:3;15166:93;:::i;:::-;15284:2;15279:3;15275:12;15268:19;;14927:366;;;:::o;15299:::-;15441:3;15462:67;15526:2;15521:3;15462:67;:::i;:::-;15455:74;;15538:93;15627:3;15538:93;:::i;:::-;15656:2;15651:3;15647:12;15640:19;;15299:366;;;:::o;15671:::-;15813:3;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15910:93;15999:3;15910:93;:::i;:::-;16028:2;16023:3;16019:12;16012:19;;15671:366;;;:::o;16043:::-;16185:3;16206:67;16270:2;16265:3;16206:67;:::i;:::-;16199:74;;16282:93;16371:3;16282:93;:::i;:::-;16400:2;16395:3;16391:12;16384:19;;16043:366;;;:::o;16415:::-;16557:3;16578:67;16642:2;16637:3;16578:67;:::i;:::-;16571:74;;16654:93;16743:3;16654:93;:::i;:::-;16772:2;16767:3;16763:12;16756:19;;16415:366;;;:::o;16787:::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:::-;17301:3;17322:67;17386:2;17381:3;17322:67;:::i;:::-;17315:74;;17398:93;17487:3;17398:93;:::i;:::-;17516:2;17511:3;17507:12;17500:19;;17159:366;;;:::o;17531:::-;17673:3;17694:67;17758:2;17753:3;17694:67;:::i;:::-;17687:74;;17770:93;17859:3;17770:93;:::i;:::-;17888:2;17883:3;17879:12;17872:19;;17531:366;;;:::o;17903:::-;18045:3;18066:67;18130:2;18125:3;18066:67;:::i;:::-;18059:74;;18142:93;18231:3;18142:93;:::i;:::-;18260:2;18255:3;18251:12;18244:19;;17903:366;;;:::o;18275:::-;18417:3;18438:67;18502:2;18497:3;18438:67;:::i;:::-;18431:74;;18514:93;18603:3;18514:93;:::i;:::-;18632:2;18627:3;18623:12;18616:19;;18275:366;;;:::o;18647:::-;18789:3;18810:67;18874:2;18869:3;18810:67;:::i;:::-;18803:74;;18886:93;18975:3;18886:93;:::i;:::-;19004:2;18999:3;18995:12;18988:19;;18647:366;;;:::o;19019:::-;19161:3;19182:67;19246:2;19241:3;19182:67;:::i;:::-;19175:74;;19258:93;19347:3;19258:93;:::i;:::-;19376:2;19371:3;19367:12;19360:19;;19019:366;;;:::o;19391:::-;19533:3;19554:67;19618:2;19613:3;19554:67;:::i;:::-;19547:74;;19630:93;19719:3;19630:93;:::i;:::-;19748:2;19743:3;19739:12;19732:19;;19391:366;;;:::o;19763:::-;19905:3;19926:67;19990:2;19985:3;19926:67;:::i;:::-;19919:74;;20002:93;20091:3;20002:93;:::i;:::-;20120:2;20115:3;20111:12;20104:19;;19763:366;;;:::o;20135:118::-;20222:24;20240:5;20222:24;:::i;:::-;20217:3;20210:37;20135:118;;:::o;20259:157::-;20364:45;20384:24;20402:5;20384:24;:::i;:::-;20364:45;:::i;:::-;20359:3;20352:58;20259:157;;:::o;20422:112::-;20505:22;20521:5;20505:22;:::i;:::-;20500:3;20493:35;20422:112;;:::o;20540:397::-;20680:3;20695:75;20766:3;20757:6;20695:75;:::i;:::-;20795:2;20790:3;20786:12;20779:19;;20808:75;20879:3;20870:6;20808:75;:::i;:::-;20908:2;20903:3;20899:12;20892:19;;20928:3;20921:10;;20540:397;;;;;:::o;20943:429::-;21120:3;21142:92;21230:3;21221:6;21142:92;:::i;:::-;21135:99;;21251:95;21342:3;21333:6;21251:95;:::i;:::-;21244:102;;21363:3;21356:10;;20943:429;;;;;:::o;21378:222::-;21471:4;21509:2;21498:9;21494:18;21486:26;;21522:71;21590:1;21579:9;21575:17;21566:6;21522:71;:::i;:::-;21378:222;;;;:::o;21606:640::-;21801:4;21839:3;21828:9;21824:19;21816:27;;21853:71;21921:1;21910:9;21906:17;21897:6;21853:71;:::i;:::-;21934:72;22002:2;21991:9;21987:18;21978:6;21934:72;:::i;:::-;22016;22084:2;22073:9;22069:18;22060:6;22016:72;:::i;:::-;22135:9;22129:4;22125:20;22120:2;22109:9;22105:18;22098:48;22163:76;22234:4;22225:6;22163:76;:::i;:::-;22155:84;;21606:640;;;;;;;:::o;22252:210::-;22339:4;22377:2;22366:9;22362:18;22354:26;;22390:65;22452:1;22441:9;22437:17;22428:6;22390:65;:::i;:::-;22252:210;;;;:::o;22468:545::-;22641:4;22679:3;22668:9;22664:19;22656:27;;22693:71;22761:1;22750:9;22746:17;22737:6;22693:71;:::i;:::-;22774:68;22838:2;22827:9;22823:18;22814:6;22774:68;:::i;:::-;22852:72;22920:2;22909:9;22905:18;22896:6;22852:72;:::i;:::-;22934;23002:2;22991:9;22987:18;22978:6;22934:72;:::i;:::-;22468:545;;;;;;;:::o;23019:240::-;23121:4;23159:2;23148:9;23144:18;23136:26;;23172:80;23249:1;23238:9;23234:17;23225:6;23172:80;:::i;:::-;23019:240;;;;:::o;23265:313::-;23378:4;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:78;23566:4;23557:6;23493:78;:::i;:::-;23485:86;;23265:313;;;;:::o;23584:419::-;23750:4;23788:2;23777:9;23773:18;23765:26;;23837:9;23831:4;23827:20;23823:1;23812:9;23808:17;23801:47;23865:131;23991:4;23865:131;:::i;:::-;23857:139;;23584:419;;;:::o;24009:::-;24175:4;24213:2;24202:9;24198:18;24190:26;;24262:9;24256:4;24252:20;24248:1;24237:9;24233:17;24226:47;24290:131;24416:4;24290:131;:::i;:::-;24282:139;;24009:419;;;:::o;24434:::-;24600:4;24638:2;24627:9;24623:18;24615:26;;24687:9;24681:4;24677:20;24673:1;24662:9;24658:17;24651:47;24715:131;24841:4;24715:131;:::i;:::-;24707:139;;24434:419;;;:::o;24859:::-;25025:4;25063:2;25052:9;25048:18;25040:26;;25112:9;25106:4;25102:20;25098:1;25087:9;25083:17;25076:47;25140:131;25266:4;25140:131;:::i;:::-;25132:139;;24859:419;;;:::o;25284:::-;25450:4;25488:2;25477:9;25473:18;25465:26;;25537:9;25531:4;25527:20;25523:1;25512:9;25508:17;25501:47;25565:131;25691:4;25565:131;:::i;:::-;25557:139;;25284:419;;;:::o;25709:::-;25875:4;25913:2;25902:9;25898:18;25890:26;;25962:9;25956:4;25952:20;25948:1;25937:9;25933:17;25926:47;25990:131;26116:4;25990:131;:::i;:::-;25982:139;;25709:419;;;:::o;26134:::-;26300:4;26338:2;26327:9;26323:18;26315:26;;26387:9;26381:4;26377:20;26373:1;26362:9;26358:17;26351:47;26415:131;26541:4;26415:131;:::i;:::-;26407:139;;26134:419;;;:::o;26559:::-;26725:4;26763:2;26752:9;26748:18;26740:26;;26812:9;26806:4;26802:20;26798:1;26787:9;26783:17;26776:47;26840:131;26966:4;26840:131;:::i;:::-;26832:139;;26559:419;;;:::o;26984:::-;27150:4;27188:2;27177:9;27173:18;27165:26;;27237:9;27231:4;27227:20;27223:1;27212:9;27208:17;27201:47;27265:131;27391:4;27265:131;:::i;:::-;27257:139;;26984:419;;;:::o;27409:::-;27575:4;27613:2;27602:9;27598:18;27590:26;;27662:9;27656:4;27652:20;27648:1;27637:9;27633:17;27626:47;27690:131;27816:4;27690:131;:::i;:::-;27682:139;;27409:419;;;:::o;27834:::-;28000:4;28038:2;28027:9;28023:18;28015:26;;28087:9;28081:4;28077:20;28073:1;28062:9;28058:17;28051:47;28115:131;28241:4;28115:131;:::i;:::-;28107:139;;27834:419;;;:::o;28259:::-;28425:4;28463:2;28452:9;28448:18;28440:26;;28512:9;28506:4;28502:20;28498:1;28487:9;28483:17;28476:47;28540:131;28666:4;28540:131;:::i;:::-;28532:139;;28259:419;;;:::o;28684:::-;28850:4;28888:2;28877:9;28873:18;28865:26;;28937:9;28931:4;28927:20;28923:1;28912:9;28908:17;28901:47;28965:131;29091:4;28965:131;:::i;:::-;28957:139;;28684:419;;;:::o;29109:::-;29275:4;29313:2;29302:9;29298:18;29290:26;;29362:9;29356:4;29352:20;29348:1;29337:9;29333:17;29326:47;29390:131;29516:4;29390:131;:::i;:::-;29382:139;;29109:419;;;:::o;29534:222::-;29627:4;29665:2;29654:9;29650:18;29642:26;;29678:71;29746:1;29735:9;29731:17;29722:6;29678:71;:::i;:::-;29534:222;;;;:::o;29762:129::-;29796:6;29823:20;;:::i;:::-;29813:30;;29852:33;29880:4;29872:6;29852:33;:::i;:::-;29762:129;;;:::o;29897:75::-;29930:6;29963:2;29957:9;29947:19;;29897:75;:::o;29978:311::-;30055:4;30145:18;30137:6;30134:30;30131:56;;;30167:18;;:::i;:::-;30131:56;30217:4;30209:6;30205:17;30197:25;;30277:4;30271;30267:15;30259:23;;29978:311;;;:::o;30295:::-;30372:4;30462:18;30454:6;30451:30;30448:56;;;30484:18;;:::i;:::-;30448:56;30534:4;30526:6;30522:17;30514:25;;30594:4;30588;30584:15;30576:23;;30295:311;;;:::o;30612:307::-;30673:4;30763:18;30755:6;30752:30;30749:56;;;30785:18;;:::i;:::-;30749:56;30823:29;30845:6;30823:29;:::i;:::-;30815:37;;30907:4;30901;30897:15;30889:23;;30612:307;;;:::o;30925:308::-;30987:4;31077:18;31069:6;31066:30;31063:56;;;31099:18;;:::i;:::-;31063:56;31137:29;31159:6;31137:29;:::i;:::-;31129:37;;31221:4;31215;31211:15;31203:23;;30925:308;;;:::o;31239:141::-;31288:4;31311:3;31303:11;;31334:3;31331:1;31324:14;31368:4;31365:1;31355:18;31347:26;;31239:141;;;:::o;31386:98::-;31437:6;31471:5;31465:12;31455:22;;31386:98;;;:::o;31490:99::-;31542:6;31576:5;31570:12;31560:22;;31490:99;;;:::o;31595:168::-;31678:11;31712:6;31707:3;31700:19;31752:4;31747:3;31743:14;31728:29;;31595:168;;;;:::o;31769:169::-;31853:11;31887:6;31882:3;31875:19;31927:4;31922:3;31918:14;31903:29;;31769:169;;;;:::o;31944:148::-;32046:11;32083:3;32068:18;;31944:148;;;;:::o;32098:305::-;32138:3;32157:20;32175:1;32157:20;:::i;:::-;32152:25;;32191:20;32209:1;32191:20;:::i;:::-;32186:25;;32345:1;32277:66;32273:74;32270:1;32267:81;32264:107;;;32351:18;;:::i;:::-;32264:107;32395:1;32392;32388:9;32381:16;;32098:305;;;;:::o;32409:185::-;32449:1;32466:20;32484:1;32466:20;:::i;:::-;32461:25;;32500:20;32518:1;32500:20;:::i;:::-;32495:25;;32539:1;32529:35;;32544:18;;:::i;:::-;32529:35;32586:1;32583;32579:9;32574:14;;32409:185;;;;:::o;32600:348::-;32640:7;32663:20;32681:1;32663:20;:::i;:::-;32658:25;;32697:20;32715:1;32697:20;:::i;:::-;32692:25;;32885:1;32817:66;32813:74;32810:1;32807:81;32802:1;32795:9;32788:17;32784:105;32781:131;;;32892:18;;:::i;:::-;32781:131;32940:1;32937;32933:9;32922:20;;32600:348;;;;:::o;32954:191::-;32994:4;33014:20;33032:1;33014:20;:::i;:::-;33009:25;;33048:20;33066:1;33048:20;:::i;:::-;33043:25;;33087:1;33084;33081:8;33078:34;;;33092:18;;:::i;:::-;33078:34;33137:1;33134;33130:9;33122:17;;32954:191;;;;:::o;33151:96::-;33188:7;33217:24;33235:5;33217:24;:::i;:::-;33206:35;;33151:96;;;:::o;33253:90::-;33287:7;33330:5;33323:13;33316:21;33305:32;;33253:90;;;:::o;33349:77::-;33386:7;33415:5;33404:16;;33349:77;;;:::o;33432:149::-;33468:7;33508:66;33501:5;33497:78;33486:89;;33432:149;;;:::o;33587:133::-;33635:7;33664:5;33653:16;;33670:44;33708:5;33670:44;:::i;:::-;33587:133;;;:::o;33726:126::-;33763:7;33803:42;33796:5;33792:54;33781:65;;33726:126;;;:::o;33858:77::-;33895:7;33924:5;33913:16;;33858:77;;;:::o;33941:86::-;33976:7;34016:4;34009:5;34005:16;33994:27;;33941:86;;;:::o;34033:133::-;34092:9;34125:35;34154:5;34125:35;:::i;:::-;34112:48;;34033:133;;;:::o;34172:154::-;34256:6;34251:3;34246;34233:30;34318:1;34309:6;34304:3;34300:16;34293:27;34172:154;;;:::o;34332:307::-;34400:1;34410:113;34424:6;34421:1;34418:13;34410:113;;;34509:1;34504:3;34500:11;34494:18;34490:1;34485:3;34481:11;34474:39;34446:2;34443:1;34439:10;34434:15;;34410:113;;;34541:6;34538:1;34535:13;34532:101;;;34621:1;34612:6;34607:3;34603:16;34596:27;34532:101;34381:258;34332:307;;;:::o;34645:320::-;34689:6;34726:1;34720:4;34716:12;34706:22;;34773:1;34767:4;34763:12;34794:18;34784:81;;34850:4;34842:6;34838:17;34828:27;;34784:81;34912:2;34904:6;34901:14;34881:18;34878:38;34875:84;;;34931:18;;:::i;:::-;34875:84;34696:269;34645:320;;;:::o;34971:281::-;35054:27;35076:4;35054:27;:::i;:::-;35046:6;35042:40;35184:6;35172:10;35169:22;35148:18;35136:10;35133:34;35130:62;35127:88;;;35195:18;;:::i;:::-;35127:88;35235:10;35231:2;35224:22;35014:238;34971:281;;:::o;35258:233::-;35297:3;35320:24;35338:5;35320:24;:::i;:::-;35311:33;;35366:66;35359:5;35356:77;35353:103;;;35436:18;;:::i;:::-;35353:103;35483:1;35476:5;35472:13;35465:20;;35258:233;;;:::o;35497:100::-;35536:7;35565:26;35585:5;35565:26;:::i;:::-;35554:37;;35497:100;;;:::o;35603:94::-;35642:7;35671:20;35685:5;35671:20;:::i;:::-;35660:31;;35603:94;;;:::o;35703:79::-;35742:7;35771:5;35760:16;;35703:79;;;:::o;35788:176::-;35820:1;35837:20;35855:1;35837:20;:::i;:::-;35832:25;;35871:20;35889:1;35871:20;:::i;:::-;35866:25;;35910:1;35900:35;;35915:18;;:::i;:::-;35900:35;35956:1;35953;35949:9;35944:14;;35788:176;;;;:::o;35970:180::-;36018:77;36015:1;36008:88;36115:4;36112:1;36105:15;36139:4;36136:1;36129:15;36156:180;36204:77;36201:1;36194:88;36301:4;36298:1;36291:15;36325:4;36322:1;36315:15;36342:180;36390:77;36387:1;36380:88;36487:4;36484:1;36477:15;36511:4;36508:1;36501:15;36528:180;36576:77;36573:1;36566:88;36673:4;36670:1;36663:15;36697:4;36694:1;36687:15;36714:180;36762:77;36759:1;36752:88;36859:4;36856:1;36849:15;36883:4;36880:1;36873:15;36900:180;36948:77;36945:1;36938:88;37045:4;37042:1;37035:15;37069:4;37066:1;37059:15;37086:117;37195:1;37192;37185:12;37209:117;37318:1;37315;37308:12;37332:117;37441:1;37438;37431:12;37455:117;37564:1;37561;37554:12;37578:117;37687:1;37684;37677:12;37701:117;37810:1;37807;37800:12;37824:102;37865:6;37916:2;37912:7;37907:2;37900:5;37896:14;37892:28;37882:38;;37824:102;;;:::o;37932:94::-;37965:8;38013:5;38009:2;38005:14;37984:35;;37932:94;;;:::o;38032:174::-;38172:26;38168:1;38160:6;38156:14;38149:50;38032:174;:::o;38212:181::-;38352:33;38348:1;38340:6;38336:14;38329:57;38212:181;:::o;38399:225::-;38539:34;38535:1;38527:6;38523:14;38516:58;38608:8;38603:2;38595:6;38591:15;38584:33;38399:225;:::o;38630:221::-;38770:34;38766:1;38758:6;38754:14;38747:58;38839:4;38834:2;38826:6;38822:15;38815:29;38630:221;:::o;38857:172::-;38997:20;38993:1;38985:6;38981:14;38974:44;38857:172;:::o;39039:233::-;39183:34;39179:1;39171:6;39167:14;39160:58;39256:4;39251:2;39243:6;39239:15;39232:29;39039:233;:::o;39282:183::-;39426:23;39422:1;39414:6;39410:14;39403:47;39282:183;:::o;39479:186::-;39627:18;39623:1;39615:6;39611:14;39604:42;39479:186;:::o;39683:206::-;39835:34;39831:1;39823:6;39819:14;39812:58;39683:206;:::o;39907:202::-;40059:26;40055:1;40047:6;40043:14;40036:50;39907:202;:::o;40131:282::-;40287:34;40283:1;40275:6;40271:14;40264:58;40372:17;40367:2;40359:6;40355:15;40348:42;40131:282;:::o;40435:210::-;40591:26;40587:1;40579:6;40575:14;40568:50;40435:210;:::o;40671:::-;40831:18;40827:1;40819:6;40815:14;40808:42;40671:210;:::o;40911:228::-;41075:28;41071:1;41063:6;41059:14;41052:52;40911:228;:::o;41173:172::-;41285:1;41278:5;41275:12;41265:46;;41291:18;;:::i;:::-;41265:46;41173:172;:::o;41379:178::-;41480:24;41498:5;41480:24;:::i;:::-;41473:5;41470:35;41460:63;;41519:1;41516;41509:12;41460:63;41379:178;:::o;41591:172::-;41689:21;41704:5;41689:21;:::i;:::-;41682:5;41679:32;41669:60;;41725:1;41722;41715:12;41669:60;41591:172;:::o;41797:176::-;41897:23;41914:5;41897:23;:::i;:::-;41890:5;41887:34;41877:62;;41935:1;41932;41925:12;41877:62;41797:176;:::o;42007:166::-;42119:1;42112:5;42109:12;42099:40;;42135:1;42132;42125:12;42099:40;42007:166;:::o;42207:178::-;42308:24;42326:5;42308:24;:::i;:::-;42301:5;42298:35;42288:63;;42347:1;42344;42337:12;42288:63;42207:178;:::o

Swarm Source

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