Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 535 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 21251665 | 8 hrs ago | IN | 0 ETH | 0.00182568 | ||||
Set Approval For... | 21156060 | 13 days ago | IN | 0 ETH | 0.00059996 | ||||
Safe Transfer Fr... | 21151388 | 14 days ago | IN | 0 ETH | 0.00065227 | ||||
Safe Transfer Fr... | 21139332 | 16 days ago | IN | 0 ETH | 0.00083152 | ||||
Safe Transfer Fr... | 21139328 | 16 days ago | IN | 0 ETH | 0.00080568 | ||||
Set Approval For... | 21130956 | 17 days ago | IN | 0 ETH | 0.00055996 | ||||
Safe Transfer Fr... | 21129615 | 17 days ago | IN | 0 ETH | 0.00146188 | ||||
Set Approval For... | 21124410 | 18 days ago | IN | 0 ETH | 0.00036175 | ||||
Set Approval For... | 21122956 | 18 days ago | IN | 0 ETH | 0.00061478 | ||||
Set Approval For... | 21114058 | 19 days ago | IN | 0 ETH | 0.00019301 | ||||
Safe Transfer Fr... | 21103120 | 21 days ago | IN | 0 ETH | 0.0002634 | ||||
Safe Transfer Fr... | 21102030 | 21 days ago | IN | 0 ETH | 0.00038528 | ||||
Safe Transfer Fr... | 21101047 | 21 days ago | IN | 0 ETH | 0.000984 | ||||
Safe Transfer Fr... | 21101032 | 21 days ago | IN | 0 ETH | 0.00098305 | ||||
Safe Transfer Fr... | 21088930 | 23 days ago | IN | 0 ETH | 0.00034837 | ||||
Set Approval For... | 21079861 | 24 days ago | IN | 0 ETH | 0.00083556 | ||||
Set Approval For... | 21075646 | 24 days ago | IN | 0 ETH | 0.00067952 | ||||
Safe Transfer Fr... | 21073219 | 25 days ago | IN | 0 ETH | 0.00086321 | ||||
Set Approval For... | 21019563 | 32 days ago | IN | 0 ETH | 0.00034943 | ||||
Set Approval For... | 21018629 | 32 days ago | IN | 0 ETH | 0.00025052 | ||||
Set Approval For... | 21014661 | 33 days ago | IN | 0 ETH | 0.00064656 | ||||
Set Approval For... | 21014518 | 33 days ago | IN | 0 ETH | 0.00071437 | ||||
Safe Transfer Fr... | 21014461 | 33 days ago | IN | 0 ETH | 0.00127785 | ||||
Safe Transfer Fr... | 20998700 | 35 days ago | IN | 0 ETH | 0.0005928 | ||||
Safe Transfer Fr... | 20911220 | 47 days ago | IN | 0 ETH | 0.00049914 |
Latest 9 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19336761 | 268 days ago | 0.27105882 ETH | ||||
19336761 | 268 days ago | 5.77694117 ETH | ||||
19118651 | 298 days ago | 0.88658823 ETH | ||||
19118651 | 298 days ago | 18.89541176 ETH | ||||
19075981 | 304 days ago | 6.29999999 ETH | ||||
17568047 | 515 days ago | 0.44423529 ETH | ||||
17568047 | 515 days ago | 9.4677647 ETH | ||||
17452886 | 532 days ago | 0.23520717 ETH | ||||
17452886 | 532 days ago | 2.41835882 ETH |
Loading...
Loading
Contract Name:
THC_NFT
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-10 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // SPDX-License-Identifier: Unlicensed // File: contracts/honeycast.sol pragma solidity ^0.8.4; contract THC_NFT is ERC721A, Ownable, ERC2981 { //Mint Variables uint256 public maxMintPerBatch = 150; uint256 public MAXSUPPLY = 6969; uint256 public MINTPRICE = 0.001 ether; uint256 public immutable TWO_DOLLARS_ETH = 0.00108 ether; bool public mintLive = false; //URI string public baseURI = "ipfs://bafybeigceuibnnlrpyxmakvl6ro7ohivzjlqxa6kclq3lqlmmpoqcwsyw4/"; //Payout addresses mapping(address => uint256) private pendingBalances; address public immutable KPA = 0xFfDD202184de72c8b7B79F4b1109892d375Cf5dA; //THIS IS OUR HARDCODED FEE ADDRESS address public OPA = 0x04C0f5dBd7D32847D52960Ff26663D73e01Ad639; //OPA is owner payout address set this depending on what they put constructor() ERC721A("THC NFT", "THC") { _setDefaultRoyalty(OPA, 1000); } // <------------------------------------- Main Functions -------------------------------------> //Starts the mint function changeMintStatus(bool status) public onlyOwner { mintLive = status; } //Might delete function startMint() public onlyOwner { mintLive = true; } function batchMint(uint256 amount) external payable { // _safeMint's second argument now takes in a amount, not a tokenId. require(mintLive == true, "Mint has not started"); require(amount + _numberMinted(msg.sender) <= maxMintPerBatch, "Exceeded the limit"); require(totalSupply() + amount <= MAXSUPPLY, "Not enough tokens left"); require(msg.value >= (((MINTPRICE * 51)/50 + TWO_DOLLARS_ETH) * amount), "Not enough ether sent"); pendingBalances[OPA] += (MINTPRICE * amount); pendingBalances[KPA] += ((MINTPRICE/50) + TWO_DOLLARS_ETH) * amount; _safeMint(msg.sender, amount); } function withdrawMintFunds() public payable onlyOwner { uint256 ownerPayout = pendingBalances[msg.sender]; uint256 kingdomlyFee = pendingBalances[KPA]; //Prevent reentrancy attacks pendingBalances[msg.sender] = 0; pendingBalances[KPA] = 0; (bool success1, ) = payable(msg.sender).call{value: ownerPayout}(""); (bool success2, ) = payable(KPA).call{value: kingdomlyFee}(""); require(success1 && success2, "Withdraw Transfer Failed"); } //Setters function setMaxMintPerBatch(uint256 newMaxMintPerBatch) public onlyOwner { maxMintPerBatch = newMaxMintPerBatch; } function setBaseURI(string memory newBaseURI) public onlyOwner{ baseURI = newBaseURI; } function changePrice(uint256 _MINTPRICE) public onlyOwner { MINTPRICE = _MINTPRICE; } //Getters function _baseURI() internal view override returns (string memory) { return baseURI; } function checkPendingBalance() public view returns(uint256){ return pendingBalances[msg.sender]; } //Overrides /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view override virtual returns (uint256) { return 1; } //remove ERC2981 from here if no royalties function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } // <------------------------------------- End Main Functions -------------------------------------> }
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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"KPA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXSUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTPRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWO_DOLLARS_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MINTPRICE","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPendingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintPerBatch","type":"uint256"}],"name":"setMaxMintPerBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMintFunds","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60c06040526096600b55611b39600c5566038d7ea4c68000600d556603d641185b80006080908152506000600e60006101000a81548160ff02191690831515021790555060405180608001604052806043815260200162003e3a60439139600f90816200006d91906200071a565b5073ffdd202184de72c8b7b79f4b1109892d375cf5da73ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff168152507304c0f5dbd7d32847d52960ff26663d73e01ad639601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011757600080fd5b506040518060400160405280600781526020017f544843204e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f544843000000000000000000000000000000000000000000000000000000000081525081600290816200019591906200071a565b508060039081620001a791906200071a565b50620001b86200021c60201b60201c565b6000819055505050620001e0620001d46200022560201b60201c565b6200022d60201b60201c565b62000216601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620002f360201b60201c565b6200091c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003036200049660201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000364576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035b9062000888565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd90620008fa565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052257607f821691505b602082108103620005385762000537620004da565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000563565b620005ae868362000563565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005fb620005f5620005ef84620005c6565b620005d0565b620005c6565b9050919050565b6000819050919050565b6200061783620005da565b6200062f620006268262000602565b84845462000570565b825550505050565b600090565b6200064662000637565b620006538184846200060c565b505050565b5b818110156200067b576200066f6000826200063c565b60018101905062000659565b5050565b601f821115620006ca5762000694816200053e565b6200069f8462000553565b81016020851015620006af578190505b620006c7620006be8562000553565b83018262000658565b50505b505050565b600082821c905092915050565b6000620006ef60001984600802620006cf565b1980831691505092915050565b60006200070a8383620006dc565b9150826002028217905092915050565b6200072582620004a0565b67ffffffffffffffff811115620007415762000740620004ab565b5b6200074d825462000509565b6200075a8282856200067f565b600060209050601f8311600181146200079257600084156200077d578287015190505b620007898582620006fc565b865550620007f9565b601f198416620007a2866200053e565b60005b82811015620007cc57848901518255600182019150602085019450602081019050620007a5565b86831015620007ec5784890151620007e8601f891682620006dc565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000870602a8362000801565b91506200087d8262000812565b604082019050919050565b60006020820190508181036000830152620008a38162000861565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000620008e260198362000801565b9150620008ef82620008aa565b602082019050919050565b600060208201905081810360008301526200091581620008d3565b9050919050565b60805160a0516134ce6200096c60003960008181610f44015281816113930152818161148d0152818161153601526116030152600081816112330152818161134b0152611a9401526134ce6000f3fe6080604052600436106101f95760003560e01c8063758b4e861161010d578063b88d4fde116100a0578063e8656fcc1161006f578063e8656fcc146106ac578063e985e9c5146106d7578063f04ed8db14610714578063f2fde38b1461073f578063fea414b614610768576101f9565b8063b88d4fde146105fd578063c87b56dd14610619578063d263413214610656578063e626302614610681576101f9565b806395d89b41116100dc57806395d89b4114610557578063a22cb46514610582578063a2b40d19146105ab578063a8ddf8f6146105d4576101f9565b8063758b4e86146104db5780638467be0d146105065780638da5cb5b14610522578063905d7b331461054d576101f9565b80633a8e6b0e116101905780635dee9b171161015f5780635dee9b17146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487578063715018a6146104c4576101f9565b80633a8e6b0e1461035b57806342842e0e14610386578063480af5bc146103a257806355f804b3146103cb576101f9565b806318160ddd116101cc57806318160ddd146102bf57806323b872dd146102ea5780632a55205a146103065780632be0956114610344576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612544565b610793565b604051610232919061258c565b60405180910390f35b34801561024757600080fd5b506102506107a5565b60405161025d9190612637565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061268f565b610837565b60405161029a91906126fd565b60405180910390f35b6102bd60048036038101906102b89190612744565b6108b6565b005b3480156102cb57600080fd5b506102d46109fa565b6040516102e19190612793565b60405180910390f35b61030460048036038101906102ff91906127ae565b610a11565b005b34801561031257600080fd5b5061032d60048036038101906103289190612801565b610d33565b60405161033b929190612841565b60405180910390f35b34801561035057600080fd5b50610359610f1d565b005b34801561036757600080fd5b50610370610f42565b60405161037d91906126fd565b60405180910390f35b6103a0600480360381019061039b91906127ae565b610f66565b005b3480156103ae57600080fd5b506103c960048036038101906103c4919061268f565b610f86565b005b3480156103d757600080fd5b506103f260048036038101906103ed919061299f565b610f98565b005b34801561040057600080fd5b50610409610fb3565b6040516104169190612793565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061268f565b610fb9565b60405161045391906126fd565b60405180910390f35b34801561046857600080fd5b50610471610fcb565b60405161047e9190612637565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906129e8565b611059565b6040516104bb9190612793565b60405180910390f35b3480156104d057600080fd5b506104d9611111565b005b3480156104e757600080fd5b506104f0611125565b6040516104fd9190612793565b60405180910390f35b610520600480360381019061051b919061268f565b61112b565b005b34801561052e57600080fd5b5061053761140f565b60405161054491906126fd565b60405180910390f35b610555611439565b005b34801561056357600080fd5b5061056c6116da565b6040516105799190612637565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190612a41565b61176c565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061268f565b611877565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190612a81565b611889565b005b61061760048036038101906106129190612b4f565b6118ae565b005b34801561062557600080fd5b50610640600480360381019061063b919061268f565b611921565b60405161064d9190612637565b60405180910390f35b34801561066257600080fd5b5061066b6119bf565b60405161067891906126fd565b60405180910390f35b34801561068d57600080fd5b506106966119e5565b6040516106a39190612793565b60405180910390f35b3480156106b857600080fd5b506106c16119eb565b6040516106ce919061258c565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190612bd2565b6119fe565b60405161070b919061258c565b60405180910390f35b34801561072057600080fd5b50610729611a92565b6040516107369190612793565b60405180910390f35b34801561074b57600080fd5b50610766600480360381019061076191906129e8565b611ab6565b005b34801561077457600080fd5b5061077d611b39565b60405161078a9190612793565b60405180910390f35b600061079e82611b80565b9050919050565b6060600280546107b490612c41565b80601f01602080910402602001604051908101604052809291908181526020018280546107e090612c41565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282611bfa565b610878576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c182610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff166108e2611c59565b73ffffffffffffffffffffffffffffffffffffffff16146109455761090e81610909611c59565b6119fe565b610944576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a04611c61565b6001546000540303905090565b6000610a1c82611c6a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a83576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a8f84611d36565b91509150610aa58187610aa0611c59565b611d5d565b610af157610aba86610ab5611c59565b6119fe565b610af0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b57576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b648686866001611da1565b8015610b6f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c3d85610c19888887611da7565b7c020000000000000000000000000000000000000000000000000000000017611dcf565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610cc35760006001850190506000600460008381526020019081526020016000205403610cc1576000548114610cc0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d2b8686866001611dfa565b505050505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ec85760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ed2611e00565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610efe9190612ca1565b610f089190612d12565b90508160000151819350935050509250929050565b610f25611e0a565b6001600e60006101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f81838383604051806020016040528060008152506118ae565b505050565b610f8e611e0a565b80600b8190555050565b610fa0611e0a565b80600f9081610faf9190612eef565b5050565b600d5481565b6000610fc482611c6a565b9050919050565b600f8054610fd890612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461100490612c41565b80156110515780601f1061102657610100808354040283529160200191611051565b820191906000526020600020905b81548152906001019060200180831161103457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611119611e0a565b6111236000611e88565b565b600c5481565b60011515600e60009054906101000a900460ff16151514611181576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111789061300d565b60405180910390fd5b600b5461118d33611f4e565b82611198919061302d565b11156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906130ad565b60405180910390fd5b600c54816111e56109fa565b6111ef919061302d565b1115611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613119565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000000000000000060326033600d546112639190612ca1565b61126d9190612d12565b611277919061302d565b6112819190612ca1565b3410156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613185565b60405180910390fd5b80600d546112d19190612ca1565b60106000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611341919061302d565b92505081905550807f00000000000000000000000000000000000000000000000000000000000000006032600d546113799190612d12565b611383919061302d565b61138d9190612ca1565b601060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113fb919061302d565b9250508190555061140c3382611fa5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611441611e0a565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16836040516115b9906131d6565b60006040518083038185875af1925050503d80600081146115f6576040519150601f19603f3d011682016040523d82523d6000602084013e6115fb565b606091505b5050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683604051611645906131d6565b60006040518083038185875af1925050503d8060008114611682576040519150601f19603f3d011682016040523d82523d6000602084013e611687565b606091505b505090508180156116955750805b6116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613237565b60405180910390fd5b50505050565b6060600380546116e990612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461171590612c41565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b5050505050905090565b8060076000611779611c59565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611826611c59565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186b919061258c565b60405180910390a35050565b61187f611e0a565b80600d8190555050565b611891611e0a565b80600e60006101000a81548160ff02191690831515021790555050565b6118b9848484610a11565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191b576118e484848484611fc3565b61191a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061192c82611bfa565b611962576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061196c612113565b9050600081510361198c57604051806020016040528060008152506119b7565b80611996846121a5565b6040516020016119a7929190613293565b6040516020818303038152906040525b915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600e60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611abe611e0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490613329565b60405180910390fd5b611b3681611e88565b50565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bf35750611bf2826121f5565b5b9050919050565b600081611c05611c61565b11158015611c14575060005482105b8015611c52575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611c79611c61565b11611cff57600054811015611cfe5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cfc575b60008103611cf2576004600083600190039350838152602001908152602001600020549050611cc8565b8092505050611d31565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dbe86868461225f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b611e12612268565b73ffffffffffffffffffffffffffffffffffffffff16611e3061140f565b73ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90613395565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611fbf828260405180602001604052806000815250612270565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fe9611c59565b8786866040518563ffffffff1660e01b815260040161200b949392919061340a565b6020604051808303816000875af192505050801561204757506040513d601f19601f82011682018060405250810190612044919061346b565b60015b6120c0573d8060008114612077576040519150601f19603f3d011682016040523d82523d6000602084013e61207c565b606091505b5060008151036120b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461212290612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461214e90612c41565b801561219b5780601f106121705761010080835404028352916020019161219b565b820191906000526020600020905b81548152906001019060200180831161217e57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156121e057600184039350600a81066030018453600a81049050806121be575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b600033905090565b61227a838361230d565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461230857600080549050600083820390505b6122ba6000868380600101945086611fc3565b6122f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106122a757816000541461230557600080fd5b50505b505050565b6000805490506000820361234d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61235a6000848385611da1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123d1836123c26000866000611da7565b6123cb856124c8565b17611dcf565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461247257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612437565b50600082036124ad576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124c36000848385611dfa565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612521816124ec565b811461252c57600080fd5b50565b60008135905061253e81612518565b92915050565b60006020828403121561255a576125596124e2565b5b60006125688482850161252f565b91505092915050565b60008115159050919050565b61258681612571565b82525050565b60006020820190506125a1600083018461257d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125e15780820151818401526020810190506125c6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612609826125a7565b61261381856125b2565b93506126238185602086016125c3565b61262c816125ed565b840191505092915050565b6000602082019050818103600083015261265181846125fe565b905092915050565b6000819050919050565b61266c81612659565b811461267757600080fd5b50565b60008135905061268981612663565b92915050565b6000602082840312156126a5576126a46124e2565b5b60006126b38482850161267a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126e7826126bc565b9050919050565b6126f7816126dc565b82525050565b600060208201905061271260008301846126ee565b92915050565b612721816126dc565b811461272c57600080fd5b50565b60008135905061273e81612718565b92915050565b6000806040838503121561275b5761275a6124e2565b5b60006127698582860161272f565b925050602061277a8582860161267a565b9150509250929050565b61278d81612659565b82525050565b60006020820190506127a86000830184612784565b92915050565b6000806000606084860312156127c7576127c66124e2565b5b60006127d58682870161272f565b93505060206127e68682870161272f565b92505060406127f78682870161267a565b9150509250925092565b60008060408385031215612818576128176124e2565b5b60006128268582860161267a565b92505060206128378582860161267a565b9150509250929050565b600060408201905061285660008301856126ee565b6128636020830184612784565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128ac826125ed565b810181811067ffffffffffffffff821117156128cb576128ca612874565b5b80604052505050565b60006128de6124d8565b90506128ea82826128a3565b919050565b600067ffffffffffffffff82111561290a57612909612874565b5b612913826125ed565b9050602081019050919050565b82818337600083830152505050565b600061294261293d846128ef565b6128d4565b90508281526020810184848401111561295e5761295d61286f565b5b612969848285612920565b509392505050565b600082601f8301126129865761298561286a565b5b813561299684826020860161292f565b91505092915050565b6000602082840312156129b5576129b46124e2565b5b600082013567ffffffffffffffff8111156129d3576129d26124e7565b5b6129df84828501612971565b91505092915050565b6000602082840312156129fe576129fd6124e2565b5b6000612a0c8482850161272f565b91505092915050565b612a1e81612571565b8114612a2957600080fd5b50565b600081359050612a3b81612a15565b92915050565b60008060408385031215612a5857612a576124e2565b5b6000612a668582860161272f565b9250506020612a7785828601612a2c565b9150509250929050565b600060208284031215612a9757612a966124e2565b5b6000612aa584828501612a2c565b91505092915050565b600067ffffffffffffffff821115612ac957612ac8612874565b5b612ad2826125ed565b9050602081019050919050565b6000612af2612aed84612aae565b6128d4565b905082815260208101848484011115612b0e57612b0d61286f565b5b612b19848285612920565b509392505050565b600082601f830112612b3657612b3561286a565b5b8135612b46848260208601612adf565b91505092915050565b60008060008060808587031215612b6957612b686124e2565b5b6000612b778782880161272f565b9450506020612b888782880161272f565b9350506040612b998782880161267a565b925050606085013567ffffffffffffffff811115612bba57612bb96124e7565b5b612bc687828801612b21565b91505092959194509250565b60008060408385031215612be957612be86124e2565b5b6000612bf78582860161272f565b9250506020612c088582860161272f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c5957607f821691505b602082108103612c6c57612c6b612c12565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cac82612659565b9150612cb783612659565b9250828202612cc581612659565b91508282048414831517612cdc57612cdb612c72565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d1d82612659565b9150612d2883612659565b925082612d3857612d37612ce3565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612da57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d68565b612daf8683612d68565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612dec612de7612de284612659565b612dc7565b612659565b9050919050565b6000819050919050565b612e0683612dd1565b612e1a612e1282612df3565b848454612d75565b825550505050565b600090565b612e2f612e22565b612e3a818484612dfd565b505050565b5b81811015612e5e57612e53600082612e27565b600181019050612e40565b5050565b601f821115612ea357612e7481612d43565b612e7d84612d58565b81016020851015612e8c578190505b612ea0612e9885612d58565b830182612e3f565b50505b505050565b600082821c905092915050565b6000612ec660001984600802612ea8565b1980831691505092915050565b6000612edf8383612eb5565b9150826002028217905092915050565b612ef8826125a7565b67ffffffffffffffff811115612f1157612f10612874565b5b612f1b8254612c41565b612f26828285612e62565b600060209050601f831160018114612f595760008415612f47578287015190505b612f518582612ed3565b865550612fb9565b601f198416612f6786612d43565b60005b82811015612f8f57848901518255600182019150602085019450602081019050612f6a565b86831015612fac5784890151612fa8601f891682612eb5565b8355505b6001600288020188555050505b505050505050565b7f4d696e7420686173206e6f742073746172746564000000000000000000000000600082015250565b6000612ff76014836125b2565b915061300282612fc1565b602082019050919050565b6000602082019050818103600083015261302681612fea565b9050919050565b600061303882612659565b915061304383612659565b925082820190508082111561305b5761305a612c72565b5b92915050565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b60006130976012836125b2565b91506130a282613061565b602082019050919050565b600060208201905081810360008301526130c68161308a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b60006131036016836125b2565b915061310e826130cd565b602082019050919050565b60006020820190508181036000830152613132816130f6565b9050919050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b600061316f6015836125b2565b915061317a82613139565b602082019050919050565b6000602082019050818103600083015261319e81613162565b9050919050565b600081905092915050565b50565b60006131c06000836131a5565b91506131cb826131b0565b600082019050919050565b60006131e1826131b3565b9150819050919050565b7f5769746864726177205472616e73666572204661696c65640000000000000000600082015250565b60006132216018836125b2565b915061322c826131eb565b602082019050919050565b6000602082019050818103600083015261325081613214565b9050919050565b600081905092915050565b600061326d826125a7565b6132778185613257565b93506132878185602086016125c3565b80840191505092915050565b600061329f8285613262565b91506132ab8284613262565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133136026836125b2565b915061331e826132b7565b604082019050919050565b6000602082019050818103600083015261334281613306565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061337f6020836125b2565b915061338a82613349565b602082019050919050565b600060208201905081810360008301526133ae81613372565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006133dc826133b5565b6133e681856133c0565b93506133f68185602086016125c3565b6133ff816125ed565b840191505092915050565b600060808201905061341f60008301876126ee565b61342c60208301866126ee565b6134396040830185612784565b818103606083015261344b81846133d1565b905095945050505050565b60008151905061346581612518565b92915050565b600060208284031215613481576134806124e2565b5b600061348f84828501613456565b9150509291505056fea26469706673582212201626d2bebfa97dfbde1b992a7d764ac968e605601788eabcb90bbce940215f9d64736f6c63430008130033697066733a2f2f626166796265696763657569626e6e6c727079786d616b766c36726f376f6869767a6a6c717861366b636c71336c716c6d6d706f716377737977342f
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063758b4e861161010d578063b88d4fde116100a0578063e8656fcc1161006f578063e8656fcc146106ac578063e985e9c5146106d7578063f04ed8db14610714578063f2fde38b1461073f578063fea414b614610768576101f9565b8063b88d4fde146105fd578063c87b56dd14610619578063d263413214610656578063e626302614610681576101f9565b806395d89b41116100dc57806395d89b4114610557578063a22cb46514610582578063a2b40d19146105ab578063a8ddf8f6146105d4576101f9565b8063758b4e86146104db5780638467be0d146105065780638da5cb5b14610522578063905d7b331461054d576101f9565b80633a8e6b0e116101905780635dee9b171161015f5780635dee9b17146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487578063715018a6146104c4576101f9565b80633a8e6b0e1461035b57806342842e0e14610386578063480af5bc146103a257806355f804b3146103cb576101f9565b806318160ddd116101cc57806318160ddd146102bf57806323b872dd146102ea5780632a55205a146103065780632be0956114610344576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612544565b610793565b604051610232919061258c565b60405180910390f35b34801561024757600080fd5b506102506107a5565b60405161025d9190612637565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061268f565b610837565b60405161029a91906126fd565b60405180910390f35b6102bd60048036038101906102b89190612744565b6108b6565b005b3480156102cb57600080fd5b506102d46109fa565b6040516102e19190612793565b60405180910390f35b61030460048036038101906102ff91906127ae565b610a11565b005b34801561031257600080fd5b5061032d60048036038101906103289190612801565b610d33565b60405161033b929190612841565b60405180910390f35b34801561035057600080fd5b50610359610f1d565b005b34801561036757600080fd5b50610370610f42565b60405161037d91906126fd565b60405180910390f35b6103a0600480360381019061039b91906127ae565b610f66565b005b3480156103ae57600080fd5b506103c960048036038101906103c4919061268f565b610f86565b005b3480156103d757600080fd5b506103f260048036038101906103ed919061299f565b610f98565b005b34801561040057600080fd5b50610409610fb3565b6040516104169190612793565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061268f565b610fb9565b60405161045391906126fd565b60405180910390f35b34801561046857600080fd5b50610471610fcb565b60405161047e9190612637565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906129e8565b611059565b6040516104bb9190612793565b60405180910390f35b3480156104d057600080fd5b506104d9611111565b005b3480156104e757600080fd5b506104f0611125565b6040516104fd9190612793565b60405180910390f35b610520600480360381019061051b919061268f565b61112b565b005b34801561052e57600080fd5b5061053761140f565b60405161054491906126fd565b60405180910390f35b610555611439565b005b34801561056357600080fd5b5061056c6116da565b6040516105799190612637565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190612a41565b61176c565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061268f565b611877565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190612a81565b611889565b005b61061760048036038101906106129190612b4f565b6118ae565b005b34801561062557600080fd5b50610640600480360381019061063b919061268f565b611921565b60405161064d9190612637565b60405180910390f35b34801561066257600080fd5b5061066b6119bf565b60405161067891906126fd565b60405180910390f35b34801561068d57600080fd5b506106966119e5565b6040516106a39190612793565b60405180910390f35b3480156106b857600080fd5b506106c16119eb565b6040516106ce919061258c565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190612bd2565b6119fe565b60405161070b919061258c565b60405180910390f35b34801561072057600080fd5b50610729611a92565b6040516107369190612793565b60405180910390f35b34801561074b57600080fd5b50610766600480360381019061076191906129e8565b611ab6565b005b34801561077457600080fd5b5061077d611b39565b60405161078a9190612793565b60405180910390f35b600061079e82611b80565b9050919050565b6060600280546107b490612c41565b80601f01602080910402602001604051908101604052809291908181526020018280546107e090612c41565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282611bfa565b610878576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c182610fb9565b90508073ffffffffffffffffffffffffffffffffffffffff166108e2611c59565b73ffffffffffffffffffffffffffffffffffffffff16146109455761090e81610909611c59565b6119fe565b610944576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a04611c61565b6001546000540303905090565b6000610a1c82611c6a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a83576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a8f84611d36565b91509150610aa58187610aa0611c59565b611d5d565b610af157610aba86610ab5611c59565b6119fe565b610af0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b57576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b648686866001611da1565b8015610b6f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c3d85610c19888887611da7565b7c020000000000000000000000000000000000000000000000000000000017611dcf565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610cc35760006001850190506000600460008381526020019081526020016000205403610cc1576000548114610cc0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d2b8686866001611dfa565b505050505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ec85760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ed2611e00565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610efe9190612ca1565b610f089190612d12565b90508160000151819350935050509250929050565b610f25611e0a565b6001600e60006101000a81548160ff021916908315150217905550565b7f000000000000000000000000ffdd202184de72c8b7b79f4b1109892d375cf5da81565b610f81838383604051806020016040528060008152506118ae565b505050565b610f8e611e0a565b80600b8190555050565b610fa0611e0a565b80600f9081610faf9190612eef565b5050565b600d5481565b6000610fc482611c6a565b9050919050565b600f8054610fd890612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461100490612c41565b80156110515780601f1061102657610100808354040283529160200191611051565b820191906000526020600020905b81548152906001019060200180831161103457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611119611e0a565b6111236000611e88565b565b600c5481565b60011515600e60009054906101000a900460ff16151514611181576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111789061300d565b60405180910390fd5b600b5461118d33611f4e565b82611198919061302d565b11156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906130ad565b60405180910390fd5b600c54816111e56109fa565b6111ef919061302d565b1115611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613119565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000003d641185b800060326033600d546112639190612ca1565b61126d9190612d12565b611277919061302d565b6112819190612ca1565b3410156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613185565b60405180910390fd5b80600d546112d19190612ca1565b60106000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611341919061302d565b92505081905550807f0000000000000000000000000000000000000000000000000003d641185b80006032600d546113799190612d12565b611383919061302d565b61138d9190612ca1565b601060007f000000000000000000000000ffdd202184de72c8b7b79f4b1109892d375cf5da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113fb919061302d565b9250508190555061140c3382611fa5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611441611e0a565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601060007f000000000000000000000000ffdd202184de72c8b7b79f4b1109892d375cf5da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060007f000000000000000000000000ffdd202184de72c8b7b79f4b1109892d375cf5da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16836040516115b9906131d6565b60006040518083038185875af1925050503d80600081146115f6576040519150601f19603f3d011682016040523d82523d6000602084013e6115fb565b606091505b5050905060007f000000000000000000000000ffdd202184de72c8b7b79f4b1109892d375cf5da73ffffffffffffffffffffffffffffffffffffffff1683604051611645906131d6565b60006040518083038185875af1925050503d8060008114611682576040519150601f19603f3d011682016040523d82523d6000602084013e611687565b606091505b505090508180156116955750805b6116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613237565b60405180910390fd5b50505050565b6060600380546116e990612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461171590612c41565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b5050505050905090565b8060076000611779611c59565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611826611c59565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186b919061258c565b60405180910390a35050565b61187f611e0a565b80600d8190555050565b611891611e0a565b80600e60006101000a81548160ff02191690831515021790555050565b6118b9848484610a11565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191b576118e484848484611fc3565b61191a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061192c82611bfa565b611962576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061196c612113565b9050600081510361198c57604051806020016040528060008152506119b7565b80611996846121a5565b6040516020016119a7929190613293565b6040516020818303038152906040525b915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600e60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f0000000000000000000000000000000000000000000000000003d641185b800081565b611abe611e0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490613329565b60405180910390fd5b611b3681611e88565b50565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bf35750611bf2826121f5565b5b9050919050565b600081611c05611c61565b11158015611c14575060005482105b8015611c52575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611c79611c61565b11611cff57600054811015611cfe5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611cfc575b60008103611cf2576004600083600190039350838152602001908152602001600020549050611cc8565b8092505050611d31565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dbe86868461225f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b611e12612268565b73ffffffffffffffffffffffffffffffffffffffff16611e3061140f565b73ffffffffffffffffffffffffffffffffffffffff1614611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90613395565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611fbf828260405180602001604052806000815250612270565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fe9611c59565b8786866040518563ffffffff1660e01b815260040161200b949392919061340a565b6020604051808303816000875af192505050801561204757506040513d601f19601f82011682018060405250810190612044919061346b565b60015b6120c0573d8060008114612077576040519150601f19603f3d011682016040523d82523d6000602084013e61207c565b606091505b5060008151036120b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461212290612c41565b80601f016020809104026020016040519081016040528092919081815260200182805461214e90612c41565b801561219b5780601f106121705761010080835404028352916020019161219b565b820191906000526020600020905b81548152906001019060200180831161217e57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156121e057600184039350600a81066030018453600a81049050806121be575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b600033905090565b61227a838361230d565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461230857600080549050600083820390505b6122ba6000868380600101945086611fc3565b6122f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106122a757816000541461230557600080fd5b50505b505050565b6000805490506000820361234d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61235a6000848385611da1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123d1836123c26000866000611da7565b6123cb856124c8565b17611dcf565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461247257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612437565b50600082036124ad576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124c36000848385611dfa565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612521816124ec565b811461252c57600080fd5b50565b60008135905061253e81612518565b92915050565b60006020828403121561255a576125596124e2565b5b60006125688482850161252f565b91505092915050565b60008115159050919050565b61258681612571565b82525050565b60006020820190506125a1600083018461257d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125e15780820151818401526020810190506125c6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612609826125a7565b61261381856125b2565b93506126238185602086016125c3565b61262c816125ed565b840191505092915050565b6000602082019050818103600083015261265181846125fe565b905092915050565b6000819050919050565b61266c81612659565b811461267757600080fd5b50565b60008135905061268981612663565b92915050565b6000602082840312156126a5576126a46124e2565b5b60006126b38482850161267a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126e7826126bc565b9050919050565b6126f7816126dc565b82525050565b600060208201905061271260008301846126ee565b92915050565b612721816126dc565b811461272c57600080fd5b50565b60008135905061273e81612718565b92915050565b6000806040838503121561275b5761275a6124e2565b5b60006127698582860161272f565b925050602061277a8582860161267a565b9150509250929050565b61278d81612659565b82525050565b60006020820190506127a86000830184612784565b92915050565b6000806000606084860312156127c7576127c66124e2565b5b60006127d58682870161272f565b93505060206127e68682870161272f565b92505060406127f78682870161267a565b9150509250925092565b60008060408385031215612818576128176124e2565b5b60006128268582860161267a565b92505060206128378582860161267a565b9150509250929050565b600060408201905061285660008301856126ee565b6128636020830184612784565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128ac826125ed565b810181811067ffffffffffffffff821117156128cb576128ca612874565b5b80604052505050565b60006128de6124d8565b90506128ea82826128a3565b919050565b600067ffffffffffffffff82111561290a57612909612874565b5b612913826125ed565b9050602081019050919050565b82818337600083830152505050565b600061294261293d846128ef565b6128d4565b90508281526020810184848401111561295e5761295d61286f565b5b612969848285612920565b509392505050565b600082601f8301126129865761298561286a565b5b813561299684826020860161292f565b91505092915050565b6000602082840312156129b5576129b46124e2565b5b600082013567ffffffffffffffff8111156129d3576129d26124e7565b5b6129df84828501612971565b91505092915050565b6000602082840312156129fe576129fd6124e2565b5b6000612a0c8482850161272f565b91505092915050565b612a1e81612571565b8114612a2957600080fd5b50565b600081359050612a3b81612a15565b92915050565b60008060408385031215612a5857612a576124e2565b5b6000612a668582860161272f565b9250506020612a7785828601612a2c565b9150509250929050565b600060208284031215612a9757612a966124e2565b5b6000612aa584828501612a2c565b91505092915050565b600067ffffffffffffffff821115612ac957612ac8612874565b5b612ad2826125ed565b9050602081019050919050565b6000612af2612aed84612aae565b6128d4565b905082815260208101848484011115612b0e57612b0d61286f565b5b612b19848285612920565b509392505050565b600082601f830112612b3657612b3561286a565b5b8135612b46848260208601612adf565b91505092915050565b60008060008060808587031215612b6957612b686124e2565b5b6000612b778782880161272f565b9450506020612b888782880161272f565b9350506040612b998782880161267a565b925050606085013567ffffffffffffffff811115612bba57612bb96124e7565b5b612bc687828801612b21565b91505092959194509250565b60008060408385031215612be957612be86124e2565b5b6000612bf78582860161272f565b9250506020612c088582860161272f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c5957607f821691505b602082108103612c6c57612c6b612c12565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cac82612659565b9150612cb783612659565b9250828202612cc581612659565b91508282048414831517612cdc57612cdb612c72565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d1d82612659565b9150612d2883612659565b925082612d3857612d37612ce3565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612da57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d68565b612daf8683612d68565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612dec612de7612de284612659565b612dc7565b612659565b9050919050565b6000819050919050565b612e0683612dd1565b612e1a612e1282612df3565b848454612d75565b825550505050565b600090565b612e2f612e22565b612e3a818484612dfd565b505050565b5b81811015612e5e57612e53600082612e27565b600181019050612e40565b5050565b601f821115612ea357612e7481612d43565b612e7d84612d58565b81016020851015612e8c578190505b612ea0612e9885612d58565b830182612e3f565b50505b505050565b600082821c905092915050565b6000612ec660001984600802612ea8565b1980831691505092915050565b6000612edf8383612eb5565b9150826002028217905092915050565b612ef8826125a7565b67ffffffffffffffff811115612f1157612f10612874565b5b612f1b8254612c41565b612f26828285612e62565b600060209050601f831160018114612f595760008415612f47578287015190505b612f518582612ed3565b865550612fb9565b601f198416612f6786612d43565b60005b82811015612f8f57848901518255600182019150602085019450602081019050612f6a565b86831015612fac5784890151612fa8601f891682612eb5565b8355505b6001600288020188555050505b505050505050565b7f4d696e7420686173206e6f742073746172746564000000000000000000000000600082015250565b6000612ff76014836125b2565b915061300282612fc1565b602082019050919050565b6000602082019050818103600083015261302681612fea565b9050919050565b600061303882612659565b915061304383612659565b925082820190508082111561305b5761305a612c72565b5b92915050565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b60006130976012836125b2565b91506130a282613061565b602082019050919050565b600060208201905081810360008301526130c68161308a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b60006131036016836125b2565b915061310e826130cd565b602082019050919050565b60006020820190508181036000830152613132816130f6565b9050919050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b600061316f6015836125b2565b915061317a82613139565b602082019050919050565b6000602082019050818103600083015261319e81613162565b9050919050565b600081905092915050565b50565b60006131c06000836131a5565b91506131cb826131b0565b600082019050919050565b60006131e1826131b3565b9150819050919050565b7f5769746864726177205472616e73666572204661696c65640000000000000000600082015250565b60006132216018836125b2565b915061322c826131eb565b602082019050919050565b6000602082019050818103600083015261325081613214565b9050919050565b600081905092915050565b600061326d826125a7565b6132778185613257565b93506132878185602086016125c3565b80840191505092915050565b600061329f8285613262565b91506132ab8284613262565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133136026836125b2565b915061331e826132b7565b604082019050919050565b6000602082019050818103600083015261334281613306565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061337f6020836125b2565b915061338a82613349565b602082019050919050565b600060208201905081810360008301526133ae81613372565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006133dc826133b5565b6133e681856133c0565b93506133f68185602086016125c3565b6133ff816125ed565b840191505092915050565b600060808201905061341f60008301876126ee565b61342c60208301866126ee565b6134396040830185612784565b818103606083015261344b81846133d1565b905095945050505050565b60008151905061346581612518565b92915050565b600060208284031215613481576134806124e2565b5b600061348f84828501613456565b9150509291505056fea26469706673582212201626d2bebfa97dfbde1b992a7d764ac968e605601788eabcb90bbce940215f9d64736f6c63430008130033
Deployed Bytecode Sourcemap
62081:3579:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65393:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29849:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36340:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35773:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25600:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39979:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4498:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63201:95;;;;;;;;;;;;;:::i;:::-;;62577:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42900:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64492:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64626:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62237:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31242:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62393:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26784:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9726:103;;;;;;;;;;;;;:::i;:::-;;62199:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63304:658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9085:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63970:499;;;:::i;:::-;;30025:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36898:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64735:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63057:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43691:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30235:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62694:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62156:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62345:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37289:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62282:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9984:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64967:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65393:163;65488:4;65512:36;65536:11;65512:23;:36::i;:::-;65505:43;;65393:163;;;:::o;29849:100::-;29903:13;29936:5;29929:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29849:100;:::o;36340:218::-;36416:7;36441:16;36449:7;36441;:16::i;:::-;36436:64;;36466:34;;;;;;;;;;;;;;36436:64;36520:15;:24;36536:7;36520:24;;;;;;;;;;;:30;;;;;;;;;;;;36513:37;;36340:218;;;:::o;35773:408::-;35862:13;35878:16;35886:7;35878;:16::i;:::-;35862:32;;35934:5;35911:28;;:19;:17;:19::i;:::-;:28;;;35907:175;;35959:44;35976:5;35983:19;:17;:19::i;:::-;35959:16;:44::i;:::-;35954:128;;36031:35;;;;;;;;;;;;;;35954:128;35907:175;36127:2;36094:15;:24;36110:7;36094:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36165:7;36161:2;36145:28;;36154:5;36145:28;;;;;;;;;;;;35851:330;35773:408;;:::o;25600:323::-;25661:7;25889:15;:13;:15::i;:::-;25874:12;;25858:13;;:28;:46;25851:53;;25600:323;:::o;39979:2825::-;40121:27;40151;40170:7;40151:18;:27::i;:::-;40121:57;;40236:4;40195:45;;40211:19;40195:45;;;40191:86;;40249:28;;;;;;;;;;;;;;40191:86;40291:27;40320:23;40347:35;40374:7;40347:26;:35::i;:::-;40290:92;;;;40482:68;40507:15;40524:4;40530:19;:17;:19::i;:::-;40482:24;:68::i;:::-;40477:180;;40570:43;40587:4;40593:19;:17;:19::i;:::-;40570:16;:43::i;:::-;40565:92;;40622:35;;;;;;;;;;;;;;40565:92;40477:180;40688:1;40674:16;;:2;:16;;;40670:52;;40699:23;;;;;;;;;;;;;;40670:52;40735:43;40757:4;40763:2;40767:7;40776:1;40735:21;:43::i;:::-;40871:15;40868:160;;;41011:1;40990:19;40983:30;40868:160;41408:18;:24;41427:4;41408:24;;;;;;;;;;;;;;;;41406:26;;;;;;;;;;;;41477:18;:22;41496:2;41477:22;;;;;;;;;;;;;;;;41475:24;;;;;;;;;;;41799:146;41836:2;41885:45;41900:4;41906:2;41910:19;41885:14;:45::i;:::-;21999:8;41857:73;41799:18;:146::i;:::-;41770:17;:26;41788:7;41770:26;;;;;;;;;;;:175;;;;42116:1;21999:8;42065:19;:47;:52;42061:627;;42138:19;42170:1;42160:7;:11;42138:33;;42327:1;42293:17;:30;42311:11;42293:30;;;;;;;;;;;;:35;42289:384;;42431:13;;42416:11;:28;42412:242;;42611:19;42578:17;:30;42596:11;42578:30;;;;;;;;;;;:52;;;;42412:242;42289:384;42119:569;42061:627;42735:7;42731:2;42716:27;;42725:4;42716:27;;;;;;;;;;;;42754:42;42775:4;42781:2;42785:7;42794:1;42754:20;:42::i;:::-;40110:2694;;;39979:2825;;;:::o;4498:438::-;4593:7;4602;4622:26;4651:17;:26;4669:7;4651:26;;;;;;;;;;;4622:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4722:1;4694:30;;:7;:16;;;:30;;;4690:92;;4751:19;4741:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4690:92;4794:21;4858:17;:15;:17::i;:::-;4818:57;;4831:7;:23;;;4819:35;;:9;:35;;;;:::i;:::-;4818:57;;;;:::i;:::-;4794:81;;4896:7;:16;;;4914:13;4888:40;;;;;;4498:438;;;;;:::o;63201:95::-;8971:13;:11;:13::i;:::-;63284:4:::1;63273:8;;:15;;;;;;;;;;;;;;;;;;63201:95::o:0;62577:73::-;;;:::o;42900:193::-;43046:39;43063:4;43069:2;43073:7;43046:39;;;;;;;;;;;;:16;:39::i;:::-;42900:193;;;:::o;64492:126::-;8971:13;:11;:13::i;:::-;64592:18:::1;64574:15;:36;;;;64492:126:::0;:::o;64626:101::-;8971:13;:11;:13::i;:::-;64709:10:::1;64699:7;:20;;;;;;:::i;:::-;;64626:101:::0;:::o;62237:38::-;;;;:::o;31242:152::-;31314:7;31357:27;31376:7;31357:18;:27::i;:::-;31334:52;;31242:152;;;:::o;62393:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26784:233::-;26856:7;26897:1;26880:19;;:5;:19;;;26876:60;;26908:28;;;;;;;;;;;;;;26876:60;20943:13;26954:18;:25;26973:5;26954:25;;;;;;;;;;;;;;;;:55;26947:62;;26784:233;;;:::o;9726:103::-;8971:13;:11;:13::i;:::-;9791:30:::1;9818:1;9791:18;:30::i;:::-;9726:103::o:0;62199:31::-;;;;:::o;63304:658::-;63465:4;63453:16;;:8;;;;;;;;;;;:16;;;63445:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;63551:15;;63522:25;63536:10;63522:13;:25::i;:::-;63513:6;:34;;;;:::i;:::-;:53;;63505:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;63634:9;;63624:6;63608:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;63600:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;63746:6;63726:15;63721:2;63717;63705:9;;:14;;;;:::i;:::-;63704:19;;;;:::i;:::-;:37;;;;:::i;:::-;63703:49;;;;:::i;:::-;63689:9;:64;;63681:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;63829:6;63817:9;;:18;;;;:::i;:::-;63792:15;:20;63808:3;;;;;;;;;;;63792:20;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;63908:6;63889:15;63883:2;63873:9;;:12;;;;:::i;:::-;63872:32;;;;:::i;:::-;63871:43;;;;:::i;:::-;63847:15;:20;63863:3;63847:20;;;;;;;;;;;;;;;;:67;;;;;;;:::i;:::-;;;;;;;;63925:29;63935:10;63947:6;63925:9;:29::i;:::-;63304:658;:::o;9085:87::-;9131:7;9158:6;;;;;;;;;;;9151:13;;9085:87;:::o;63970:499::-;8971:13;:11;:13::i;:::-;64033:19:::1;64055:15;:27;64071:10;64055:27;;;;;;;;;;;;;;;;64033:49;;64091:20;64114:15;:20;64130:3;64114:20;;;;;;;;;;;;;;;;64091:43;;64211:1;64181:15;:27;64197:10;64181:27;;;;;;;;;;;;;;;:31;;;;64244:1;64221:15;:20;64237:3;64221:20;;;;;;;;;;;;;;;:24;;;;64257:13;64284:10;64276:24;;64308:11;64276:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64256:68;;;64334:13;64361:3;64353:17;;64378:12;64353:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64333:62;;;64412:8;:20;;;;;64424:8;64412:20;64404:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64024:445;;;;63970:499::o:0;30025:104::-;30081:13;30114:7;30107:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30025:104;:::o;36898:234::-;37045:8;36993:18;:39;37012:19;:17;:19::i;:::-;36993:39;;;;;;;;;;;;;;;:49;37033:8;36993:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37105:8;37069:55;;37084:19;:17;:19::i;:::-;37069:55;;;37115:8;37069:55;;;;;;:::i;:::-;;;;;;;;36898:234;;:::o;64735:99::-;8971:13;:11;:13::i;:::-;64816:10:::1;64804:9;:22;;;;64735:99:::0;:::o;63057:115::-;8971:13;:11;:13::i;:::-;63158:6:::1;63147:8;;:17;;;;;;;;;;;;;;;;;;63057:115:::0;:::o;43691:407::-;43866:31;43879:4;43885:2;43889:7;43866:12;:31::i;:::-;43930:1;43912:2;:14;;;:19;43908:183;;43951:56;43982:4;43988:2;43992:7;44001:5;43951:30;:56::i;:::-;43946:145;;44035:40;;;;;;;;;;;;;;43946:145;43908:183;43691:407;;;;:::o;30235:318::-;30308:13;30339:16;30347:7;30339;:16::i;:::-;30334:59;;30364:29;;;;;;;;;;;;;;30334:59;30406:21;30430:10;:8;:10::i;:::-;30406:34;;30483:1;30464:7;30458:21;:26;:87;;;;;;;;;;;;;;;;;30511:7;30520:18;30530:7;30520:9;:18::i;:::-;30494:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30458:87;30451:94;;;30235:318;;;:::o;62694:63::-;;;;;;;;;;;;;:::o;62156:36::-;;;;:::o;62345:28::-;;;;;;;;;;;;;:::o;37289:164::-;37386:4;37410:18;:25;37429:5;37410:25;;;;;;;;;;;;;;;:35;37436:8;37410:35;;;;;;;;;;;;;;;;;;;;;;;;;37403:42;;37289:164;;;;:::o;62282:56::-;;;:::o;9984:201::-;8971:13;:11;:13::i;:::-;10093:1:::1;10073:22;;:8;:22;;::::0;10065:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10149:28;10168:8;10149:18;:28::i;:::-;9984:201:::0;:::o;64967:110::-;65018:7;65042:15;:27;65058:10;65042:27;;;;;;;;;;;;;;;;65035:34;;64967:110;:::o;4228:215::-;4330:4;4369:26;4354:41;;;:11;:41;;;;:81;;;;4399:36;4423:11;4399:23;:36::i;:::-;4354:81;4347:88;;4228:215;;;:::o;37711:282::-;37776:4;37832:7;37813:15;:13;:15::i;:::-;:26;;:66;;;;;37866:13;;37856:7;:23;37813:66;:153;;;;;37965:1;21719:8;37917:17;:26;37935:7;37917:26;;;;;;;;;;;;:44;:49;37813:153;37793:173;;37711:282;;;:::o;60019:105::-;60079:7;60106:10;60099:17;;60019:105;:::o;65236:101::-;65301:7;65328:1;65321:8;;65236:101;:::o;32397:1275::-;32464:7;32484:12;32499:7;32484:22;;32567:4;32548:15;:13;:15::i;:::-;:23;32544:1061;;32601:13;;32594:4;:20;32590:1015;;;32639:14;32656:17;:23;32674:4;32656:23;;;;;;;;;;;;32639:40;;32773:1;21719:8;32745:6;:24;:29;32741:845;;33410:113;33427:1;33417:6;:11;33410:113;;33470:17;:25;33488:6;;;;;;;33470:25;;;;;;;;;;;;33461:34;;33410:113;;;33556:6;33549:13;;;;;;32741:845;32616:989;32590:1015;32544:1061;33633:31;;;;;;;;;;;;;;32397:1275;;;;:::o;38874:485::-;38976:27;39005:23;39046:38;39087:15;:24;39103:7;39087:24;;;;;;;;;;;39046:65;;39264:18;39241:41;;39321:19;39315:26;39296:45;;39226:126;38874:485;;;:::o;38102:659::-;38251:11;38416:16;38409:5;38405:28;38396:37;;38576:16;38565:9;38561:32;38548:45;;38726:15;38715:9;38712:30;38704:5;38693:9;38690:20;38687:56;38677:66;;38102:659;;;;;:::o;44760:159::-;;;;;:::o;59328:311::-;59463:7;59483:16;22123:3;59509:19;:41;;59483:68;;22123:3;59577:31;59588:4;59594:2;59598:9;59577:10;:31::i;:::-;59569:40;;:62;;59562:69;;;59328:311;;;;;:::o;34220:450::-;34300:14;34468:16;34461:5;34457:28;34448:37;;34645:5;34631:11;34606:23;34602:41;34599:52;34592:5;34589:63;34579:73;;34220:450;;;;:::o;45584:158::-;;;;;:::o;5218:97::-;5276:6;5302:5;5295:12;;5218:97;:::o;9250:132::-;9325:12;:10;:12::i;:::-;9314:23;;:7;:5;:7::i;:::-;:23;;;9306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9250:132::o;10345:191::-;10419:16;10438:6;;;;;;;;;;;10419:25;;10464:8;10455:6;;:17;;;;;;;;;;;;;;;;;;10519:8;10488:40;;10509:8;10488:40;;;;;;;;;;;;10408:128;10345:191;:::o;27099:178::-;27160:7;20943:13;21081:2;27188:18;:25;27207:5;27188:25;;;;;;;;;;;;;;;;:50;;27187:82;27180:89;;27099:178;;;:::o;53851:112::-;53928:27;53938:2;53942:8;53928:27;;;;;;;;;;;;:9;:27::i;:::-;53851:112;;:::o;46182:716::-;46345:4;46391:2;46366:45;;;46412:19;:17;:19::i;:::-;46433:4;46439:7;46448:5;46366:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46362:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46666:1;46649:6;:13;:18;46645:235;;46695:40;;;;;;;;;;;;;;46645:235;46838:6;46832:13;46823:6;46819:2;46815:15;46808:38;46362:529;46535:54;;;46525:64;;;:6;:64;;;;46518:71;;;46182:716;;;;;;:::o;64859:100::-;64911:13;64944:7;64937:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64859:100;:::o;60226:1745::-;60291:17;60725:4;60718;60712:11;60708:22;60817:1;60811:4;60804:15;60892:4;60889:1;60885:12;60878:19;;60974:1;60969:3;60962:14;61078:3;61317:5;61299:428;61325:1;61299:428;;;61365:1;61360:3;61356:11;61349:18;;61536:2;61530:4;61526:13;61522:2;61518:22;61513:3;61505:36;61630:2;61624:4;61620:13;61612:21;;61697:4;61299:428;61687:25;61299:428;61303:21;61766:3;61761;61757:13;61881:4;61876:3;61872:14;61865:21;;61946:6;61941:3;61934:19;60330:1634;;;60226:1745;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;59029:147::-;59166:6;59029:147;;;;;:::o;7636:98::-;7689:7;7716:10;7709:17;;7636:98;:::o;53078:689::-;53209:19;53215:2;53219:8;53209:5;:19::i;:::-;53288:1;53270:2;:14;;;:19;53266:483;;53310:11;53324:13;;53310:27;;53356:13;53378:8;53372:3;:14;53356:30;;53405:233;53436:62;53475:1;53479:2;53483:7;;;;;;53492:5;53436:30;:62::i;:::-;53431:167;;53534:40;;;;;;;;;;;;;;53431:167;53633:3;53625:5;:11;53405:233;;53720:3;53703:13;;:20;53699:34;;53725:8;;;53699:34;53291:458;;53266:483;53078:689;;;:::o;47360:2966::-;47433:20;47456:13;;47433:36;;47496:1;47484:8;:13;47480:44;;47506:18;;;;;;;;;;;;;;47480:44;47537:61;47567:1;47571:2;47575:12;47589:8;47537:21;:61::i;:::-;48081:1;21081:2;48051:1;:26;;48050:32;48038:8;:45;48012:18;:22;48031:2;48012:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;48360:139;48397:2;48451:33;48474:1;48478:2;48482:1;48451:14;:33::i;:::-;48418:30;48439:8;48418:20;:30::i;:::-;:66;48360:18;:139::i;:::-;48326:17;:31;48344:12;48326:31;;;;;;;;;;;:173;;;;48516:16;48547:11;48576:8;48561:12;:23;48547:37;;49097:16;49093:2;49089:25;49077:37;;49469:12;49429:8;49388:1;49326:25;49267:1;49206;49179:335;49840:1;49826:12;49822:20;49780:346;49881:3;49872:7;49869:16;49780:346;;50099:7;50089:8;50086:1;50059:25;50056:1;50053;50048:59;49934:1;49925:7;49921:15;49910:26;;49780:346;;;49784:77;50171:1;50159:8;:13;50155:45;;50181:19;;;;;;;;;;;;;;50155:45;50233:3;50217:13;:19;;;;47786:2462;;50258:60;50287:1;50291:2;50295:12;50309:8;50258:20;:60::i;:::-;47422:2904;47360:2966;;:::o;34772:324::-;34842:14;35075:1;35065:8;35062:15;35036:24;35032:46;35022:56;;34772:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:180;6979:77;6976:1;6969:88;7076:4;7073:1;7066:15;7100:4;7097:1;7090:15;7117:281;7200:27;7222:4;7200:27;:::i;:::-;7192:6;7188:40;7330:6;7318:10;7315:22;7294:18;7282:10;7279:34;7276:62;7273:88;;;7341:18;;:::i;:::-;7273:88;7381:10;7377:2;7370:22;7160:238;7117:281;;:::o;7404:129::-;7438:6;7465:20;;:::i;:::-;7455:30;;7494:33;7522:4;7514:6;7494:33;:::i;:::-;7404:129;;;:::o;7539:308::-;7601:4;7691:18;7683:6;7680:30;7677:56;;;7713:18;;:::i;:::-;7677:56;7751:29;7773:6;7751:29;:::i;:::-;7743:37;;7835:4;7829;7825:15;7817:23;;7539:308;;;:::o;7853:146::-;7950:6;7945:3;7940;7927:30;7991:1;7982:6;7977:3;7973:16;7966:27;7853:146;;;:::o;8005:425::-;8083:5;8108:66;8124:49;8166:6;8124:49;:::i;:::-;8108:66;:::i;:::-;8099:75;;8197:6;8190:5;8183:21;8235:4;8228:5;8224:16;8273:3;8264:6;8259:3;8255:16;8252:25;8249:112;;;8280:79;;:::i;:::-;8249:112;8370:54;8417:6;8412:3;8407;8370:54;:::i;:::-;8089:341;8005:425;;;;;:::o;8450:340::-;8506:5;8555:3;8548:4;8540:6;8536:17;8532:27;8522:122;;8563:79;;:::i;:::-;8522:122;8680:6;8667:20;8705:79;8780:3;8772:6;8765:4;8757:6;8753:17;8705:79;:::i;:::-;8696:88;;8512:278;8450:340;;;;:::o;8796:509::-;8865:6;8914:2;8902:9;8893:7;8889:23;8885:32;8882:119;;;8920:79;;:::i;:::-;8882:119;9068:1;9057:9;9053:17;9040:31;9098:18;9090:6;9087:30;9084:117;;;9120:79;;:::i;:::-;9084:117;9225:63;9280:7;9271:6;9260:9;9256:22;9225:63;:::i;:::-;9215:73;;9011:287;8796:509;;;;:::o;9311:329::-;9370:6;9419:2;9407:9;9398:7;9394:23;9390:32;9387:119;;;9425:79;;:::i;:::-;9387:119;9545:1;9570:53;9615:7;9606:6;9595:9;9591:22;9570:53;:::i;:::-;9560:63;;9516:117;9311:329;;;;:::o;9646:116::-;9716:21;9731:5;9716:21;:::i;:::-;9709:5;9706:32;9696:60;;9752:1;9749;9742:12;9696:60;9646:116;:::o;9768:133::-;9811:5;9849:6;9836:20;9827:29;;9865:30;9889:5;9865:30;:::i;:::-;9768:133;;;;:::o;9907:468::-;9972:6;9980;10029:2;10017:9;10008:7;10004:23;10000:32;9997:119;;;10035:79;;:::i;:::-;9997:119;10155:1;10180:53;10225:7;10216:6;10205:9;10201:22;10180:53;:::i;:::-;10170:63;;10126:117;10282:2;10308:50;10350:7;10341:6;10330:9;10326:22;10308:50;:::i;:::-;10298:60;;10253:115;9907:468;;;;;:::o;10381:323::-;10437:6;10486:2;10474:9;10465:7;10461:23;10457:32;10454:119;;;10492:79;;:::i;:::-;10454:119;10612:1;10637:50;10679:7;10670:6;10659:9;10655:22;10637:50;:::i;:::-;10627:60;;10583:114;10381:323;;;;:::o;10710:307::-;10771:4;10861:18;10853:6;10850:30;10847:56;;;10883:18;;:::i;:::-;10847:56;10921:29;10943:6;10921:29;:::i;:::-;10913:37;;11005:4;10999;10995:15;10987:23;;10710:307;;;:::o;11023:423::-;11100:5;11125:65;11141:48;11182:6;11141:48;:::i;:::-;11125:65;:::i;:::-;11116:74;;11213:6;11206:5;11199:21;11251:4;11244:5;11240:16;11289:3;11280:6;11275:3;11271:16;11268:25;11265:112;;;11296:79;;:::i;:::-;11265:112;11386:54;11433:6;11428:3;11423;11386:54;:::i;:::-;11106:340;11023:423;;;;;:::o;11465:338::-;11520:5;11569:3;11562:4;11554:6;11550:17;11546:27;11536:122;;11577:79;;:::i;:::-;11536:122;11694:6;11681:20;11719:78;11793:3;11785:6;11778:4;11770:6;11766:17;11719:78;:::i;:::-;11710:87;;11526:277;11465:338;;;;:::o;11809:943::-;11904:6;11912;11920;11928;11977:3;11965:9;11956:7;11952:23;11948:33;11945:120;;;11984:79;;:::i;:::-;11945:120;12104:1;12129:53;12174:7;12165:6;12154:9;12150:22;12129:53;:::i;:::-;12119:63;;12075:117;12231:2;12257:53;12302:7;12293:6;12282:9;12278:22;12257:53;:::i;:::-;12247:63;;12202:118;12359:2;12385:53;12430:7;12421:6;12410:9;12406:22;12385:53;:::i;:::-;12375:63;;12330:118;12515:2;12504:9;12500:18;12487:32;12546:18;12538:6;12535:30;12532:117;;;12568:79;;:::i;:::-;12532:117;12673:62;12727:7;12718:6;12707:9;12703:22;12673:62;:::i;:::-;12663:72;;12458:287;11809:943;;;;;;;:::o;12758:474::-;12826:6;12834;12883:2;12871:9;12862:7;12858:23;12854:32;12851:119;;;12889:79;;:::i;:::-;12851:119;13009:1;13034:53;13079:7;13070:6;13059:9;13055:22;13034:53;:::i;:::-;13024:63;;12980:117;13136:2;13162:53;13207:7;13198:6;13187:9;13183:22;13162:53;:::i;:::-;13152:63;;13107:118;12758:474;;;;;:::o;13238:180::-;13286:77;13283:1;13276:88;13383:4;13380:1;13373:15;13407:4;13404:1;13397:15;13424:320;13468:6;13505:1;13499:4;13495:12;13485:22;;13552:1;13546:4;13542:12;13573:18;13563:81;;13629:4;13621:6;13617:17;13607:27;;13563:81;13691:2;13683:6;13680:14;13660:18;13657:38;13654:84;;13710:18;;:::i;:::-;13654:84;13475:269;13424:320;;;:::o;13750:180::-;13798:77;13795:1;13788:88;13895:4;13892:1;13885:15;13919:4;13916:1;13909:15;13936:410;13976:7;13999:20;14017:1;13999:20;:::i;:::-;13994:25;;14033:20;14051:1;14033:20;:::i;:::-;14028:25;;14088:1;14085;14081:9;14110:30;14128:11;14110:30;:::i;:::-;14099:41;;14289:1;14280:7;14276:15;14273:1;14270:22;14250:1;14243:9;14223:83;14200:139;;14319:18;;:::i;:::-;14200:139;13984:362;13936:410;;;;:::o;14352:180::-;14400:77;14397:1;14390:88;14497:4;14494:1;14487:15;14521:4;14518:1;14511:15;14538:185;14578:1;14595:20;14613:1;14595:20;:::i;:::-;14590:25;;14629:20;14647:1;14629:20;:::i;:::-;14624:25;;14668:1;14658:35;;14673:18;;:::i;:::-;14658:35;14715:1;14712;14708:9;14703:14;;14538:185;;;;:::o;14729:141::-;14778:4;14801:3;14793:11;;14824:3;14821:1;14814:14;14858:4;14855:1;14845:18;14837:26;;14729:141;;;:::o;14876:93::-;14913:6;14960:2;14955;14948:5;14944:14;14940:23;14930:33;;14876:93;;;:::o;14975:107::-;15019:8;15069:5;15063:4;15059:16;15038:37;;14975:107;;;;:::o;15088:393::-;15157:6;15207:1;15195:10;15191:18;15230:97;15260:66;15249:9;15230:97;:::i;:::-;15348:39;15378:8;15367:9;15348:39;:::i;:::-;15336:51;;15420:4;15416:9;15409:5;15405:21;15396:30;;15469:4;15459:8;15455:19;15448:5;15445:30;15435:40;;15164:317;;15088:393;;;;;:::o;15487:60::-;15515:3;15536:5;15529:12;;15487:60;;;:::o;15553:142::-;15603:9;15636:53;15654:34;15663:24;15681:5;15663:24;:::i;:::-;15654:34;:::i;:::-;15636:53;:::i;:::-;15623:66;;15553:142;;;:::o;15701:75::-;15744:3;15765:5;15758:12;;15701:75;;;:::o;15782:269::-;15892:39;15923:7;15892:39;:::i;:::-;15953:91;16002:41;16026:16;16002:41;:::i;:::-;15994:6;15987:4;15981:11;15953:91;:::i;:::-;15947:4;15940:105;15858:193;15782:269;;;:::o;16057:73::-;16102:3;16057:73;:::o;16136:189::-;16213:32;;:::i;:::-;16254:65;16312:6;16304;16298:4;16254:65;:::i;:::-;16189:136;16136:189;;:::o;16331:186::-;16391:120;16408:3;16401:5;16398:14;16391:120;;;16462:39;16499:1;16492:5;16462:39;:::i;:::-;16435:1;16428:5;16424:13;16415:22;;16391:120;;;16331:186;;:::o;16523:543::-;16624:2;16619:3;16616:11;16613:446;;;16658:38;16690:5;16658:38;:::i;:::-;16742:29;16760:10;16742:29;:::i;:::-;16732:8;16728:44;16925:2;16913:10;16910:18;16907:49;;;16946:8;16931:23;;16907:49;16969:80;17025:22;17043:3;17025:22;:::i;:::-;17015:8;17011:37;16998:11;16969:80;:::i;:::-;16628:431;;16613:446;16523:543;;;:::o;17072:117::-;17126:8;17176:5;17170:4;17166:16;17145:37;;17072:117;;;;:::o;17195:169::-;17239:6;17272:51;17320:1;17316:6;17308:5;17305:1;17301:13;17272:51;:::i;:::-;17268:56;17353:4;17347;17343:15;17333:25;;17246:118;17195:169;;;;:::o;17369:295::-;17445:4;17591:29;17616:3;17610:4;17591:29;:::i;:::-;17583:37;;17653:3;17650:1;17646:11;17640:4;17637:21;17629:29;;17369:295;;;;:::o;17669:1395::-;17786:37;17819:3;17786:37;:::i;:::-;17888:18;17880:6;17877:30;17874:56;;;17910:18;;:::i;:::-;17874:56;17954:38;17986:4;17980:11;17954:38;:::i;:::-;18039:67;18099:6;18091;18085:4;18039:67;:::i;:::-;18133:1;18157:4;18144:17;;18189:2;18181:6;18178:14;18206:1;18201:618;;;;18863:1;18880:6;18877:77;;;18929:9;18924:3;18920:19;18914:26;18905:35;;18877:77;18980:67;19040:6;19033:5;18980:67;:::i;:::-;18974:4;18967:81;18836:222;18171:887;;18201:618;18253:4;18249:9;18241:6;18237:22;18287:37;18319:4;18287:37;:::i;:::-;18346:1;18360:208;18374:7;18371:1;18368:14;18360:208;;;18453:9;18448:3;18444:19;18438:26;18430:6;18423:42;18504:1;18496:6;18492:14;18482:24;;18551:2;18540:9;18536:18;18523:31;;18397:4;18394:1;18390:12;18385:17;;18360:208;;;18596:6;18587:7;18584:19;18581:179;;;18654:9;18649:3;18645:19;18639:26;18697:48;18739:4;18731:6;18727:17;18716:9;18697:48;:::i;:::-;18689:6;18682:64;18604:156;18581:179;18806:1;18802;18794:6;18790:14;18786:22;18780:4;18773:36;18208:611;;;18171:887;;17761:1303;;;17669:1395;;:::o;19070:170::-;19210:22;19206:1;19198:6;19194:14;19187:46;19070:170;:::o;19246:366::-;19388:3;19409:67;19473:2;19468:3;19409:67;:::i;:::-;19402:74;;19485:93;19574:3;19485:93;:::i;:::-;19603:2;19598:3;19594:12;19587:19;;19246:366;;;:::o;19618:419::-;19784:4;19822:2;19811:9;19807:18;19799:26;;19871:9;19865:4;19861:20;19857:1;19846:9;19842:17;19835:47;19899:131;20025:4;19899:131;:::i;:::-;19891:139;;19618:419;;;:::o;20043:191::-;20083:3;20102:20;20120:1;20102:20;:::i;:::-;20097:25;;20136:20;20154:1;20136:20;:::i;:::-;20131:25;;20179:1;20176;20172:9;20165:16;;20200:3;20197:1;20194:10;20191:36;;;20207:18;;:::i;:::-;20191:36;20043:191;;;;:::o;20240:168::-;20380:20;20376:1;20368:6;20364:14;20357:44;20240:168;:::o;20414:366::-;20556:3;20577:67;20641:2;20636:3;20577:67;:::i;:::-;20570:74;;20653:93;20742:3;20653:93;:::i;:::-;20771:2;20766:3;20762:12;20755:19;;20414:366;;;:::o;20786:419::-;20952:4;20990:2;20979:9;20975:18;20967:26;;21039:9;21033:4;21029:20;21025:1;21014:9;21010:17;21003:47;21067:131;21193:4;21067:131;:::i;:::-;21059:139;;20786:419;;;:::o;21211:172::-;21351:24;21347:1;21339:6;21335:14;21328:48;21211:172;:::o;21389:366::-;21531:3;21552:67;21616:2;21611:3;21552:67;:::i;:::-;21545:74;;21628:93;21717:3;21628:93;:::i;:::-;21746:2;21741:3;21737:12;21730:19;;21389:366;;;:::o;21761:419::-;21927:4;21965:2;21954:9;21950:18;21942:26;;22014:9;22008:4;22004:20;22000:1;21989:9;21985:17;21978:47;22042:131;22168:4;22042:131;:::i;:::-;22034:139;;21761:419;;;:::o;22186:171::-;22326:23;22322:1;22314:6;22310:14;22303:47;22186:171;:::o;22363:366::-;22505:3;22526:67;22590:2;22585:3;22526:67;:::i;:::-;22519:74;;22602:93;22691:3;22602:93;:::i;:::-;22720:2;22715:3;22711:12;22704:19;;22363:366;;;:::o;22735:419::-;22901:4;22939:2;22928:9;22924:18;22916:26;;22988:9;22982:4;22978:20;22974:1;22963:9;22959:17;22952:47;23016:131;23142:4;23016:131;:::i;:::-;23008:139;;22735:419;;;:::o;23160:147::-;23261:11;23298:3;23283:18;;23160:147;;;;:::o;23313:114::-;;:::o;23433:398::-;23592:3;23613:83;23694:1;23689:3;23613:83;:::i;:::-;23606:90;;23705:93;23794:3;23705:93;:::i;:::-;23823:1;23818:3;23814:11;23807:18;;23433:398;;;:::o;23837:379::-;24021:3;24043:147;24186:3;24043:147;:::i;:::-;24036:154;;24207:3;24200:10;;23837:379;;;:::o;24222:174::-;24362:26;24358:1;24350:6;24346:14;24339:50;24222:174;:::o;24402:366::-;24544:3;24565:67;24629:2;24624:3;24565:67;:::i;:::-;24558:74;;24641:93;24730:3;24641:93;:::i;:::-;24759:2;24754:3;24750:12;24743:19;;24402:366;;;:::o;24774:419::-;24940:4;24978:2;24967:9;24963:18;24955:26;;25027:9;25021:4;25017:20;25013:1;25002:9;24998:17;24991:47;25055:131;25181:4;25055:131;:::i;:::-;25047:139;;24774:419;;;:::o;25199:148::-;25301:11;25338:3;25323:18;;25199:148;;;;:::o;25353:390::-;25459:3;25487:39;25520:5;25487:39;:::i;:::-;25542:89;25624:6;25619:3;25542:89;:::i;:::-;25535:96;;25640:65;25698:6;25693:3;25686:4;25679:5;25675:16;25640:65;:::i;:::-;25730:6;25725:3;25721:16;25714:23;;25463:280;25353:390;;;;:::o;25749:435::-;25929:3;25951:95;26042:3;26033:6;25951:95;:::i;:::-;25944:102;;26063:95;26154:3;26145:6;26063:95;:::i;:::-;26056:102;;26175:3;26168:10;;25749:435;;;;;:::o;26190:225::-;26330:34;26326:1;26318:6;26314:14;26307:58;26399:8;26394:2;26386:6;26382:15;26375:33;26190:225;:::o;26421:366::-;26563:3;26584:67;26648:2;26643:3;26584:67;:::i;:::-;26577:74;;26660:93;26749:3;26660:93;:::i;:::-;26778:2;26773:3;26769:12;26762:19;;26421:366;;;:::o;26793:419::-;26959:4;26997:2;26986:9;26982:18;26974:26;;27046:9;27040:4;27036:20;27032:1;27021:9;27017:17;27010:47;27074:131;27200:4;27074:131;:::i;:::-;27066:139;;26793:419;;;:::o;27218:182::-;27358:34;27354:1;27346:6;27342:14;27335:58;27218:182;:::o;27406:366::-;27548:3;27569:67;27633:2;27628:3;27569:67;:::i;:::-;27562:74;;27645:93;27734:3;27645:93;:::i;:::-;27763:2;27758:3;27754:12;27747:19;;27406:366;;;:::o;27778:419::-;27944:4;27982:2;27971:9;27967:18;27959:26;;28031:9;28025:4;28021:20;28017:1;28006:9;28002:17;27995:47;28059:131;28185:4;28059:131;:::i;:::-;28051:139;;27778:419;;;:::o;28203:98::-;28254:6;28288:5;28282:12;28272:22;;28203:98;;;:::o;28307:168::-;28390:11;28424:6;28419:3;28412:19;28464:4;28459:3;28455:14;28440:29;;28307:168;;;;:::o;28481:373::-;28567:3;28595:38;28627:5;28595:38;:::i;:::-;28649:70;28712:6;28707:3;28649:70;:::i;:::-;28642:77;;28728:65;28786:6;28781:3;28774:4;28767:5;28763:16;28728:65;:::i;:::-;28818:29;28840:6;28818:29;:::i;:::-;28813:3;28809:39;28802:46;;28571:283;28481:373;;;;:::o;28860:640::-;29055:4;29093:3;29082:9;29078:19;29070:27;;29107:71;29175:1;29164:9;29160:17;29151:6;29107:71;:::i;:::-;29188:72;29256:2;29245:9;29241:18;29232:6;29188:72;:::i;:::-;29270;29338:2;29327:9;29323:18;29314:6;29270:72;:::i;:::-;29389:9;29383:4;29379:20;29374:2;29363:9;29359:18;29352:48;29417:76;29488:4;29479:6;29417:76;:::i;:::-;29409:84;;28860:640;;;;;;;:::o;29506:141::-;29562:5;29593:6;29587:13;29578:22;;29609:32;29635:5;29609:32;:::i;:::-;29506:141;;;;:::o;29653:349::-;29722:6;29771:2;29759:9;29750:7;29746:23;29742:32;29739:119;;;29777:79;;:::i;:::-;29739:119;29897:1;29922:63;29977:7;29968:6;29957:9;29953:22;29922:63;:::i;:::-;29912:73;;29868:127;29653:349;;;;:::o
Swarm Source
ipfs://1626d2bebfa97dfbde1b992a7d764ac968e605601788eabcb90bbce940215f9d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.