Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,469 DRK
Holders
1,081
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DRKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
InTheDark
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-15 */ // File: openzeppelin-solidity/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: openzeppelin-solidity/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-solidity/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); 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; } /** * @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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.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 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` 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 auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. 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; } /** * 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 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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); 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-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // 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)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // 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 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/Ninjacks.sol pragma solidity ^0.8.4; contract InTheDark is ERC721A, Ownable { // --- vars // minting vars uint256 MAX_MINTS = 1; // wallet can only mint once uint256 MAX_SUPPLY = 5000; // max of 5000 tokens to mint uint256 triggerNumber = 1000; // after this many tokens minter, max_mints and price of mint will change bool triggerHasFired = false; uint256 public mintRate = 0 ether; // free mint for now // uri vars string private baseURI = "ipfs://QmSyXNwEq33iAc591H6XQyoeHTTqX8cQxXAbE52m3ZV2Wg/"; string private hiddenURI = "ipfs://QmQQzCXqnGRik6RwLMXQBRnK4Jnuh7yM8pGCHPJbrRSsb4/"; bool isRevealed = false; constructor() ERC721A("InTheDark", "DRK") {} // --- nft functions // for public to call for mints function mint(uint256 quantity) external payable { // _safeMint's second argument now takes in a quantity, not a tokenId. require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "Exceeded the limit"); require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left"); require(msg.value >= (mintRate * quantity), "Not enough ether sent"); _safeMint(msg.sender, quantity); ChangePriceAndMaxMints(); } // return base URI function _baseURI() internal view override returns (string memory) { return baseURI; } // handle which uri to associate with the token function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { // check if token exists require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); // return correct uri if(isRevealed){ string memory stringID = Strings.toString(tokenId); string memory fullURI = string(abi.encodePacked(baseURI, stringID)); return fullURI; } else{ return hiddenURI; } } // --- owner controls // for owner to bring in tha bank!! function withdraw() external payable onlyOwner { payable(msg.sender).transfer(address(this).balance); } // reveal nfts or not function reveal(bool toReveal) public onlyOwner{ isRevealed = toReveal; } // for dev to mint for free function devMint(uint num) public onlyOwner { require(totalSupply() + num <= MAX_SUPPLY, "Not enough tokens left"); _safeMint(msg.sender, num); ChangePriceAndMaxMints(); } // set price function setPrice(uint256 newPrice) external onlyOwner { mintRate = newPrice; } // set maxMints function setMaxMints(uint256 newMax) external onlyOwner { MAX_MINTS = newMax; } // --- on 1000 mints function ChangePriceAndMaxMints() internal { if(totalSupply() >= triggerNumber && !triggerHasFired){ // save trigger fire triggerHasFired = true; // change mint price mintRate = 0.005 ether; // change max mint MAX_MINTS = 10; } } // --- for front end function getMaxMints() public view returns (uint256){ return MAX_MINTS; } function getPrice() public view returns (uint256){ return mintRate; } function mintsLeft() public view returns (int) { int max = int(MAX_MINTS); int owned = int(balanceOf(msg.sender)); return max-owned; } function supplyHasFinished() public view returns (bool){ if(totalSupply() >= MAX_SUPPLY){ return true; } else{ return false; } } // --- testing purposes function setTriggerNumber(uint256 newNum) public onlyOwner{ triggerNumber = newNum; } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"devMint","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":[],"name":"getMaxMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintsLeft","outputs":[{"internalType":"int256","name":"","type":"int256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toReveal","type":"bool"}],"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":"newMax","type":"uint256"}],"name":"setMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setTriggerNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyHasFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526001600955611388600a556103e8600b556000600c60006101000a81548160ff0219169083151502179055506000600d556040518060600160405280603681526020016200341560369139600e90805190602001906200006692919062000271565b506040518060600160405280603681526020016200344b60369139600f90805190602001906200009892919062000271565b506000601060006101000a81548160ff021916908315150217905550348015620000c157600080fd5b506040518060400160405280600981526020017f496e5468654461726b00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f44524b000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200014692919062000271565b5080600390805190602001906200015f92919062000271565b50620001706200019e60201b60201c565b6000819055505050620001986200018c620001a360201b60201c565b620001ab60201b60201c565b62000386565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027f9062000321565b90600052602060002090601f016020900481019282620002a35760008555620002ef565b82601f10620002be57805160ff1916838001178555620002ef565b82800160010185558215620002ef579182015b82811115620002ee578251825591602001919060010190620002d1565b5b509050620002fe919062000302565b5090565b5b808211156200031d57600081600090555060010162000303565b5090565b600060028204905060018216806200033a57607f821691505b6020821081141562000351576200035062000357565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61307f80620003966000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f75780639d5561e111610095578063c87b56dd11610064578063c87b56dd146105ea578063ca0dcf1614610627578063e985e9c514610652578063f2fde38b1461068f576101c2565b80639d5561e114610551578063a0712d681461057c578063a22cb46514610598578063b88d4fde146105c1576101c2565b806391b7f5ed116100d157806391b7f5ed146104a9578063940cd05b146104d257806395d89b41146104fb57806398d5fdca14610526576101c2565b8063715018a61461043e57806379c9cb7b146104555780638da5cb5b1461047e576101c2565b806331b8e45a1161016457806342842e0e1161013e57806342842e0e146103705780635bdf01c8146103995780636352211e146103c457806370a0823114610401576101c2565b806331b8e45a14610314578063375a069a1461033d5780633ccfd60b14610366576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806312853cfc1461029557806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612532565b6106b8565b6040516101fb9190612874565b60405180910390f35b34801561021057600080fd5b5061021961074a565b60405161022691906128aa565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061258c565b6107dc565b604051610263919061280d565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906124c5565b610858565b005b3480156102a157600080fd5b506102aa6109ff565b6040516102b79190612874565b60405180910390f35b3480156102cc57600080fd5b506102d5610a22565b6040516102e2919061298c565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d91906123af565b610a39565b005b34801561032057600080fd5b5061033b6004803603810190610336919061258c565b610a49565b005b34801561034957600080fd5b50610364600480360381019061035f919061258c565b610acf565b005b61036e610bb7565b005b34801561037c57600080fd5b50610397600480360381019061039291906123af565b610c7c565b005b3480156103a557600080fd5b506103ae610c9c565b6040516103bb919061298c565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e6919061258c565b610ca6565b6040516103f8919061280d565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612342565b610cb8565b604051610435919061298c565b60405180910390f35b34801561044a57600080fd5b50610453610d71565b005b34801561046157600080fd5b5061047c6004803603810190610477919061258c565b610df9565b005b34801561048a57600080fd5b50610493610e7f565b6040516104a0919061280d565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb919061258c565b610ea9565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612505565b610f2f565b005b34801561050757600080fd5b50610510610fc8565b60405161051d91906128aa565b60405180910390f35b34801561053257600080fd5b5061053b61105a565b604051610548919061298c565b60405180910390f35b34801561055d57600080fd5b50610566611064565b604051610573919061288f565b60405180910390f35b6105966004803603810190610591919061258c565b61108c565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190612485565b6111a0565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612402565b611318565b005b3480156105f657600080fd5b50610611600480360381019061060c919061258c565b61138b565b60405161061e91906128aa565b60405180910390f35b34801561063357600080fd5b5061063c6114bb565b604051610649919061298c565b60405180910390f35b34801561065e57600080fd5b506106796004803603810190610674919061236f565b6114c1565b6040516106869190612874565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190612342565b611555565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107435750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461075990612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461078590612cbe565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905090565b60006107e78261164d565b61081d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610863826116ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea61177a565b73ffffffffffffffffffffffffffffffffffffffff161461094d576109168161091161177a565b6114c1565b61094c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600a54610a0c610a22565b10610a1a5760019050610a1f565b600090505b90565b6000610a2c611782565b6001546000540303905090565b610a44838383611787565b505050565b610a51611b31565b73ffffffffffffffffffffffffffffffffffffffff16610a6f610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc9061292c565b60405180910390fd5b80600b8190555050565b610ad7611b31565b73ffffffffffffffffffffffffffffffffffffffff16610af5610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b429061292c565b60405180910390fd5b600a5481610b57610a22565b610b619190612a55565b1115610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061290c565b60405180910390fd5b610bac3382611b39565b610bb4611b57565b50565b610bbf611b31565b73ffffffffffffffffffffffffffffffffffffffff16610bdd610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a9061292c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c79573d6000803e3d6000fd5b50565b610c9783838360405180602001604052806000815250611318565b505050565b6000600954905090565b6000610cb1826116ac565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d79611b31565b73ffffffffffffffffffffffffffffffffffffffff16610d97610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de49061292c565b60405180910390fd5b610df76000611bb6565b565b610e01611b31565b73ffffffffffffffffffffffffffffffffffffffff16610e1f610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c9061292c565b60405180910390fd5b8060098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb1611b31565b73ffffffffffffffffffffffffffffffffffffffff16610ecf610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c9061292c565b60405180910390fd5b80600d8190555050565b610f37611b31565b73ffffffffffffffffffffffffffffffffffffffff16610f55610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa29061292c565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060038054610fd790612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461100390612cbe565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b5050505050905090565b6000600d54905090565b6000806009549050600061107733610cb8565b905080826110859190612b36565b9250505090565b60095461109833611c7c565b826110a39190612a55565b11156110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db906128ec565b60405180910390fd5b600a54816110f0610a22565b6110fa9190612a55565b111561113b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111329061290c565b60405180910390fd5b80600d546111499190612adc565b34101561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061296c565b60405180910390fd5b6111953382611b39565b61119d611b57565b50565b6111a861177a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061121a61177a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112c761177a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161130c9190612874565b60405180910390a35050565b611323848484611787565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113855761134e84848484611cd3565b611384576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606113968261164d565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061294c565b60405180910390fd5b601060009054906101000a900460ff16156114285760006113f583611e33565b90506000600e8260405160200161140d9291906127e9565b604051602081830303815290604052905080925050506114b6565b600f805461143590612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461146190612cbe565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b505050505090505b919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61155d611b31565b73ffffffffffffffffffffffffffffffffffffffff1661157b610e7f565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061292c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611638906128cc565b60405180910390fd5b61164a81611bb6565b50565b600081611658611782565b11158015611667575060005482105b80156116a5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116bb611782565b11611743576000548110156117425760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611740575b600081141561173657600460008360019003935083815260200190815260200160002054905061170b565b8092505050611775565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611792826116ac565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661181a61177a565b73ffffffffffffffffffffffffffffffffffffffff16148061184957506118488561184361177a565b6114c1565b5b8061188e575061185761177a565b73ffffffffffffffffffffffffffffffffffffffff16611876846107dc565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118c7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561192e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193b8585856001611f94565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a3886611f9a565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611ac2576000600184019050600060046000838152602001908152602001600020541415611ac0576000548114611abf578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2a8585856001611fa4565b5050505050565b600033905090565b611b53828260405180602001604052806000815250611faa565b5050565b600b54611b62610a22565b10158015611b7d5750600c60009054906101000a900460ff16155b15611bb4576001600c60006101000a81548160ff0219169083151502179055506611c37937e08000600d81905550600a6009819055505b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf961177a565b8786866040518563ffffffff1660e01b8152600401611d1b9493929190612828565b602060405180830381600087803b158015611d3557600080fd5b505af1925050508015611d6657506040513d601f19601f82011682018060405250810190611d63919061255f565b60015b611de0573d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b50600081511415611dd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611e7b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f8f565b600082905060005b60008214611ead578080611e9690612d21565b915050600a82611ea69190612aab565b9150611e83565b60008167ffffffffffffffff811115611ec957611ec8612e57565b5b6040519080825280601f01601f191660200182016040528015611efb5781602001600182028036833780820191505090505b5090505b60008514611f8857600182611f149190612bca565b9150600a85611f239190612d6a565b6030611f2f9190612a55565b60f81b818381518110611f4557611f44612e28565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f819190612aab565b9450611eff565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612017576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612052576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61205f6000858386611f94565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120c46001851461225f565b901b60a042901b6120d486611f9a565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146121d8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121886000878480600101955087611cd3565b6121be576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106121195782600054146121d357600080fd5b612243565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121d9575b8160008190555050506122596000858386611fa4565b50505050565b6000819050919050565b600061227c612277846129cc565b6129a7565b90508281526020810184848401111561229857612297612e8b565b5b6122a3848285612c7c565b509392505050565b6000813590506122ba81612fed565b92915050565b6000813590506122cf81613004565b92915050565b6000813590506122e48161301b565b92915050565b6000815190506122f98161301b565b92915050565b600082601f83011261231457612313612e86565b5b8135612324848260208601612269565b91505092915050565b60008135905061233c81613032565b92915050565b60006020828403121561235857612357612e95565b5b6000612366848285016122ab565b91505092915050565b6000806040838503121561238657612385612e95565b5b6000612394858286016122ab565b92505060206123a5858286016122ab565b9150509250929050565b6000806000606084860312156123c8576123c7612e95565b5b60006123d6868287016122ab565b93505060206123e7868287016122ab565b92505060406123f88682870161232d565b9150509250925092565b6000806000806080858703121561241c5761241b612e95565b5b600061242a878288016122ab565b945050602061243b878288016122ab565b935050604061244c8782880161232d565b925050606085013567ffffffffffffffff81111561246d5761246c612e90565b5b612479878288016122ff565b91505092959194509250565b6000806040838503121561249c5761249b612e95565b5b60006124aa858286016122ab565b92505060206124bb858286016122c0565b9150509250929050565b600080604083850312156124dc576124db612e95565b5b60006124ea858286016122ab565b92505060206124fb8582860161232d565b9150509250929050565b60006020828403121561251b5761251a612e95565b5b6000612529848285016122c0565b91505092915050565b60006020828403121561254857612547612e95565b5b6000612556848285016122d5565b91505092915050565b60006020828403121561257557612574612e95565b5b6000612583848285016122ea565b91505092915050565b6000602082840312156125a2576125a1612e95565b5b60006125b08482850161232d565b91505092915050565b6125c281612bfe565b82525050565b6125d181612c10565b82525050565b60006125e282612a12565b6125ec8185612a28565b93506125fc818560208601612c8b565b61260581612e9a565b840191505092915050565b61261981612c48565b82525050565b600061262a82612a1d565b6126348185612a39565b9350612644818560208601612c8b565b61264d81612e9a565b840191505092915050565b600061266382612a1d565b61266d8185612a4a565b935061267d818560208601612c8b565b80840191505092915050565b6000815461269681612cbe565b6126a08186612a4a565b945060018216600081146126bb57600181146126cc576126ff565b60ff198316865281860193506126ff565b6126d5856129fd565b60005b838110156126f7578154818901526001820191506020810190506126d8565b838801955050505b50505092915050565b6000612715602683612a39565b915061272082612eab565b604082019050919050565b6000612738601283612a39565b915061274382612efa565b602082019050919050565b600061275b601683612a39565b915061276682612f23565b602082019050919050565b600061277e602083612a39565b915061278982612f4c565b602082019050919050565b60006127a1602f83612a39565b91506127ac82612f75565b604082019050919050565b60006127c4601583612a39565b91506127cf82612fc4565b602082019050919050565b6127e381612c72565b82525050565b60006127f58285612689565b91506128018284612658565b91508190509392505050565b600060208201905061282260008301846125b9565b92915050565b600060808201905061283d60008301876125b9565b61284a60208301866125b9565b61285760408301856127da565b818103606083015261286981846125d7565b905095945050505050565b600060208201905061288960008301846125c8565b92915050565b60006020820190506128a46000830184612610565b92915050565b600060208201905081810360008301526128c4818461261f565b905092915050565b600060208201905081810360008301526128e581612708565b9050919050565b600060208201905081810360008301526129058161272b565b9050919050565b600060208201905081810360008301526129258161274e565b9050919050565b6000602082019050818103600083015261294581612771565b9050919050565b6000602082019050818103600083015261296581612794565b9050919050565b60006020820190508181036000830152612985816127b7565b9050919050565b60006020820190506129a160008301846127da565b92915050565b60006129b16129c2565b90506129bd8282612cf0565b919050565b6000604051905090565b600067ffffffffffffffff8211156129e7576129e6612e57565b5b6129f082612e9a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a6082612c72565b9150612a6b83612c72565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612aa057612a9f612d9b565b5b828201905092915050565b6000612ab682612c72565b9150612ac183612c72565b925082612ad157612ad0612dca565b5b828204905092915050565b6000612ae782612c72565b9150612af283612c72565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2b57612b2a612d9b565b5b828202905092915050565b6000612b4182612c48565b9150612b4c83612c48565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615612b8757612b86612d9b565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213600084121615612bbf57612bbe612d9b565b5b828203905092915050565b6000612bd582612c72565b9150612be083612c72565b925082821015612bf357612bf2612d9b565b5b828203905092915050565b6000612c0982612c52565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ca9578082015181840152602081019050612c8e565b83811115612cb8576000848401525b50505050565b60006002820490506001821680612cd657607f821691505b60208210811415612cea57612ce9612df9565b5b50919050565b612cf982612e9a565b810181811067ffffffffffffffff82111715612d1857612d17612e57565b5b80604052505050565b6000612d2c82612c72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d5f57612d5e612d9b565b5b600182019050919050565b6000612d7582612c72565b9150612d8083612c72565b925082612d9057612d8f612dca565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b612ff681612bfe565b811461300157600080fd5b50565b61300d81612c10565b811461301857600080fd5b50565b61302481612c1c565b811461302f57600080fd5b50565b61303b81612c72565b811461304657600080fd5b5056fea2646970667358221220cf633c919687012970334ea3745a2f127f1990415c93829576866246655d404164736f6c63430008070033697066733a2f2f516d5379584e774571333369416335393148365851796f654854547158386351785841624535326d335a563257672f697066733a2f2f516d51517a4358716e4752696b3652774c4d585142526e4b344a6e756837794d3870474348504a627252537362342f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c8063715018a6116100f75780639d5561e111610095578063c87b56dd11610064578063c87b56dd146105ea578063ca0dcf1614610627578063e985e9c514610652578063f2fde38b1461068f576101c2565b80639d5561e114610551578063a0712d681461057c578063a22cb46514610598578063b88d4fde146105c1576101c2565b806391b7f5ed116100d157806391b7f5ed146104a9578063940cd05b146104d257806395d89b41146104fb57806398d5fdca14610526576101c2565b8063715018a61461043e57806379c9cb7b146104555780638da5cb5b1461047e576101c2565b806331b8e45a1161016457806342842e0e1161013e57806342842e0e146103705780635bdf01c8146103995780636352211e146103c457806370a0823114610401576101c2565b806331b8e45a14610314578063375a069a1461033d5780633ccfd60b14610366576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806312853cfc1461029557806318160ddd146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612532565b6106b8565b6040516101fb9190612874565b60405180910390f35b34801561021057600080fd5b5061021961074a565b60405161022691906128aa565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061258c565b6107dc565b604051610263919061280d565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906124c5565b610858565b005b3480156102a157600080fd5b506102aa6109ff565b6040516102b79190612874565b60405180910390f35b3480156102cc57600080fd5b506102d5610a22565b6040516102e2919061298c565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d91906123af565b610a39565b005b34801561032057600080fd5b5061033b6004803603810190610336919061258c565b610a49565b005b34801561034957600080fd5b50610364600480360381019061035f919061258c565b610acf565b005b61036e610bb7565b005b34801561037c57600080fd5b50610397600480360381019061039291906123af565b610c7c565b005b3480156103a557600080fd5b506103ae610c9c565b6040516103bb919061298c565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e6919061258c565b610ca6565b6040516103f8919061280d565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612342565b610cb8565b604051610435919061298c565b60405180910390f35b34801561044a57600080fd5b50610453610d71565b005b34801561046157600080fd5b5061047c6004803603810190610477919061258c565b610df9565b005b34801561048a57600080fd5b50610493610e7f565b6040516104a0919061280d565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb919061258c565b610ea9565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612505565b610f2f565b005b34801561050757600080fd5b50610510610fc8565b60405161051d91906128aa565b60405180910390f35b34801561053257600080fd5b5061053b61105a565b604051610548919061298c565b60405180910390f35b34801561055d57600080fd5b50610566611064565b604051610573919061288f565b60405180910390f35b6105966004803603810190610591919061258c565b61108c565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190612485565b6111a0565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612402565b611318565b005b3480156105f657600080fd5b50610611600480360381019061060c919061258c565b61138b565b60405161061e91906128aa565b60405180910390f35b34801561063357600080fd5b5061063c6114bb565b604051610649919061298c565b60405180910390f35b34801561065e57600080fd5b506106796004803603810190610674919061236f565b6114c1565b6040516106869190612874565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190612342565b611555565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107435750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461075990612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461078590612cbe565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905090565b60006107e78261164d565b61081d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610863826116ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea61177a565b73ffffffffffffffffffffffffffffffffffffffff161461094d576109168161091161177a565b6114c1565b61094c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600a54610a0c610a22565b10610a1a5760019050610a1f565b600090505b90565b6000610a2c611782565b6001546000540303905090565b610a44838383611787565b505050565b610a51611b31565b73ffffffffffffffffffffffffffffffffffffffff16610a6f610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc9061292c565b60405180910390fd5b80600b8190555050565b610ad7611b31565b73ffffffffffffffffffffffffffffffffffffffff16610af5610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b429061292c565b60405180910390fd5b600a5481610b57610a22565b610b619190612a55565b1115610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061290c565b60405180910390fd5b610bac3382611b39565b610bb4611b57565b50565b610bbf611b31565b73ffffffffffffffffffffffffffffffffffffffff16610bdd610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a9061292c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c79573d6000803e3d6000fd5b50565b610c9783838360405180602001604052806000815250611318565b505050565b6000600954905090565b6000610cb1826116ac565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d79611b31565b73ffffffffffffffffffffffffffffffffffffffff16610d97610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de49061292c565b60405180910390fd5b610df76000611bb6565b565b610e01611b31565b73ffffffffffffffffffffffffffffffffffffffff16610e1f610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c9061292c565b60405180910390fd5b8060098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb1611b31565b73ffffffffffffffffffffffffffffffffffffffff16610ecf610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c9061292c565b60405180910390fd5b80600d8190555050565b610f37611b31565b73ffffffffffffffffffffffffffffffffffffffff16610f55610e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa29061292c565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060038054610fd790612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461100390612cbe565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b5050505050905090565b6000600d54905090565b6000806009549050600061107733610cb8565b905080826110859190612b36565b9250505090565b60095461109833611c7c565b826110a39190612a55565b11156110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db906128ec565b60405180910390fd5b600a54816110f0610a22565b6110fa9190612a55565b111561113b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111329061290c565b60405180910390fd5b80600d546111499190612adc565b34101561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061296c565b60405180910390fd5b6111953382611b39565b61119d611b57565b50565b6111a861177a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061121a61177a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112c761177a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161130c9190612874565b60405180910390a35050565b611323848484611787565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113855761134e84848484611cd3565b611384576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606113968261164d565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061294c565b60405180910390fd5b601060009054906101000a900460ff16156114285760006113f583611e33565b90506000600e8260405160200161140d9291906127e9565b604051602081830303815290604052905080925050506114b6565b600f805461143590612cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461146190612cbe565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b505050505090505b919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61155d611b31565b73ffffffffffffffffffffffffffffffffffffffff1661157b610e7f565b73ffffffffffffffffffffffffffffffffffffffff16146115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061292c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611638906128cc565b60405180910390fd5b61164a81611bb6565b50565b600081611658611782565b11158015611667575060005482105b80156116a5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116bb611782565b11611743576000548110156117425760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611740575b600081141561173657600460008360019003935083815260200190815260200160002054905061170b565b8092505050611775565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611792826116ac565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661181a61177a565b73ffffffffffffffffffffffffffffffffffffffff16148061184957506118488561184361177a565b6114c1565b5b8061188e575061185761177a565b73ffffffffffffffffffffffffffffffffffffffff16611876846107dc565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118c7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561192e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193b8585856001611f94565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a3886611f9a565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611ac2576000600184019050600060046000838152602001908152602001600020541415611ac0576000548114611abf578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2a8585856001611fa4565b5050505050565b600033905090565b611b53828260405180602001604052806000815250611faa565b5050565b600b54611b62610a22565b10158015611b7d5750600c60009054906101000a900460ff16155b15611bb4576001600c60006101000a81548160ff0219169083151502179055506611c37937e08000600d81905550600a6009819055505b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cf961177a565b8786866040518563ffffffff1660e01b8152600401611d1b9493929190612828565b602060405180830381600087803b158015611d3557600080fd5b505af1925050508015611d6657506040513d601f19601f82011682018060405250810190611d63919061255f565b60015b611de0573d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b50600081511415611dd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611e7b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f8f565b600082905060005b60008214611ead578080611e9690612d21565b915050600a82611ea69190612aab565b9150611e83565b60008167ffffffffffffffff811115611ec957611ec8612e57565b5b6040519080825280601f01601f191660200182016040528015611efb5781602001600182028036833780820191505090505b5090505b60008514611f8857600182611f149190612bca565b9150600a85611f239190612d6a565b6030611f2f9190612a55565b60f81b818381518110611f4557611f44612e28565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f819190612aab565b9450611eff565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612017576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612052576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61205f6000858386611f94565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120c46001851461225f565b901b60a042901b6120d486611f9a565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146121d8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121886000878480600101955087611cd3565b6121be576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106121195782600054146121d357600080fd5b612243565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121d9575b8160008190555050506122596000858386611fa4565b50505050565b6000819050919050565b600061227c612277846129cc565b6129a7565b90508281526020810184848401111561229857612297612e8b565b5b6122a3848285612c7c565b509392505050565b6000813590506122ba81612fed565b92915050565b6000813590506122cf81613004565b92915050565b6000813590506122e48161301b565b92915050565b6000815190506122f98161301b565b92915050565b600082601f83011261231457612313612e86565b5b8135612324848260208601612269565b91505092915050565b60008135905061233c81613032565b92915050565b60006020828403121561235857612357612e95565b5b6000612366848285016122ab565b91505092915050565b6000806040838503121561238657612385612e95565b5b6000612394858286016122ab565b92505060206123a5858286016122ab565b9150509250929050565b6000806000606084860312156123c8576123c7612e95565b5b60006123d6868287016122ab565b93505060206123e7868287016122ab565b92505060406123f88682870161232d565b9150509250925092565b6000806000806080858703121561241c5761241b612e95565b5b600061242a878288016122ab565b945050602061243b878288016122ab565b935050604061244c8782880161232d565b925050606085013567ffffffffffffffff81111561246d5761246c612e90565b5b612479878288016122ff565b91505092959194509250565b6000806040838503121561249c5761249b612e95565b5b60006124aa858286016122ab565b92505060206124bb858286016122c0565b9150509250929050565b600080604083850312156124dc576124db612e95565b5b60006124ea858286016122ab565b92505060206124fb8582860161232d565b9150509250929050565b60006020828403121561251b5761251a612e95565b5b6000612529848285016122c0565b91505092915050565b60006020828403121561254857612547612e95565b5b6000612556848285016122d5565b91505092915050565b60006020828403121561257557612574612e95565b5b6000612583848285016122ea565b91505092915050565b6000602082840312156125a2576125a1612e95565b5b60006125b08482850161232d565b91505092915050565b6125c281612bfe565b82525050565b6125d181612c10565b82525050565b60006125e282612a12565b6125ec8185612a28565b93506125fc818560208601612c8b565b61260581612e9a565b840191505092915050565b61261981612c48565b82525050565b600061262a82612a1d565b6126348185612a39565b9350612644818560208601612c8b565b61264d81612e9a565b840191505092915050565b600061266382612a1d565b61266d8185612a4a565b935061267d818560208601612c8b565b80840191505092915050565b6000815461269681612cbe565b6126a08186612a4a565b945060018216600081146126bb57600181146126cc576126ff565b60ff198316865281860193506126ff565b6126d5856129fd565b60005b838110156126f7578154818901526001820191506020810190506126d8565b838801955050505b50505092915050565b6000612715602683612a39565b915061272082612eab565b604082019050919050565b6000612738601283612a39565b915061274382612efa565b602082019050919050565b600061275b601683612a39565b915061276682612f23565b602082019050919050565b600061277e602083612a39565b915061278982612f4c565b602082019050919050565b60006127a1602f83612a39565b91506127ac82612f75565b604082019050919050565b60006127c4601583612a39565b91506127cf82612fc4565b602082019050919050565b6127e381612c72565b82525050565b60006127f58285612689565b91506128018284612658565b91508190509392505050565b600060208201905061282260008301846125b9565b92915050565b600060808201905061283d60008301876125b9565b61284a60208301866125b9565b61285760408301856127da565b818103606083015261286981846125d7565b905095945050505050565b600060208201905061288960008301846125c8565b92915050565b60006020820190506128a46000830184612610565b92915050565b600060208201905081810360008301526128c4818461261f565b905092915050565b600060208201905081810360008301526128e581612708565b9050919050565b600060208201905081810360008301526129058161272b565b9050919050565b600060208201905081810360008301526129258161274e565b9050919050565b6000602082019050818103600083015261294581612771565b9050919050565b6000602082019050818103600083015261296581612794565b9050919050565b60006020820190508181036000830152612985816127b7565b9050919050565b60006020820190506129a160008301846127da565b92915050565b60006129b16129c2565b90506129bd8282612cf0565b919050565b6000604051905090565b600067ffffffffffffffff8211156129e7576129e6612e57565b5b6129f082612e9a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a6082612c72565b9150612a6b83612c72565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612aa057612a9f612d9b565b5b828201905092915050565b6000612ab682612c72565b9150612ac183612c72565b925082612ad157612ad0612dca565b5b828204905092915050565b6000612ae782612c72565b9150612af283612c72565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2b57612b2a612d9b565b5b828202905092915050565b6000612b4182612c48565b9150612b4c83612c48565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615612b8757612b86612d9b565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213600084121615612bbf57612bbe612d9b565b5b828203905092915050565b6000612bd582612c72565b9150612be083612c72565b925082821015612bf357612bf2612d9b565b5b828203905092915050565b6000612c0982612c52565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ca9578082015181840152602081019050612c8e565b83811115612cb8576000848401525b50505050565b60006002820490506001821680612cd657607f821691505b60208210811415612cea57612ce9612df9565b5b50919050565b612cf982612e9a565b810181811067ffffffffffffffff82111715612d1857612d17612e57565b5b80604052505050565b6000612d2c82612c72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d5f57612d5e612d9b565b5b600182019050919050565b6000612d7582612c72565b9150612d8083612c72565b925082612d9057612d8f612dca565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b612ff681612bfe565b811461300157600080fd5b50565b61300d81612c10565b811461301857600080fd5b50565b61302481612c1c565b811461302f57600080fd5b50565b61303b81612c72565b811461304657600080fd5b5056fea2646970667358221220cf633c919687012970334ea3745a2f127f1990415c93829576866246655d404164736f6c63430008070033
Deployed Bytecode Sourcemap
43988:3805:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18644:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23657:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25725:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25185:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47457:195;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17698:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26611:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47691:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46263:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45987:117;;;:::i;:::-;;26852:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47103:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23446:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19323:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4754:103;;;;;;;;;;;;;:::i;:::-;;46610:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4103:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46490:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46137:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23826:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47196:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47285:166;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44742:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26001:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27108:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45399:510;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44337:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26380:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5012:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18644:615;18729:4;19044:10;19029:25;;:11;:25;;;;:102;;;;19121:10;19106:25;;:11;:25;;;;19029:102;:179;;;;19198:10;19183:25;;:11;:25;;;;19029:179;19009:199;;18644:615;;;:::o;23657:100::-;23711:13;23744:5;23737:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23657:100;:::o;25725:204::-;25793:7;25818:16;25826:7;25818;:16::i;:::-;25813:64;;25843:34;;;;;;;;;;;;;;25813:64;25897:15;:24;25913:7;25897:24;;;;;;;;;;;;;;;;;;;;;25890:31;;25725:204;;;:::o;25185:474::-;25258:13;25290:27;25309:7;25290:18;:27::i;:::-;25258:61;;25340:5;25334:11;;:2;:11;;;25330:48;;;25354:24;;;;;;;;;;;;;;25330:48;25418:5;25395:28;;:19;:17;:19::i;:::-;:28;;;25391:175;;25443:44;25460:5;25467:19;:17;:19::i;:::-;25443:16;:44::i;:::-;25438:128;;25515:35;;;;;;;;;;;;;;25438:128;25391:175;25605:2;25578:15;:24;25594:7;25578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25643:7;25639:2;25623:28;;25632:5;25623:28;;;;;;;;;;;;25247:412;25185:474;;:::o;47457:195::-;47507:4;47543:10;;47526:13;:11;:13::i;:::-;:27;47523:122;;47576:4;47569:11;;;;47523:122;47628:5;47621:12;;47457:195;;:::o;17698:315::-;17751:7;17979:15;:13;:15::i;:::-;17964:12;;17948:13;;:28;:46;17941:53;;17698:315;:::o;26611:170::-;26745:28;26755:4;26761:2;26765:7;26745:9;:28::i;:::-;26611:170;;;:::o;47691:99::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47776:6:::1;47760:13;:22;;;;47691:99:::0;:::o;46263:203::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46349:10:::1;;46342:3;46326:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;46318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46397:26;46407:10;46419:3;46397:9;:26::i;:::-;46434:24;:22;:24::i;:::-;46263:203:::0;:::o;45987:117::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46053:10:::1;46045:28;;:51;46074:21;46045:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45987:117::o:0;26852:185::-;26990:39;27007:4;27013:2;27017:7;26990:39;;;;;;;;;;;;:16;:39::i;:::-;26852:185;;;:::o;47103:87::-;47147:7;47173:9;;47166:16;;47103:87;:::o;23446:144::-;23510:7;23553:27;23572:7;23553:18;:27::i;:::-;23530:52;;23446:144;;;:::o;19323:224::-;19387:7;19428:1;19411:19;;:5;:19;;;19407:60;;;19439:28;;;;;;;;;;;;;;19407:60;14662:13;19485:18;:25;19504:5;19485:25;;;;;;;;;;;;;;;;:54;19478:61;;19323:224;;;:::o;4754:103::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4819:30:::1;4846:1;4819:18;:30::i;:::-;4754:103::o:0;46610:93::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:6:::1;46677:9;:18;;;;46610:93:::0;:::o;4103:87::-;4149:7;4176:6;;;;;;;;;;;4169:13;;4103:87;:::o;46490:93::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46567:8:::1;46556;:19;;;;46490:93:::0;:::o;46137:87::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46208:8:::1;46195:10;;:21;;;;;;;;;;;;;;;;;;46137:87:::0;:::o;23826:104::-;23882:13;23915:7;23908:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23826:104;:::o;47196:83::-;47237:7;47263:8;;47256:15;;47196:83;:::o;47285:166::-;47327:3;47343:7;47357:9;;47343:24;;47378:9;47394:21;47404:10;47394:9;:21::i;:::-;47378:38;;47438:5;47434:3;:9;;;;:::i;:::-;47427:16;;;;47285:166;:::o;44742:468::-;44930:9;;44901:25;44915:10;44901:13;:25::i;:::-;44890:8;:36;;;;:::i;:::-;:49;;44882:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45009:10;;44997:8;44981:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;44973:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45090:8;45079;;:19;;;;:::i;:::-;45065:9;:34;;45057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45136:31;45146:10;45158:8;45136:9;:31::i;:::-;45178:24;:22;:24::i;:::-;44742:468;:::o;26001:308::-;26112:19;:17;:19::i;:::-;26100:31;;:8;:31;;;26096:61;;;26140:17;;;;;;;;;;;;;;26096:61;26222:8;26170:18;:39;26189:19;:17;:19::i;:::-;26170:39;;;;;;;;;;;;;;;:49;26210:8;26170:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26282:8;26246:55;;26261:19;:17;:19::i;:::-;26246:55;;;26292:8;26246:55;;;;;;:::i;:::-;;;;;;;;26001:308;;:::o;27108:396::-;27275:28;27285:4;27291:2;27295:7;27275:9;:28::i;:::-;27336:1;27318:2;:14;;;:19;27314:183;;27357:56;27388:4;27394:2;27398:7;27407:5;27357:30;:56::i;:::-;27352:145;;27441:40;;;;;;;;;;;;;;27352:145;27314:183;27108:396;;;;:::o;45399:510::-;45472:13;45540:16;45548:7;45540;:16::i;:::-;45532:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45655:10;;;;;;;;;;;45652:250;;;45681:22;45706:25;45723:7;45706:16;:25::i;:::-;45681:50;;45746:21;45794:7;45803:8;45777:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45746:67;;45835:7;45828:14;;;;;;45652:250;45881:9;45874:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45399:510;;;;:::o;44337:33::-;;;;:::o;26380:164::-;26477:4;26501:18;:25;26520:5;26501:25;;;;;;;;;;;;;;;:35;26527:8;26501:35;;;;;;;;;;;;;;;;;;;;;;;;;26494:42;;26380:164;;;;:::o;5012:201::-;4334:12;:10;:12::i;:::-;4323:23;;:7;:5;:7::i;:::-;:23;;;4315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5121:1:::1;5101:22;;:8;:22;;;;5093:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5177:28;5196:8;5177:18;:28::i;:::-;5012:201:::0;:::o;27759:273::-;27816:4;27872:7;27853:15;:13;:15::i;:::-;:26;;:66;;;;;27906:13;;27896:7;:23;27853:66;:152;;;;;28004:1;15432:8;27957:17;:26;27975:7;27957:26;;;;;;;;;;;;:43;:48;27853:152;27833:172;;27759:273;;;:::o;20961:1129::-;21028:7;21048:12;21063:7;21048:22;;21131:4;21112:15;:13;:15::i;:::-;:23;21108:915;;21165:13;;21158:4;:20;21154:869;;;21203:14;21220:17;:23;21238:4;21220:23;;;;;;;;;;;;21203:40;;21336:1;15432:8;21309:6;:23;:28;21305:699;;;21828:113;21845:1;21835:6;:11;21828:113;;;21888:17;:25;21906:6;;;;;;;21888:25;;;;;;;;;;;;21879:34;;21828:113;;;21974:6;21967:13;;;;;;21305:699;21180:843;21154:869;21108:915;22051:31;;;;;;;;;;;;;;20961:1129;;;;:::o;41741:105::-;41801:7;41828:10;41821:17;;41741:105;:::o;17221:92::-;17277:7;17221:92;:::o;32998:2515::-;33113:27;33143;33162:7;33143:18;:27::i;:::-;33113:57;;33228:4;33187:45;;33203:19;33187:45;;;33183:86;;33241:28;;;;;;;;;;;;;;33183:86;33282:22;33331:4;33308:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;33352:43;33369:4;33375:19;:17;:19::i;:::-;33352:16;:43::i;:::-;33308:87;:147;;;;33436:19;:17;:19::i;:::-;33412:43;;:20;33424:7;33412:11;:20::i;:::-;:43;;;33308:147;33282:174;;33474:17;33469:66;;33500:35;;;;;;;;;;;;;;33469:66;33564:1;33550:16;;:2;:16;;;33546:52;;;33575:23;;;;;;;;;;;;;;33546:52;33611:43;33633:4;33639:2;33643:7;33652:1;33611:21;:43::i;:::-;33727:15;:24;33743:7;33727:24;;;;;;;;;;;;33720:31;;;;;;;;;;;34119:18;:24;34138:4;34119:24;;;;;;;;;;;;;;;;34117:26;;;;;;;;;;;;34188:18;:22;34207:2;34188:22;;;;;;;;;;;;;;;;34186:24;;;;;;;;;;;15714:8;15316:3;34569:15;:41;;34527:21;34545:2;34527:17;:21::i;:::-;:84;:128;34481:17;:26;34499:7;34481:26;;;;;;;;;;;:174;;;;34825:1;15714:8;34775:19;:46;:51;34771:626;;;34847:19;34879:1;34869:7;:11;34847:33;;35036:1;35002:17;:30;35020:11;35002:30;;;;;;;;;;;;:35;34998:384;;;35140:13;;35125:11;:28;35121:242;;35320:19;35287:17;:30;35305:11;35287:30;;;;;;;;;;;:52;;;;35121:242;34998:384;34828:569;34771:626;35444:7;35440:2;35425:27;;35434:4;35425:27;;;;;;;;;;;;35463:42;35484:4;35490:2;35494:7;35503:1;35463:20;:42::i;:::-;33102:2411;;32998:2515;;;:::o;2819:98::-;2872:7;2899:10;2892:17;;2819:98;:::o;28116:104::-;28185:27;28195:2;28199:8;28185:27;;;;;;;;;;;;:9;:27::i;:::-;28116:104;;:::o;46739:330::-;46813:13;;46796;:11;:13::i;:::-;:30;;:50;;;;;46831:15;;;;;;;;;;;46830:16;46796:50;46793:269;;;46914:4;46896:15;;:22;;;;;;;;;;;;;;;;;;46978:11;46967:8;:22;;;;47048:2;47036:9;:14;;;;46793:269;46739:330::o;5373:191::-;5447:16;5466:6;;;;;;;;;;;5447:25;;5492:8;5483:6;;:17;;;;;;;;;;;;;;;;;;5547:8;5516:40;;5537:8;5516:40;;;;;;;;;;;;5436:128;5373:191;:::o;19629:176::-;19690:7;14662:13;14799:2;19718:18;:25;19737:5;19718:25;;;;;;;;;;;;;;;;:49;;19717:80;19710:87;;19629:176;;;:::o;39210:716::-;39373:4;39419:2;39394:45;;;39440:19;:17;:19::i;:::-;39461:4;39467:7;39476:5;39394:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39390:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39694:1;39677:6;:13;:18;39673:235;;;39723:40;;;;;;;;;;;;;;39673:235;39866:6;39860:13;39851:6;39847:2;39843:15;39836:38;39390:529;39563:54;;;39553:64;;;:6;:64;;;;39546:71;;;39210:716;;;;;;:::o;373:723::-;429:13;659:1;650:5;:10;646:53;;;677:10;;;;;;;;;;;;;;;;;;;;;646:53;709:12;724:5;709:20;;740:14;765:78;780:1;772:4;:9;765:78;;798:8;;;;;:::i;:::-;;;;829:2;821:10;;;;;:::i;:::-;;;765:78;;;853:19;885:6;875:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;853:39;;903:154;919:1;910:5;:10;903:154;;947:1;937:11;;;;;:::i;:::-;;;1014:2;1006:5;:10;;;;:::i;:::-;993:2;:24;;;;:::i;:::-;980:39;;963:6;970;963:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1043:2;1034:11;;;;;:::i;:::-;;;903:154;;;1081:6;1067:21;;;;;373:723;;;;:::o;40574:159::-;;;;;:::o;24746:148::-;24810:14;24871:5;24861:15;;24746:148;;;:::o;41392:158::-;;;;;:::o;28593:2236::-;28716:20;28739:13;;28716:36;;28781:1;28767:16;;:2;:16;;;28763:48;;;28792:19;;;;;;;;;;;;;;28763:48;28838:1;28826:8;:13;28822:44;;;28848:18;;;;;;;;;;;;;;28822:44;28879:61;28909:1;28913:2;28917:12;28931:8;28879:21;:61::i;:::-;29483:1;14799:2;29454:1;:25;;29453:31;29441:8;:44;29415:18;:22;29434:2;29415:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15579:3;29884:29;29911:1;29899:8;:13;29884:14;:29::i;:::-;:56;;15316:3;29821:15;:41;;29779:21;29797:2;29779:17;:21::i;:::-;:84;:162;29728:17;:31;29746:12;29728:31;;;;;;;;;;;:213;;;;29958:20;29981:12;29958:35;;30008:11;30037:8;30022:12;:23;30008:37;;30084:1;30066:2;:14;;;:19;30062:635;;30106:313;30162:12;30158:2;30137:38;;30154:1;30137:38;;;;;;;;;;;;30203:69;30242:1;30246:2;30250:14;;;;;;30266:5;30203:30;:69::i;:::-;30198:174;;30308:40;;;;;;;;;;;;;;30198:174;30414:3;30399:12;:18;30106:313;;30500:12;30483:13;;:29;30479:43;;30514:8;;;30479:43;30062:635;;;30563:119;30619:14;;;;;;30615:2;30594:40;;30611:1;30594:40;;;;;;;;;;;;30677:3;30662:12;:18;30563:119;;30062:635;30727:12;30711:13;:28;;;;29192:1559;;30761:60;30790:1;30794:2;30798:12;30812:8;30761:20;:60::i;:::-;28705:2124;28593:2236;;;:::o;24981:142::-;25039:14;25100:5;25090:15;;24981:142;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:323::-;4898:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:119;;;4953:79;;:::i;:::-;4915:119;5073:1;5098:50;5140:7;5131:6;5120:9;5116:22;5098:50;:::i;:::-;5088:60;;5044:114;4842:323;;;;:::o;5171:327::-;5229:6;5278:2;5266:9;5257:7;5253:23;5249:32;5246:119;;;5284:79;;:::i;:::-;5246:119;5404:1;5429:52;5473:7;5464:6;5453:9;5449:22;5429:52;:::i;:::-;5419:62;;5375:116;5171:327;;;;:::o;5504:349::-;5573:6;5622:2;5610:9;5601:7;5597:23;5593:32;5590:119;;;5628:79;;:::i;:::-;5590:119;5748:1;5773:63;5828:7;5819:6;5808:9;5804:22;5773:63;:::i;:::-;5763:73;;5719:127;5504:349;;;;:::o;5859:329::-;5918:6;5967:2;5955:9;5946:7;5942:23;5938:32;5935:119;;;5973:79;;:::i;:::-;5935:119;6093:1;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6064:117;5859:329;;;;:::o;6194:118::-;6281:24;6299:5;6281:24;:::i;:::-;6276:3;6269:37;6194:118;;:::o;6318:109::-;6399:21;6414:5;6399:21;:::i;:::-;6394:3;6387:34;6318:109;;:::o;6433:360::-;6519:3;6547:38;6579:5;6547:38;:::i;:::-;6601:70;6664:6;6659:3;6601:70;:::i;:::-;6594:77;;6680:52;6725:6;6720:3;6713:4;6706:5;6702:16;6680:52;:::i;:::-;6757:29;6779:6;6757:29;:::i;:::-;6752:3;6748:39;6741:46;;6523:270;6433:360;;;;:::o;6799:115::-;6884:23;6901:5;6884:23;:::i;:::-;6879:3;6872:36;6799:115;;:::o;6920:364::-;7008:3;7036:39;7069:5;7036:39;:::i;:::-;7091:71;7155:6;7150:3;7091:71;:::i;:::-;7084:78;;7171:52;7216:6;7211:3;7204:4;7197:5;7193:16;7171:52;:::i;:::-;7248:29;7270:6;7248:29;:::i;:::-;7243:3;7239:39;7232:46;;7012:272;6920:364;;;;:::o;7290:377::-;7396:3;7424:39;7457:5;7424:39;:::i;:::-;7479:89;7561:6;7556:3;7479:89;:::i;:::-;7472:96;;7577:52;7622:6;7617:3;7610:4;7603:5;7599:16;7577:52;:::i;:::-;7654:6;7649:3;7645:16;7638:23;;7400:267;7290:377;;;;:::o;7697:845::-;7800:3;7837:5;7831:12;7866:36;7892:9;7866:36;:::i;:::-;7918:89;8000:6;7995:3;7918:89;:::i;:::-;7911:96;;8038:1;8027:9;8023:17;8054:1;8049:137;;;;8200:1;8195:341;;;;8016:520;;8049:137;8133:4;8129:9;8118;8114:25;8109:3;8102:38;8169:6;8164:3;8160:16;8153:23;;8049:137;;8195:341;8262:38;8294:5;8262:38;:::i;:::-;8322:1;8336:154;8350:6;8347:1;8344:13;8336:154;;;8424:7;8418:14;8414:1;8409:3;8405:11;8398:35;8474:1;8465:7;8461:15;8450:26;;8372:4;8369:1;8365:12;8360:17;;8336:154;;;8519:6;8514:3;8510:16;8503:23;;8202:334;;8016:520;;7804:738;;7697:845;;;;:::o;8548:366::-;8690:3;8711:67;8775:2;8770:3;8711:67;:::i;:::-;8704:74;;8787:93;8876:3;8787:93;:::i;:::-;8905:2;8900:3;8896:12;8889:19;;8548:366;;;:::o;8920:::-;9062:3;9083:67;9147:2;9142:3;9083:67;:::i;:::-;9076:74;;9159:93;9248:3;9159:93;:::i;:::-;9277:2;9272:3;9268:12;9261:19;;8920:366;;;:::o;9292:::-;9434:3;9455:67;9519:2;9514:3;9455:67;:::i;:::-;9448:74;;9531:93;9620:3;9531:93;:::i;:::-;9649:2;9644:3;9640:12;9633:19;;9292:366;;;:::o;9664:::-;9806:3;9827:67;9891:2;9886:3;9827:67;:::i;:::-;9820:74;;9903:93;9992:3;9903:93;:::i;:::-;10021:2;10016:3;10012:12;10005:19;;9664:366;;;:::o;10036:::-;10178:3;10199:67;10263:2;10258:3;10199:67;:::i;:::-;10192:74;;10275:93;10364:3;10275:93;:::i;:::-;10393:2;10388:3;10384:12;10377:19;;10036:366;;;:::o;10408:::-;10550:3;10571:67;10635:2;10630:3;10571:67;:::i;:::-;10564:74;;10647:93;10736:3;10647:93;:::i;:::-;10765:2;10760:3;10756:12;10749:19;;10408:366;;;:::o;10780:118::-;10867:24;10885:5;10867:24;:::i;:::-;10862:3;10855:37;10780:118;;:::o;10904:429::-;11081:3;11103:92;11191:3;11182:6;11103:92;:::i;:::-;11096:99;;11212:95;11303:3;11294:6;11212:95;:::i;:::-;11205:102;;11324:3;11317:10;;10904:429;;;;;:::o;11339:222::-;11432:4;11470:2;11459:9;11455:18;11447:26;;11483:71;11551:1;11540:9;11536:17;11527:6;11483:71;:::i;:::-;11339:222;;;;:::o;11567:640::-;11762:4;11800:3;11789:9;11785:19;11777:27;;11814:71;11882:1;11871:9;11867:17;11858:6;11814:71;:::i;:::-;11895:72;11963:2;11952:9;11948:18;11939:6;11895:72;:::i;:::-;11977;12045:2;12034:9;12030:18;12021:6;11977:72;:::i;:::-;12096:9;12090:4;12086:20;12081:2;12070:9;12066:18;12059:48;12124:76;12195:4;12186:6;12124:76;:::i;:::-;12116:84;;11567:640;;;;;;;:::o;12213:210::-;12300:4;12338:2;12327:9;12323:18;12315:26;;12351:65;12413:1;12402:9;12398:17;12389:6;12351:65;:::i;:::-;12213:210;;;;:::o;12429:218::-;12520:4;12558:2;12547:9;12543:18;12535:26;;12571:69;12637:1;12626:9;12622:17;12613:6;12571:69;:::i;:::-;12429:218;;;;:::o;12653:313::-;12766:4;12804:2;12793:9;12789:18;12781:26;;12853:9;12847:4;12843:20;12839:1;12828:9;12824:17;12817:47;12881:78;12954:4;12945:6;12881:78;:::i;:::-;12873:86;;12653:313;;;;:::o;12972:419::-;13138:4;13176:2;13165:9;13161:18;13153:26;;13225:9;13219:4;13215:20;13211:1;13200:9;13196:17;13189:47;13253:131;13379:4;13253:131;:::i;:::-;13245:139;;12972:419;;;:::o;13397:::-;13563:4;13601:2;13590:9;13586:18;13578:26;;13650:9;13644:4;13640:20;13636:1;13625:9;13621:17;13614:47;13678:131;13804:4;13678:131;:::i;:::-;13670:139;;13397:419;;;:::o;13822:::-;13988:4;14026:2;14015:9;14011:18;14003:26;;14075:9;14069:4;14065:20;14061:1;14050:9;14046:17;14039:47;14103:131;14229:4;14103:131;:::i;:::-;14095:139;;13822:419;;;:::o;14247:::-;14413:4;14451:2;14440:9;14436:18;14428:26;;14500:9;14494:4;14490:20;14486:1;14475:9;14471:17;14464:47;14528:131;14654:4;14528:131;:::i;:::-;14520:139;;14247:419;;;:::o;14672:::-;14838:4;14876:2;14865:9;14861:18;14853:26;;14925:9;14919:4;14915:20;14911:1;14900:9;14896:17;14889:47;14953:131;15079:4;14953:131;:::i;:::-;14945:139;;14672:419;;;:::o;15097:::-;15263:4;15301:2;15290:9;15286:18;15278:26;;15350:9;15344:4;15340:20;15336:1;15325:9;15321:17;15314:47;15378:131;15504:4;15378:131;:::i;:::-;15370:139;;15097:419;;;:::o;15522:222::-;15615:4;15653:2;15642:9;15638:18;15630:26;;15666:71;15734:1;15723:9;15719:17;15710:6;15666:71;:::i;:::-;15522:222;;;;:::o;15750:129::-;15784:6;15811:20;;:::i;:::-;15801:30;;15840:33;15868:4;15860:6;15840:33;:::i;:::-;15750:129;;;:::o;15885:75::-;15918:6;15951:2;15945:9;15935:19;;15885:75;:::o;15966:307::-;16027:4;16117:18;16109:6;16106:30;16103:56;;;16139:18;;:::i;:::-;16103:56;16177:29;16199:6;16177:29;:::i;:::-;16169:37;;16261:4;16255;16251:15;16243:23;;15966:307;;;:::o;16279:141::-;16328:4;16351:3;16343:11;;16374:3;16371:1;16364:14;16408:4;16405:1;16395:18;16387:26;;16279:141;;;:::o;16426:98::-;16477:6;16511:5;16505:12;16495:22;;16426:98;;;:::o;16530:99::-;16582:6;16616:5;16610:12;16600:22;;16530:99;;;:::o;16635:168::-;16718:11;16752:6;16747:3;16740:19;16792:4;16787:3;16783:14;16768:29;;16635:168;;;;:::o;16809:169::-;16893:11;16927:6;16922:3;16915:19;16967:4;16962:3;16958:14;16943:29;;16809:169;;;;:::o;16984:148::-;17086:11;17123:3;17108:18;;16984:148;;;;:::o;17138:305::-;17178:3;17197:20;17215:1;17197:20;:::i;:::-;17192:25;;17231:20;17249:1;17231:20;:::i;:::-;17226:25;;17385:1;17317:66;17313:74;17310:1;17307:81;17304:107;;;17391:18;;:::i;:::-;17304:107;17435:1;17432;17428:9;17421:16;;17138:305;;;;:::o;17449:185::-;17489:1;17506:20;17524:1;17506:20;:::i;:::-;17501:25;;17540:20;17558:1;17540:20;:::i;:::-;17535:25;;17579:1;17569:35;;17584:18;;:::i;:::-;17569:35;17626:1;17623;17619:9;17614:14;;17449:185;;;;:::o;17640:348::-;17680:7;17703:20;17721:1;17703:20;:::i;:::-;17698:25;;17737:20;17755:1;17737:20;:::i;:::-;17732:25;;17925:1;17857:66;17853:74;17850:1;17847:81;17842:1;17835:9;17828:17;17824:105;17821:131;;;17932:18;;:::i;:::-;17821:131;17980:1;17977;17973:9;17962:20;;17640:348;;;;:::o;17994:527::-;18033:4;18053:19;18070:1;18053:19;:::i;:::-;18048:24;;18086:19;18103:1;18086:19;:::i;:::-;18081:24;;18275:1;18207:66;18203:74;18200:1;18196:82;18191:1;18188;18184:9;18177:17;18173:106;18170:132;;;18282:18;;:::i;:::-;18170:132;18461:1;18393:66;18389:74;18386:1;18382:82;18378:1;18375;18371:9;18367:98;18364:124;;;18468:18;;:::i;:::-;18364:124;18513:1;18510;18506:9;18498:17;;17994:527;;;;:::o;18527:191::-;18567:4;18587:20;18605:1;18587:20;:::i;:::-;18582:25;;18621:20;18639:1;18621:20;:::i;:::-;18616:25;;18660:1;18657;18654:8;18651:34;;;18665:18;;:::i;:::-;18651:34;18710:1;18707;18703:9;18695:17;;18527:191;;;;:::o;18724:96::-;18761:7;18790:24;18808:5;18790:24;:::i;:::-;18779:35;;18724:96;;;:::o;18826:90::-;18860:7;18903:5;18896:13;18889:21;18878:32;;18826:90;;;:::o;18922:149::-;18958:7;18998:66;18991:5;18987:78;18976:89;;18922:149;;;:::o;19077:76::-;19113:7;19142:5;19131:16;;19077:76;;;:::o;19159:126::-;19196:7;19236:42;19229:5;19225:54;19214:65;;19159:126;;;:::o;19291:77::-;19328:7;19357:5;19346:16;;19291:77;;;:::o;19374:154::-;19458:6;19453:3;19448;19435:30;19520:1;19511:6;19506:3;19502:16;19495:27;19374:154;;;:::o;19534:307::-;19602:1;19612:113;19626:6;19623:1;19620:13;19612:113;;;19711:1;19706:3;19702:11;19696:18;19692:1;19687:3;19683:11;19676:39;19648:2;19645:1;19641:10;19636:15;;19612:113;;;19743:6;19740:1;19737:13;19734:101;;;19823:1;19814:6;19809:3;19805:16;19798:27;19734:101;19583:258;19534:307;;;:::o;19847:320::-;19891:6;19928:1;19922:4;19918:12;19908:22;;19975:1;19969:4;19965:12;19996:18;19986:81;;20052:4;20044:6;20040:17;20030:27;;19986:81;20114:2;20106:6;20103:14;20083:18;20080:38;20077:84;;;20133:18;;:::i;:::-;20077:84;19898:269;19847:320;;;:::o;20173:281::-;20256:27;20278:4;20256:27;:::i;:::-;20248:6;20244:40;20386:6;20374:10;20371:22;20350:18;20338:10;20335:34;20332:62;20329:88;;;20397:18;;:::i;:::-;20329:88;20437:10;20433:2;20426:22;20216:238;20173:281;;:::o;20460:233::-;20499:3;20522:24;20540:5;20522:24;:::i;:::-;20513:33;;20568:66;20561:5;20558:77;20555:103;;;20638:18;;:::i;:::-;20555:103;20685:1;20678:5;20674:13;20667:20;;20460:233;;;:::o;20699:176::-;20731:1;20748:20;20766:1;20748:20;:::i;:::-;20743:25;;20782:20;20800:1;20782:20;:::i;:::-;20777:25;;20821:1;20811:35;;20826:18;;:::i;:::-;20811:35;20867:1;20864;20860:9;20855:14;;20699:176;;;;:::o;20881:180::-;20929:77;20926:1;20919:88;21026:4;21023:1;21016:15;21050:4;21047:1;21040:15;21067:180;21115:77;21112:1;21105:88;21212:4;21209:1;21202:15;21236:4;21233:1;21226:15;21253:180;21301:77;21298:1;21291:88;21398:4;21395:1;21388:15;21422:4;21419:1;21412:15;21439:180;21487:77;21484:1;21477:88;21584:4;21581:1;21574:15;21608:4;21605:1;21598:15;21625:180;21673:77;21670:1;21663:88;21770:4;21767:1;21760:15;21794:4;21791:1;21784:15;21811:117;21920:1;21917;21910:12;21934:117;22043:1;22040;22033:12;22057:117;22166:1;22163;22156:12;22180:117;22289:1;22286;22279:12;22303:102;22344:6;22395:2;22391:7;22386:2;22379:5;22375:14;22371:28;22361:38;;22303:102;;;:::o;22411:225::-;22551:34;22547:1;22539:6;22535:14;22528:58;22620:8;22615:2;22607:6;22603:15;22596:33;22411:225;:::o;22642:168::-;22782:20;22778:1;22770:6;22766:14;22759:44;22642:168;:::o;22816:172::-;22956:24;22952:1;22944:6;22940:14;22933:48;22816:172;:::o;22994:182::-;23134:34;23130:1;23122:6;23118:14;23111:58;22994:182;:::o;23182:234::-;23322:34;23318:1;23310:6;23306:14;23299:58;23391:17;23386:2;23378:6;23374:15;23367:42;23182:234;:::o;23422:171::-;23562:23;23558:1;23550:6;23546:14;23539:47;23422:171;:::o;23599:122::-;23672:24;23690:5;23672:24;:::i;:::-;23665:5;23662:35;23652:63;;23711:1;23708;23701:12;23652:63;23599:122;:::o;23727:116::-;23797:21;23812:5;23797:21;:::i;:::-;23790:5;23787:32;23777:60;;23833:1;23830;23823:12;23777:60;23727:116;:::o;23849:120::-;23921:23;23938:5;23921:23;:::i;:::-;23914:5;23911:34;23901:62;;23959:1;23956;23949:12;23901:62;23849:120;:::o;23975:122::-;24048:24;24066:5;24048:24;:::i;:::-;24041:5;24038:35;24028:63;;24087:1;24084;24077:12;24028:63;23975:122;:::o
Swarm Source
ipfs://cf633c919687012970334ea3745a2f127f1990415c93829576866246655d4041
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.