ERC-721
NFT
Overview
Max Total Supply
8,700 SMIF
Holders
3,517
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
9 SMIFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
StrangeMeInNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-15 */ /** @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@00@@@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@C;1@@@@@@@00@@0@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@0;;;;;;;;i@0@@@@@0@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@0;;;;;;;;;;;;;;;@0@@@@0@@@00@0@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@t;;;;;;;;;;;;;;;;;;;;@00@@@@@@@118@@@@@@@0@@0@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@L;;;;;;;;;;;;;;;;;;;;;;;;;;@0@@@@@@@@@@@@80@@0@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@0@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@0@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@00@@0@0@@00@@@t;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@0@0@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@@L;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;G@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@811tfffLGGCCCC888800@@@00;;;;;;;;;;;;;;@@@@@@@@@@@@@t;;0@@@@@@@@@@@0@@@@@@@@@@@@@0@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;;;;;;;;;;;0@0fC@8::::;@@@;;;;;;;;;i@@@@i,,,,,,;@@@@@@@@@@@@@@@@@@00@@@CLG8@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@0@@@00;;;LC@@@@@@@@@@@@@@00::::G@,f@1;;;;;f@@@@@@0,,,,@0@@@@@@@@@@@@@@@0@@LLLLLLL8@0LL@0@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@0@C;;C@@@8i@ 1@@::@L,,G@;;;;@8@@@@@@,,:@0@@@@@@@@@@@@@@@@0LLLLLLL@0LLLLLL@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@00@@C;;;;;t@ @;:@,,,,@;;;@ @@@@@G,@0@@@@@@@@@@@@@@@@0@GLLLLLLLLLLLLC0@@@@@@000@@@@@@ @@@@@@@@@@@@@@00@@0@@it@@0;;;1@ @@ @::1@,,.@@;;@@@@@@1,@0@@@@@@@@@@@@@@@@@@@0@CLLLLLLLLLLL0@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@0@::@1;;;;;;;@ L@@. 8@@@@C8@,,,@L;@@@@i,0@@@@@@@@@@@@@@@@@@@@@@@@0@LLLLLLLL@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@00::::C@1;;;i@. i@0;;;;;;;@1,,:@;@i,,.@@@::@@@@@@@@@@@@@@@@@@@@@@@0@LLG@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@0@::::@;;;;;@0 L@@@t1:,,,,,,,,@,,,@;@G,8@@G:::@@@@@@@@@@@@@@@@@@@@@@@@@00@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@800;;;;;@ 1@@@@C1t1@f1,,,,,,,,,,1@,,@LC0@L@8;:::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@00L0@@@@@@@@@0GLf1fff111f1@81,,,,,,,,,,,,00,08L@108:::::::::::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@00@@@@@@ @@@@@@@@@@@@@@@@@@@@@@;;;;;;C@1ft11tt1tt1t1ftf@11,,,,,,,,,,,,,@;t@t@C@::::::::::@@@@@@@0@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@@@ @@@@@@@@@@@@@@@@@@@@@@@0;;;;;@ft1t11ftfftf1ft@G111,,,,,,,,,,,,,@@@1@@::::::::::@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@0@@@C8@f1ff1f1ffff1tf@11101:,,,,,,,,,,,,;@i@f:::::::::@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ff1f1f1f1ffft@01111@0111;,,,,;111@@1@::::::::@@@@@@@@@@@@@@0@0@@@@@0@@@0@@@@@@@@@@@@@@@G@0@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Ltf1tff1tftft@f111111G@@@@00@@@@fG@1@:::::;@@@8@0@@@@@@@@@00@@0@@@@@@@@@@@@@@@@@@@@@@@@C8@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@1ftft1fff1ft@111111111111111111108t@:1@@8GGGGGGC@0000@@@@8C00CC@8CCGGGC@0@@@@@@@@@@@@00C@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1ftttf1fft1f@111111111@C@G111111@Gt@0GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG0@@@@@@@@@@@@@GG@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1f1t1ftttf1t@11111118@;;;L@t1111@;t@GLLGGGGG@8G8@GGGGGGGGGGGGGGGGGGGGGLGGG@0@@@@@@@@@GGG@0@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Ltft1ftttf1f@111111@C;;;C@G11111@;t@LGGGGGGGGGGGGGGGGGGGGf;GGGGGGGG;;GGi;GG@0@@@@@@@GGLG@0@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@00ff1tf1tf11f@1111C@;;i@@1111111t@;L@LGGGGLLGGGGGGGGGGGGGGi1GGG@GG;fGGGGGL;GG@@@@0@GGGLLG00@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@081f1tff1t11f@L11110@@t11111111100;80GGGGLGGGGLGGGGGGGGGGG;LGG@GGGGGG@@i@GtLGC@@@CGLGLLGG0@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@11ft1tffttf1L@110@GG0CCft1@f:1@@f;@8GGGGLGGGLGGGGGGGGGGGG;GGG8@GG@@:,@::@GGGG@@GGLGGGGC@0@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f1ff1ff1f1ff0@01tfttttf1110@:@@;;@0GGGGGGGGLGGGGGGGGGGGG;GGG@GGCC0@@:8@:@GGGC@GLGLLG@0@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@1ttf1f1f11t1t11ft11t11f1tf@G@;;@0GGGGGGG8@@GGGGC@8GGGG;LGGC@@8GGG8@8@0@@GGG@CGGLGC@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C0@@@@f@1iii@t11111ft1f1tff1f111@@;;0@@@@@@@@0@8GLG@@GGGG@GGi;GGGGGC@8G0@CGGGGGG0@GLLG00@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@0tiiiii@@iiiiiiii@f1f1111f1ft1f1ftt1@G;@8CCCCCCCC@fffff0@8@@@GGGG;iGGGGC@GGGGGGGGGGC@GLGG@0@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@0Liiiiiiiii1fG0000@@1ft11ftt1fftf1f11tG@CCCCCCCCC@ffffff8@@G@8GGGGG;GGGGG@GGGGGGGGGGG@GGG8@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@00ttttttttttttttttGLf1f11tf1ftf1fC@@@@@0CCCCCCCC@0fffffff@00GC@@GGG;GGGGC@GGGGGGGGGGG@GG0@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@ttttttttttttttttt@1ft11f111tf11@8CCCCCCCCCCCCCCC@ffffffff@C0@GGG@0GGGGGGC@GGGGGGGGG0@@@0@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@0@Ltttttttttttt@81f11ttf1t111f@8CCCCCCCCCCCCCCC@fffffffff00C0@GGG@C8@@@@@GGGGGGGG0@0@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@8@000t00@C@01111ttfftff@8CCCCCCCCCCCCCCC00ffffffffff@CC0@GGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCC80@LLLGC0@0CCCCCCCCCCCCCCCC@fffffffffff@CCC0@GGGGGGGGGGGG0@0@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0CCCCCCCC@0ffffff0@CCCCCCCCCCCCCC@Lfffffffffff@0CCC8@0CGGGGG0@@0@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0CCCCCCCCCC@8ffffff0@CCCCCCCCCCCC8@ffffffffLLffL@CCCC8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8CCCCCCCCCCCC@8ffffff8@CCCCCCCCCCC@ffffffff@CCCCCCCCCCCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8CCCCCCCCCCCCCC@8ffffffC@CCCCCCCCC0@fffffff@8CCCCCCCCCCCCC@@@@@@@00@@@0@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8CCCCCCCCCCCCCCC8@fffffffG@CCCCCCCC@fffffff00CCCCCCCCCCCCCCC@@0@@8CCCCC@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCCCCCCCCCC0@ffffffffff@CCCCCC@Cffffff8@CCCCCCCC@CCCCCCCCCCCCCCCCCC@0@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCC00CCCCCCC@Cffffffffffff@CCCC8@ffffffL@CCCCCCCCCC@CCCCCCCCCCCCCCCCCC@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@0@0CCCCCCCCC00CCCCCC8@fffffffffffffff@CCC@fffffff@CCCCCCCCCCC0@CCCCCCCCCCCCCCCCC@0@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@8CCCCCCCCCC8@CCCCCC@0ttttfttffffffffff@0@fffffff@CCCCCCCCCCCCC@8CCCCCCCCCCCCCCCC8@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCCCCC@0CCCCCCCCCCCCCCCCCCCC800@@@@fffffff@0CCCCCCCCCCCCCC@CCCCCCCCCCCCCCCCC@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCCCC8@CCCCCCCCCCCCCCCCCCCCCCC@CC@ffffffL@CCCCCCCCCCCCCCCC@0CCCCCCCCCCCCCCC@0@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCC088@ffffff@CCCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCC8@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCCC0@CCCCCCCCCCCCCCCCCCCCCC0800fffff00CCCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCCC@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@00CCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCC@C00ffffC@CCCCCCCCCCCCCCCCCCCC00CCCCCCCCCCCCCC@0@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@00CCCCCCCC8@CCCCCCCCCCCCCCCCCCCCCCC00ffff@CCCCCCCCCCCCCCCCCCCCC8@CCCCCCCCCCCCCC00@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@CCCCCCCC@8CCCCCCCCCCCCCCCCCCCC@C00fff@8CCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCCC@@@@@@@@@@@@@@@@ */ // SPDX-License-Identifier: MIT // 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 (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: 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: contracts/StrangeMeInNFT.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); } } pragma solidity ^0.8.0; contract StrangeMeInNFT is ERC721A, Ownable { using Strings for uint; uint public constant MINT_PRICE = 0.007 ether; uint public constant MAX_NFT_PER_TRAN = 10; uint public constant MAX_PER_WALLET = 100; uint public maxSupply = 10000; bool public isPaused = true; bool public isMetadataFinal; string private _baseURL = "ipfs://QmbmmPsKaEjyzMuHbgRbPf1b6L3iVgyenbdcRLkGoxhzMQ/"; string public prerevealURL = ''; mapping(address => uint) private _walletMintedCount; constructor() // Name ERC721A('Strange Me In NFT', 'SMIF') { } function _baseURI() internal view override returns (string memory) { return _baseURL; } function _startTokenId() internal pure override returns (uint) { return 1; } function contractURI() public pure returns (string memory) { return ""; } function finalizeMetadata() external onlyOwner { isMetadataFinal = true; } function reveal(string memory url) external onlyOwner { require(!isMetadataFinal, "Metadata is finalized"); _baseURL = url; } function mintedCount(address owner) external view returns (uint) { return _walletMintedCount[owner]; } function setPause(bool value) external onlyOwner { isPaused = value; } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } function devMint(address to, uint count) external onlyOwner { require( _totalMinted() + count <= maxSupply, 'Exceeds max supply' ); _safeMint(to, count); } function setMaxSupply(uint newMaxSupply) external onlyOwner { maxSupply = newMaxSupply; } function tokenURI(uint tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(_baseURI()).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json")) : prerevealURL; } function mint(uint count) external payable { require(!isPaused, 'Sales are off'); require(count <= MAX_NFT_PER_TRAN,'Exceeds NFT per transaction limit'); require(_totalMinted() + count <= maxSupply,'Exceeds max supply'); require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET,'Exceeds max per wallet'); uint payForCount = count; uint mintedSoFar = _walletMintedCount[msg.sender]; if(mintedSoFar < 2) { uint remainingFreeMints = 2 - mintedSoFar; if(count > remainingFreeMints) { payForCount = count - remainingFreeMints; } else { payForCount = 0; } } require( msg.value >= payForCount * MINT_PRICE, 'Ether value sent is not sufficient' ); _walletMintedCount[msg.sender] += count; _safeMint(msg.sender, count); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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_NFT_PER_TRAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeMetadata","outputs":[],"stateMutability":"nonpayable","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":"isMetadataFinal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","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":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"prerevealURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526127106009556001600a60006101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200367460369139600b90805190602001906200005692919062000240565b5060405180602001604052806000815250600c90805190602001906200007e92919062000240565b503480156200008c57600080fd5b506040518060400160405280601181526020017f537472616e6765204d6520496e204e46540000000000000000000000000000008152506040518060400160405280600481526020017f534d49460000000000000000000000000000000000000000000000000000000081525081600290805190602001906200011192919062000240565b5080600390805190602001906200012a92919062000240565b506200013b6200016960201b60201c565b600081905550505062000163620001576200017260201b60201c565b6200017a60201b60201c565b62000355565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024e90620002f0565b90600052602060002090601f016020900481019282620002725760008555620002be565b82601f106200028d57805160ff1916838001178555620002be565b82800160010185558215620002be579182015b82811115620002bd578251825591602001919060010190620002a0565b5b509050620002cd9190620002d1565b5090565b5b80821115620002ec576000816000905550600101620002d2565b5090565b600060028204905060018216806200030957607f821691505b6020821081141562000320576200031f62000326565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61330f80620003656000396000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d485146106b8578063e985e9c5146106e3578063f2fde38b14610720578063f4a560a514610749578063fddcb5ea14610760576101ee565b8063c87b56dd146105fa578063d5abeb0114610637578063d821048214610662578063e193e7e21461068d576101ee565b8063b187bd26116100dc578063b187bd2614610552578063b88d4fde1461057d578063bedb86fb146105a6578063c002d23d146105cf576101ee565b80638da5cb5b146104b757806395d89b41146104e2578063a0712d681461050d578063a22cb46514610529576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e146103fd5780636f8b44b01461043a57806370a0823114610463578063715018a6146104a0576101ee565b80633ccfd60b1461036b57806342842e0e146103825780634c261247146103ab578063627804af146103d4576101ee565b80630de76de4116101c15780630de76de4146102c15780630f2cdd6c146102ec57806318160ddd1461031757806323b872dd14610342576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612677565b61079d565b6040516102279190612a43565b60405180910390f35b34801561023c57600080fd5b5061024561082f565b6040516102529190612a5e565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061271a565b6108c1565b60405161028f91906129dc565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061260a565b61093d565b005b3480156102cd57600080fd5b506102d6610a7e565b6040516102e39190612a43565b60405180910390f35b3480156102f857600080fd5b50610301610a91565b60405161030e9190612ba0565b60405180910390f35b34801561032357600080fd5b5061032c610a96565b6040516103399190612ba0565b60405180910390f35b34801561034e57600080fd5b50610369600480360381019061036491906124f4565b610aad565b005b34801561037757600080fd5b50610380610dd2565b005b34801561038e57600080fd5b506103a960048036038101906103a491906124f4565b610e53565b005b3480156103b757600080fd5b506103d260048036038101906103cd91906126d1565b610e73565b005b3480156103e057600080fd5b506103fb60048036038101906103f6919061260a565b610ee5565b005b34801561040957600080fd5b50610424600480360381019061041f919061271a565b610f52565b60405161043191906129dc565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061271a565b610f64565b005b34801561046f57600080fd5b5061048a60048036038101906104859190612487565b610f76565b6040516104979190612ba0565b60405180910390f35b3480156104ac57600080fd5b506104b561102f565b005b3480156104c357600080fd5b506104cc611043565b6040516104d991906129dc565b60405180910390f35b3480156104ee57600080fd5b506104f761106d565b6040516105049190612a5e565b60405180910390f35b6105276004803603810190610522919061271a565b6110ff565b005b34801561053557600080fd5b50610550600480360381019061054b91906125ca565b6113b7565b005b34801561055e57600080fd5b5061056761152f565b6040516105749190612a43565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612547565b611542565b005b3480156105b257600080fd5b506105cd60048036038101906105c8919061264a565b6115b5565b005b3480156105db57600080fd5b506105e46115da565b6040516105f19190612ba0565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c919061271a565b6115e5565b60405161062e9190612a5e565b60405180910390f35b34801561064357600080fd5b5061064c611708565b6040516106599190612ba0565b60405180910390f35b34801561066e57600080fd5b5061067761170e565b6040516106849190612a5e565b60405180910390f35b34801561069957600080fd5b506106a261179c565b6040516106af9190612ba0565b60405180910390f35b3480156106c457600080fd5b506106cd6117a1565b6040516106da9190612a5e565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906124b4565b6117b8565b6040516107179190612a43565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190612487565b61184c565b005b34801561075557600080fd5b5061075e6118d0565b005b34801561076c57600080fd5b5061078760048036038101906107829190612487565b6118f5565b6040516107949190612ba0565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108285750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461083e90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461086a90612e5b565b80156108b75780601f1061088c576101008083540402835291602001916108b7565b820191906000526020600020905b81548152906001019060200180831161089a57829003601f168201915b5050505050905090565b60006108cc8261193e565b610902576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094882610f52565b90508073ffffffffffffffffffffffffffffffffffffffff1661096961199d565b73ffffffffffffffffffffffffffffffffffffffff16146109cc576109958161099061199d565b6117b8565b6109cb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a60019054906101000a900460ff1681565b606481565b6000610aa06119a5565b6001546000540303905090565b6000610ab8826119ae565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b2b84611a7c565b91509150610b418187610b3c61199d565b611a9e565b610b8d57610b5686610b5161199d565b6117b8565b610b8c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bf4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c018686866001611ae2565b8015610c0c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cda85610cb6888887611ae8565b7c020000000000000000000000000000000000000000000000000000000017611b10565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d62576000600185019050600060046000838152602001908152602001600020541415610d60576000548114610d5f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dca8686866001611b3b565b505050505050565b610dda611b41565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e00906129c7565b60006040518083038185875af1925050503d8060008114610e3d576040519150601f19603f3d011682016040523d82523d6000602084013e610e42565b606091505b5050905080610e5057600080fd5b50565b610e6e83838360405180602001604052806000815250611542565b505050565b610e7b611b41565b600a60019054906101000a900460ff1615610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290612a80565b60405180910390fd5b80600b9080519060200190610ee192919061229b565b5050565b610eed611b41565b60095481610ef9611bbf565b610f039190612c90565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90612b00565b60405180910390fd5b610f4e8282611bd2565b5050565b6000610f5d826119ae565b9050919050565b610f6c611b41565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611037611b41565b6110416000611bf0565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461107c90612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546110a890612e5b565b80156110f55780601f106110ca576101008083540402835291602001916110f5565b820191906000526020600020905b8154815290600101906020018083116110d857829003601f168201915b5050505050905090565b600a60009054906101000a900460ff161561114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612ae0565b60405180910390fd5b600a811115611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90612ac0565b60405180910390fd5b6009548161119f611bbf565b6111a99190612c90565b11156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e190612b00565b60405180910390fd5b606481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112379190612c90565b1115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612b80565b60405180910390fd5b60008190506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028110156112fd5760008160026112d99190612d71565b9050808411156112f65780846112ef9190612d71565b92506112fb565b600092505b505b6618de76816d8000826113109190612d17565b341015611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990612b20565b60405180910390fd5b82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a19190612c90565b925050819055506113b23384611bd2565b505050565b6113bf61199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611424576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061143161199d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114de61199d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115239190612a43565b60405180910390a35050565b600a60009054906101000a900460ff1681565b61154d848484610aad565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115af5761157884848484611cb6565b6115ae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6115bd611b41565b80600a60006101000a81548160ff02191690831515021790555050565b6618de76816d800081565b60606115f08261193e565b61162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690612b60565b60405180910390fd5b6000611639611e16565b51116116cf57600c805461164c90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461167890612e5b565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050505050611701565b6116d7611e16565b6116e083611ea8565b6040516020016116f1929190612998565b6040516020818303038152906040525b9050919050565b60095481565b600c805461171b90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461174790612e5b565b80156117945780601f1061176957610100808354040283529160200191611794565b820191906000526020600020905b81548152906001019060200180831161177757829003601f168201915b505050505081565b600a81565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611854611b41565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90612aa0565b60405180910390fd5b6118cd81611bf0565b50565b6118d8611b41565b6001600a60016101000a81548160ff021916908315150217905550565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816119496119a5565b11158015611958575060005482105b8015611996575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119bd6119a5565b11611a4557600054811015611a445760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a42575b6000811415611a38576004600083600190039350838152602001908152602001600020549050611a0d565b8092505050611a77565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611aff868684612009565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611b49612012565b73ffffffffffffffffffffffffffffffffffffffff16611b67611043565b73ffffffffffffffffffffffffffffffffffffffff1614611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612b40565b60405180910390fd5b565b6000611bc96119a5565b60005403905090565b611bec82826040518060200160405280600081525061201a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cdc61199d565b8786866040518563ffffffff1660e01b8152600401611cfe94939291906129f7565b602060405180830381600087803b158015611d1857600080fd5b505af1925050508015611d4957506040513d601f19601f82011682018060405250810190611d4691906126a4565b60015b611dc3573d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b50600081511415611dbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611e2590612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5190612e5b565b8015611e9e5780601f10611e7357610100808354040283529160200191611e9e565b820191906000526020600020905b815481529060010190602001808311611e8157829003601f168201915b5050505050905090565b60606000821415611ef0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612004565b600082905060005b60008214611f22578080611f0b90612ebe565b915050600a82611f1b9190612ce6565b9150611ef8565b60008167ffffffffffffffff811115611f3e57611f3d612ff4565b5b6040519080825280601f01601f191660200182016040528015611f705781602001600182028036833780820191505090505b5090505b60008514611ffd57600182611f899190612d71565b9150600a85611f989190612f07565b6030611fa49190612c90565b60f81b818381518110611fba57611fb9612fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff69190612ce6565b9450611f74565b8093505050505b919050565b60009392505050565b600033905090565b61202483836120b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120b257600080549050600083820390505b6120646000868380600101945086611cb6565b61209a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120515781600054146120af57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561215f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61216c6000848385611ae2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121e3836121d46000866000611ae8565b6121dd8561228b565b17611b10565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612207578060008190555050506122866000848385611b3b565b505050565b60006001821460e11b9050919050565b8280546122a790612e5b565b90600052602060002090601f0160209004810192826122c95760008555612310565b82601f106122e257805160ff1916838001178555612310565b82800160010185558215612310579182015b8281111561230f5782518255916020019190600101906122f4565b5b50905061231d9190612321565b5090565b5b8082111561233a576000816000905550600101612322565b5090565b600061235161234c84612be0565b612bbb565b90508281526020810184848401111561236d5761236c613028565b5b612378848285612e19565b509392505050565b600061239361238e84612c11565b612bbb565b9050828152602081018484840111156123af576123ae613028565b5b6123ba848285612e19565b509392505050565b6000813590506123d18161327d565b92915050565b6000813590506123e681613294565b92915050565b6000813590506123fb816132ab565b92915050565b600081519050612410816132ab565b92915050565b600082601f83011261242b5761242a613023565b5b813561243b84826020860161233e565b91505092915050565b600082601f83011261245957612458613023565b5b8135612469848260208601612380565b91505092915050565b600081359050612481816132c2565b92915050565b60006020828403121561249d5761249c613032565b5b60006124ab848285016123c2565b91505092915050565b600080604083850312156124cb576124ca613032565b5b60006124d9858286016123c2565b92505060206124ea858286016123c2565b9150509250929050565b60008060006060848603121561250d5761250c613032565b5b600061251b868287016123c2565b935050602061252c868287016123c2565b925050604061253d86828701612472565b9150509250925092565b6000806000806080858703121561256157612560613032565b5b600061256f878288016123c2565b9450506020612580878288016123c2565b935050604061259187828801612472565b925050606085013567ffffffffffffffff8111156125b2576125b161302d565b5b6125be87828801612416565b91505092959194509250565b600080604083850312156125e1576125e0613032565b5b60006125ef858286016123c2565b9250506020612600858286016123d7565b9150509250929050565b6000806040838503121561262157612620613032565b5b600061262f858286016123c2565b925050602061264085828601612472565b9150509250929050565b6000602082840312156126605761265f613032565b5b600061266e848285016123d7565b91505092915050565b60006020828403121561268d5761268c613032565b5b600061269b848285016123ec565b91505092915050565b6000602082840312156126ba576126b9613032565b5b60006126c884828501612401565b91505092915050565b6000602082840312156126e7576126e6613032565b5b600082013567ffffffffffffffff8111156127055761270461302d565b5b61271184828501612444565b91505092915050565b6000602082840312156127305761272f613032565b5b600061273e84828501612472565b91505092915050565b61275081612da5565b82525050565b61275f81612db7565b82525050565b600061277082612c42565b61277a8185612c58565b935061278a818560208601612e28565b61279381613037565b840191505092915050565b60006127a982612c4d565b6127b38185612c74565b93506127c3818560208601612e28565b6127cc81613037565b840191505092915050565b60006127e282612c4d565b6127ec8185612c85565b93506127fc818560208601612e28565b80840191505092915050565b6000612815601583612c74565b915061282082613048565b602082019050919050565b6000612838602683612c74565b915061284382613071565b604082019050919050565b600061285b602183612c74565b9150612866826130c0565b604082019050919050565b600061287e600d83612c74565b91506128898261310f565b602082019050919050565b60006128a1601283612c74565b91506128ac82613138565b602082019050919050565b60006128c4602283612c74565b91506128cf82613161565b604082019050919050565b60006128e7600583612c85565b91506128f2826131b0565b600582019050919050565b600061290a602083612c74565b9150612915826131d9565b602082019050919050565b600061292d602f83612c74565b915061293882613202565b604082019050919050565b6000612950600083612c69565b915061295b82613251565b600082019050919050565b6000612973601683612c74565b915061297e82613254565b602082019050919050565b61299281612e0f565b82525050565b60006129a482856127d7565b91506129b082846127d7565b91506129bb826128da565b91508190509392505050565b60006129d282612943565b9150819050919050565b60006020820190506129f16000830184612747565b92915050565b6000608082019050612a0c6000830187612747565b612a196020830186612747565b612a266040830185612989565b8181036060830152612a388184612765565b905095945050505050565b6000602082019050612a586000830184612756565b92915050565b60006020820190508181036000830152612a78818461279e565b905092915050565b60006020820190508181036000830152612a9981612808565b9050919050565b60006020820190508181036000830152612ab98161282b565b9050919050565b60006020820190508181036000830152612ad98161284e565b9050919050565b60006020820190508181036000830152612af981612871565b9050919050565b60006020820190508181036000830152612b1981612894565b9050919050565b60006020820190508181036000830152612b39816128b7565b9050919050565b60006020820190508181036000830152612b59816128fd565b9050919050565b60006020820190508181036000830152612b7981612920565b9050919050565b60006020820190508181036000830152612b9981612966565b9050919050565b6000602082019050612bb56000830184612989565b92915050565b6000612bc5612bd6565b9050612bd18282612e8d565b919050565b6000604051905090565b600067ffffffffffffffff821115612bfb57612bfa612ff4565b5b612c0482613037565b9050602081019050919050565b600067ffffffffffffffff821115612c2c57612c2b612ff4565b5b612c3582613037565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c9b82612e0f565b9150612ca683612e0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cdb57612cda612f38565b5b828201905092915050565b6000612cf182612e0f565b9150612cfc83612e0f565b925082612d0c57612d0b612f67565b5b828204905092915050565b6000612d2282612e0f565b9150612d2d83612e0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6657612d65612f38565b5b828202905092915050565b6000612d7c82612e0f565b9150612d8783612e0f565b925082821015612d9a57612d99612f38565b5b828203905092915050565b6000612db082612def565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e46578082015181840152602081019050612e2b565b83811115612e55576000848401525b50505050565b60006002820490506001821680612e7357607f821691505b60208210811415612e8757612e86612f96565b5b50919050565b612e9682613037565b810181811067ffffffffffffffff82111715612eb557612eb4612ff4565b5b80604052505050565b6000612ec982612e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612efc57612efb612f38565b5b600182019050919050565b6000612f1282612e0f565b9150612f1d83612e0f565b925082612f2d57612f2c612f67565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d657461646174612069732066696e616c697a65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61328681612da5565b811461329157600080fd5b50565b61329d81612db7565b81146132a857600080fd5b50565b6132b481612dc3565b81146132bf57600080fd5b50565b6132cb81612e0f565b81146132d657600080fd5b5056fea2646970667358221220b7c6377e929eefd0f41da757c7062cdcf295d1f116587b0bf9ce0cb2ec6940dc64736f6c63430008070033697066733a2f2f516d626d6d50734b61456a797a4d75486267526250663162364c3369566779656e626463524c6b476f78687a4d512f
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d485146106b8578063e985e9c5146106e3578063f2fde38b14610720578063f4a560a514610749578063fddcb5ea14610760576101ee565b8063c87b56dd146105fa578063d5abeb0114610637578063d821048214610662578063e193e7e21461068d576101ee565b8063b187bd26116100dc578063b187bd2614610552578063b88d4fde1461057d578063bedb86fb146105a6578063c002d23d146105cf576101ee565b80638da5cb5b146104b757806395d89b41146104e2578063a0712d681461050d578063a22cb46514610529576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e146103fd5780636f8b44b01461043a57806370a0823114610463578063715018a6146104a0576101ee565b80633ccfd60b1461036b57806342842e0e146103825780634c261247146103ab578063627804af146103d4576101ee565b80630de76de4116101c15780630de76de4146102c15780630f2cdd6c146102ec57806318160ddd1461031757806323b872dd14610342576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612677565b61079d565b6040516102279190612a43565b60405180910390f35b34801561023c57600080fd5b5061024561082f565b6040516102529190612a5e565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061271a565b6108c1565b60405161028f91906129dc565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061260a565b61093d565b005b3480156102cd57600080fd5b506102d6610a7e565b6040516102e39190612a43565b60405180910390f35b3480156102f857600080fd5b50610301610a91565b60405161030e9190612ba0565b60405180910390f35b34801561032357600080fd5b5061032c610a96565b6040516103399190612ba0565b60405180910390f35b34801561034e57600080fd5b50610369600480360381019061036491906124f4565b610aad565b005b34801561037757600080fd5b50610380610dd2565b005b34801561038e57600080fd5b506103a960048036038101906103a491906124f4565b610e53565b005b3480156103b757600080fd5b506103d260048036038101906103cd91906126d1565b610e73565b005b3480156103e057600080fd5b506103fb60048036038101906103f6919061260a565b610ee5565b005b34801561040957600080fd5b50610424600480360381019061041f919061271a565b610f52565b60405161043191906129dc565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061271a565b610f64565b005b34801561046f57600080fd5b5061048a60048036038101906104859190612487565b610f76565b6040516104979190612ba0565b60405180910390f35b3480156104ac57600080fd5b506104b561102f565b005b3480156104c357600080fd5b506104cc611043565b6040516104d991906129dc565b60405180910390f35b3480156104ee57600080fd5b506104f761106d565b6040516105049190612a5e565b60405180910390f35b6105276004803603810190610522919061271a565b6110ff565b005b34801561053557600080fd5b50610550600480360381019061054b91906125ca565b6113b7565b005b34801561055e57600080fd5b5061056761152f565b6040516105749190612a43565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612547565b611542565b005b3480156105b257600080fd5b506105cd60048036038101906105c8919061264a565b6115b5565b005b3480156105db57600080fd5b506105e46115da565b6040516105f19190612ba0565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c919061271a565b6115e5565b60405161062e9190612a5e565b60405180910390f35b34801561064357600080fd5b5061064c611708565b6040516106599190612ba0565b60405180910390f35b34801561066e57600080fd5b5061067761170e565b6040516106849190612a5e565b60405180910390f35b34801561069957600080fd5b506106a261179c565b6040516106af9190612ba0565b60405180910390f35b3480156106c457600080fd5b506106cd6117a1565b6040516106da9190612a5e565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906124b4565b6117b8565b6040516107179190612a43565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190612487565b61184c565b005b34801561075557600080fd5b5061075e6118d0565b005b34801561076c57600080fd5b5061078760048036038101906107829190612487565b6118f5565b6040516107949190612ba0565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108285750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461083e90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461086a90612e5b565b80156108b75780601f1061088c576101008083540402835291602001916108b7565b820191906000526020600020905b81548152906001019060200180831161089a57829003601f168201915b5050505050905090565b60006108cc8261193e565b610902576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094882610f52565b90508073ffffffffffffffffffffffffffffffffffffffff1661096961199d565b73ffffffffffffffffffffffffffffffffffffffff16146109cc576109958161099061199d565b6117b8565b6109cb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a60019054906101000a900460ff1681565b606481565b6000610aa06119a5565b6001546000540303905090565b6000610ab8826119ae565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b2b84611a7c565b91509150610b418187610b3c61199d565b611a9e565b610b8d57610b5686610b5161199d565b6117b8565b610b8c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bf4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c018686866001611ae2565b8015610c0c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cda85610cb6888887611ae8565b7c020000000000000000000000000000000000000000000000000000000017611b10565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d62576000600185019050600060046000838152602001908152602001600020541415610d60576000548114610d5f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dca8686866001611b3b565b505050505050565b610dda611b41565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e00906129c7565b60006040518083038185875af1925050503d8060008114610e3d576040519150601f19603f3d011682016040523d82523d6000602084013e610e42565b606091505b5050905080610e5057600080fd5b50565b610e6e83838360405180602001604052806000815250611542565b505050565b610e7b611b41565b600a60019054906101000a900460ff1615610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290612a80565b60405180910390fd5b80600b9080519060200190610ee192919061229b565b5050565b610eed611b41565b60095481610ef9611bbf565b610f039190612c90565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90612b00565b60405180910390fd5b610f4e8282611bd2565b5050565b6000610f5d826119ae565b9050919050565b610f6c611b41565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611037611b41565b6110416000611bf0565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461107c90612e5b565b80601f01602080910402602001604051908101604052809291908181526020018280546110a890612e5b565b80156110f55780601f106110ca576101008083540402835291602001916110f5565b820191906000526020600020905b8154815290600101906020018083116110d857829003601f168201915b5050505050905090565b600a60009054906101000a900460ff161561114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612ae0565b60405180910390fd5b600a811115611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90612ac0565b60405180910390fd5b6009548161119f611bbf565b6111a99190612c90565b11156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e190612b00565b60405180910390fd5b606481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112379190612c90565b1115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612b80565b60405180910390fd5b60008190506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028110156112fd5760008160026112d99190612d71565b9050808411156112f65780846112ef9190612d71565b92506112fb565b600092505b505b6618de76816d8000826113109190612d17565b341015611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990612b20565b60405180910390fd5b82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a19190612c90565b925050819055506113b23384611bd2565b505050565b6113bf61199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611424576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061143161199d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114de61199d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115239190612a43565b60405180910390a35050565b600a60009054906101000a900460ff1681565b61154d848484610aad565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115af5761157884848484611cb6565b6115ae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6115bd611b41565b80600a60006101000a81548160ff02191690831515021790555050565b6618de76816d800081565b60606115f08261193e565b61162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690612b60565b60405180910390fd5b6000611639611e16565b51116116cf57600c805461164c90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461167890612e5b565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050505050611701565b6116d7611e16565b6116e083611ea8565b6040516020016116f1929190612998565b6040516020818303038152906040525b9050919050565b60095481565b600c805461171b90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461174790612e5b565b80156117945780601f1061176957610100808354040283529160200191611794565b820191906000526020600020905b81548152906001019060200180831161177757829003601f168201915b505050505081565b600a81565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611854611b41565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90612aa0565b60405180910390fd5b6118cd81611bf0565b50565b6118d8611b41565b6001600a60016101000a81548160ff021916908315150217905550565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816119496119a5565b11158015611958575060005482105b8015611996575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119bd6119a5565b11611a4557600054811015611a445760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a42575b6000811415611a38576004600083600190039350838152602001908152602001600020549050611a0d565b8092505050611a77565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611aff868684612009565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611b49612012565b73ffffffffffffffffffffffffffffffffffffffff16611b67611043565b73ffffffffffffffffffffffffffffffffffffffff1614611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612b40565b60405180910390fd5b565b6000611bc96119a5565b60005403905090565b611bec82826040518060200160405280600081525061201a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cdc61199d565b8786866040518563ffffffff1660e01b8152600401611cfe94939291906129f7565b602060405180830381600087803b158015611d1857600080fd5b505af1925050508015611d4957506040513d601f19601f82011682018060405250810190611d4691906126a4565b60015b611dc3573d8060008114611d79576040519150601f19603f3d011682016040523d82523d6000602084013e611d7e565b606091505b50600081511415611dbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611e2590612e5b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5190612e5b565b8015611e9e5780601f10611e7357610100808354040283529160200191611e9e565b820191906000526020600020905b815481529060010190602001808311611e8157829003601f168201915b5050505050905090565b60606000821415611ef0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612004565b600082905060005b60008214611f22578080611f0b90612ebe565b915050600a82611f1b9190612ce6565b9150611ef8565b60008167ffffffffffffffff811115611f3e57611f3d612ff4565b5b6040519080825280601f01601f191660200182016040528015611f705781602001600182028036833780820191505090505b5090505b60008514611ffd57600182611f899190612d71565b9150600a85611f989190612f07565b6030611fa49190612c90565b60f81b818381518110611fba57611fb9612fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff69190612ce6565b9450611f74565b8093505050505b919050565b60009392505050565b600033905090565b61202483836120b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120b257600080549050600083820390505b6120646000868380600101945086611cb6565b61209a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120515781600054146120af57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561215f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61216c6000848385611ae2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121e3836121d46000866000611ae8565b6121dd8561228b565b17611b10565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612207578060008190555050506122866000848385611b3b565b505050565b60006001821460e11b9050919050565b8280546122a790612e5b565b90600052602060002090601f0160209004810192826122c95760008555612310565b82601f106122e257805160ff1916838001178555612310565b82800160010185558215612310579182015b8281111561230f5782518255916020019190600101906122f4565b5b50905061231d9190612321565b5090565b5b8082111561233a576000816000905550600101612322565b5090565b600061235161234c84612be0565b612bbb565b90508281526020810184848401111561236d5761236c613028565b5b612378848285612e19565b509392505050565b600061239361238e84612c11565b612bbb565b9050828152602081018484840111156123af576123ae613028565b5b6123ba848285612e19565b509392505050565b6000813590506123d18161327d565b92915050565b6000813590506123e681613294565b92915050565b6000813590506123fb816132ab565b92915050565b600081519050612410816132ab565b92915050565b600082601f83011261242b5761242a613023565b5b813561243b84826020860161233e565b91505092915050565b600082601f83011261245957612458613023565b5b8135612469848260208601612380565b91505092915050565b600081359050612481816132c2565b92915050565b60006020828403121561249d5761249c613032565b5b60006124ab848285016123c2565b91505092915050565b600080604083850312156124cb576124ca613032565b5b60006124d9858286016123c2565b92505060206124ea858286016123c2565b9150509250929050565b60008060006060848603121561250d5761250c613032565b5b600061251b868287016123c2565b935050602061252c868287016123c2565b925050604061253d86828701612472565b9150509250925092565b6000806000806080858703121561256157612560613032565b5b600061256f878288016123c2565b9450506020612580878288016123c2565b935050604061259187828801612472565b925050606085013567ffffffffffffffff8111156125b2576125b161302d565b5b6125be87828801612416565b91505092959194509250565b600080604083850312156125e1576125e0613032565b5b60006125ef858286016123c2565b9250506020612600858286016123d7565b9150509250929050565b6000806040838503121561262157612620613032565b5b600061262f858286016123c2565b925050602061264085828601612472565b9150509250929050565b6000602082840312156126605761265f613032565b5b600061266e848285016123d7565b91505092915050565b60006020828403121561268d5761268c613032565b5b600061269b848285016123ec565b91505092915050565b6000602082840312156126ba576126b9613032565b5b60006126c884828501612401565b91505092915050565b6000602082840312156126e7576126e6613032565b5b600082013567ffffffffffffffff8111156127055761270461302d565b5b61271184828501612444565b91505092915050565b6000602082840312156127305761272f613032565b5b600061273e84828501612472565b91505092915050565b61275081612da5565b82525050565b61275f81612db7565b82525050565b600061277082612c42565b61277a8185612c58565b935061278a818560208601612e28565b61279381613037565b840191505092915050565b60006127a982612c4d565b6127b38185612c74565b93506127c3818560208601612e28565b6127cc81613037565b840191505092915050565b60006127e282612c4d565b6127ec8185612c85565b93506127fc818560208601612e28565b80840191505092915050565b6000612815601583612c74565b915061282082613048565b602082019050919050565b6000612838602683612c74565b915061284382613071565b604082019050919050565b600061285b602183612c74565b9150612866826130c0565b604082019050919050565b600061287e600d83612c74565b91506128898261310f565b602082019050919050565b60006128a1601283612c74565b91506128ac82613138565b602082019050919050565b60006128c4602283612c74565b91506128cf82613161565b604082019050919050565b60006128e7600583612c85565b91506128f2826131b0565b600582019050919050565b600061290a602083612c74565b9150612915826131d9565b602082019050919050565b600061292d602f83612c74565b915061293882613202565b604082019050919050565b6000612950600083612c69565b915061295b82613251565b600082019050919050565b6000612973601683612c74565b915061297e82613254565b602082019050919050565b61299281612e0f565b82525050565b60006129a482856127d7565b91506129b082846127d7565b91506129bb826128da565b91508190509392505050565b60006129d282612943565b9150819050919050565b60006020820190506129f16000830184612747565b92915050565b6000608082019050612a0c6000830187612747565b612a196020830186612747565b612a266040830185612989565b8181036060830152612a388184612765565b905095945050505050565b6000602082019050612a586000830184612756565b92915050565b60006020820190508181036000830152612a78818461279e565b905092915050565b60006020820190508181036000830152612a9981612808565b9050919050565b60006020820190508181036000830152612ab98161282b565b9050919050565b60006020820190508181036000830152612ad98161284e565b9050919050565b60006020820190508181036000830152612af981612871565b9050919050565b60006020820190508181036000830152612b1981612894565b9050919050565b60006020820190508181036000830152612b39816128b7565b9050919050565b60006020820190508181036000830152612b59816128fd565b9050919050565b60006020820190508181036000830152612b7981612920565b9050919050565b60006020820190508181036000830152612b9981612966565b9050919050565b6000602082019050612bb56000830184612989565b92915050565b6000612bc5612bd6565b9050612bd18282612e8d565b919050565b6000604051905090565b600067ffffffffffffffff821115612bfb57612bfa612ff4565b5b612c0482613037565b9050602081019050919050565b600067ffffffffffffffff821115612c2c57612c2b612ff4565b5b612c3582613037565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c9b82612e0f565b9150612ca683612e0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cdb57612cda612f38565b5b828201905092915050565b6000612cf182612e0f565b9150612cfc83612e0f565b925082612d0c57612d0b612f67565b5b828204905092915050565b6000612d2282612e0f565b9150612d2d83612e0f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6657612d65612f38565b5b828202905092915050565b6000612d7c82612e0f565b9150612d8783612e0f565b925082821015612d9a57612d99612f38565b5b828203905092915050565b6000612db082612def565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e46578082015181840152602081019050612e2b565b83811115612e55576000848401525b50505050565b60006002820490506001821680612e7357607f821691505b60208210811415612e8757612e86612f96565b5b50919050565b612e9682613037565b810181811067ffffffffffffffff82111715612eb557612eb4612ff4565b5b80604052505050565b6000612ec982612e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612efc57612efb612f38565b5b600182019050919050565b6000612f1282612e0f565b9150612f1d83612e0f565b925082612f2d57612f2c612f67565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d657461646174612069732066696e616c697a65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61328681612da5565b811461329157600080fd5b50565b61329d81612db7565b81146132a857600080fd5b50565b6132b481612dc3565b81146132bf57600080fd5b50565b6132cb81612e0f565b81146132d657600080fd5b5056fea2646970667358221220b7c6377e929eefd0f41da757c7062cdcf295d1f116587b0bf9ce0cb2ec6940dc64736f6c63430008070033
Deployed Bytecode Sourcemap
58454:3001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26228:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31875:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33821:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33369:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58742:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58628:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25282:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43086:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59743:177;;;;;;;;;;;;;:::i;:::-;;34711:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59395:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59925:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31664:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60104:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26907:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10819:103;;;;;;;;;;;;;:::i;:::-;;10171:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32044:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60549:901;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34097:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58708:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34967:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59663:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58530:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60203:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58673:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58862:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58579:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59216:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34476:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11077:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59302:88;;;;;;;;;;;;;:::i;:::-;;59542:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26228:615;26313:4;26628:10;26613:25;;:11;:25;;;;:102;;;;26705:10;26690:25;;:11;:25;;;;26613:102;:179;;;;26782:10;26767:25;;:11;:25;;;;26613:179;26593:199;;26228:615;;;:::o;31875:100::-;31929:13;31962:5;31955:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31875:100;:::o;33821:204::-;33889:7;33914:16;33922:7;33914;:16::i;:::-;33909:64;;33939:34;;;;;;;;;;;;;;33909:64;33993:15;:24;34009:7;33993:24;;;;;;;;;;;;;;;;;;;;;33986:31;;33821:204;;;:::o;33369:386::-;33442:13;33458:16;33466:7;33458;:16::i;:::-;33442:32;;33514:5;33491:28;;:19;:17;:19::i;:::-;:28;;;33487:175;;33539:44;33556:5;33563:19;:17;:19::i;:::-;33539:16;:44::i;:::-;33534:128;;33611:35;;;;;;;;;;;;;;33534:128;33487:175;33701:2;33674:15;:24;33690:7;33674:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33739:7;33735:2;33719:28;;33728:5;33719:28;;;;;;;;;;;;33431:324;33369:386;;:::o;58742:27::-;;;;;;;;;;;;;:::o;58628:41::-;58666:3;58628:41;:::o;25282:315::-;25335:7;25563:15;:13;:15::i;:::-;25548:12;;25532:13;;:28;:46;25525:53;;25282:315;:::o;43086:2800::-;43220:27;43250;43269:7;43250:18;:27::i;:::-;43220:57;;43335:4;43294:45;;43310:19;43294:45;;;43290:86;;43348:28;;;;;;;;;;;;;;43290:86;43390:27;43419:23;43446:28;43466:7;43446:19;:28::i;:::-;43389:85;;;;43574:62;43593:15;43610:4;43616:19;:17;:19::i;:::-;43574:18;:62::i;:::-;43569:174;;43656:43;43673:4;43679:19;:17;:19::i;:::-;43656:16;:43::i;:::-;43651:92;;43708:35;;;;;;;;;;;;;;43651:92;43569:174;43774:1;43760:16;;:2;:16;;;43756:52;;;43785:23;;;;;;;;;;;;;;43756:52;43821:43;43843:4;43849:2;43853:7;43862:1;43821:21;:43::i;:::-;43957:15;43954:160;;;44097:1;44076:19;44069:30;43954:160;44492:18;:24;44511:4;44492:24;;;;;;;;;;;;;;;;44490:26;;;;;;;;;;;;44561:18;:22;44580:2;44561:22;;;;;;;;;;;;;;;;44559:24;;;;;;;;;;;44883:145;44920:2;44968:45;44983:4;44989:2;44993:19;44968:14;:45::i;:::-;22510:8;44941:72;44883:18;:145::i;:::-;44854:17;:26;44872:7;44854:26;;;;;;;;;;;:174;;;;45198:1;22510:8;45148:19;:46;:51;45144:626;;;45220:19;45252:1;45242:7;:11;45220:33;;45409:1;45375:17;:30;45393:11;45375:30;;;;;;;;;;;;:35;45371:384;;;45513:13;;45498:11;:28;45494:242;;45693:19;45660:17;:30;45678:11;45660:30;;;;;;;;;;;:52;;;;45494:242;45371:384;45201:569;45144:626;45817:7;45813:2;45798:27;;45807:4;45798:27;;;;;;;;;;;;45836:42;45857:4;45863:2;45867:7;45876:1;45836:20;:42::i;:::-;43209:2677;;;43086:2800;;;:::o;59743:177::-;10057:13;:11;:13::i;:::-;59788:12:::1;59814:10;59806:24;;59852:21;59806:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59787:101;;;59907:7;59899:16;;;::::0;::::1;;59782:138;59743:177::o:0;34711:185::-;34849:39;34866:4;34872:2;34876:7;34849:39;;;;;;;;;;;;:16;:39::i;:::-;34711:185;;;:::o;59395:139::-;10057:13;:11;:13::i;:::-;59469:15:::1;;;;;;;;;;;59468:16;59460:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59526:3;59515:8;:14;;;;;;;;;;;;:::i;:::-;;59395:139:::0;:::o;59925:174::-;10057:13;:11;:13::i;:::-;60029:9:::1;;60020:5;60003:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;59990:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;60074:20;60084:2;60088:5;60074:9;:20::i;:::-;59925:174:::0;;:::o;31664:144::-;31728:7;31771:27;31790:7;31771:18;:27::i;:::-;31748:52;;31664:144;;;:::o;60104:94::-;10057:13;:11;:13::i;:::-;60181:12:::1;60169:9;:24;;;;60104:94:::0;:::o;26907:224::-;26971:7;27012:1;26995:19;;:5;:19;;;26991:60;;;27023:28;;;;;;;;;;;;;;26991:60;21462:13;27069:18;:25;27088:5;27069:25;;;;;;;;;;;;;;;;:54;27062:61;;26907:224;;;:::o;10819:103::-;10057:13;:11;:13::i;:::-;10884:30:::1;10911:1;10884:18;:30::i;:::-;10819:103::o:0;10171:87::-;10217:7;10244:6;;;;;;;;;;;10237:13;;10171:87;:::o;32044:104::-;32100:13;32133:7;32126:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32044:104;:::o;60549:901::-;60606:8;;;;;;;;;;;60605:9;60597:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;58619:2;60645:5;:25;;60637:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60746:9;;60737:5;60720:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;60712:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58666:3;60829:5;60796:18;:30;60815:10;60796:30;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:56;;60788:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;60891:16;60910:5;60891:24;;60926:16;60945:18;:30;60964:10;60945:30;;;;;;;;;;;;;;;;60926:49;;61003:1;60989:11;:15;60986:277;;;61021:23;61051:11;61047:1;:15;;;;:::i;:::-;61021:41;;61088:18;61080:5;:26;61077:175;;;61149:18;61141:5;:26;;;;:::i;:::-;61127:40;;61077:175;;;61235:1;61221:15;;61077:175;61006:257;60986:277;58564:11;61295;:24;;;;:::i;:::-;61282:9;:37;;61269:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;61407:5;61373:18;:30;61392:10;61373:30;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;61417:28;61427:10;61439:5;61417:9;:28::i;:::-;60592:858;;60549:901;:::o;34097:308::-;34208:19;:17;:19::i;:::-;34196:31;;:8;:31;;;34192:61;;;34236:17;;;;;;;;;;;;;;34192:61;34318:8;34266:18;:39;34285:19;:17;:19::i;:::-;34266:39;;;;;;;;;;;;;;;:49;34306:8;34266:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34378:8;34342:55;;34357:19;:17;:19::i;:::-;34342:55;;;34388:8;34342:55;;;;;;:::i;:::-;;;;;;;;34097:308;;:::o;58708:27::-;;;;;;;;;;;;;:::o;34967:399::-;35134:31;35147:4;35153:2;35157:7;35134:12;:31::i;:::-;35198:1;35180:2;:14;;;:19;35176:183;;35219:56;35250:4;35256:2;35260:7;35269:5;35219:30;:56::i;:::-;35214:145;;35303:40;;;;;;;;;;;;;;35214:145;35176:183;34967:399;;;;:::o;59663:75::-;10057:13;:11;:13::i;:::-;59728:5:::1;59717:8;;:16;;;;;;;;;;;;;;;;;;59663:75:::0;:::o;58530:45::-;58564:11;58530:45;:::o;60203:341::-;60277:13;60313:16;60321:7;60313;:16::i;:::-;60305:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;60428:1;60407:10;:8;:10::i;:::-;60401:24;:28;:138;;60527:12;60401:138;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60470:10;:8;:10::i;:::-;60482:18;:7;:16;:18::i;:::-;60453:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60401:138;60394:145;;60203:341;;;:::o;58673:29::-;;;;:::o;58862:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58579:42::-;58619:2;58579:42;:::o;59216:78::-;59260:13;59280:9;;;;;;;;;;;;;;59216:78;:::o;34476:164::-;34573:4;34597:18;:25;34616:5;34597:25;;;;;;;;;;;;;;;:35;34623:8;34597:35;;;;;;;;;;;;;;;;;;;;;;;;;34590:42;;34476:164;;;;:::o;11077:201::-;10057:13;:11;:13::i;:::-;11186:1:::1;11166:22;;:8;:22;;;;11158:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11242:28;11261:8;11242:18;:28::i;:::-;11077:201:::0;:::o;59302:88::-;10057:13;:11;:13::i;:::-;59378:4:::1;59360:15;;:22;;;;;;;;;;;;;;;;;;59302:88::o:0;59542:116::-;59601:4;59625:18;:25;59644:5;59625:25;;;;;;;;;;;;;;;;59618:32;;59542:116;;;:::o;35621:273::-;35678:4;35734:7;35715:15;:13;:15::i;:::-;:26;;:66;;;;;35768:13;;35758:7;:23;35715:66;:152;;;;;35866:1;22232:8;35819:17;:26;35837:7;35819:26;;;;;;;;;;;;:43;:48;35715:152;35695:172;;35621:273;;;:::o;54182:105::-;54242:7;54269:10;54262:17;;54182:105;:::o;59130:81::-;59187:4;59205:1;59198:8;;59130:81;:::o;28581:1129::-;28648:7;28668:12;28683:7;28668:22;;28751:4;28732:15;:13;:15::i;:::-;:23;28728:915;;28785:13;;28778:4;:20;28774:869;;;28823:14;28840:17;:23;28858:4;28840:23;;;;;;;;;;;;28823:40;;28956:1;22232:8;28929:6;:23;:28;28925:699;;;29448:113;29465:1;29455:6;:11;29448:113;;;29508:17;:25;29526:6;;;;;;;29508:25;;;;;;;;;;;;29499:34;;29448:113;;;29594:6;29587:13;;;;;;28925:699;28800:843;28774:869;28728:915;29671:31;;;;;;;;;;;;;;28581:1129;;;;:::o;41422:652::-;41517:27;41546:23;41587:53;41643:15;41587:71;;41829:7;41823:4;41816:21;41864:22;41858:4;41851:36;41940:4;41934;41924:21;41901:44;;42036:19;42030:26;42011:45;;41767:300;41422:652;;;:::o;42187:645::-;42329:11;42491:15;42485:4;42481:26;42473:34;;42650:15;42639:9;42635:31;42622:44;;42797:15;42786:9;42783:30;42776:4;42765:9;42762:19;42759:55;42749:65;;42187:645;;;;;:::o;53015:159::-;;;;;:::o;51327:309::-;51462:7;51482:16;22633:3;51508:19;:40;;51482:67;;22633:3;51575:31;51586:4;51592:2;51596:9;51575:10;:31::i;:::-;51567:40;;:61;;51560:68;;;51327:309;;;;;:::o;31155:447::-;31235:14;31403:15;31396:5;31392:27;31383:36;;31577:5;31563:11;31539:22;31535:40;31532:51;31525:5;31522:62;31512:72;;31155:447;;;;:::o;53833:158::-;;;;;:::o;10336:132::-;10411:12;:10;:12::i;:::-;10400:23;;:7;:5;:7::i;:::-;:23;;;10392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10336:132::o;25695:285::-;25742:7;25946:15;:13;:15::i;:::-;25930:13;;:31;25923:38;;25695:285;:::o;35978:104::-;36047:27;36057:2;36061:8;36047:27;;;;;;;;;;;;:9;:27::i;:::-;35978:104;;:::o;11438:191::-;11512:16;11531:6;;;;;;;;;;;11512:25;;11557:8;11548:6;;:17;;;;;;;;;;;;;;;;;;11612:8;11581:40;;11602:8;11581:40;;;;;;;;;;;;11501:128;11438:191;:::o;49837:716::-;50000:4;50046:2;50021:45;;;50067:19;:17;:19::i;:::-;50088:4;50094:7;50103:5;50021:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50017:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50321:1;50304:6;:13;:18;50300:235;;;50350:40;;;;;;;;;;;;;;50300:235;50493:6;50487:13;50478:6;50474:2;50470:15;50463:38;50017:529;50190:54;;;50180:64;;;:6;:64;;;;50173:71;;;49837:716;;;;;;:::o;59033:92::-;59085:13;59112:8;59105:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59033:92;:::o;56658:723::-;56714:13;56944:1;56935:5;:10;56931:53;;;56962:10;;;;;;;;;;;;;;;;;;;;;56931:53;56994:12;57009:5;56994:20;;57025:14;57050:78;57065:1;57057:4;:9;57050:78;;57083:8;;;;;:::i;:::-;;;;57114:2;57106:10;;;;;:::i;:::-;;;57050:78;;;57138:19;57170:6;57160:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57138:39;;57188:154;57204:1;57195:5;:10;57188:154;;57232:1;57222:11;;;;;:::i;:::-;;;57299:2;57291:5;:10;;;;:::i;:::-;57278:2;:24;;;;:::i;:::-;57265:39;;57248:6;57255;57248:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;57328:2;57319:11;;;;;:::i;:::-;;;57188:154;;;57366:6;57352:21;;;;;56658:723;;;;:::o;52212:147::-;52349:6;52212:147;;;;;:::o;8722:98::-;8775:7;8802:10;8795:17;;8722:98;:::o;36498:681::-;36621:19;36627:2;36631:8;36621:5;:19::i;:::-;36700:1;36682:2;:14;;;:19;36678:483;;36722:11;36736:13;;36722:27;;36768:13;36790:8;36784:3;:14;36768:30;;36817:233;36848:62;36887:1;36891:2;36895:7;;;;;;36904:5;36848:30;:62::i;:::-;36843:167;;36946:40;;;;;;;;;;;;;;36843:167;37045:3;37037:5;:11;36817:233;;37132:3;37115:13;;:20;37111:34;;37137:8;;;37111:34;36703:458;;36678:483;36498:681;;;:::o;37452:1529::-;37517:20;37540:13;;37517:36;;37582:1;37568:16;;:2;:16;;;37564:48;;;37593:19;;;;;;;;;;;;;;37564:48;37639:1;37627:8;:13;37623:44;;;37649:18;;;;;;;;;;;;;;37623:44;37680:61;37710:1;37714:2;37718:12;37732:8;37680:21;:61::i;:::-;38223:1;21599:2;38194:1;:25;;38193:31;38181:8;:44;38155:18;:22;38174:2;38155:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;38502:139;38539:2;38593:33;38616:1;38620:2;38624:1;38593:14;:33::i;:::-;38560:30;38581:8;38560:20;:30::i;:::-;:66;38502:18;:139::i;:::-;38468:17;:31;38486:12;38468:31;;;;;;;;;;;:173;;;;38658:15;38676:12;38658:30;;38703:11;38732:8;38717:12;:23;38703:37;;38755:101;38807:9;;;;;;38803:2;38782:35;;38799:1;38782:35;;;;;;;;;;;;38851:3;38841:7;:13;38755:101;;38888:3;38872:13;:19;;;;37929:974;;38913:60;38942:1;38946:2;38950:12;38964:8;38913:20;:60::i;:::-;37506:1475;37452:1529;;:::o;32985:322::-;33055:14;33286:1;33276:8;33273:15;33248:23;33244:45;33234:55;;32985:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:400::-;11237:3;11258:84;11340:1;11335:3;11258:84;:::i;:::-;11251:91;;11351:93;11440:3;11351:93;:::i;:::-;11469:1;11464:3;11460:11;11453:18;;11077:400;;;:::o;11483:366::-;11625:3;11646:67;11710:2;11705:3;11646:67;:::i;:::-;11639:74;;11722:93;11811:3;11722:93;:::i;:::-;11840:2;11835:3;11831:12;11824:19;;11483:366;;;:::o;11855:::-;11997:3;12018:67;12082:2;12077:3;12018:67;:::i;:::-;12011:74;;12094:93;12183:3;12094:93;:::i;:::-;12212:2;12207:3;12203:12;12196:19;;11855:366;;;:::o;12227:398::-;12386:3;12407:83;12488:1;12483:3;12407:83;:::i;:::-;12400:90;;12499:93;12588:3;12499:93;:::i;:::-;12617:1;12612:3;12608:11;12601:18;;12227:398;;;:::o;12631:366::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:118::-;13090:24;13108:5;13090:24;:::i;:::-;13085:3;13078:37;13003:118;;:::o;13127:701::-;13408:3;13430:95;13521:3;13512:6;13430:95;:::i;:::-;13423:102;;13542:95;13633:3;13624:6;13542:95;:::i;:::-;13535:102;;13654:148;13798:3;13654:148;:::i;:::-;13647:155;;13819:3;13812:10;;13127:701;;;;;:::o;13834:379::-;14018:3;14040:147;14183:3;14040:147;:::i;:::-;14033:154;;14204:3;14197:10;;13834:379;;;:::o;14219:222::-;14312:4;14350:2;14339:9;14335:18;14327:26;;14363:71;14431:1;14420:9;14416:17;14407:6;14363:71;:::i;:::-;14219:222;;;;:::o;14447:640::-;14642:4;14680:3;14669:9;14665:19;14657:27;;14694:71;14762:1;14751:9;14747:17;14738:6;14694:71;:::i;:::-;14775:72;14843:2;14832:9;14828:18;14819:6;14775:72;:::i;:::-;14857;14925:2;14914:9;14910:18;14901:6;14857:72;:::i;:::-;14976:9;14970:4;14966:20;14961:2;14950:9;14946:18;14939:48;15004:76;15075:4;15066:6;15004:76;:::i;:::-;14996:84;;14447:640;;;;;;;:::o;15093:210::-;15180:4;15218:2;15207:9;15203:18;15195:26;;15231:65;15293:1;15282:9;15278:17;15269:6;15231:65;:::i;:::-;15093:210;;;;:::o;15309:313::-;15422:4;15460:2;15449:9;15445:18;15437:26;;15509:9;15503:4;15499:20;15495:1;15484:9;15480:17;15473:47;15537:78;15610:4;15601:6;15537:78;:::i;:::-;15529:86;;15309:313;;;;:::o;15628:419::-;15794:4;15832:2;15821:9;15817:18;15809:26;;15881:9;15875:4;15871:20;15867:1;15856:9;15852:17;15845:47;15909:131;16035:4;15909:131;:::i;:::-;15901:139;;15628:419;;;:::o;16053:::-;16219:4;16257:2;16246:9;16242:18;16234:26;;16306:9;16300:4;16296:20;16292:1;16281:9;16277:17;16270:47;16334:131;16460:4;16334:131;:::i;:::-;16326:139;;16053:419;;;:::o;16478:::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16731:9;16725:4;16721:20;16717:1;16706:9;16702:17;16695:47;16759:131;16885:4;16759:131;:::i;:::-;16751:139;;16478:419;;;:::o;16903:::-;17069:4;17107:2;17096:9;17092:18;17084:26;;17156:9;17150:4;17146:20;17142:1;17131:9;17127:17;17120:47;17184:131;17310:4;17184:131;:::i;:::-;17176:139;;16903:419;;;:::o;17328:::-;17494:4;17532:2;17521:9;17517:18;17509:26;;17581:9;17575:4;17571:20;17567:1;17556:9;17552:17;17545:47;17609:131;17735:4;17609:131;:::i;:::-;17601:139;;17328:419;;;:::o;17753:::-;17919:4;17957:2;17946:9;17942:18;17934:26;;18006:9;18000:4;17996:20;17992:1;17981:9;17977:17;17970:47;18034:131;18160:4;18034:131;:::i;:::-;18026:139;;17753:419;;;:::o;18178:::-;18344:4;18382:2;18371:9;18367:18;18359:26;;18431:9;18425:4;18421:20;18417:1;18406:9;18402:17;18395:47;18459:131;18585:4;18459:131;:::i;:::-;18451:139;;18178:419;;;:::o;18603:::-;18769:4;18807:2;18796:9;18792:18;18784:26;;18856:9;18850:4;18846:20;18842:1;18831:9;18827:17;18820:47;18884:131;19010:4;18884:131;:::i;:::-;18876:139;;18603:419;;;:::o;19028:::-;19194:4;19232:2;19221:9;19217:18;19209:26;;19281:9;19275:4;19271:20;19267:1;19256:9;19252:17;19245:47;19309:131;19435:4;19309:131;:::i;:::-;19301:139;;19028:419;;;:::o;19453:222::-;19546:4;19584:2;19573:9;19569:18;19561:26;;19597:71;19665:1;19654:9;19650:17;19641:6;19597:71;:::i;:::-;19453:222;;;;:::o;19681:129::-;19715:6;19742:20;;:::i;:::-;19732:30;;19771:33;19799:4;19791:6;19771:33;:::i;:::-;19681:129;;;:::o;19816:75::-;19849:6;19882:2;19876:9;19866:19;;19816:75;:::o;19897:307::-;19958:4;20048:18;20040:6;20037:30;20034:56;;;20070:18;;:::i;:::-;20034:56;20108:29;20130:6;20108:29;:::i;:::-;20100:37;;20192:4;20186;20182:15;20174:23;;19897:307;;;:::o;20210:308::-;20272:4;20362:18;20354:6;20351:30;20348:56;;;20384:18;;:::i;:::-;20348:56;20422:29;20444:6;20422:29;:::i;:::-;20414:37;;20506:4;20500;20496:15;20488:23;;20210:308;;;:::o;20524:98::-;20575:6;20609:5;20603:12;20593:22;;20524:98;;;:::o;20628:99::-;20680:6;20714:5;20708:12;20698:22;;20628:99;;;:::o;20733:168::-;20816:11;20850:6;20845:3;20838:19;20890:4;20885:3;20881:14;20866:29;;20733:168;;;;:::o;20907:147::-;21008:11;21045:3;21030:18;;20907:147;;;;:::o;21060:169::-;21144:11;21178:6;21173:3;21166:19;21218:4;21213:3;21209:14;21194:29;;21060:169;;;;:::o;21235:148::-;21337:11;21374:3;21359:18;;21235:148;;;;:::o;21389:305::-;21429:3;21448:20;21466:1;21448:20;:::i;:::-;21443:25;;21482:20;21500:1;21482:20;:::i;:::-;21477:25;;21636:1;21568:66;21564:74;21561:1;21558:81;21555:107;;;21642:18;;:::i;:::-;21555:107;21686:1;21683;21679:9;21672:16;;21389:305;;;;:::o;21700:185::-;21740:1;21757:20;21775:1;21757:20;:::i;:::-;21752:25;;21791:20;21809:1;21791:20;:::i;:::-;21786:25;;21830:1;21820:35;;21835:18;;:::i;:::-;21820:35;21877:1;21874;21870:9;21865:14;;21700:185;;;;:::o;21891:348::-;21931:7;21954:20;21972:1;21954:20;:::i;:::-;21949:25;;21988:20;22006:1;21988:20;:::i;:::-;21983:25;;22176:1;22108:66;22104:74;22101:1;22098:81;22093:1;22086:9;22079:17;22075:105;22072:131;;;22183:18;;:::i;:::-;22072:131;22231:1;22228;22224:9;22213:20;;21891:348;;;;:::o;22245:191::-;22285:4;22305:20;22323:1;22305:20;:::i;:::-;22300:25;;22339:20;22357:1;22339:20;:::i;:::-;22334:25;;22378:1;22375;22372:8;22369:34;;;22383:18;;:::i;:::-;22369:34;22428:1;22425;22421:9;22413:17;;22245:191;;;;:::o;22442:96::-;22479:7;22508:24;22526:5;22508:24;:::i;:::-;22497:35;;22442:96;;;:::o;22544:90::-;22578:7;22621:5;22614:13;22607:21;22596:32;;22544:90;;;:::o;22640:149::-;22676:7;22716:66;22709:5;22705:78;22694:89;;22640:149;;;:::o;22795:126::-;22832:7;22872:42;22865:5;22861:54;22850:65;;22795:126;;;:::o;22927:77::-;22964:7;22993:5;22982:16;;22927:77;;;:::o;23010:154::-;23094:6;23089:3;23084;23071:30;23156:1;23147:6;23142:3;23138:16;23131:27;23010:154;;;:::o;23170:307::-;23238:1;23248:113;23262:6;23259:1;23256:13;23248:113;;;23347:1;23342:3;23338:11;23332:18;23328:1;23323:3;23319:11;23312:39;23284:2;23281:1;23277:10;23272:15;;23248:113;;;23379:6;23376:1;23373:13;23370:101;;;23459:1;23450:6;23445:3;23441:16;23434:27;23370:101;23219:258;23170:307;;;:::o;23483:320::-;23527:6;23564:1;23558:4;23554:12;23544:22;;23611:1;23605:4;23601:12;23632:18;23622:81;;23688:4;23680:6;23676:17;23666:27;;23622:81;23750:2;23742:6;23739:14;23719:18;23716:38;23713:84;;;23769:18;;:::i;:::-;23713:84;23534:269;23483:320;;;:::o;23809:281::-;23892:27;23914:4;23892:27;:::i;:::-;23884:6;23880:40;24022:6;24010:10;24007:22;23986:18;23974:10;23971:34;23968:62;23965:88;;;24033:18;;:::i;:::-;23965:88;24073:10;24069:2;24062:22;23852:238;23809:281;;:::o;24096:233::-;24135:3;24158:24;24176:5;24158:24;:::i;:::-;24149:33;;24204:66;24197:5;24194:77;24191:103;;;24274:18;;:::i;:::-;24191:103;24321:1;24314:5;24310:13;24303:20;;24096:233;;;:::o;24335:176::-;24367:1;24384:20;24402:1;24384:20;:::i;:::-;24379:25;;24418:20;24436:1;24418:20;:::i;:::-;24413:25;;24457:1;24447:35;;24462:18;;:::i;:::-;24447:35;24503:1;24500;24496:9;24491:14;;24335:176;;;;:::o;24517:180::-;24565:77;24562:1;24555:88;24662:4;24659:1;24652:15;24686:4;24683:1;24676:15;24703:180;24751:77;24748:1;24741:88;24848:4;24845:1;24838:15;24872:4;24869:1;24862:15;24889:180;24937:77;24934:1;24927:88;25034:4;25031:1;25024:15;25058:4;25055:1;25048:15;25075:180;25123:77;25120:1;25113:88;25220:4;25217:1;25210:15;25244:4;25241:1;25234:15;25261:180;25309:77;25306:1;25299:88;25406:4;25403:1;25396:15;25430:4;25427:1;25420:15;25447:117;25556:1;25553;25546:12;25570:117;25679:1;25676;25669:12;25693:117;25802:1;25799;25792:12;25816:117;25925:1;25922;25915:12;25939:102;25980:6;26031:2;26027:7;26022:2;26015:5;26011:14;26007:28;25997:38;;25939:102;;;:::o;26047:171::-;26187:23;26183:1;26175:6;26171:14;26164:47;26047:171;:::o;26224:225::-;26364:34;26360:1;26352:6;26348:14;26341:58;26433:8;26428:2;26420:6;26416:15;26409:33;26224:225;:::o;26455:220::-;26595:34;26591:1;26583:6;26579:14;26572:58;26664:3;26659:2;26651:6;26647:15;26640:28;26455:220;:::o;26681:163::-;26821:15;26817:1;26809:6;26805:14;26798:39;26681:163;:::o;26850:168::-;26990:20;26986:1;26978:6;26974:14;26967:44;26850:168;:::o;27024:221::-;27164:34;27160:1;27152:6;27148:14;27141:58;27233:4;27228:2;27220:6;27216:15;27209:29;27024:221;:::o;27251:155::-;27391:7;27387:1;27379:6;27375:14;27368:31;27251:155;:::o;27412:182::-;27552:34;27548:1;27540:6;27536:14;27529:58;27412:182;:::o;27600:234::-;27740:34;27736:1;27728:6;27724:14;27717:58;27809:17;27804:2;27796:6;27792:15;27785:42;27600:234;:::o;27840:114::-;;:::o;27960:172::-;28100:24;28096:1;28088:6;28084:14;28077:48;27960:172;:::o;28138:122::-;28211:24;28229:5;28211:24;:::i;:::-;28204:5;28201:35;28191:63;;28250:1;28247;28240:12;28191:63;28138:122;:::o;28266:116::-;28336:21;28351:5;28336:21;:::i;:::-;28329:5;28326:32;28316:60;;28372:1;28369;28362:12;28316:60;28266:116;:::o;28388:120::-;28460:23;28477:5;28460:23;:::i;:::-;28453:5;28450:34;28440:62;;28498:1;28495;28488:12;28440:62;28388:120;:::o;28514:122::-;28587:24;28605:5;28587:24;:::i;:::-;28580:5;28577:35;28567:63;;28626:1;28623;28616:12;28567:63;28514:122;:::o
Swarm Source
ipfs://b7c6377e929eefd0f41da757c7062cdcf295d1f116587b0bf9ce0cb2ec6940dc
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.