ERC-721
Overview
Max Total Supply
580 CLAP
Holders
237
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CLAPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CLAP
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-11 */ // SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // 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 { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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) } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // 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/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.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/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/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.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/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.9; contract CLAP is ERC721A, ERC2981 , Ownable, Pausable { using Strings for uint256; string public baseURI = ""; string internal revealUri = "ipfs://QmVfmXKWfAne9fXgvtg6JdqHMMteufBmZdMFg9TomiLBR3"; string internal lockedUri = "ipfs://QmWmSerJ3UB7R99KKm9ur5GgN4SE8Wwa2P1p7JSaorgCVt"; string internal extension = ".json"; bool internal isRevealed = false; bool public presale = true; uint256 public preCost = 0.05 ether; uint256 public publicCost = 0.1 ether; uint256 public publicMaxPerTx = 1; uint96 public royaltyFee = 1000; //1000 = 10% uint96 public maxSupply = 1000; address public royaltyAddress = 0x9110bd3C7497E8eb12ac4923664d55Fb3BC549a8; mapping(address => uint256) public preMintLists; mapping(string => bool) internal lockLists; constructor( string memory _name, string memory _symbol ) ERC721A(_name, _symbol) { _setDefaultRoyalty(royaltyAddress, royaltyFee); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI query for nonexistent token"); if(lockLists[Strings.toString(_tokenId)] == true) { return lockedUri; } if(isRevealed == false) { return revealUri; } return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), extension)); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function publicMint(uint256 _mintAmount) public payable whenNotPaused callerIsUser { uint256 cost = publicCost * _mintAmount; mintCheck(_mintAmount, cost); require(!presale, "Presale is active."); require( _mintAmount <= publicMaxPerTx, "Mint amount over" ); _safeMint(msg.sender, _mintAmount); } function preMint(uint256 _mintAmount) public payable whenNotPaused callerIsUser { uint256 cost = preCost * _mintAmount; mintCheck(_mintAmount, cost); require(presale, "Presale is not active."); require( preMintLists[msg.sender] >= _mintAmount, "You don't have Mint List" ); preMintLists[msg.sender] -= _mintAmount; _safeMint(msg.sender, _mintAmount); } function mintCheck( uint256 _mintAmount, uint256 cost ) private view { require(_mintAmount > 0, "Mint amount cannot be zero"); require( totalSupply() + _mintAmount <= maxSupply, "MAXSUPPLY over" ); require(msg.value >= cost, "Not enough funds"); } function ownerMint(address _address, uint256 count) public onlyOwner { _safeMint(_address, count); } function bulkMint(address[] memory _toList, uint256[] memory _count) public onlyOwner { for (uint256 i = 0; i < _toList.length; i++) { ownerMint(_toList[i], _count[i]); } } function setPresale(bool _state) public onlyOwner { presale = _state; } function setPreCost(uint256 _preCost) public onlyOwner { preCost = _preCost; } function setPublicCost(uint256 _publicCost) public onlyOwner { publicCost = _publicCost; } function getCurrentCost() public view returns (uint256) { if (presale) { return preCost; } else { return publicCost; } } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function _getExtension() internal view returns (string memory) { return extension; } function setExtension(string memory value) external onlyOwner { extension = value; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function withdraw() external onlyOwner { Address.sendValue(payable(royaltyAddress), address(this).balance); } function pushMultiPreMintList(address[] memory list, uint256[] memory maxMint) public virtual onlyOwner { for (uint256 i = 0; i < list.length; i++) { preMintLists[list[i]] = maxMint[i]; } } function getRegisteredCount(address _address) external view returns (uint256) { return preMintLists[_address]; } function setRoyaltyFee(uint96 _feeNumerator) external onlyOwner { royaltyFee = _feeNumerator; _setDefaultRoyalty(royaltyAddress, royaltyFee); } function setRoyaltyAddress(address _royaltyAddress) external onlyOwner { royaltyAddress = _royaltyAddress; _setDefaultRoyalty(royaltyAddress, royaltyFee); } function setMaxSupply(uint96 _maxSupplyNumerator) external onlyOwner { maxSupply = _maxSupplyNumerator; } function setPublicMaxPerTx(uint256 _publicMaxPerTx) external onlyOwner { publicMaxPerTx = _publicMaxPerTx; } function setHiddenBaseURI(string memory _uri_) external virtual onlyOwner { revealUri = _uri_; } function setLockedURI(string memory _uri_) external virtual onlyOwner { lockedUri = _uri_; } function setReveal(bool bool_) external virtual onlyOwner { isRevealed = bool_; } function setLockList(string memory _tokenId, bool _bool) public virtual onlyOwner { lockLists[_tokenId] = _bool; } function getLockList(string memory _tokenId) public view virtual returns (bool) { return lockLists[_tokenId]; } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal view override { if(to != address(0)){ for (uint256 i = startTokenId; i < startTokenId + quantity; i++) { require(lockLists[Strings.toString(i)] != true, "This token is locked"); } } } function burn(uint256 tokenId) external virtual { _burn(tokenId, true); } function ownerBurn(uint256 tokenId) external virtual onlyOwner { _burn(tokenId, false); } function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_toList","type":"address[]"},{"internalType":"uint256[]","name":"_count","type":"uint256[]"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenId","type":"string"}],"name":"getLockList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRegisteredCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"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":"ownerBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMintLists","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"},{"internalType":"uint256[]","name":"maxMint","type":"uint256[]"}],"name":"pushMultiPreMintList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFee","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri_","type":"string"}],"name":"setHiddenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenId","type":"string"},{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setLockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri_","type":"string"}],"name":"setLockedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_maxSupplyNumerator","type":"uint96"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preCost","type":"uint256"}],"name":"setPreCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicCost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMaxPerTx","type":"uint256"}],"name":"setPublicMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b9081620000249190620007cf565b5060405180606001604052806035815260200162005b6060359139600c90816200004f9190620007cf565b5060405180606001604052806035815260200162005b9560359139600d90816200007a9190620007cf565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9081620000c19190620007cf565b506000600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff02191690831515021790555066b1a2bc2ec5000060105567016345785d8a000060115560016012556103e8601360006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506103e86013600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550739110bd3c7497e8eb12ac4923664d55fb3bc549a8601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001dc57600080fd5b5060405162005bca38038062005bca833981810160405281019062000202919062000a24565b81818160029081620002159190620007cf565b508060039081620002279190620007cf565b5062000238620002d160201b60201c565b60008190555050506200026062000254620002da60201b60201c565b620002e260201b60201c565b6000600a60146101000a81548160ff021916908315150217905550620002c9601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a90046bffffffffffffffffffffffff16620003a860201b60201c565b505062000bc4565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003b86200054b60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004109062000b30565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200048b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004829062000ba2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d757607f821691505b602082108103620005ed57620005ec6200058f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000618565b62000663868362000618565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006b0620006aa620006a4846200067b565b62000685565b6200067b565b9050919050565b6000819050919050565b620006cc836200068f565b620006e4620006db82620006b7565b84845462000625565b825550505050565b600090565b620006fb620006ec565b62000708818484620006c1565b505050565b5b81811015620007305762000724600082620006f1565b6001810190506200070e565b5050565b601f8211156200077f576200074981620005f3565b620007548462000608565b8101602085101562000764578190505b6200077c620007738562000608565b8301826200070d565b50505b505050565b600082821c905092915050565b6000620007a46000198460080262000784565b1980831691505092915050565b6000620007bf838362000791565b9150826002028217905092915050565b620007da8262000555565b67ffffffffffffffff811115620007f657620007f562000560565b5b620008028254620005be565b6200080f82828562000734565b600060209050601f83116001811462000847576000841562000832578287015190505b6200083e8582620007b1565b865550620008ae565b601f1984166200085786620005f3565b60005b8281101562000881578489015182556001820191506020850194506020810190506200085a565b86831015620008a157848901516200089d601f89168262000791565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620008f082620008d4565b810181811067ffffffffffffffff8211171562000912576200091162000560565b5b80604052505050565b600062000927620008b6565b9050620009358282620008e5565b919050565b600067ffffffffffffffff82111562000958576200095762000560565b5b6200096382620008d4565b9050602081019050919050565b60005b838110156200099057808201518184015260208101905062000973565b83811115620009a0576000848401525b50505050565b6000620009bd620009b7846200093a565b6200091b565b905082815260208101848484011115620009dc57620009db620008cf565b5b620009e984828562000970565b509392505050565b600082601f83011262000a095762000a08620008ca565b5b815162000a1b848260208601620009a6565b91505092915050565b6000806040838503121562000a3e5762000a3d620008c0565b5b600083015167ffffffffffffffff81111562000a5f5762000a5e620008c5565b5b62000a6d85828601620009f1565b925050602083015167ffffffffffffffff81111562000a915762000a90620008c5565b5b62000a9f85828601620009f1565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000b18602a8362000aa9565b915062000b258262000aba565b604082019050919050565b6000602082019050818103600083015262000b4b8162000b09565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000b8a60198362000aa9565b915062000b978262000b52565b602082019050919050565b6000602082019050818103600083015262000bbd8162000b7b565b9050919050565b614f8c8062000bd46000396000f3fe6080604052600436106103355760003560e01c80636c0360eb116101ab578063a22cb465116100f7578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610ba7578063efe8c4ac14610be4578063f2fde38b14610c0f578063fdea8e0b14610c3857610335565b8063c87b56dd14610b02578063d5abeb0114610b3f578063d620c8f614610b6a57610335565b8063b88d4fde116100d1578063b88d4fde14610a48578063b8997a9714610a71578063c54e73e314610a9c578063c601c01014610ac557610335565b8063a22cb465146109c9578063ad2f852a146109f2578063b6374e3514610a1d57610335565b8063831e60de116101645780638ad433ac1161013e5780638ad433ac1461092e5780638da5cb5b1461094a57806395d89b411461097557806398095250146109a057610335565b8063831e60de146108c15780638456cb59146108ec5780638693da201461090357610335565b80636c0360eb146107b35780636c5c8e2d146107de57806370a082311461081b578063715018a6146108585780637e2285aa1461086f578063811d24371461089857610335565b80633018f54f1161028557806342966c681161022357806355f804b3116101fd57806355f804b3146106f95780635c975abb146107225780636352211e1461074d5780636ae459bd1461078a57610335565b806342966c681461067e578063484b973c146106a7578063496f9dcc146106d057610335565b80633a4b36641161025f5780633a4b3664146105fe5780633ccfd60b146106275780633f4ba83a1461063e57806342842e0e1461065557610335565b80633018f54f1461058357806331bab3d6146105ac57806331faafb4146105d557610335565b806318160ddd116102f257806323b872dd116102cc57806323b872dd146104d75780632a3f300c146105005780632a55205a146105295780632db115441461056757610335565b806318160ddd1461045a5780631828d92d1461048557806320ac6850146104ae57610335565b806301ffc9a71461033a57806306d254da1461037757806306fdde03146103a0578063081812fc146103cb578063095ea7b31461040857806316a529cb14610431575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613652565b610c63565b60405161036e919061369a565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613713565b610c85565b005b3480156103ac57600080fd5b506103b5610d17565b6040516103c291906137d9565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613831565b610da9565b6040516103ff919061386d565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613888565b610e28565b005b34801561043d57600080fd5b5061045860048036038101906104539190613831565b610f6c565b005b34801561046657600080fd5b5061046f610f7e565b60405161047c91906138d7565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613afd565b610f95565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613c2a565b611039565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190613c73565b611054565b005b34801561050c57600080fd5b5061052760048036038101906105229190613cf2565b611376565b005b34801561053557600080fd5b50610550600480360381019061054b9190613d1f565b61139b565b60405161055e929190613d5f565b60405180910390f35b610581600480360381019061057c9190613831565b611585565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190613831565b6116ba565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190613c2a565b6116cc565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613dcc565b6116e7565b005b34801561060a57600080fd5b5061062560048036038101906106209190613831565b611769565b005b34801561063357600080fd5b5061063c61177f565b005b34801561064a57600080fd5b506106536117b5565b005b34801561066157600080fd5b5061067c60048036038101906106779190613c73565b6117c7565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613831565b6117e7565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613888565b6117f5565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613df9565b61180b565b005b34801561070557600080fd5b50610720600480360381019061071b9190613c2a565b61184d565b005b34801561072e57600080fd5b50610737611868565b604051610744919061369a565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613831565b61187f565b604051610781919061386d565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613afd565b611891565b005b3480156107bf57600080fd5b506107c86118fb565b6040516107d591906137d9565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190613713565b611989565b60405161081291906138d7565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613713565b6119d2565b60405161084f91906138d7565b60405180910390f35b34801561086457600080fd5b5061086d611a8a565b005b34801561087b57600080fd5b5061089660048036038101906108919190613c2a565b611a9e565b005b3480156108a457600080fd5b506108bf60048036038101906108ba9190613831565b611ab9565b005b3480156108cd57600080fd5b506108d6611acb565b6040516108e391906138d7565b60405180910390f35b3480156108f857600080fd5b50610901611af5565b005b34801561090f57600080fd5b50610918611b07565b60405161092591906138d7565b60405180910390f35b61094860048036038101906109439190613831565b611b0d565b005b34801561095657600080fd5b5061095f611cd4565b60405161096c919061386d565b60405180910390f35b34801561098157600080fd5b5061098a611cfe565b60405161099791906137d9565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613dcc565b611d90565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613e55565b611dcc565b005b3480156109fe57600080fd5b50610a07611f43565b604051610a14919061386d565b60405180910390f35b348015610a2957600080fd5b50610a32611f69565b604051610a3f91906138d7565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a9190613f36565b611f6f565b005b348015610a7d57600080fd5b50610a86611fe2565b604051610a939190613fc8565b60405180910390f35b348015610aa857600080fd5b50610ac36004803603810190610abe9190613cf2565b612000565b005b348015610ad157600080fd5b50610aec6004803603810190610ae79190613713565b612025565b604051610af991906138d7565b60405180910390f35b348015610b0e57600080fd5b50610b296004803603810190610b249190613831565b61203d565b604051610b3691906137d9565b60405180910390f35b348015610b4b57600080fd5b50610b5461223b565b604051610b619190613fc8565b60405180910390f35b348015610b7657600080fd5b50610b916004803603810190610b8c9190613c2a565b612259565b604051610b9e919061369a565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613fe3565b61228e565b604051610bdb919061369a565b60405180910390f35b348015610bf057600080fd5b50610bf9612322565b604051610c0691906138d7565b60405180910390f35b348015610c1b57600080fd5b50610c366004803603810190610c319190613713565b612328565b005b348015610c4457600080fd5b50610c4d6123ab565b604051610c5a919061369a565b60405180910390f35b6000610c6e826123be565b80610c7e5750610c7d82612450565b5b9050919050565b610c8d6124ca565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d14601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a90046bffffffffffffffffffffffff16612548565b50565b606060028054610d2690614052565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5290614052565b8015610d9f5780601f10610d7457610100808354040283529160200191610d9f565b820191906000526020600020905b815481529060010190602001808311610d8257829003601f168201915b5050505050905090565b6000610db4826126dd565b610dea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e338261187f565b90508073ffffffffffffffffffffffffffffffffffffffff16610e5461273c565b73ffffffffffffffffffffffffffffffffffffffff1614610eb757610e8081610e7b61273c565b61228e565b610eb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610f746124ca565b8060128190555050565b6000610f88612744565b6001546000540303905090565b610f9d6124ca565b60005b825181101561103457818181518110610fbc57610fbb614083565b5b602002602001015160156000858481518110610fdb57610fda614083565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061102c906140e1565b915050610fa0565b505050565b6110416124ca565b80600c908161105091906142d5565b5050565b600061105f8261274d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110d284612819565b915091506110e881876110e361273c565b612840565b611134576110fd866110f861273c565b61228e565b611133576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361119a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a78686866001612884565b80156111b257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112808561125c888887612966565b7c02000000000000000000000000000000000000000000000000000000001761298e565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113065760006001850190506000600460008381526020019081526020016000205403611304576000548114611303578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461136e86868660016129b9565b505050505050565b61137e6124ca565b80600f60006101000a81548160ff02191690831515021790555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036115305760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061153a6129bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661156691906143a7565b6115709190614430565b90508160000151819350935050509250929050565b61158d6129c9565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f2906144ad565b60405180910390fd5b60008160115461160b91906143a7565b90506116178282612a13565b600f60019054906101000a900460ff1615611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90614519565b60405180910390fd5b6012548211156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614585565b60405180910390fd5b6116b63383612b1a565b5050565b6116c26124ca565b8060108190555050565b6116d46124ca565b80600d90816116e391906142d5565b5050565b6116ef6124ca565b80601360006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611766601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a90046bffffffffffffffffffffffff16612548565b50565b6117716124ca565b61177c816000612b38565b50565b6117876124ca565b6117b3601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612d8a565b565b6117bd6124ca565b6117c5612e7e565b565b6117e283838360405180602001604052806000815250611f6f565b505050565b6117f2816001612b38565b50565b6117fd6124ca565b6118078282612b1a565b5050565b6118136124ca565b8060168360405161182491906145e1565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6118556124ca565b80600b908161186491906142d5565b5050565b6000600a60149054906101000a900460ff16905090565b600061188a8261274d565b9050919050565b6118996124ca565b60005b82518110156118f6576118e38382815181106118bb576118ba614083565b5b60200260200101518383815181106118d6576118d5614083565b5b60200260200101516117f5565b80806118ee906140e1565b91505061189c565b505050565b600b805461190890614052565b80601f016020809104026020016040519081016040528092919081815260200182805461193490614052565b80156119815780601f1061195657610100808354040283529160200191611981565b820191906000526020600020905b81548152906001019060200180831161196457829003601f168201915b505050505081565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a39576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a926124ca565b611a9c6000612ee1565b565b611aa66124ca565b80600e9081611ab591906142d5565b5050565b611ac16124ca565b8060118190555050565b6000600f60019054906101000a900460ff1615611aec576010549050611af2565b60115490505b90565b611afd6124ca565b611b05612fa7565b565b60115481565b611b156129c9565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906144ad565b60405180910390fd5b600081601054611b9391906143a7565b9050611b9f8282612a13565b600f60019054906101000a900460ff16611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590614644565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906146b0565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbf91906146d0565b92505081905550611cd03383612b1a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d0d90614052565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3990614052565b8015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050905090565b611d986124ca565b806013600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b611dd461273c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e38576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4561273c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ef261273c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f37919061369a565b60405180910390a35050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b611f7a848484611054565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fdc57611fa58484848461300a565b611fdb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601360009054906101000a90046bffffffffffffffffffffffff1681565b6120086124ca565b80600f60016101000a81548160ff02191690831515021790555050565b60156020528060005260406000206000915090505481565b6060612048826126dd565b612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90614750565b60405180910390fd5b6001151560166120968461315a565b6040516120a391906145e1565b908152602001604051809103902060009054906101000a900460ff1615150361215857600d80546120d390614052565b80601f01602080910402602001604051908101604052809291908181526020018280546120ff90614052565b801561214c5780601f106121215761010080835404028352916020019161214c565b820191906000526020600020905b81548152906001019060200180831161212f57829003601f168201915b50505050509050612236565b60001515600f60009054906101000a900460ff1615150361220557600c805461218090614052565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90614052565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b50505050509050612236565b600b6122108361315a565b600e604051602001612224939291906147f3565b60405160208183030381529060405290505b919050565b6013600c9054906101000a90046bffffffffffffffffffffffff1681565b600060168260405161226b91906145e1565b908152602001604051809103902060009054906101000a900460ff169050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6123306124ca565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361239f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239690614896565b60405180910390fd5b6123a881612ee1565b50565b600f60019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124495750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124c357506124c2826132ba565b5b9050919050565b6124d2613324565b73ffffffffffffffffffffffffffffffffffffffff166124f0611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614902565b60405180910390fd5b565b6125506129bf565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a590614994565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614a00565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816126e8612744565b111580156126f7575060005482105b8015612735575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061275c612744565b116127e2576000548110156127e15760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036127df575b600081036127d55760046000836001900393508381526020019081526020016000205490506127ab565b8092505050612814565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129605760008290505b81836128ca9190614a20565b81101561295e576001151560166128e08361315a565b6040516128ed91906145e1565b908152602001604051809103902060009054906101000a900460ff1615150361294b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294290614ac2565b60405180910390fd5b8080612956906140e1565b9150506128be565b505b50505050565b60008060e883901c905060e861297d86868461332c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6129d1611868565b15612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614b2e565b60405180910390fd5b565b60008211612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90614b9a565b60405180910390fd5b6013600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1682612a88610f7e565b612a929190614a20565b1115612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca90614c06565b60405180910390fd5b80341015612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90614c72565b60405180910390fd5b5050565b612b34828260405180602001604052806000815250613335565b5050565b6000612b438361274d565b90506000819050600080612b5686612819565b915091508415612bbf57612b728184612b6d61273c565b612840565b612bbe57612b8783612b8261273c565b61228e565b612bbd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612bcd836000886001612884565b8015612bd857600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c8083612c3d85600088612966565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761298e565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612d065760006001870190506000600460008381526020019081526020016000205403612d04576000548114612d03578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d708360008860016129b9565b600160008154809291906001019190505550505050505050565b80471015612dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc490614cde565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612df390614d2f565b60006040518083038185875af1925050503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5050905080612e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7090614db6565b60405180910390fd5b505050565b612e866133d2565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612eca613324565b604051612ed7919061386d565b60405180910390a1565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612faf6129c9565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ff3613324565b604051613000919061386d565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261303061273c565b8786866040518563ffffffff1660e01b81526004016130529493929190614e2b565b6020604051808303816000875af192505050801561308e57506040513d601f19601f8201168201806040525081019061308b9190614e8c565b60015b613107573d80600081146130be576040519150601f19603f3d011682016040523d82523d6000602084013e6130c3565b606091505b5060008151036130ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036131a1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132b5565b600082905060005b600082146131d35780806131bc906140e1565b915050600a826131cc9190614430565b91506131a9565b60008167ffffffffffffffff8111156131ef576131ee6138f7565b5b6040519080825280601f01601f1916602001820160405280156132215781602001600182028036833780820191505090505b5090505b600085146132ae5760018261323a91906146d0565b9150600a856132499190614eb9565b60306132559190614a20565b60f81b81838151811061326b5761326a614083565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132a79190614430565b9450613225565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60009392505050565b61333f838361341b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146133cd57600080549050600083820390505b61337f600086838060010194508661300a565b6133b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061336c5781600054146133ca57600080fd5b50505b505050565b6133da611868565b613419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341090614f36565b60405180910390fd5b565b6000805490506000820361345b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134686000848385612884565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506134df836134d06000866000612966565b6134d9856135d6565b1761298e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461358057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613545565b50600082036135bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506135d160008483856129b9565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61362f816135fa565b811461363a57600080fd5b50565b60008135905061364c81613626565b92915050565b600060208284031215613668576136676135f0565b5b60006136768482850161363d565b91505092915050565b60008115159050919050565b6136948161367f565b82525050565b60006020820190506136af600083018461368b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136e0826136b5565b9050919050565b6136f0816136d5565b81146136fb57600080fd5b50565b60008135905061370d816136e7565b92915050565b600060208284031215613729576137286135f0565b5b6000613737848285016136fe565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561377a57808201518184015260208101905061375f565b83811115613789576000848401525b50505050565b6000601f19601f8301169050919050565b60006137ab82613740565b6137b5818561374b565b93506137c581856020860161375c565b6137ce8161378f565b840191505092915050565b600060208201905081810360008301526137f381846137a0565b905092915050565b6000819050919050565b61380e816137fb565b811461381957600080fd5b50565b60008135905061382b81613805565b92915050565b600060208284031215613847576138466135f0565b5b60006138558482850161381c565b91505092915050565b613867816136d5565b82525050565b6000602082019050613882600083018461385e565b92915050565b6000806040838503121561389f5761389e6135f0565b5b60006138ad858286016136fe565b92505060206138be8582860161381c565b9150509250929050565b6138d1816137fb565b82525050565b60006020820190506138ec60008301846138c8565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61392f8261378f565b810181811067ffffffffffffffff8211171561394e5761394d6138f7565b5b80604052505050565b60006139616135e6565b905061396d8282613926565b919050565b600067ffffffffffffffff82111561398d5761398c6138f7565b5b602082029050602081019050919050565b600080fd5b60006139b66139b184613972565b613957565b905080838252602082019050602084028301858111156139d9576139d861399e565b5b835b81811015613a0257806139ee88826136fe565b8452602084019350506020810190506139db565b5050509392505050565b600082601f830112613a2157613a206138f2565b5b8135613a318482602086016139a3565b91505092915050565b600067ffffffffffffffff821115613a5557613a546138f7565b5b602082029050602081019050919050565b6000613a79613a7484613a3a565b613957565b90508083825260208201905060208402830185811115613a9c57613a9b61399e565b5b835b81811015613ac55780613ab1888261381c565b845260208401935050602081019050613a9e565b5050509392505050565b600082601f830112613ae457613ae36138f2565b5b8135613af4848260208601613a66565b91505092915050565b60008060408385031215613b1457613b136135f0565b5b600083013567ffffffffffffffff811115613b3257613b316135f5565b5b613b3e85828601613a0c565b925050602083013567ffffffffffffffff811115613b5f57613b5e6135f5565b5b613b6b85828601613acf565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b9557613b946138f7565b5b613b9e8261378f565b9050602081019050919050565b82818337600083830152505050565b6000613bcd613bc884613b7a565b613957565b905082815260208101848484011115613be957613be8613b75565b5b613bf4848285613bab565b509392505050565b600082601f830112613c1157613c106138f2565b5b8135613c21848260208601613bba565b91505092915050565b600060208284031215613c4057613c3f6135f0565b5b600082013567ffffffffffffffff811115613c5e57613c5d6135f5565b5b613c6a84828501613bfc565b91505092915050565b600080600060608486031215613c8c57613c8b6135f0565b5b6000613c9a868287016136fe565b9350506020613cab868287016136fe565b9250506040613cbc8682870161381c565b9150509250925092565b613ccf8161367f565b8114613cda57600080fd5b50565b600081359050613cec81613cc6565b92915050565b600060208284031215613d0857613d076135f0565b5b6000613d1684828501613cdd565b91505092915050565b60008060408385031215613d3657613d356135f0565b5b6000613d448582860161381c565b9250506020613d558582860161381c565b9150509250929050565b6000604082019050613d74600083018561385e565b613d8160208301846138c8565b9392505050565b60006bffffffffffffffffffffffff82169050919050565b613da981613d88565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de16135f0565b5b6000613df084828501613db7565b91505092915050565b60008060408385031215613e1057613e0f6135f0565b5b600083013567ffffffffffffffff811115613e2e57613e2d6135f5565b5b613e3a85828601613bfc565b9250506020613e4b85828601613cdd565b9150509250929050565b60008060408385031215613e6c57613e6b6135f0565b5b6000613e7a858286016136fe565b9250506020613e8b85828601613cdd565b9150509250929050565b600067ffffffffffffffff821115613eb057613eaf6138f7565b5b613eb98261378f565b9050602081019050919050565b6000613ed9613ed484613e95565b613957565b905082815260208101848484011115613ef557613ef4613b75565b5b613f00848285613bab565b509392505050565b600082601f830112613f1d57613f1c6138f2565b5b8135613f2d848260208601613ec6565b91505092915050565b60008060008060808587031215613f5057613f4f6135f0565b5b6000613f5e878288016136fe565b9450506020613f6f878288016136fe565b9350506040613f808782880161381c565b925050606085013567ffffffffffffffff811115613fa157613fa06135f5565b5b613fad87828801613f08565b91505092959194509250565b613fc281613d88565b82525050565b6000602082019050613fdd6000830184613fb9565b92915050565b60008060408385031215613ffa57613ff96135f0565b5b6000614008858286016136fe565b9250506020614019858286016136fe565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406a57607f821691505b60208210810361407d5761407c614023565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140ec826137fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411e5761411d6140b2565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261418b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261414e565b614195868361414e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141d26141cd6141c8846137fb565b6141ad565b6137fb565b9050919050565b6000819050919050565b6141ec836141b7565b6142006141f8826141d9565b84845461415b565b825550505050565b600090565b614215614208565b6142208184846141e3565b505050565b5b818110156142445761423960008261420d565b600181019050614226565b5050565b601f8211156142895761425a81614129565b6142638461413e565b81016020851015614272578190505b61428661427e8561413e565b830182614225565b50505b505050565b600082821c905092915050565b60006142ac6000198460080261428e565b1980831691505092915050565b60006142c5838361429b565b9150826002028217905092915050565b6142de82613740565b67ffffffffffffffff8111156142f7576142f66138f7565b5b6143018254614052565b61430c828285614248565b600060209050601f83116001811461433f576000841561432d578287015190505b61433785826142b9565b86555061439f565b601f19841661434d86614129565b60005b8281101561437557848901518255600182019150602085019450602081019050614350565b86831015614392578489015161438e601f89168261429b565b8355505b6001600288020188555050505b505050505050565b60006143b2826137fb565b91506143bd836137fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f6576143f56140b2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061443b826137fb565b9150614446836137fb565b92508261445657614455614401565b5b828204905092915050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614497601e8361374b565b91506144a282614461565b602082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b7f50726573616c65206973206163746976652e0000000000000000000000000000600082015250565b600061450360128361374b565b915061450e826144cd565b602082019050919050565b60006020820190508181036000830152614532816144f6565b9050919050565b7f4d696e7420616d6f756e74206f76657200000000000000000000000000000000600082015250565b600061456f60108361374b565b915061457a82614539565b602082019050919050565b6000602082019050818103600083015261459e81614562565b9050919050565b600081905092915050565b60006145bb82613740565b6145c581856145a5565b93506145d581856020860161375c565b80840191505092915050565b60006145ed82846145b0565b915081905092915050565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b600061462e60168361374b565b9150614639826145f8565b602082019050919050565b6000602082019050818103600083015261465d81614621565b9050919050565b7f596f7520646f6e27742068617665204d696e74204c6973740000000000000000600082015250565b600061469a60188361374b565b91506146a582614664565b602082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b60006146db826137fb565b91506146e6836137fb565b9250828210156146f9576146f86140b2565b5b828203905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061473a601f8361374b565b915061474582614704565b602082019050919050565b600060208201905081810360008301526147698161472d565b9050919050565b6000815461477d81614052565b61478781866145a5565b945060018216600081146147a257600181146147b7576147ea565b60ff19831686528115158202860193506147ea565b6147c085614129565b60005b838110156147e2578154818901526001820191506020810190506147c3565b838801955050505b50505092915050565b60006147ff8286614770565b915061480b82856145b0565b91506148178284614770565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061488060268361374b565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148ec60208361374b565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061497e602a8361374b565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006149ea60198361374b565b91506149f5826149b4565b602082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b6000614a2b826137fb565b9150614a36836137fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6b57614a6a6140b2565b5b828201905092915050565b7f5468697320746f6b656e206973206c6f636b6564000000000000000000000000600082015250565b6000614aac60148361374b565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b1860108361374b565b9150614b2382614ae2565b602082019050919050565b60006020820190508181036000830152614b4781614b0b565b9050919050565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b6000614b84601a8361374b565b9150614b8f82614b4e565b602082019050919050565b60006020820190508181036000830152614bb381614b77565b9050919050565b7f4d4158535550504c59206f766572000000000000000000000000000000000000600082015250565b6000614bf0600e8361374b565b9150614bfb82614bba565b602082019050919050565b60006020820190508181036000830152614c1f81614be3565b9050919050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000614c5c60108361374b565b9150614c6782614c26565b602082019050919050565b60006020820190508181036000830152614c8b81614c4f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614cc8601d8361374b565b9150614cd382614c92565b602082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b600081905092915050565b50565b6000614d19600083614cfe565b9150614d2482614d09565b600082019050919050565b6000614d3a82614d0c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614da0603a8361374b565b9150614dab82614d44565b604082019050919050565b60006020820190508181036000830152614dcf81614d93565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614dfd82614dd6565b614e078185614de1565b9350614e1781856020860161375c565b614e208161378f565b840191505092915050565b6000608082019050614e40600083018761385e565b614e4d602083018661385e565b614e5a60408301856138c8565b8181036060830152614e6c8184614df2565b905095945050505050565b600081519050614e8681613626565b92915050565b600060208284031215614ea257614ea16135f0565b5b6000614eb084828501614e77565b91505092915050565b6000614ec4826137fb565b9150614ecf836137fb565b925082614edf57614ede614401565b5b828206905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f2060148361374b565b9150614f2b82614eea565b602082019050919050565b60006020820190508181036000830152614f4f81614f13565b905091905056fea26469706673582212209bd35689e7173eb684428b0f9dc1dd327d072742f942648902f61c38cf55c9ea64736f6c634300080f0033697066733a2f2f516d56666d584b5766416e6539665867767467364a6471484d4d74657566426d5a644d466739546f6d694c425233697066733a2f2f516d576d5365724a335542375239394b4b6d3975723547674e3453453857776132503170374a53616f7267435674000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018434e46204c69666574696d6520416363657373205061737300000000000000000000000000000000000000000000000000000000000000000000000000000004434c415000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103355760003560e01c80636c0360eb116101ab578063a22cb465116100f7578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610ba7578063efe8c4ac14610be4578063f2fde38b14610c0f578063fdea8e0b14610c3857610335565b8063c87b56dd14610b02578063d5abeb0114610b3f578063d620c8f614610b6a57610335565b8063b88d4fde116100d1578063b88d4fde14610a48578063b8997a9714610a71578063c54e73e314610a9c578063c601c01014610ac557610335565b8063a22cb465146109c9578063ad2f852a146109f2578063b6374e3514610a1d57610335565b8063831e60de116101645780638ad433ac1161013e5780638ad433ac1461092e5780638da5cb5b1461094a57806395d89b411461097557806398095250146109a057610335565b8063831e60de146108c15780638456cb59146108ec5780638693da201461090357610335565b80636c0360eb146107b35780636c5c8e2d146107de57806370a082311461081b578063715018a6146108585780637e2285aa1461086f578063811d24371461089857610335565b80633018f54f1161028557806342966c681161022357806355f804b3116101fd57806355f804b3146106f95780635c975abb146107225780636352211e1461074d5780636ae459bd1461078a57610335565b806342966c681461067e578063484b973c146106a7578063496f9dcc146106d057610335565b80633a4b36641161025f5780633a4b3664146105fe5780633ccfd60b146106275780633f4ba83a1461063e57806342842e0e1461065557610335565b80633018f54f1461058357806331bab3d6146105ac57806331faafb4146105d557610335565b806318160ddd116102f257806323b872dd116102cc57806323b872dd146104d75780632a3f300c146105005780632a55205a146105295780632db115441461056757610335565b806318160ddd1461045a5780631828d92d1461048557806320ac6850146104ae57610335565b806301ffc9a71461033a57806306d254da1461037757806306fdde03146103a0578063081812fc146103cb578063095ea7b31461040857806316a529cb14610431575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613652565b610c63565b60405161036e919061369a565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613713565b610c85565b005b3480156103ac57600080fd5b506103b5610d17565b6040516103c291906137d9565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613831565b610da9565b6040516103ff919061386d565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613888565b610e28565b005b34801561043d57600080fd5b5061045860048036038101906104539190613831565b610f6c565b005b34801561046657600080fd5b5061046f610f7e565b60405161047c91906138d7565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613afd565b610f95565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613c2a565b611039565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190613c73565b611054565b005b34801561050c57600080fd5b5061052760048036038101906105229190613cf2565b611376565b005b34801561053557600080fd5b50610550600480360381019061054b9190613d1f565b61139b565b60405161055e929190613d5f565b60405180910390f35b610581600480360381019061057c9190613831565b611585565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190613831565b6116ba565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190613c2a565b6116cc565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613dcc565b6116e7565b005b34801561060a57600080fd5b5061062560048036038101906106209190613831565b611769565b005b34801561063357600080fd5b5061063c61177f565b005b34801561064a57600080fd5b506106536117b5565b005b34801561066157600080fd5b5061067c60048036038101906106779190613c73565b6117c7565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613831565b6117e7565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613888565b6117f5565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613df9565b61180b565b005b34801561070557600080fd5b50610720600480360381019061071b9190613c2a565b61184d565b005b34801561072e57600080fd5b50610737611868565b604051610744919061369a565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613831565b61187f565b604051610781919061386d565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613afd565b611891565b005b3480156107bf57600080fd5b506107c86118fb565b6040516107d591906137d9565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190613713565b611989565b60405161081291906138d7565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613713565b6119d2565b60405161084f91906138d7565b60405180910390f35b34801561086457600080fd5b5061086d611a8a565b005b34801561087b57600080fd5b5061089660048036038101906108919190613c2a565b611a9e565b005b3480156108a457600080fd5b506108bf60048036038101906108ba9190613831565b611ab9565b005b3480156108cd57600080fd5b506108d6611acb565b6040516108e391906138d7565b60405180910390f35b3480156108f857600080fd5b50610901611af5565b005b34801561090f57600080fd5b50610918611b07565b60405161092591906138d7565b60405180910390f35b61094860048036038101906109439190613831565b611b0d565b005b34801561095657600080fd5b5061095f611cd4565b60405161096c919061386d565b60405180910390f35b34801561098157600080fd5b5061098a611cfe565b60405161099791906137d9565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613dcc565b611d90565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613e55565b611dcc565b005b3480156109fe57600080fd5b50610a07611f43565b604051610a14919061386d565b60405180910390f35b348015610a2957600080fd5b50610a32611f69565b604051610a3f91906138d7565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a9190613f36565b611f6f565b005b348015610a7d57600080fd5b50610a86611fe2565b604051610a939190613fc8565b60405180910390f35b348015610aa857600080fd5b50610ac36004803603810190610abe9190613cf2565b612000565b005b348015610ad157600080fd5b50610aec6004803603810190610ae79190613713565b612025565b604051610af991906138d7565b60405180910390f35b348015610b0e57600080fd5b50610b296004803603810190610b249190613831565b61203d565b604051610b3691906137d9565b60405180910390f35b348015610b4b57600080fd5b50610b5461223b565b604051610b619190613fc8565b60405180910390f35b348015610b7657600080fd5b50610b916004803603810190610b8c9190613c2a565b612259565b604051610b9e919061369a565b60405180910390f35b348015610bb357600080fd5b50610bce6004803603810190610bc99190613fe3565b61228e565b604051610bdb919061369a565b60405180910390f35b348015610bf057600080fd5b50610bf9612322565b604051610c0691906138d7565b60405180910390f35b348015610c1b57600080fd5b50610c366004803603810190610c319190613713565b612328565b005b348015610c4457600080fd5b50610c4d6123ab565b604051610c5a919061369a565b60405180910390f35b6000610c6e826123be565b80610c7e5750610c7d82612450565b5b9050919050565b610c8d6124ca565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d14601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a90046bffffffffffffffffffffffff16612548565b50565b606060028054610d2690614052565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5290614052565b8015610d9f5780601f10610d7457610100808354040283529160200191610d9f565b820191906000526020600020905b815481529060010190602001808311610d8257829003601f168201915b5050505050905090565b6000610db4826126dd565b610dea576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e338261187f565b90508073ffffffffffffffffffffffffffffffffffffffff16610e5461273c565b73ffffffffffffffffffffffffffffffffffffffff1614610eb757610e8081610e7b61273c565b61228e565b610eb6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610f746124ca565b8060128190555050565b6000610f88612744565b6001546000540303905090565b610f9d6124ca565b60005b825181101561103457818181518110610fbc57610fbb614083565b5b602002602001015160156000858481518110610fdb57610fda614083565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061102c906140e1565b915050610fa0565b505050565b6110416124ca565b80600c908161105091906142d5565b5050565b600061105f8261274d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110d284612819565b915091506110e881876110e361273c565b612840565b611134576110fd866110f861273c565b61228e565b611133576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361119a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a78686866001612884565b80156111b257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112808561125c888887612966565b7c02000000000000000000000000000000000000000000000000000000001761298e565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113065760006001850190506000600460008381526020019081526020016000205403611304576000548114611303578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461136e86868660016129b9565b505050505050565b61137e6124ca565b80600f60006101000a81548160ff02191690831515021790555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036115305760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061153a6129bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661156691906143a7565b6115709190614430565b90508160000151819350935050509250929050565b61158d6129c9565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f2906144ad565b60405180910390fd5b60008160115461160b91906143a7565b90506116178282612a13565b600f60019054906101000a900460ff1615611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90614519565b60405180910390fd5b6012548211156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614585565b60405180910390fd5b6116b63383612b1a565b5050565b6116c26124ca565b8060108190555050565b6116d46124ca565b80600d90816116e391906142d5565b5050565b6116ef6124ca565b80601360006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611766601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a90046bffffffffffffffffffffffff16612548565b50565b6117716124ca565b61177c816000612b38565b50565b6117876124ca565b6117b3601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612d8a565b565b6117bd6124ca565b6117c5612e7e565b565b6117e283838360405180602001604052806000815250611f6f565b505050565b6117f2816001612b38565b50565b6117fd6124ca565b6118078282612b1a565b5050565b6118136124ca565b8060168360405161182491906145e1565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6118556124ca565b80600b908161186491906142d5565b5050565b6000600a60149054906101000a900460ff16905090565b600061188a8261274d565b9050919050565b6118996124ca565b60005b82518110156118f6576118e38382815181106118bb576118ba614083565b5b60200260200101518383815181106118d6576118d5614083565b5b60200260200101516117f5565b80806118ee906140e1565b91505061189c565b505050565b600b805461190890614052565b80601f016020809104026020016040519081016040528092919081815260200182805461193490614052565b80156119815780601f1061195657610100808354040283529160200191611981565b820191906000526020600020905b81548152906001019060200180831161196457829003601f168201915b505050505081565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a39576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a926124ca565b611a9c6000612ee1565b565b611aa66124ca565b80600e9081611ab591906142d5565b5050565b611ac16124ca565b8060118190555050565b6000600f60019054906101000a900460ff1615611aec576010549050611af2565b60115490505b90565b611afd6124ca565b611b05612fa7565b565b60115481565b611b156129c9565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906144ad565b60405180910390fd5b600081601054611b9391906143a7565b9050611b9f8282612a13565b600f60019054906101000a900460ff16611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590614644565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906146b0565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbf91906146d0565b92505081905550611cd03383612b1a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d0d90614052565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3990614052565b8015611d865780601f10611d5b57610100808354040283529160200191611d86565b820191906000526020600020905b815481529060010190602001808311611d6957829003601f168201915b5050505050905090565b611d986124ca565b806013600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b611dd461273c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e38576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4561273c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ef261273c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f37919061369a565b60405180910390a35050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b611f7a848484611054565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fdc57611fa58484848461300a565b611fdb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601360009054906101000a90046bffffffffffffffffffffffff1681565b6120086124ca565b80600f60016101000a81548160ff02191690831515021790555050565b60156020528060005260406000206000915090505481565b6060612048826126dd565b612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90614750565b60405180910390fd5b6001151560166120968461315a565b6040516120a391906145e1565b908152602001604051809103902060009054906101000a900460ff1615150361215857600d80546120d390614052565b80601f01602080910402602001604051908101604052809291908181526020018280546120ff90614052565b801561214c5780601f106121215761010080835404028352916020019161214c565b820191906000526020600020905b81548152906001019060200180831161212f57829003601f168201915b50505050509050612236565b60001515600f60009054906101000a900460ff1615150361220557600c805461218090614052565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90614052565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b50505050509050612236565b600b6122108361315a565b600e604051602001612224939291906147f3565b60405160208183030381529060405290505b919050565b6013600c9054906101000a90046bffffffffffffffffffffffff1681565b600060168260405161226b91906145e1565b908152602001604051809103902060009054906101000a900460ff169050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6123306124ca565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361239f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239690614896565b60405180910390fd5b6123a881612ee1565b50565b600f60019054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124495750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124c357506124c2826132ba565b5b9050919050565b6124d2613324565b73ffffffffffffffffffffffffffffffffffffffff166124f0611cd4565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614902565b60405180910390fd5b565b6125506129bf565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a590614994565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614a00565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816126e8612744565b111580156126f7575060005482105b8015612735575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061275c612744565b116127e2576000548110156127e15760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036127df575b600081036127d55760046000836001900393508381526020019081526020016000205490506127ab565b8092505050612814565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129605760008290505b81836128ca9190614a20565b81101561295e576001151560166128e08361315a565b6040516128ed91906145e1565b908152602001604051809103902060009054906101000a900460ff1615150361294b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294290614ac2565b60405180910390fd5b8080612956906140e1565b9150506128be565b505b50505050565b60008060e883901c905060e861297d86868461332c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6129d1611868565b15612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614b2e565b60405180910390fd5b565b60008211612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90614b9a565b60405180910390fd5b6013600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1682612a88610f7e565b612a929190614a20565b1115612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca90614c06565b60405180910390fd5b80341015612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90614c72565b60405180910390fd5b5050565b612b34828260405180602001604052806000815250613335565b5050565b6000612b438361274d565b90506000819050600080612b5686612819565b915091508415612bbf57612b728184612b6d61273c565b612840565b612bbe57612b8783612b8261273c565b61228e565b612bbd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612bcd836000886001612884565b8015612bd857600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c8083612c3d85600088612966565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761298e565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612d065760006001870190506000600460008381526020019081526020016000205403612d04576000548114612d03578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d708360008860016129b9565b600160008154809291906001019190505550505050505050565b80471015612dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc490614cde565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612df390614d2f565b60006040518083038185875af1925050503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5050905080612e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7090614db6565b60405180910390fd5b505050565b612e866133d2565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612eca613324565b604051612ed7919061386d565b60405180910390a1565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612faf6129c9565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ff3613324565b604051613000919061386d565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261303061273c565b8786866040518563ffffffff1660e01b81526004016130529493929190614e2b565b6020604051808303816000875af192505050801561308e57506040513d601f19601f8201168201806040525081019061308b9190614e8c565b60015b613107573d80600081146130be576040519150601f19603f3d011682016040523d82523d6000602084013e6130c3565b606091505b5060008151036130ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036131a1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132b5565b600082905060005b600082146131d35780806131bc906140e1565b915050600a826131cc9190614430565b91506131a9565b60008167ffffffffffffffff8111156131ef576131ee6138f7565b5b6040519080825280601f01601f1916602001820160405280156132215781602001600182028036833780820191505090505b5090505b600085146132ae5760018261323a91906146d0565b9150600a856132499190614eb9565b60306132559190614a20565b60f81b81838151811061326b5761326a614083565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132a79190614430565b9450613225565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60009392505050565b61333f838361341b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146133cd57600080549050600083820390505b61337f600086838060010194508661300a565b6133b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061336c5781600054146133ca57600080fd5b50505b505050565b6133da611868565b613419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341090614f36565b60405180910390fd5b565b6000805490506000820361345b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134686000848385612884565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506134df836134d06000866000612966565b6134d9856135d6565b1761298e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461358057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613545565b50600082036135bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506135d160008483856129b9565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61362f816135fa565b811461363a57600080fd5b50565b60008135905061364c81613626565b92915050565b600060208284031215613668576136676135f0565b5b60006136768482850161363d565b91505092915050565b60008115159050919050565b6136948161367f565b82525050565b60006020820190506136af600083018461368b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136e0826136b5565b9050919050565b6136f0816136d5565b81146136fb57600080fd5b50565b60008135905061370d816136e7565b92915050565b600060208284031215613729576137286135f0565b5b6000613737848285016136fe565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561377a57808201518184015260208101905061375f565b83811115613789576000848401525b50505050565b6000601f19601f8301169050919050565b60006137ab82613740565b6137b5818561374b565b93506137c581856020860161375c565b6137ce8161378f565b840191505092915050565b600060208201905081810360008301526137f381846137a0565b905092915050565b6000819050919050565b61380e816137fb565b811461381957600080fd5b50565b60008135905061382b81613805565b92915050565b600060208284031215613847576138466135f0565b5b60006138558482850161381c565b91505092915050565b613867816136d5565b82525050565b6000602082019050613882600083018461385e565b92915050565b6000806040838503121561389f5761389e6135f0565b5b60006138ad858286016136fe565b92505060206138be8582860161381c565b9150509250929050565b6138d1816137fb565b82525050565b60006020820190506138ec60008301846138c8565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61392f8261378f565b810181811067ffffffffffffffff8211171561394e5761394d6138f7565b5b80604052505050565b60006139616135e6565b905061396d8282613926565b919050565b600067ffffffffffffffff82111561398d5761398c6138f7565b5b602082029050602081019050919050565b600080fd5b60006139b66139b184613972565b613957565b905080838252602082019050602084028301858111156139d9576139d861399e565b5b835b81811015613a0257806139ee88826136fe565b8452602084019350506020810190506139db565b5050509392505050565b600082601f830112613a2157613a206138f2565b5b8135613a318482602086016139a3565b91505092915050565b600067ffffffffffffffff821115613a5557613a546138f7565b5b602082029050602081019050919050565b6000613a79613a7484613a3a565b613957565b90508083825260208201905060208402830185811115613a9c57613a9b61399e565b5b835b81811015613ac55780613ab1888261381c565b845260208401935050602081019050613a9e565b5050509392505050565b600082601f830112613ae457613ae36138f2565b5b8135613af4848260208601613a66565b91505092915050565b60008060408385031215613b1457613b136135f0565b5b600083013567ffffffffffffffff811115613b3257613b316135f5565b5b613b3e85828601613a0c565b925050602083013567ffffffffffffffff811115613b5f57613b5e6135f5565b5b613b6b85828601613acf565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b9557613b946138f7565b5b613b9e8261378f565b9050602081019050919050565b82818337600083830152505050565b6000613bcd613bc884613b7a565b613957565b905082815260208101848484011115613be957613be8613b75565b5b613bf4848285613bab565b509392505050565b600082601f830112613c1157613c106138f2565b5b8135613c21848260208601613bba565b91505092915050565b600060208284031215613c4057613c3f6135f0565b5b600082013567ffffffffffffffff811115613c5e57613c5d6135f5565b5b613c6a84828501613bfc565b91505092915050565b600080600060608486031215613c8c57613c8b6135f0565b5b6000613c9a868287016136fe565b9350506020613cab868287016136fe565b9250506040613cbc8682870161381c565b9150509250925092565b613ccf8161367f565b8114613cda57600080fd5b50565b600081359050613cec81613cc6565b92915050565b600060208284031215613d0857613d076135f0565b5b6000613d1684828501613cdd565b91505092915050565b60008060408385031215613d3657613d356135f0565b5b6000613d448582860161381c565b9250506020613d558582860161381c565b9150509250929050565b6000604082019050613d74600083018561385e565b613d8160208301846138c8565b9392505050565b60006bffffffffffffffffffffffff82169050919050565b613da981613d88565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de16135f0565b5b6000613df084828501613db7565b91505092915050565b60008060408385031215613e1057613e0f6135f0565b5b600083013567ffffffffffffffff811115613e2e57613e2d6135f5565b5b613e3a85828601613bfc565b9250506020613e4b85828601613cdd565b9150509250929050565b60008060408385031215613e6c57613e6b6135f0565b5b6000613e7a858286016136fe565b9250506020613e8b85828601613cdd565b9150509250929050565b600067ffffffffffffffff821115613eb057613eaf6138f7565b5b613eb98261378f565b9050602081019050919050565b6000613ed9613ed484613e95565b613957565b905082815260208101848484011115613ef557613ef4613b75565b5b613f00848285613bab565b509392505050565b600082601f830112613f1d57613f1c6138f2565b5b8135613f2d848260208601613ec6565b91505092915050565b60008060008060808587031215613f5057613f4f6135f0565b5b6000613f5e878288016136fe565b9450506020613f6f878288016136fe565b9350506040613f808782880161381c565b925050606085013567ffffffffffffffff811115613fa157613fa06135f5565b5b613fad87828801613f08565b91505092959194509250565b613fc281613d88565b82525050565b6000602082019050613fdd6000830184613fb9565b92915050565b60008060408385031215613ffa57613ff96135f0565b5b6000614008858286016136fe565b9250506020614019858286016136fe565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406a57607f821691505b60208210810361407d5761407c614023565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140ec826137fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411e5761411d6140b2565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261418b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261414e565b614195868361414e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141d26141cd6141c8846137fb565b6141ad565b6137fb565b9050919050565b6000819050919050565b6141ec836141b7565b6142006141f8826141d9565b84845461415b565b825550505050565b600090565b614215614208565b6142208184846141e3565b505050565b5b818110156142445761423960008261420d565b600181019050614226565b5050565b601f8211156142895761425a81614129565b6142638461413e565b81016020851015614272578190505b61428661427e8561413e565b830182614225565b50505b505050565b600082821c905092915050565b60006142ac6000198460080261428e565b1980831691505092915050565b60006142c5838361429b565b9150826002028217905092915050565b6142de82613740565b67ffffffffffffffff8111156142f7576142f66138f7565b5b6143018254614052565b61430c828285614248565b600060209050601f83116001811461433f576000841561432d578287015190505b61433785826142b9565b86555061439f565b601f19841661434d86614129565b60005b8281101561437557848901518255600182019150602085019450602081019050614350565b86831015614392578489015161438e601f89168261429b565b8355505b6001600288020188555050505b505050505050565b60006143b2826137fb565b91506143bd836137fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f6576143f56140b2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061443b826137fb565b9150614446836137fb565b92508261445657614455614401565b5b828204905092915050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614497601e8361374b565b91506144a282614461565b602082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b7f50726573616c65206973206163746976652e0000000000000000000000000000600082015250565b600061450360128361374b565b915061450e826144cd565b602082019050919050565b60006020820190508181036000830152614532816144f6565b9050919050565b7f4d696e7420616d6f756e74206f76657200000000000000000000000000000000600082015250565b600061456f60108361374b565b915061457a82614539565b602082019050919050565b6000602082019050818103600083015261459e81614562565b9050919050565b600081905092915050565b60006145bb82613740565b6145c581856145a5565b93506145d581856020860161375c565b80840191505092915050565b60006145ed82846145b0565b915081905092915050565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b600061462e60168361374b565b9150614639826145f8565b602082019050919050565b6000602082019050818103600083015261465d81614621565b9050919050565b7f596f7520646f6e27742068617665204d696e74204c6973740000000000000000600082015250565b600061469a60188361374b565b91506146a582614664565b602082019050919050565b600060208201905081810360008301526146c98161468d565b9050919050565b60006146db826137fb565b91506146e6836137fb565b9250828210156146f9576146f86140b2565b5b828203905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061473a601f8361374b565b915061474582614704565b602082019050919050565b600060208201905081810360008301526147698161472d565b9050919050565b6000815461477d81614052565b61478781866145a5565b945060018216600081146147a257600181146147b7576147ea565b60ff19831686528115158202860193506147ea565b6147c085614129565b60005b838110156147e2578154818901526001820191506020810190506147c3565b838801955050505b50505092915050565b60006147ff8286614770565b915061480b82856145b0565b91506148178284614770565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061488060268361374b565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148ec60208361374b565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061497e602a8361374b565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006149ea60198361374b565b91506149f5826149b4565b602082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b6000614a2b826137fb565b9150614a36836137fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6b57614a6a6140b2565b5b828201905092915050565b7f5468697320746f6b656e206973206c6f636b6564000000000000000000000000600082015250565b6000614aac60148361374b565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b1860108361374b565b9150614b2382614ae2565b602082019050919050565b60006020820190508181036000830152614b4781614b0b565b9050919050565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b6000614b84601a8361374b565b9150614b8f82614b4e565b602082019050919050565b60006020820190508181036000830152614bb381614b77565b9050919050565b7f4d4158535550504c59206f766572000000000000000000000000000000000000600082015250565b6000614bf0600e8361374b565b9150614bfb82614bba565b602082019050919050565b60006020820190508181036000830152614c1f81614be3565b9050919050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000614c5c60108361374b565b9150614c6782614c26565b602082019050919050565b60006020820190508181036000830152614c8b81614c4f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614cc8601d8361374b565b9150614cd382614c92565b602082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b600081905092915050565b50565b6000614d19600083614cfe565b9150614d2482614d09565b600082019050919050565b6000614d3a82614d0c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614da0603a8361374b565b9150614dab82614d44565b604082019050919050565b60006020820190508181036000830152614dcf81614d93565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614dfd82614dd6565b614e078185614de1565b9350614e1781856020860161375c565b614e208161378f565b840191505092915050565b6000608082019050614e40600083018761385e565b614e4d602083018661385e565b614e5a60408301856138c8565b8181036060830152614e6c8184614df2565b905095945050505050565b600081519050614e8681613626565b92915050565b600060208284031215614ea257614ea16135f0565b5b6000614eb084828501614e77565b91505092915050565b6000614ec4826137fb565b9150614ecf836137fb565b925082614edf57614ede614401565b5b828206905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f2060148361374b565b9150614f2b82614eea565b602082019050919050565b60006020820190508181036000830152614f4f81614f13565b905091905056fea26469706673582212209bd35689e7173eb684428b0f9dc1dd327d072742f942648902f61c38cf55c9ea64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018434e46204c69666574696d6520416363657373205061737300000000000000000000000000000000000000000000000000000000000000000000000000000004434c415000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): CNF Lifetime Access Pass
Arg [1] : _symbol (string): CLAP
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 434e46204c69666574696d652041636365737320506173730000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 434c415000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
97426:6774:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103940:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102280:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19325:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25808:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25249:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102594:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15076:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101739:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102724:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29515:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102956:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64921:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;99124:381;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100744:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102842:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102106:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103829:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101608:123;;;;;;;;;;;;;:::i;:::-;;101535:65;;;;;;;;;;;;;:::i;:::-;;32428:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103734:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100313:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103059:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101142:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78168:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20718:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100434:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97521:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101972:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16260:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96582:103;;;;;;;;;;;;;:::i;:::-;;101360:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100844:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100956:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101466:61;;;;;;;;;;;;;:::i;:::-;;97894:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99513:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95934:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19501:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102467:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26366:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98071:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97852:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33211:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97980:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100651:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98154:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98566:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98034:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103195:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26831:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97938:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96840:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97817:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103940:257;104059:4;104096:38;104122:11;104096:25;:38::i;:::-;:93;;;;104151:38;104177:11;104151:25;:38::i;:::-;104096:93;104076:113;;103940:257;;;:::o;102280:179::-;95820:13;:11;:13::i;:::-;102379:15:::1;102362:14;;:32;;;;;;;;;;;;;;;;;;102405:46;102424:14;;;;;;;;;;;102440:10;;;;;;;;;;;102405:18;:46::i;:::-;102280:179:::0;:::o;19325:100::-;19379:13;19412:5;19405:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19325:100;:::o;25808:218::-;25884:7;25909:16;25917:7;25909;:16::i;:::-;25904:64;;25934:34;;;;;;;;;;;;;;25904:64;25988:15;:24;26004:7;25988:24;;;;;;;;;;;:30;;;;;;;;;;;;25981:37;;25808:218;;;:::o;25249:400::-;25330:13;25346:16;25354:7;25346;:16::i;:::-;25330:32;;25402:5;25379:28;;:19;:17;:19::i;:::-;:28;;;25375:175;;25427:44;25444:5;25451:19;:17;:19::i;:::-;25427:16;:44::i;:::-;25422:128;;25499:35;;;;;;;;;;;;;;25422:128;25375:175;25595:2;25562:15;:24;25578:7;25562:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25633:7;25629:2;25613:28;;25622:5;25613:28;;;;;;;;;;;;25319:330;25249:400;;:::o;102594:122::-;95820:13;:11;:13::i;:::-;102693:15:::1;102676:14;:32;;;;102594:122:::0;:::o;15076:323::-;15137:7;15365:15;:13;:15::i;:::-;15350:12;;15334:13;;:28;:46;15327:53;;15076:323;:::o;101739:225::-;95820:13;:11;:13::i;:::-;101859:9:::1;101854:103;101878:4;:11;101874:1;:15;101854:103;;;101935:7;101943:1;101935:10;;;;;;;;:::i;:::-;;;;;;;;101911:12;:21;101924:4;101929:1;101924:7;;;;;;;;:::i;:::-;;;;;;;;101911:21;;;;;;;;;;;;;;;:34;;;;101891:3;;;;;:::i;:::-;;;;101854:103;;;;101739:225:::0;;:::o;102724:110::-;95820:13;:11;:13::i;:::-;102821:5:::1;102809:9;:17;;;;;;:::i;:::-;;102724:110:::0;:::o;29515:2817::-;29649:27;29679;29698:7;29679:18;:27::i;:::-;29649:57;;29764:4;29723:45;;29739:19;29723:45;;;29719:86;;29777:28;;;;;;;;;;;;;;29719:86;29819:27;29848:23;29875:35;29902:7;29875:26;:35::i;:::-;29818:92;;;;30010:68;30035:15;30052:4;30058:19;:17;:19::i;:::-;30010:24;:68::i;:::-;30005:180;;30098:43;30115:4;30121:19;:17;:19::i;:::-;30098:16;:43::i;:::-;30093:92;;30150:35;;;;;;;;;;;;;;30093:92;30005:180;30216:1;30202:16;;:2;:16;;;30198:52;;30227:23;;;;;;;;;;;;;;30198:52;30263:43;30285:4;30291:2;30295:7;30304:1;30263:21;:43::i;:::-;30399:15;30396:160;;;30539:1;30518:19;30511:30;30396:160;30936:18;:24;30955:4;30936:24;;;;;;;;;;;;;;;;30934:26;;;;;;;;;;;;31005:18;:22;31024:2;31005:22;;;;;;;;;;;;;;;;31003:24;;;;;;;;;;;31327:146;31364:2;31413:45;31428:4;31434:2;31438:19;31413:14;:45::i;:::-;11475:8;31385:73;31327:18;:146::i;:::-;31298:17;:26;31316:7;31298:26;;;;;;;;;;;:175;;;;31644:1;11475:8;31593:19;:47;:52;31589:627;;31666:19;31698:1;31688:7;:11;31666:33;;31855:1;31821:17;:30;31839:11;31821:30;;;;;;;;;;;;:35;31817:384;;31959:13;;31944:11;:28;31940:242;;32139:19;32106:17;:30;32124:11;32106:30;;;;;;;;;;;:52;;;;31940:242;31817:384;31647:569;31589:627;32263:7;32259:2;32244:27;;32253:4;32244:27;;;;;;;;;;;;32282:42;32303:4;32309:2;32313:7;32322:1;32282:20;:42::i;:::-;29638:2694;;;29515:2817;;;:::o;102956:95::-;95820:13;:11;:13::i;:::-;103038:5:::1;103025:10;;:18;;;;;;;;;;;;;;;;;;102956:95:::0;:::o;64921:442::-;65018:7;65027;65047:26;65076:17;:27;65094:8;65076:27;;;;;;;;;;;65047:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65148:1;65120:30;;:7;:16;;;:30;;;65116:92;;65177:19;65167:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65116:92;65220:21;65285:17;:15;:17::i;:::-;65244:58;;65258:7;:23;;;65245:36;;:10;:36;;;;:::i;:::-;65244:58;;;;:::i;:::-;65220:82;;65323:7;:16;;;65341:13;65315:40;;;;;;64921:442;;;;;:::o;99124:381::-;77773:19;:17;:19::i;:::-;98493:10:::1;98480:23;;:9;:23;;;98472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;99218:12:::2;99246:11;99233:10;;:24;;;;:::i;:::-;99218:39;;99268:28;99278:11;99291:4;99268:9;:28::i;:::-;99316:7;;;;;;;;;;;99315:8;99307:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;99394:14;;99379:11;:29;;99357:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;99463:34;99473:10;99485:11;99463:9;:34::i;:::-;99207:298;99124:381:::0;:::o;100744:92::-;95820:13;:11;:13::i;:::-;100820:8:::1;100810:7;:18;;;;100744:92:::0;:::o;102842:106::-;95820:13;:11;:13::i;:::-;102935:5:::1;102923:9;:17;;;;;;:::i;:::-;;102842:106:::0;:::o;102106:166::-;95820:13;:11;:13::i;:::-;102194::::1;102181:10;;:26;;;;;;;;;;;;;;;;;;102218:46;102237:14;;;;;;;;;;;102253:10;;;;;;;;;;;102218:18;:46::i;:::-;102106:166:::0;:::o;103829:103::-;95820:13;:11;:13::i;:::-;103903:21:::1;103909:7;103918:5;103903;:21::i;:::-;103829:103:::0;:::o;101608:123::-;95820:13;:11;:13::i;:::-;101658:65:::1;101684:14;;;;;;;;;;;101701:21;101658:17;:65::i;:::-;101608:123::o:0;101535:65::-;95820:13;:11;:13::i;:::-;101582:10:::1;:8;:10::i;:::-;101535:65::o:0;32428:185::-;32566:39;32583:4;32589:2;32593:7;32566:39;;;;;;;;;;;;:16;:39::i;:::-;32428:185;;;:::o;103734:87::-;103793:20;103799:7;103808:4;103793:5;:20::i;:::-;103734:87;:::o;100313:113::-;95820:13;:11;:13::i;:::-;100392:26:::1;100402:8;100412:5;100392:9;:26::i;:::-;100313:113:::0;;:::o;103059:128::-;95820:13;:11;:13::i;:::-;103174:5:::1;103152:9;103162:8;103152:19;;;;;;:::i;:::-;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;103059:128:::0;;:::o;101142:104::-;95820:13;:11;:13::i;:::-;101227:11:::1;101217:7;:21;;;;;;:::i;:::-;;101142:104:::0;:::o;78168:86::-;78215:4;78239:7;;;;;;;;;;;78232:14;;78168:86;:::o;20718:152::-;20790:7;20833:27;20852:7;20833:18;:27::i;:::-;20810:52;;20718:152;;;:::o;100434:209::-;95820:13;:11;:13::i;:::-;100537:9:::1;100532:104;100556:7;:14;100552:1;:18;100532:104;;;100592:32;100602:7;100610:1;100602:10;;;;;;;;:::i;:::-;;;;;;;;100614:6;100621:1;100614:9;;;;;;;;:::i;:::-;;;;;;;;100592;:32::i;:::-;100572:3;;;;;:::i;:::-;;;;100532:104;;;;100434:209:::0;;:::o;97521:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;101972:126::-;102041:7;102068:12;:22;102081:8;102068:22;;;;;;;;;;;;;;;;102061:29;;101972:126;;;:::o;16260:233::-;16332:7;16373:1;16356:19;;:5;:19;;;16352:60;;16384:28;;;;;;;;;;;;;;16352:60;10419:13;16430:18;:25;16449:5;16430:25;;;;;;;;;;;;;;;;:55;16423:62;;16260:233;;;:::o;96582:103::-;95820:13;:11;:13::i;:::-;96647:30:::1;96674:1;96647:18;:30::i;:::-;96582:103::o:0;101360:98::-;95820:13;:11;:13::i;:::-;101445:5:::1;101433:9;:17;;;;;;:::i;:::-;;101360:98:::0;:::o;100844:104::-;95820:13;:11;:13::i;:::-;100929:11:::1;100916:10;:24;;;;100844:104:::0;:::o;100956:178::-;101003:7;101027;;;;;;;;;;;101023:104;;;101058:7;;101051:14;;;;101023:104;101105:10;;101098:17;;100956:178;;:::o;101466:61::-;95820:13;:11;:13::i;:::-;101511:8:::1;:6;:8::i;:::-;101466:61::o:0;97894:37::-;;;;:::o;99513:447::-;77773:19;:17;:19::i;:::-;98493:10:::1;98480:23;;:9;:23;;;98472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;99604:12:::2;99629:11;99619:7;;:21;;;;:::i;:::-;99604:36;;99651:29;99661:11;99675:4;99651:9;:29::i;:::-;99699:7;;;;;;;;;;;99691:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;99794:11;99766:12;:24;99779:10;99766:24;;;;;;;;;;;;;;;;:39;;99744:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;99896:11;99868:12;:24;99881:10;99868:24;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;99918:34;99928:10;99940:11;99918:9;:34::i;:::-;99593:367;99513:447:::0;:::o;95934:87::-;95980:7;96007:6;;;;;;;;;;;96000:13;;95934:87;:::o;19501:104::-;19557:13;19590:7;19583:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19501:104;:::o;102467:119::-;95820:13;:11;:13::i;:::-;102559:19:::1;102547:9;;:31;;;;;;;;;;;;;;;;;;102467:119:::0;:::o;26366:308::-;26477:19;:17;:19::i;:::-;26465:31;;:8;:31;;;26461:61;;26505:17;;;;;;;;;;;;;;26461:61;26587:8;26535:18;:39;26554:19;:17;:19::i;:::-;26535:39;;;;;;;;;;;;;;;:49;26575:8;26535:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26647:8;26611:55;;26626:19;:17;:19::i;:::-;26611:55;;;26657:8;26611:55;;;;;;:::i;:::-;;;;;;;;26366:308;;:::o;98071:74::-;;;;;;;;;;;;;:::o;97852:35::-;;;;:::o;33211:399::-;33378:31;33391:4;33397:2;33401:7;33378:12;:31::i;:::-;33442:1;33424:2;:14;;;:19;33420:183;;33463:56;33494:4;33500:2;33504:7;33513:5;33463:30;:56::i;:::-;33458:145;;33547:40;;;;;;;;;;;;;;33458:145;33420:183;33211:399;;;;:::o;97980:31::-;;;;;;;;;;;;;:::o;100651:85::-;95820:13;:11;:13::i;:::-;100722:6:::1;100712:7;;:16;;;;;;;;;;;;;;;;;;100651:85:::0;:::o;98154:47::-;;;;;;;;;;;;;;;;;:::o;98566:439::-;98640:13;98674:17;98682:8;98674:7;:17::i;:::-;98666:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;98782:4;98741:45;;:9;98751:26;98768:8;98751:16;:26::i;:::-;98741:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:45;;;98738:93;;98810:9;98803:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98738:93;98858:5;98844:19;;:10;;;;;;;;;;;:19;;;98841:67;;98887:9;98880:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98841:67;98949:7;98958:26;98975:8;98958:16;:26::i;:::-;98986:9;98932:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;98918:79;;98566:439;;;;:::o;98034:30::-;;;;;;;;;;;;;:::o;103195:125::-;103269:4;103293:9;103303:8;103293:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;103286:26;;103195:125;;;:::o;26831:164::-;26928:4;26952:18;:25;26971:5;26952:25;;;;;;;;;;;;;;;:35;26978:8;26952:35;;;;;;;;;;;;;;;;;;;;;;;;;26945:42;;26831:164;;;;:::o;97938:33::-;;;;:::o;96840:201::-;95820:13;:11;:13::i;:::-;96949:1:::1;96929:22;;:8;:22;;::::0;96921:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;97005:28;97024:8;97005:18;:28::i;:::-;96840:201:::0;:::o;97817:26::-;;;;;;;;;;;;;:::o;18423:639::-;18508:4;18847:10;18832:25;;:11;:25;;;;:102;;;;18924:10;18909:25;;:11;:25;;;;18832:102;:179;;;;19001:10;18986:25;;:11;:25;;;;18832:179;18812:199;;18423:639;;;:::o;64651:215::-;64753:4;64792:26;64777:41;;;:11;:41;;;;:81;;;;64822:36;64846:11;64822:23;:36::i;:::-;64777:81;64770:88;;64651:215;;;:::o;96099:132::-;96174:12;:10;:12::i;:::-;96163:23;;:7;:5;:7::i;:::-;:23;;;96155:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;96099:132::o;66013:332::-;66132:17;:15;:17::i;:::-;66116:33;;:12;:33;;;;66108:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;66235:1;66215:22;;:8;:22;;;66207:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;66302:35;;;;;;;;66314:8;66302:35;;;;;;66324:12;66302:35;;;;;66280:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66013:332;;:::o;27253:282::-;27318:4;27374:7;27355:15;:13;:15::i;:::-;:26;;:66;;;;;27408:13;;27398:7;:23;27355:66;:153;;;;;27507:1;11195:8;27459:17;:26;27477:7;27459:26;;;;;;;;;;;;:44;:49;27355:153;27335:173;;27253:282;;;:::o;49019:105::-;49079:7;49106:10;49099:17;;49019:105;:::o;99011:::-;99076:7;99107:1;99100:8;;99011:105;:::o;21873:1275::-;21940:7;21960:12;21975:7;21960:22;;22043:4;22024:15;:13;:15::i;:::-;:23;22020:1061;;22077:13;;22070:4;:20;22066:1015;;;22115:14;22132:17;:23;22150:4;22132:23;;;;;;;;;;;;22115:40;;22249:1;11195:8;22221:6;:24;:29;22217:845;;22886:113;22903:1;22893:6;:11;22886:113;;22946:17;:25;22964:6;;;;;;;22946:25;;;;;;;;;;;;22937:34;;22886:113;;;23032:6;23025:13;;;;;;22217:845;22092:989;22066:1015;22020:1061;23109:31;;;;;;;;;;;;;;21873:1275;;;;:::o;28416:479::-;28518:27;28547:23;28588:38;28629:15;:24;28645:7;28629:24;;;;;;;;;;;28588:65;;28800:18;28777:41;;28857:19;28851:26;28832:45;;28762:126;28416:479;;;:::o;27644:659::-;27793:11;27958:16;27951:5;27947:28;27938:37;;28118:16;28107:9;28103:32;28090:45;;28268:15;28257:9;28254:30;28246:5;28235:9;28232:20;28229:56;28219:66;;27644:659;;;;;:::o;103328:398::-;103519:1;103505:16;;:2;:16;;;103502:217;;103542:9;103554:12;103542:24;;103537:171;103587:8;103572:12;:23;;;;:::i;:::-;103568:1;:27;103537:171;;;103663:4;103629:38;;:9;103639:19;103656:1;103639:16;:19::i;:::-;103629:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:38;;;103621:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;103597:3;;;;;:::i;:::-;;;;103537:171;;;;103502:217;103328:398;;;;:::o;48328:311::-;48463:7;48483:16;11599:3;48509:19;:41;;48483:68;;11599:3;48577:31;48588:4;48594:2;48598:9;48577:10;:31::i;:::-;48569:40;;:62;;48562:69;;;48328:311;;;;;:::o;23696:450::-;23776:14;23944:16;23937:5;23933:28;23924:37;;24121:5;24107:11;24082:23;24078:41;24075:52;24068:5;24065:63;24055:73;;23696:450;;;;:::o;35096:158::-;;;;;:::o;65645:97::-;65703:6;65729:5;65722:12;;65645:97;:::o;78327:108::-;78398:8;:6;:8::i;:::-;78397:9;78389:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;78327:108::o;99968:337::-;100093:1;100079:11;:15;100071:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;100189:9;;;;;;;;;;;100158:40;;100174:11;100158:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;100136:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;100272:4;100259:9;:17;;100251:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;99968:337;;:::o;42851:112::-;42928:27;42938:2;42942:8;42928:27;;;;;;;;;;;;:9;:27::i;:::-;42851:112;;:::o;43548:3081::-;43628:27;43658;43677:7;43658:18;:27::i;:::-;43628:57;;43698:12;43729:19;43698:52;;43764:27;43793:23;43820:35;43847:7;43820:26;:35::i;:::-;43763:92;;;;43872:13;43868:316;;;43993:68;44018:15;44035:4;44041:19;:17;:19::i;:::-;43993:24;:68::i;:::-;43988:184;;44085:43;44102:4;44108:19;:17;:19::i;:::-;44085:16;:43::i;:::-;44080:92;;44137:35;;;;;;;;;;;;;;44080:92;43988:184;43868:316;44196:51;44218:4;44232:1;44236:7;44245:1;44196:21;:51::i;:::-;44340:15;44337:160;;;44480:1;44459:19;44452:30;44337:160;45158:1;10684:3;45128:1;:26;;45127:32;45099:18;:24;45118:4;45099:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45426:176;45463:4;45534:53;45549:4;45563:1;45567:19;45534:14;:53::i;:::-;11475:8;11195;45487:43;45486:101;45426:18;:176::i;:::-;45397:17;:26;45415:7;45397:26;;;;;;;;;;;:205;;;;45773:1;11475:8;45722:19;:47;:52;45718:627;;45795:19;45827:1;45817:7;:11;45795:33;;45984:1;45950:17;:30;45968:11;45950:30;;;;;;;;;;;;:35;45946:384;;46088:13;;46073:11;:28;46069:242;;46268:19;46235:17;:30;46253:11;46235:30;;;;;;;;;;;:52;;;;46069:242;45946:384;45776:569;45718:627;46400:7;46396:1;46373:35;;46382:4;46373:35;;;;;;;;;;;;46419:50;46440:4;46454:1;46458:7;46467:1;46419:20;:50::i;:::-;46596:12;;:14;;;;;;;;;;;;;43617:3012;;;;43548:3081;;:::o;53308:317::-;53423:6;53398:21;:31;;53390:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53477:12;53495:9;:14;;53517:6;53495:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53476:52;;;53547:7;53539:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;53379:246;53308:317;;:::o;79023:120::-;78032:16;:14;:16::i;:::-;79092:5:::1;79082:7;;:15;;;;;;;;;;;;;;;;;;79113:22;79122:12;:10;:12::i;:::-;79113:22;;;;;;:::i;:::-;;;;;;;;79023:120::o:0;97201:191::-;97275:16;97294:6;;;;;;;;;;;97275:25;;97320:8;97311:6;;:17;;;;;;;;;;;;;;;;;;97375:8;97344:40;;97365:8;97344:40;;;;;;;;;;;;97264:128;97201:191;:::o;78764:118::-;77773:19;:17;:19::i;:::-;78834:4:::1;78824:7;;:14;;;;;;;;;;;;;;;;;;78854:20;78861:12;:10;:12::i;:::-;78854:20;;;;;;:::i;:::-;;;;;;;;78764:118::o:0;35694:716::-;35857:4;35903:2;35878:45;;;35924:19;:17;:19::i;:::-;35945:4;35951:7;35960:5;35878:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35874:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36178:1;36161:6;:13;:18;36157:235;;36207:40;;;;;;;;;;;;;;36157:235;36350:6;36344:13;36335:6;36331:2;36327:15;36320:38;35874:529;36047:54;;;36037:64;;;:6;:64;;;;36030:71;;;35694:716;;;;;;:::o;73535:723::-;73591:13;73821:1;73812:5;:10;73808:53;;73839:10;;;;;;;;;;;;;;;;;;;;;73808:53;73871:12;73886:5;73871:20;;73902:14;73927:78;73942:1;73934:4;:9;73927:78;;73960:8;;;;;:::i;:::-;;;;73991:2;73983:10;;;;;:::i;:::-;;;73927:78;;;74015:19;74047:6;74037:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74015:39;;74065:154;74081:1;74072:5;:10;74065:154;;74109:1;74099:11;;;;;:::i;:::-;;;74176:2;74168:5;:10;;;;:::i;:::-;74155:2;:24;;;;:::i;:::-;74142:39;;74125:6;74132;74125:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;74205:2;74196:11;;;;;:::i;:::-;;;74065:154;;;74243:6;74229:21;;;;;73535:723;;;;:::o;63101:157::-;63186:4;63225:25;63210:40;;;:11;:40;;;;63203:47;;63101:157;;;:::o;76281:98::-;76334:7;76361:10;76354:17;;76281:98;:::o;48029:147::-;48166:6;48029:147;;;;;:::o;42078:689::-;42209:19;42215:2;42219:8;42209:5;:19::i;:::-;42288:1;42270:2;:14;;;:19;42266:483;;42310:11;42324:13;;42310:27;;42356:13;42378:8;42372:3;:14;42356:30;;42405:233;42436:62;42475:1;42479:2;42483:7;;;;;;42492:5;42436:30;:62::i;:::-;42431:167;;42534:40;;;;;;;;;;;;;;42431:167;42633:3;42625:5;:11;42405:233;;42720:3;42703:13;;:20;42699:34;;42725:8;;;42699:34;42291:458;;42266:483;42078:689;;;:::o;78512:108::-;78579:8;:6;:8::i;:::-;78571:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;78512:108::o;36872:2454::-;36945:20;36968:13;;36945:36;;37008:1;36996:8;:13;36992:44;;37018:18;;;;;;;;;;;;;;36992:44;37049:61;37079:1;37083:2;37087:12;37101:8;37049:21;:61::i;:::-;37593:1;10557:2;37563:1;:26;;37562:32;37550:8;:45;37524:18;:22;37543:2;37524:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37872:139;37909:2;37963:33;37986:1;37990:2;37994:1;37963:14;:33::i;:::-;37930:30;37951:8;37930:20;:30::i;:::-;:66;37872:18;:139::i;:::-;37838:17;:31;37856:12;37838:31;;;;;;;;;;;:173;;;;38028:16;38059:11;38088:8;38073:12;:23;38059:37;;38343:16;38339:2;38335:25;38323:37;;38715:12;38675:8;38634:1;38572:25;38513:1;38452;38425:335;38840:1;38826:12;38822:20;38780:346;38881:3;38872:7;38869:16;38780:346;;39099:7;39089:8;39086:1;39059:25;39056:1;39053;39048:59;38934:1;38925:7;38921:15;38910:26;;38780:346;;;38784:77;39171:1;39159:8;:13;39155:45;;39181:19;;;;;;;;;;;;;;39155:45;39233:3;39217:13;:19;;;;37298:1950;;39258:60;39287:1;39291:2;39295:12;39309:8;39258:20;:60::i;:::-;36934:2392;36872:2454;;:::o;24248:324::-;24318:14;24551:1;24541:8;24538:15;24512:24;24508:46;24498:56;;24248: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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:180;5796:77;5793:1;5786:88;5893:4;5890:1;5883:15;5917:4;5914:1;5907:15;5934:281;6017:27;6039:4;6017:27;:::i;:::-;6009:6;6005:40;6147:6;6135:10;6132:22;6111:18;6099:10;6096:34;6093:62;6090:88;;;6158:18;;:::i;:::-;6090:88;6198:10;6194:2;6187:22;5977:238;5934:281;;:::o;6221:129::-;6255:6;6282:20;;:::i;:::-;6272:30;;6311:33;6339:4;6331:6;6311:33;:::i;:::-;6221:129;;;:::o;6356:311::-;6433:4;6523:18;6515:6;6512:30;6509:56;;;6545:18;;:::i;:::-;6509:56;6595:4;6587:6;6583:17;6575:25;;6655:4;6649;6645:15;6637:23;;6356:311;;;:::o;6673:117::-;6782:1;6779;6772:12;6813:710;6909:5;6934:81;6950:64;7007:6;6950:64;:::i;:::-;6934:81;:::i;:::-;6925:90;;7035:5;7064:6;7057:5;7050:21;7098:4;7091:5;7087:16;7080:23;;7151:4;7143:6;7139:17;7131:6;7127:30;7180:3;7172:6;7169:15;7166:122;;;7199:79;;:::i;:::-;7166:122;7314:6;7297:220;7331:6;7326:3;7323:15;7297:220;;;7406:3;7435:37;7468:3;7456:10;7435:37;:::i;:::-;7430:3;7423:50;7502:4;7497:3;7493:14;7486:21;;7373:144;7357:4;7352:3;7348:14;7341:21;;7297:220;;;7301:21;6915:608;;6813:710;;;;;:::o;7546:370::-;7617:5;7666:3;7659:4;7651:6;7647:17;7643:27;7633:122;;7674:79;;:::i;:::-;7633:122;7791:6;7778:20;7816:94;7906:3;7898:6;7891:4;7883:6;7879:17;7816:94;:::i;:::-;7807:103;;7623:293;7546:370;;;;:::o;7922:311::-;7999:4;8089:18;8081:6;8078:30;8075:56;;;8111:18;;:::i;:::-;8075:56;8161:4;8153:6;8149:17;8141:25;;8221:4;8215;8211:15;8203:23;;7922:311;;;:::o;8256:710::-;8352:5;8377:81;8393:64;8450:6;8393:64;:::i;:::-;8377:81;:::i;:::-;8368:90;;8478:5;8507:6;8500:5;8493:21;8541:4;8534:5;8530:16;8523:23;;8594:4;8586:6;8582:17;8574:6;8570:30;8623:3;8615:6;8612:15;8609:122;;;8642:79;;:::i;:::-;8609:122;8757:6;8740:220;8774:6;8769:3;8766:15;8740:220;;;8849:3;8878:37;8911:3;8899:10;8878:37;:::i;:::-;8873:3;8866:50;8945:4;8940:3;8936:14;8929:21;;8816:144;8800:4;8795:3;8791:14;8784:21;;8740:220;;;8744:21;8358:608;;8256:710;;;;;:::o;8989:370::-;9060:5;9109:3;9102:4;9094:6;9090:17;9086:27;9076:122;;9117:79;;:::i;:::-;9076:122;9234:6;9221:20;9259:94;9349:3;9341:6;9334:4;9326:6;9322:17;9259:94;:::i;:::-;9250:103;;9066:293;8989:370;;;;:::o;9365:894::-;9483:6;9491;9540:2;9528:9;9519:7;9515:23;9511:32;9508:119;;;9546:79;;:::i;:::-;9508:119;9694:1;9683:9;9679:17;9666:31;9724:18;9716:6;9713:30;9710:117;;;9746:79;;:::i;:::-;9710:117;9851:78;9921:7;9912:6;9901:9;9897:22;9851:78;:::i;:::-;9841:88;;9637:302;10006:2;9995:9;9991:18;9978:32;10037:18;10029:6;10026:30;10023:117;;;10059:79;;:::i;:::-;10023:117;10164:78;10234:7;10225:6;10214:9;10210:22;10164:78;:::i;:::-;10154:88;;9949:303;9365:894;;;;;:::o;10265:117::-;10374:1;10371;10364:12;10388:308;10450:4;10540:18;10532:6;10529:30;10526:56;;;10562:18;;:::i;:::-;10526:56;10600:29;10622:6;10600:29;:::i;:::-;10592:37;;10684:4;10678;10674:15;10666:23;;10388:308;;;:::o;10702:154::-;10786:6;10781:3;10776;10763:30;10848:1;10839:6;10834:3;10830:16;10823:27;10702:154;;;:::o;10862:412::-;10940:5;10965:66;10981:49;11023:6;10981:49;:::i;:::-;10965:66;:::i;:::-;10956:75;;11054:6;11047:5;11040:21;11092:4;11085:5;11081:16;11130:3;11121:6;11116:3;11112:16;11109:25;11106:112;;;11137:79;;:::i;:::-;11106:112;11227:41;11261:6;11256:3;11251;11227:41;:::i;:::-;10946:328;10862:412;;;;;:::o;11294:340::-;11350:5;11399:3;11392:4;11384:6;11380:17;11376:27;11366:122;;11407:79;;:::i;:::-;11366:122;11524:6;11511:20;11549:79;11624:3;11616:6;11609:4;11601:6;11597:17;11549:79;:::i;:::-;11540:88;;11356:278;11294:340;;;;:::o;11640:509::-;11709:6;11758:2;11746:9;11737:7;11733:23;11729:32;11726:119;;;11764:79;;:::i;:::-;11726:119;11912:1;11901:9;11897:17;11884:31;11942:18;11934:6;11931:30;11928:117;;;11964:79;;:::i;:::-;11928:117;12069:63;12124:7;12115:6;12104:9;12100:22;12069:63;:::i;:::-;12059:73;;11855:287;11640:509;;;;:::o;12155:619::-;12232:6;12240;12248;12297:2;12285:9;12276:7;12272:23;12268:32;12265:119;;;12303:79;;:::i;:::-;12265:119;12423:1;12448:53;12493:7;12484:6;12473:9;12469:22;12448:53;:::i;:::-;12438:63;;12394:117;12550:2;12576:53;12621:7;12612:6;12601:9;12597:22;12576:53;:::i;:::-;12566:63;;12521:118;12678:2;12704:53;12749:7;12740:6;12729:9;12725:22;12704:53;:::i;:::-;12694:63;;12649:118;12155:619;;;;;:::o;12780:116::-;12850:21;12865:5;12850:21;:::i;:::-;12843:5;12840:32;12830:60;;12886:1;12883;12876:12;12830:60;12780:116;:::o;12902:133::-;12945:5;12983:6;12970:20;12961:29;;12999:30;13023:5;12999:30;:::i;:::-;12902:133;;;;:::o;13041:323::-;13097:6;13146:2;13134:9;13125:7;13121:23;13117:32;13114:119;;;13152:79;;:::i;:::-;13114:119;13272:1;13297:50;13339:7;13330:6;13319:9;13315:22;13297:50;:::i;:::-;13287:60;;13243:114;13041:323;;;;:::o;13370:474::-;13438:6;13446;13495:2;13483:9;13474:7;13470:23;13466:32;13463:119;;;13501:79;;:::i;:::-;13463:119;13621:1;13646:53;13691:7;13682:6;13671:9;13667:22;13646:53;:::i;:::-;13636:63;;13592:117;13748:2;13774:53;13819:7;13810:6;13799:9;13795:22;13774:53;:::i;:::-;13764:63;;13719:118;13370:474;;;;;:::o;13850:332::-;13971:4;14009:2;13998:9;13994:18;13986:26;;14022:71;14090:1;14079:9;14075:17;14066:6;14022:71;:::i;:::-;14103:72;14171:2;14160:9;14156:18;14147:6;14103:72;:::i;:::-;13850:332;;;;;:::o;14188:109::-;14224:7;14264:26;14257:5;14253:38;14242:49;;14188:109;;;:::o;14303:120::-;14375:23;14392:5;14375:23;:::i;:::-;14368:5;14365:34;14355:62;;14413:1;14410;14403:12;14355:62;14303:120;:::o;14429:137::-;14474:5;14512:6;14499:20;14490:29;;14528:32;14554:5;14528:32;:::i;:::-;14429:137;;;;:::o;14572:327::-;14630:6;14679:2;14667:9;14658:7;14654:23;14650:32;14647:119;;;14685:79;;:::i;:::-;14647:119;14805:1;14830:52;14874:7;14865:6;14854:9;14850:22;14830:52;:::i;:::-;14820:62;;14776:116;14572:327;;;;:::o;14905:648::-;14980:6;14988;15037:2;15025:9;15016:7;15012:23;15008:32;15005:119;;;15043:79;;:::i;:::-;15005:119;15191:1;15180:9;15176:17;15163:31;15221:18;15213:6;15210:30;15207:117;;;15243:79;;:::i;:::-;15207:117;15348:63;15403:7;15394:6;15383:9;15379:22;15348:63;:::i;:::-;15338:73;;15134:287;15460:2;15486:50;15528:7;15519:6;15508:9;15504:22;15486:50;:::i;:::-;15476:60;;15431:115;14905:648;;;;;:::o;15559:468::-;15624:6;15632;15681:2;15669:9;15660:7;15656:23;15652:32;15649:119;;;15687:79;;:::i;:::-;15649:119;15807:1;15832:53;15877:7;15868:6;15857:9;15853:22;15832:53;:::i;:::-;15822:63;;15778:117;15934:2;15960:50;16002:7;15993:6;15982:9;15978:22;15960:50;:::i;:::-;15950:60;;15905:115;15559:468;;;;;:::o;16033:307::-;16094:4;16184:18;16176:6;16173:30;16170:56;;;16206:18;;:::i;:::-;16170:56;16244:29;16266:6;16244:29;:::i;:::-;16236:37;;16328:4;16322;16318:15;16310:23;;16033:307;;;:::o;16346:410::-;16423:5;16448:65;16464:48;16505:6;16464:48;:::i;:::-;16448:65;:::i;:::-;16439:74;;16536:6;16529:5;16522:21;16574:4;16567:5;16563:16;16612:3;16603:6;16598:3;16594:16;16591:25;16588:112;;;16619:79;;:::i;:::-;16588:112;16709:41;16743:6;16738:3;16733;16709:41;:::i;:::-;16429:327;16346:410;;;;;:::o;16775:338::-;16830:5;16879:3;16872:4;16864:6;16860:17;16856:27;16846:122;;16887:79;;:::i;:::-;16846:122;17004:6;16991:20;17029:78;17103:3;17095:6;17088:4;17080:6;17076:17;17029:78;:::i;:::-;17020:87;;16836:277;16775:338;;;;:::o;17119:943::-;17214:6;17222;17230;17238;17287:3;17275:9;17266:7;17262:23;17258:33;17255:120;;;17294:79;;:::i;:::-;17255:120;17414:1;17439:53;17484:7;17475:6;17464:9;17460:22;17439:53;:::i;:::-;17429:63;;17385:117;17541:2;17567:53;17612:7;17603:6;17592:9;17588:22;17567:53;:::i;:::-;17557:63;;17512:118;17669:2;17695:53;17740:7;17731:6;17720:9;17716:22;17695:53;:::i;:::-;17685:63;;17640:118;17825:2;17814:9;17810:18;17797:32;17856:18;17848:6;17845:30;17842:117;;;17878:79;;:::i;:::-;17842:117;17983:62;18037:7;18028:6;18017:9;18013:22;17983:62;:::i;:::-;17973:72;;17768:287;17119:943;;;;;;;:::o;18068:115::-;18153:23;18170:5;18153:23;:::i;:::-;18148:3;18141:36;18068:115;;:::o;18189:218::-;18280:4;18318:2;18307:9;18303:18;18295:26;;18331:69;18397:1;18386:9;18382:17;18373:6;18331:69;:::i;:::-;18189:218;;;;:::o;18413:474::-;18481:6;18489;18538:2;18526:9;18517:7;18513:23;18509:32;18506:119;;;18544:79;;:::i;:::-;18506:119;18664:1;18689:53;18734:7;18725:6;18714:9;18710:22;18689:53;:::i;:::-;18679:63;;18635:117;18791:2;18817:53;18862:7;18853:6;18842:9;18838:22;18817:53;:::i;:::-;18807:63;;18762:118;18413:474;;;;;:::o;18893:180::-;18941:77;18938:1;18931:88;19038:4;19035:1;19028:15;19062:4;19059:1;19052:15;19079:320;19123:6;19160:1;19154:4;19150:12;19140:22;;19207:1;19201:4;19197:12;19228:18;19218:81;;19284:4;19276:6;19272:17;19262:27;;19218:81;19346:2;19338:6;19335:14;19315:18;19312:38;19309:84;;19365:18;;:::i;:::-;19309:84;19130:269;19079:320;;;:::o;19405:180::-;19453:77;19450:1;19443:88;19550:4;19547:1;19540:15;19574:4;19571:1;19564:15;19591:180;19639:77;19636:1;19629:88;19736:4;19733:1;19726:15;19760:4;19757:1;19750:15;19777:233;19816:3;19839:24;19857:5;19839:24;:::i;:::-;19830:33;;19885:66;19878:5;19875:77;19872:103;;19955:18;;:::i;:::-;19872:103;20002:1;19995:5;19991:13;19984:20;;19777:233;;;:::o;20016:141::-;20065:4;20088:3;20080:11;;20111:3;20108:1;20101:14;20145:4;20142:1;20132:18;20124:26;;20016:141;;;:::o;20163:93::-;20200:6;20247:2;20242;20235:5;20231:14;20227:23;20217:33;;20163:93;;;:::o;20262:107::-;20306:8;20356:5;20350:4;20346:16;20325:37;;20262:107;;;;:::o;20375:393::-;20444:6;20494:1;20482:10;20478:18;20517:97;20547:66;20536:9;20517:97;:::i;:::-;20635:39;20665:8;20654:9;20635:39;:::i;:::-;20623:51;;20707:4;20703:9;20696:5;20692:21;20683:30;;20756:4;20746:8;20742:19;20735:5;20732:30;20722:40;;20451:317;;20375:393;;;;;:::o;20774:60::-;20802:3;20823:5;20816:12;;20774:60;;;:::o;20840:142::-;20890:9;20923:53;20941:34;20950:24;20968:5;20950:24;:::i;:::-;20941:34;:::i;:::-;20923:53;:::i;:::-;20910:66;;20840:142;;;:::o;20988:75::-;21031:3;21052:5;21045:12;;20988:75;;;:::o;21069:269::-;21179:39;21210:7;21179:39;:::i;:::-;21240:91;21289:41;21313:16;21289:41;:::i;:::-;21281:6;21274:4;21268:11;21240:91;:::i;:::-;21234:4;21227:105;21145:193;21069:269;;;:::o;21344:73::-;21389:3;21344:73;:::o;21423:189::-;21500:32;;:::i;:::-;21541:65;21599:6;21591;21585:4;21541:65;:::i;:::-;21476:136;21423:189;;:::o;21618:186::-;21678:120;21695:3;21688:5;21685:14;21678:120;;;21749:39;21786:1;21779:5;21749:39;:::i;:::-;21722:1;21715:5;21711:13;21702:22;;21678:120;;;21618:186;;:::o;21810:543::-;21911:2;21906:3;21903:11;21900:446;;;21945:38;21977:5;21945:38;:::i;:::-;22029:29;22047:10;22029:29;:::i;:::-;22019:8;22015:44;22212:2;22200:10;22197:18;22194:49;;;22233:8;22218:23;;22194:49;22256:80;22312:22;22330:3;22312:22;:::i;:::-;22302:8;22298:37;22285:11;22256:80;:::i;:::-;21915:431;;21900:446;21810:543;;;:::o;22359:117::-;22413:8;22463:5;22457:4;22453:16;22432:37;;22359:117;;;;:::o;22482:169::-;22526:6;22559:51;22607:1;22603:6;22595:5;22592:1;22588:13;22559:51;:::i;:::-;22555:56;22640:4;22634;22630:15;22620:25;;22533:118;22482:169;;;;:::o;22656:295::-;22732:4;22878:29;22903:3;22897:4;22878:29;:::i;:::-;22870:37;;22940:3;22937:1;22933:11;22927:4;22924:21;22916:29;;22656:295;;;;:::o;22956:1395::-;23073:37;23106:3;23073:37;:::i;:::-;23175:18;23167:6;23164:30;23161:56;;;23197:18;;:::i;:::-;23161:56;23241:38;23273:4;23267:11;23241:38;:::i;:::-;23326:67;23386:6;23378;23372:4;23326:67;:::i;:::-;23420:1;23444:4;23431:17;;23476:2;23468:6;23465:14;23493:1;23488:618;;;;24150:1;24167:6;24164:77;;;24216:9;24211:3;24207:19;24201:26;24192:35;;24164:77;24267:67;24327:6;24320:5;24267:67;:::i;:::-;24261:4;24254:81;24123:222;23458:887;;23488:618;23540:4;23536:9;23528:6;23524:22;23574:37;23606:4;23574:37;:::i;:::-;23633:1;23647:208;23661:7;23658:1;23655:14;23647:208;;;23740:9;23735:3;23731:19;23725:26;23717:6;23710:42;23791:1;23783:6;23779:14;23769:24;;23838:2;23827:9;23823:18;23810:31;;23684:4;23681:1;23677:12;23672:17;;23647:208;;;23883:6;23874:7;23871:19;23868:179;;;23941:9;23936:3;23932:19;23926:26;23984:48;24026:4;24018:6;24014:17;24003:9;23984:48;:::i;:::-;23976:6;23969:64;23891:156;23868:179;24093:1;24089;24081:6;24077:14;24073:22;24067:4;24060:36;23495:611;;;23458:887;;23048:1303;;;22956:1395;;:::o;24357:348::-;24397:7;24420:20;24438:1;24420:20;:::i;:::-;24415:25;;24454:20;24472:1;24454:20;:::i;:::-;24449:25;;24642:1;24574:66;24570:74;24567:1;24564:81;24559:1;24552:9;24545:17;24541:105;24538:131;;;24649:18;;:::i;:::-;24538:131;24697:1;24694;24690:9;24679:20;;24357:348;;;;:::o;24711:180::-;24759:77;24756:1;24749:88;24856:4;24853:1;24846:15;24880:4;24877:1;24870:15;24897:185;24937:1;24954:20;24972:1;24954:20;:::i;:::-;24949:25;;24988:20;25006:1;24988:20;:::i;:::-;24983:25;;25027:1;25017:35;;25032:18;;:::i;:::-;25017:35;25074:1;25071;25067:9;25062:14;;24897:185;;;;:::o;25088:180::-;25228:32;25224:1;25216:6;25212:14;25205:56;25088:180;:::o;25274:366::-;25416:3;25437:67;25501:2;25496:3;25437:67;:::i;:::-;25430:74;;25513:93;25602:3;25513:93;:::i;:::-;25631:2;25626:3;25622:12;25615:19;;25274:366;;;:::o;25646:419::-;25812:4;25850:2;25839:9;25835:18;25827:26;;25899:9;25893:4;25889:20;25885:1;25874:9;25870:17;25863:47;25927:131;26053:4;25927:131;:::i;:::-;25919:139;;25646:419;;;:::o;26071:168::-;26211:20;26207:1;26199:6;26195:14;26188:44;26071:168;:::o;26245:366::-;26387:3;26408:67;26472:2;26467:3;26408:67;:::i;:::-;26401:74;;26484:93;26573:3;26484:93;:::i;:::-;26602:2;26597:3;26593:12;26586:19;;26245:366;;;:::o;26617:419::-;26783:4;26821:2;26810:9;26806:18;26798:26;;26870:9;26864:4;26860:20;26856:1;26845:9;26841:17;26834:47;26898:131;27024:4;26898:131;:::i;:::-;26890:139;;26617:419;;;:::o;27042:166::-;27182:18;27178:1;27170:6;27166:14;27159:42;27042:166;:::o;27214:366::-;27356:3;27377:67;27441:2;27436:3;27377:67;:::i;:::-;27370:74;;27453:93;27542:3;27453:93;:::i;:::-;27571:2;27566:3;27562:12;27555:19;;27214:366;;;:::o;27586:419::-;27752:4;27790:2;27779:9;27775:18;27767:26;;27839:9;27833:4;27829:20;27825:1;27814:9;27810:17;27803:47;27867:131;27993:4;27867:131;:::i;:::-;27859:139;;27586:419;;;:::o;28011:148::-;28113:11;28150:3;28135:18;;28011:148;;;;:::o;28165:377::-;28271:3;28299:39;28332:5;28299:39;:::i;:::-;28354:89;28436:6;28431:3;28354:89;:::i;:::-;28347:96;;28452:52;28497:6;28492:3;28485:4;28478:5;28474:16;28452:52;:::i;:::-;28529:6;28524:3;28520:16;28513:23;;28275:267;28165:377;;;;:::o;28548:275::-;28680:3;28702:95;28793:3;28784:6;28702:95;:::i;:::-;28695:102;;28814:3;28807:10;;28548:275;;;;:::o;28829:172::-;28969:24;28965:1;28957:6;28953:14;28946:48;28829:172;:::o;29007:366::-;29149:3;29170:67;29234:2;29229:3;29170:67;:::i;:::-;29163:74;;29246:93;29335:3;29246:93;:::i;:::-;29364:2;29359:3;29355:12;29348:19;;29007:366;;;:::o;29379:419::-;29545:4;29583:2;29572:9;29568:18;29560:26;;29632:9;29626:4;29622:20;29618:1;29607:9;29603:17;29596:47;29660:131;29786:4;29660:131;:::i;:::-;29652:139;;29379:419;;;:::o;29804:174::-;29944:26;29940:1;29932:6;29928:14;29921:50;29804:174;:::o;29984:366::-;30126:3;30147:67;30211:2;30206:3;30147:67;:::i;:::-;30140:74;;30223:93;30312:3;30223:93;:::i;:::-;30341:2;30336:3;30332:12;30325:19;;29984:366;;;:::o;30356:419::-;30522:4;30560:2;30549:9;30545:18;30537:26;;30609:9;30603:4;30599:20;30595:1;30584:9;30580:17;30573:47;30637:131;30763:4;30637:131;:::i;:::-;30629:139;;30356:419;;;:::o;30781:191::-;30821:4;30841:20;30859:1;30841:20;:::i;:::-;30836:25;;30875:20;30893:1;30875:20;:::i;:::-;30870:25;;30914:1;30911;30908:8;30905:34;;;30919:18;;:::i;:::-;30905:34;30964:1;30961;30957:9;30949:17;;30781:191;;;;:::o;30978:181::-;31118:33;31114:1;31106:6;31102:14;31095:57;30978:181;:::o;31165:366::-;31307:3;31328:67;31392:2;31387:3;31328:67;:::i;:::-;31321:74;;31404:93;31493:3;31404:93;:::i;:::-;31522:2;31517:3;31513:12;31506:19;;31165:366;;;:::o;31537:419::-;31703:4;31741:2;31730:9;31726:18;31718:26;;31790:9;31784:4;31780:20;31776:1;31765:9;31761:17;31754:47;31818:131;31944:4;31818:131;:::i;:::-;31810:139;;31537:419;;;:::o;31986:874::-;32089:3;32126:5;32120:12;32155:36;32181:9;32155:36;:::i;:::-;32207:89;32289:6;32284:3;32207:89;:::i;:::-;32200:96;;32327:1;32316:9;32312:17;32343:1;32338:166;;;;32518:1;32513:341;;;;32305:549;;32338:166;32422:4;32418:9;32407;32403:25;32398:3;32391:38;32484:6;32477:14;32470:22;32462:6;32458:35;32453:3;32449:45;32442:52;;32338:166;;32513:341;32580:38;32612:5;32580:38;:::i;:::-;32640:1;32654:154;32668:6;32665:1;32662:13;32654:154;;;32742:7;32736:14;32732:1;32727:3;32723:11;32716:35;32792:1;32783:7;32779:15;32768:26;;32690:4;32687:1;32683:12;32678:17;;32654:154;;;32837:6;32832:3;32828:16;32821:23;;32520:334;;32305:549;;32093:767;;31986:874;;;;:::o;32866:583::-;33088:3;33110:92;33198:3;33189:6;33110:92;:::i;:::-;33103:99;;33219:95;33310:3;33301:6;33219:95;:::i;:::-;33212:102;;33331:92;33419:3;33410:6;33331:92;:::i;:::-;33324:99;;33440:3;33433:10;;32866:583;;;;;;:::o;33455:225::-;33595:34;33591:1;33583:6;33579:14;33572:58;33664:8;33659:2;33651:6;33647:15;33640:33;33455:225;:::o;33686:366::-;33828:3;33849:67;33913:2;33908:3;33849:67;:::i;:::-;33842:74;;33925:93;34014:3;33925:93;:::i;:::-;34043:2;34038:3;34034:12;34027:19;;33686:366;;;:::o;34058:419::-;34224:4;34262:2;34251:9;34247:18;34239:26;;34311:9;34305:4;34301:20;34297:1;34286:9;34282:17;34275:47;34339:131;34465:4;34339:131;:::i;:::-;34331:139;;34058:419;;;:::o;34483:182::-;34623:34;34619:1;34611:6;34607:14;34600:58;34483:182;:::o;34671:366::-;34813:3;34834:67;34898:2;34893:3;34834:67;:::i;:::-;34827:74;;34910:93;34999:3;34910:93;:::i;:::-;35028:2;35023:3;35019:12;35012:19;;34671:366;;;:::o;35043:419::-;35209:4;35247:2;35236:9;35232:18;35224:26;;35296:9;35290:4;35286:20;35282:1;35271:9;35267:17;35260:47;35324:131;35450:4;35324:131;:::i;:::-;35316:139;;35043:419;;;:::o;35468:229::-;35608:34;35604:1;35596:6;35592:14;35585:58;35677:12;35672:2;35664:6;35660:15;35653:37;35468:229;:::o;35703:366::-;35845:3;35866:67;35930:2;35925:3;35866:67;:::i;:::-;35859:74;;35942:93;36031:3;35942:93;:::i;:::-;36060:2;36055:3;36051:12;36044:19;;35703:366;;;:::o;36075:419::-;36241:4;36279:2;36268:9;36264:18;36256:26;;36328:9;36322:4;36318:20;36314:1;36303:9;36299:17;36292:47;36356:131;36482:4;36356:131;:::i;:::-;36348:139;;36075:419;;;:::o;36500:175::-;36640:27;36636:1;36628:6;36624:14;36617:51;36500:175;:::o;36681:366::-;36823:3;36844:67;36908:2;36903:3;36844:67;:::i;:::-;36837:74;;36920:93;37009:3;36920:93;:::i;:::-;37038:2;37033:3;37029:12;37022:19;;36681:366;;;:::o;37053:419::-;37219:4;37257:2;37246:9;37242:18;37234:26;;37306:9;37300:4;37296:20;37292:1;37281:9;37277:17;37270:47;37334:131;37460:4;37334:131;:::i;:::-;37326:139;;37053:419;;;:::o;37478:305::-;37518:3;37537:20;37555:1;37537:20;:::i;:::-;37532:25;;37571:20;37589:1;37571:20;:::i;:::-;37566:25;;37725:1;37657:66;37653:74;37650:1;37647:81;37644:107;;;37731:18;;:::i;:::-;37644:107;37775:1;37772;37768:9;37761:16;;37478:305;;;;:::o;37789:170::-;37929:22;37925:1;37917:6;37913:14;37906:46;37789:170;:::o;37965:366::-;38107:3;38128:67;38192:2;38187:3;38128:67;:::i;:::-;38121:74;;38204:93;38293:3;38204:93;:::i;:::-;38322:2;38317:3;38313:12;38306:19;;37965:366;;;:::o;38337:419::-;38503:4;38541:2;38530:9;38526:18;38518:26;;38590:9;38584:4;38580:20;38576:1;38565:9;38561:17;38554:47;38618:131;38744:4;38618:131;:::i;:::-;38610:139;;38337:419;;;:::o;38762:166::-;38902:18;38898:1;38890:6;38886:14;38879:42;38762:166;:::o;38934:366::-;39076:3;39097:67;39161:2;39156:3;39097:67;:::i;:::-;39090:74;;39173:93;39262:3;39173:93;:::i;:::-;39291:2;39286:3;39282:12;39275:19;;38934:366;;;:::o;39306:419::-;39472:4;39510:2;39499:9;39495:18;39487:26;;39559:9;39553:4;39549:20;39545:1;39534:9;39530:17;39523:47;39587:131;39713:4;39587:131;:::i;:::-;39579:139;;39306:419;;;:::o;39731:176::-;39871:28;39867:1;39859:6;39855:14;39848:52;39731:176;:::o;39913:366::-;40055:3;40076:67;40140:2;40135:3;40076:67;:::i;:::-;40069:74;;40152:93;40241:3;40152:93;:::i;:::-;40270:2;40265:3;40261:12;40254:19;;39913:366;;;:::o;40285:419::-;40451:4;40489:2;40478:9;40474:18;40466:26;;40538:9;40532:4;40528:20;40524:1;40513:9;40509:17;40502:47;40566:131;40692:4;40566:131;:::i;:::-;40558:139;;40285:419;;;:::o;40710:164::-;40850:16;40846:1;40838:6;40834:14;40827:40;40710:164;:::o;40880:366::-;41022:3;41043:67;41107:2;41102:3;41043:67;:::i;:::-;41036:74;;41119:93;41208:3;41119:93;:::i;:::-;41237:2;41232:3;41228:12;41221:19;;40880:366;;;:::o;41252:419::-;41418:4;41456:2;41445:9;41441:18;41433:26;;41505:9;41499:4;41495:20;41491:1;41480:9;41476:17;41469:47;41533:131;41659:4;41533:131;:::i;:::-;41525:139;;41252:419;;;:::o;41677:166::-;41817:18;41813:1;41805:6;41801:14;41794:42;41677:166;:::o;41849:366::-;41991:3;42012:67;42076:2;42071:3;42012:67;:::i;:::-;42005:74;;42088:93;42177:3;42088:93;:::i;:::-;42206:2;42201:3;42197:12;42190:19;;41849:366;;;:::o;42221:419::-;42387:4;42425:2;42414:9;42410:18;42402:26;;42474:9;42468:4;42464:20;42460:1;42449:9;42445:17;42438:47;42502:131;42628:4;42502:131;:::i;:::-;42494:139;;42221:419;;;:::o;42646:179::-;42786:31;42782:1;42774:6;42770:14;42763:55;42646:179;:::o;42831:366::-;42973:3;42994:67;43058:2;43053:3;42994:67;:::i;:::-;42987:74;;43070:93;43159:3;43070:93;:::i;:::-;43188:2;43183:3;43179:12;43172:19;;42831:366;;;:::o;43203:419::-;43369:4;43407:2;43396:9;43392:18;43384:26;;43456:9;43450:4;43446:20;43442:1;43431:9;43427:17;43420:47;43484:131;43610:4;43484:131;:::i;:::-;43476:139;;43203:419;;;:::o;43628:147::-;43729:11;43766:3;43751:18;;43628:147;;;;:::o;43781:114::-;;:::o;43901:398::-;44060:3;44081:83;44162:1;44157:3;44081:83;:::i;:::-;44074:90;;44173:93;44262:3;44173:93;:::i;:::-;44291:1;44286:3;44282:11;44275:18;;43901:398;;;:::o;44305:379::-;44489:3;44511:147;44654:3;44511:147;:::i;:::-;44504:154;;44675:3;44668:10;;44305:379;;;:::o;44690:245::-;44830:34;44826:1;44818:6;44814:14;44807:58;44899:28;44894:2;44886:6;44882:15;44875:53;44690:245;:::o;44941:366::-;45083:3;45104:67;45168:2;45163:3;45104:67;:::i;:::-;45097:74;;45180:93;45269:3;45180:93;:::i;:::-;45298:2;45293:3;45289:12;45282:19;;44941:366;;;:::o;45313:419::-;45479:4;45517:2;45506:9;45502:18;45494:26;;45566:9;45560:4;45556:20;45552:1;45541:9;45537:17;45530:47;45594:131;45720:4;45594:131;:::i;:::-;45586:139;;45313:419;;;:::o;45738:98::-;45789:6;45823:5;45817:12;45807:22;;45738:98;;;:::o;45842:168::-;45925:11;45959:6;45954:3;45947:19;45999:4;45994:3;45990:14;45975:29;;45842:168;;;;:::o;46016:360::-;46102:3;46130:38;46162:5;46130:38;:::i;:::-;46184:70;46247:6;46242:3;46184:70;:::i;:::-;46177:77;;46263:52;46308:6;46303:3;46296:4;46289:5;46285:16;46263:52;:::i;:::-;46340:29;46362:6;46340:29;:::i;:::-;46335:3;46331:39;46324:46;;46106:270;46016:360;;;;:::o;46382:640::-;46577:4;46615:3;46604:9;46600:19;46592:27;;46629:71;46697:1;46686:9;46682:17;46673:6;46629:71;:::i;:::-;46710:72;46778:2;46767:9;46763:18;46754:6;46710:72;:::i;:::-;46792;46860:2;46849:9;46845:18;46836:6;46792:72;:::i;:::-;46911:9;46905:4;46901:20;46896:2;46885:9;46881:18;46874:48;46939:76;47010:4;47001:6;46939:76;:::i;:::-;46931:84;;46382:640;;;;;;;:::o;47028:141::-;47084:5;47115:6;47109:13;47100:22;;47131:32;47157:5;47131:32;:::i;:::-;47028:141;;;;:::o;47175:349::-;47244:6;47293:2;47281:9;47272:7;47268:23;47264:32;47261:119;;;47299:79;;:::i;:::-;47261:119;47419:1;47444:63;47499:7;47490:6;47479:9;47475:22;47444:63;:::i;:::-;47434:73;;47390:127;47175:349;;;;:::o;47530:176::-;47562:1;47579:20;47597:1;47579:20;:::i;:::-;47574:25;;47613:20;47631:1;47613:20;:::i;:::-;47608:25;;47652:1;47642:35;;47657:18;;:::i;:::-;47642:35;47698:1;47695;47691:9;47686:14;;47530:176;;;;:::o;47712:170::-;47852:22;47848:1;47840:6;47836:14;47829:46;47712:170;:::o;47888:366::-;48030:3;48051:67;48115:2;48110:3;48051:67;:::i;:::-;48044:74;;48127:93;48216:3;48127:93;:::i;:::-;48245:2;48240:3;48236:12;48229:19;;47888:366;;;:::o;48260:419::-;48426:4;48464:2;48453:9;48449:18;48441:26;;48513:9;48507:4;48503:20;48499:1;48488:9;48484:17;48477:47;48541:131;48667:4;48541:131;:::i;:::-;48533:139;;48260:419;;;:::o
Swarm Source
ipfs://9bd35689e7173eb684428b0f9dc1dd327d072742f942648902f61c38cf55c9ea
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.