ERC-721
Overview
Max Total Supply
3,333 RB
Holders
1,329
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 RBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RugBuds
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; import './ERC721A.sol'; import './Ownable.sol'; import './Strings.sol'; import './ReentrancyGuard.sol'; import "./DefaultOperatorFilterer.sol"; contract RugBuds is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer { using Strings for uint256; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; uint256 public maxSupply = 4500; uint256 public maxMintAmountPerWallet = 5; uint256 public maxFreeMintAmountPerWallet = 1; uint256 public teamSupply = 100; mapping(address => bool) freeMint; uint256 public publicMintCost = 0.0039 ether; bool public paused = true; bool public revealed = false; constructor( string memory _tokenName, string memory _tokenSymbol, string memory _hiddenMetadataUri ) ERC721A(_tokenName, _tokenSymbol) { hiddenMetadataUri = _hiddenMetadataUri; } modifier mintCompliance(uint256 _mintAmount) { require(totalSupply() + _mintAmount <= maxSupply - teamSupply, 'Max Supply Exceeded!'); _; } function publicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) nonReentrant { require(!paused, 'The portal is not open yet!'); require(_numberMinted(_msgSender()) + _mintAmount <= maxMintAmountPerWallet, 'Max Limit per Wallet!'); if(freeMint[_msgSender()]) { require(msg.value >= _mintAmount * publicMintCost, 'Insufficient Funds!'); } else { require(msg.value >= (_mintAmount - 1) * publicMintCost, 'Insufficient Funds!'); freeMint[_msgSender()] = true; } _safeMint(_msgSender(), _mintAmount); } function teamMint(address[] memory _staff_address) public onlyOwner payable { require(_staff_address.length <= teamSupply, ''); for (uint256 i = 0; i < _staff_address.length; i ++) { _safeMint(_staff_address[i], 1); } } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setTeamAmount(uint256 _teamSupply) public onlyOwner { teamSupply = _teamSupply; } function withdraw() public onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_teamSupply","type":"uint256"}],"name":"setTeamAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"address[]","name":"_staff_address","type":"address[]"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a9081620000249190620006d5565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90816200006b9190620006d5565b50611194600d556005600e556001600f556064601055660ddb07829fc0006012556001601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff021916908315150217905550348015620000cf57600080fd5b506040516200452d3803806200452d8339818101604052810190620000f5919062000920565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001848481600290816200011f9190620006d5565b508060039081620001319190620006d5565b50620001426200038460201b60201c565b60008190555050506200016a6200015e6200038d60201b60201c565b6200039560201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003675780156200022d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001f392919062000a1e565b600060405180830381600087803b1580156200020e57600080fd5b505af115801562000223573d6000803e3d6000fd5b5050505062000366565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002e7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002ad92919062000a1e565b600060405180830381600087803b158015620002c857600080fd5b505af1158015620002dd573d6000803e3d6000fd5b5050505062000365565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000330919062000a4b565b600060405180830381600087803b1580156200034b57600080fd5b505af115801562000360573d6000803e3d6000fd5b505050505b5b5b505080600c90816200037a9190620006d5565b5050505062000a68565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004dd57607f821691505b602082108103620004f357620004f262000495565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200055d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200051e565b6200056986836200051e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005b6620005b0620005aa8462000581565b6200058b565b62000581565b9050919050565b6000819050919050565b620005d28362000595565b620005ea620005e182620005bd565b8484546200052b565b825550505050565b600090565b62000601620005f2565b6200060e818484620005c7565b505050565b5b8181101562000636576200062a600082620005f7565b60018101905062000614565b5050565b601f82111562000685576200064f81620004f9565b6200065a846200050e565b810160208510156200066a578190505b6200068262000679856200050e565b83018262000613565b50505b505050565b600082821c905092915050565b6000620006aa600019846008026200068a565b1980831691505092915050565b6000620006c5838362000697565b9150826002028217905092915050565b620006e0826200045b565b67ffffffffffffffff811115620006fc57620006fb62000466565b5b620007088254620004c4565b620007158282856200063a565b600060209050601f8311600181146200074d576000841562000738578287015190505b620007448582620006b7565b865550620007b4565b601f1984166200075d86620004f9565b60005b82811015620007875784890151825560018201915060208501945060208101905062000760565b86831015620007a75784890151620007a3601f89168262000697565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007f682620007da565b810181811067ffffffffffffffff8211171562000818576200081762000466565b5b80604052505050565b60006200082d620007bc565b90506200083b8282620007eb565b919050565b600067ffffffffffffffff8211156200085e576200085d62000466565b5b6200086982620007da565b9050602081019050919050565b60005b838110156200089657808201518184015260208101905062000879565b60008484015250505050565b6000620008b9620008b38462000840565b62000821565b905082815260208101848484011115620008d857620008d7620007d5565b5b620008e584828562000876565b509392505050565b600082601f830112620009055762000904620007d0565b5b815162000917848260208601620008a2565b91505092915050565b6000806000606084860312156200093c576200093b620007c6565b5b600084015167ffffffffffffffff8111156200095d576200095c620007cb565b5b6200096b86828701620008ed565b935050602084015167ffffffffffffffff8111156200098f576200098e620007cb565b5b6200099d86828701620008ed565b925050604084015167ffffffffffffffff811115620009c157620009c0620007cb565b5b620009cf86828701620008ed565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a0682620009d9565b9050919050565b62000a1881620009f9565b82525050565b600060408201905062000a35600083018562000a0d565b62000a44602083018462000a0d565b9392505050565b600060208201905062000a62600083018462000a0d565b92915050565b613ab58062000a786000396000f3fe6080604052600436106102255760003560e01c80636f8b44b011610123578063b88d4fde116100ab578063e0a808531161006f578063e0a808531461078e578063e985e9c5146107b7578063f0028585146107f4578063f2fde38b14610810578063f8bf51721461083957610225565b8063b88d4fde146106b6578063bac7984a146106d2578063bc951b91146106fb578063c87b56dd14610726578063d5abeb011461076357610225565b80638c770067116100f25780638c770067146105e15780638da5cb5b1461060c57806395d89b4114610637578063a22cb46514610662578063a45ba8e71461068b57610225565b80636f8b44b01461053b57806370a0823114610564578063715018a6146105a15780637ec4a659146105b857610225565b80632db11544116101b1578063518302271161017557806351830227146104525780635503a0e81461047d5780635c975abb146104a857806362b99ad4146104d35780636352211e146104fe57610225565b80632db11544146103af5780633ccfd60b146103cb57806341f43434146103e257806342842e0e1461040d5780634fdd43cb1461042957610225565b806316ba10e0116101f857806316ba10e0146102eb57806316c38b3c1461031457806318160ddd1461033d57806323b872dd146103685780632cfac6ec1461038457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906127c9565b610864565b60405161025e9190612811565b60405180910390f35b34801561027357600080fd5b5061027c6108f6565b60405161028991906128bc565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612914565b610988565b6040516102c69190612982565b60405180910390f35b6102e960048036038101906102e491906129c9565b610a07565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612b3e565b610a20565b005b34801561032057600080fd5b5061033b60048036038101906103369190612bb3565b610a3b565b005b34801561034957600080fd5b50610352610a60565b60405161035f9190612bef565b60405180910390f35b610382600480360381019061037d9190612c0a565b610a77565b005b34801561039057600080fd5b50610399610ac6565b6040516103a69190612bef565b60405180910390f35b6103c960048036038101906103c49190612914565b610acc565b005b3480156103d757600080fd5b506103e0610d6f565b005b3480156103ee57600080fd5b506103f7610df7565b6040516104049190612cbc565b60405180910390f35b61042760048036038101906104229190612c0a565b610e09565b005b34801561043557600080fd5b50610450600480360381019061044b9190612b3e565b610e58565b005b34801561045e57600080fd5b50610467610e73565b6040516104749190612811565b60405180910390f35b34801561048957600080fd5b50610492610e86565b60405161049f91906128bc565b60405180910390f35b3480156104b457600080fd5b506104bd610f14565b6040516104ca9190612811565b60405180910390f35b3480156104df57600080fd5b506104e8610f27565b6040516104f591906128bc565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612914565b610fb5565b6040516105329190612982565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612914565b610fc7565b005b34801561057057600080fd5b5061058b60048036038101906105869190612cd7565b610fd9565b6040516105989190612bef565b60405180910390f35b3480156105ad57600080fd5b506105b6611091565b005b3480156105c457600080fd5b506105df60048036038101906105da9190612b3e565b6110a5565b005b3480156105ed57600080fd5b506105f66110c0565b6040516106039190612bef565b60405180910390f35b34801561061857600080fd5b506106216110c6565b60405161062e9190612982565b60405180910390f35b34801561064357600080fd5b5061064c6110f0565b60405161065991906128bc565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190612d04565b611182565b005b34801561069757600080fd5b506106a061119b565b6040516106ad91906128bc565b60405180910390f35b6106d060048036038101906106cb9190612de5565b611229565b005b3480156106de57600080fd5b506106f960048036038101906106f49190612914565b61127a565b005b34801561070757600080fd5b5061071061128c565b60405161071d9190612bef565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190612914565b611292565b60405161075a91906128bc565b60405180910390f35b34801561076f57600080fd5b506107786113ea565b6040516107859190612bef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612bb3565b6113f0565b005b3480156107c357600080fd5b506107de60048036038101906107d99190612e68565b611415565b6040516107eb9190612811565b60405180910390f35b61080e60048036038101906108099190612f70565b6114a9565b005b34801561081c57600080fd5b5061083760048036038101906108329190612cd7565b61153f565b005b34801561084557600080fd5b5061084e6115c2565b60405161085b9190612bef565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ef5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461090590612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612fe8565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b5050505050905090565b6000610993826115c8565b6109c9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a1181611627565b610a1b8383611724565b505050565b610a28611868565b80600b9081610a3791906131bb565b5050565b610a43611868565b80601360006101000a81548160ff02191690831515021790555050565b6000610a6a6118e6565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab557610ab433611627565b5b610ac08484846118ef565b50505050565b60105481565b80601054600d54610add91906132bc565b81610ae6610a60565b610af091906132f0565b1115610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890613370565b60405180910390fd5b610b39611c11565b601360009054906101000a900460ff1615610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906133dc565b60405180910390fd5b600e5482610b9d610b98611c60565b611c68565b610ba791906132f0565b1115610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613448565b60405180910390fd5b60116000610bf4611c60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c965760125482610c4f9190613468565b341015610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906134f6565b60405180910390fd5b610d52565b601254600183610ca691906132bc565b610cb09190613468565b341015610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906134f6565b60405180910390fd5b600160116000610d00611c60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610d63610d5d611c60565b83611cbf565b610d6b611cdd565b5050565b610d77611868565b6000610d816110c6565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da490613547565b60006040518083038185875af1925050503d8060008114610de1576040519150601f19603f3d011682016040523d82523d6000602084013e610de6565b606091505b5050905080610df457600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4757610e4633611627565b5b610e52848484611ce7565b50505050565b610e60611868565b80600c9081610e6f91906131bb565b5050565b601360019054906101000a900460ff1681565b600b8054610e9390612fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90612fe8565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b600a8054610f3490612fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6090612fe8565b8015610fad5780601f10610f8257610100808354040283529160200191610fad565b820191906000526020600020905b815481529060010190602001808311610f9057829003601f168201915b505050505081565b6000610fc082611d07565b9050919050565b610fcf611868565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611040576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611099611868565b6110a36000611dd3565b565b6110ad611868565b80600a90816110bc91906131bb565b5050565b60125481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110ff90612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461112b90612fe8565b80156111785780601f1061114d57610100808354040283529160200191611178565b820191906000526020600020905b81548152906001019060200180831161115b57829003601f168201915b5050505050905090565b8161118c81611627565b6111968383611e99565b505050565b600c80546111a890612fe8565b80601f01602080910402602001604051908101604052809291908181526020018280546111d490612fe8565b80156112215780601f106111f657610100808354040283529160200191611221565b820191906000526020600020905b81548152906001019060200180831161120457829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112675761126633611627565b5b61127385858585611fa4565b5050505050565b611282611868565b8060108190555050565b600e5481565b606061129d826115c8565b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d3906135ce565b60405180910390fd5b60001515601360019054906101000a900460ff1615150361138957600c805461130490612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461133090612fe8565b801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505090506113e5565b6000611393612017565b905060008151116113b357604051806020016040528060008152506113e1565b806113bd846120a9565b600b6040516020016113d1939291906136ad565b6040516020818303038152906040525b9150505b919050565b600d5481565b6113f8611868565b80601360016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114b1611868565b601054815111156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613701565b60405180910390fd5b60005b815181101561153b5761152882828151811061151957611518613721565b5b60200260200101516001611cbf565b808061153390613750565b9150506114fa565b5050565b611547611868565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad9061380a565b60405180910390fd5b6115bf81611dd3565b50565b600f5481565b6000816115d36118e6565b111580156115e2575060005482105b8015611620575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611721576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161169e92919061382a565b602060405180830381865afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df9190613868565b61172057806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117179190612982565b60405180910390fd5b5b50565b600061172f82610fb5565b90508073ffffffffffffffffffffffffffffffffffffffff16611750612177565b73ffffffffffffffffffffffffffffffffffffffff16146117b35761177c81611777612177565b611415565b6117b2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611870611c60565b73ffffffffffffffffffffffffffffffffffffffff1661188e6110c6565b73ffffffffffffffffffffffffffffffffffffffff16146118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db906138e1565b60405180910390fd5b565b60006001905090565b60006118fa82611d07565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611961576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061196d8461217f565b91509150611983818761197e612177565b6121a6565b6119cf5761199886611993612177565b611415565b6119ce576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a35576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4286868660016121ea565b8015611a4d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611b1b85611af78888876121f0565b7c020000000000000000000000000000000000000000000000000000000017612218565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611ba15760006001850190506000600460008381526020019081526020016000205403611b9f576000548114611b9e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c098686866001612243565b505050505050565b600260095403611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9061394d565b60405180910390fd5b6002600981905550565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611cd9828260405180602001604052806000815250612249565b5050565b6001600981905550565b611d0283838360405180602001604052806000815250611229565b505050565b60008082905080611d166118e6565b11611d9c57600054811015611d9b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d99575b60008103611d8f576004600083600190039350838152602001908152602001600020549050611d65565b8092505050611dce565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000611ea6612177565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f53612177565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f989190612811565b60405180910390a35050565b611faf848484610a77565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461201157611fda848484846122e6565b612010576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a805461202690612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461205290612fe8565b801561209f5780601f106120745761010080835404028352916020019161209f565b820191906000526020600020905b81548152906001019060200180831161208257829003601f168201915b5050505050905090565b6060600060016120b884612436565b01905060008167ffffffffffffffff8111156120d7576120d6612a13565b5b6040519080825280601f01601f1916602001820160405280156121095781602001600182028036833780820191505090505b509050600082602001820190505b60011561216c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816121605761215f61396d565b5b04945060008503612117575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612207868684612589565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6122538383612592565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122e157600080549050600083820390505b61229360008683806001019450866122e6565b6122c9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106122805781600054146122de57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230c612177565b8786866040518563ffffffff1660e01b815260040161232e94939291906139f1565b6020604051808303816000875af192505050801561236a57506040513d601f19601f820116820180604052508101906123679190613a52565b60015b6123e3573d806000811461239a576040519150601f19603f3d011682016040523d82523d6000602084013e61239f565b606091505b5060008151036123db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612494577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161248a5761248961396d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106124d1576d04ee2d6d415b85acef810000000083816124c7576124c661396d565b5b0492506020810190505b662386f26fc10000831061250057662386f26fc1000083816124f6576124f561396d565b5b0492506010810190505b6305f5e1008310612529576305f5e100838161251f5761251e61396d565b5b0492506008810190505b612710831061254e5761271083816125445761254361396d565b5b0492506004810190505b6064831061257157606483816125675761256661396d565b5b0492506002810190505b600a8310612580576001810190505b80915050919050565b60009392505050565b600080549050600082036125d2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125df60008483856121ea565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126568361264760008660006121f0565b6126508561274d565b17612218565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146126f757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126bc565b5060008203612732576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127486000848385612243565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a681612771565b81146127b157600080fd5b50565b6000813590506127c38161279d565b92915050565b6000602082840312156127df576127de612767565b5b60006127ed848285016127b4565b91505092915050565b60008115159050919050565b61280b816127f6565b82525050565b60006020820190506128266000830184612802565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561286657808201518184015260208101905061284b565b60008484015250505050565b6000601f19601f8301169050919050565b600061288e8261282c565b6128988185612837565b93506128a8818560208601612848565b6128b181612872565b840191505092915050565b600060208201905081810360008301526128d68184612883565b905092915050565b6000819050919050565b6128f1816128de565b81146128fc57600080fd5b50565b60008135905061290e816128e8565b92915050565b60006020828403121561292a57612929612767565b5b6000612938848285016128ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061296c82612941565b9050919050565b61297c81612961565b82525050565b60006020820190506129976000830184612973565b92915050565b6129a681612961565b81146129b157600080fd5b50565b6000813590506129c38161299d565b92915050565b600080604083850312156129e0576129df612767565b5b60006129ee858286016129b4565b92505060206129ff858286016128ff565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a4b82612872565b810181811067ffffffffffffffff82111715612a6a57612a69612a13565b5b80604052505050565b6000612a7d61275d565b9050612a898282612a42565b919050565b600067ffffffffffffffff821115612aa957612aa8612a13565b5b612ab282612872565b9050602081019050919050565b82818337600083830152505050565b6000612ae1612adc84612a8e565b612a73565b905082815260208101848484011115612afd57612afc612a0e565b5b612b08848285612abf565b509392505050565b600082601f830112612b2557612b24612a09565b5b8135612b35848260208601612ace565b91505092915050565b600060208284031215612b5457612b53612767565b5b600082013567ffffffffffffffff811115612b7257612b7161276c565b5b612b7e84828501612b10565b91505092915050565b612b90816127f6565b8114612b9b57600080fd5b50565b600081359050612bad81612b87565b92915050565b600060208284031215612bc957612bc8612767565b5b6000612bd784828501612b9e565b91505092915050565b612be9816128de565b82525050565b6000602082019050612c046000830184612be0565b92915050565b600080600060608486031215612c2357612c22612767565b5b6000612c31868287016129b4565b9350506020612c42868287016129b4565b9250506040612c53868287016128ff565b9150509250925092565b6000819050919050565b6000612c82612c7d612c7884612941565b612c5d565b612941565b9050919050565b6000612c9482612c67565b9050919050565b6000612ca682612c89565b9050919050565b612cb681612c9b565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b600060208284031215612ced57612cec612767565b5b6000612cfb848285016129b4565b91505092915050565b60008060408385031215612d1b57612d1a612767565b5b6000612d29858286016129b4565b9250506020612d3a85828601612b9e565b9150509250929050565b600067ffffffffffffffff821115612d5f57612d5e612a13565b5b612d6882612872565b9050602081019050919050565b6000612d88612d8384612d44565b612a73565b905082815260208101848484011115612da457612da3612a0e565b5b612daf848285612abf565b509392505050565b600082601f830112612dcc57612dcb612a09565b5b8135612ddc848260208601612d75565b91505092915050565b60008060008060808587031215612dff57612dfe612767565b5b6000612e0d878288016129b4565b9450506020612e1e878288016129b4565b9350506040612e2f878288016128ff565b925050606085013567ffffffffffffffff811115612e5057612e4f61276c565b5b612e5c87828801612db7565b91505092959194509250565b60008060408385031215612e7f57612e7e612767565b5b6000612e8d858286016129b4565b9250506020612e9e858286016129b4565b9150509250929050565b600067ffffffffffffffff821115612ec357612ec2612a13565b5b602082029050602081019050919050565b600080fd5b6000612eec612ee784612ea8565b612a73565b90508083825260208201905060208402830185811115612f0f57612f0e612ed4565b5b835b81811015612f385780612f2488826129b4565b845260208401935050602081019050612f11565b5050509392505050565b600082601f830112612f5757612f56612a09565b5b8135612f67848260208601612ed9565b91505092915050565b600060208284031215612f8657612f85612767565b5b600082013567ffffffffffffffff811115612fa457612fa361276c565b5b612fb084828501612f42565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061300057607f821691505b60208210810361301357613012612fb9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261307b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261303e565b613085868361303e565b95508019841693508086168417925050509392505050565b60006130b86130b36130ae846128de565b612c5d565b6128de565b9050919050565b6000819050919050565b6130d28361309d565b6130e66130de826130bf565b84845461304b565b825550505050565b600090565b6130fb6130ee565b6131068184846130c9565b505050565b5b8181101561312a5761311f6000826130f3565b60018101905061310c565b5050565b601f82111561316f5761314081613019565b6131498461302e565b81016020851015613158578190505b61316c6131648561302e565b83018261310b565b50505b505050565b600082821c905092915050565b600061319260001984600802613174565b1980831691505092915050565b60006131ab8383613181565b9150826002028217905092915050565b6131c48261282c565b67ffffffffffffffff8111156131dd576131dc612a13565b5b6131e78254612fe8565b6131f282828561312e565b600060209050601f8311600181146132255760008415613213578287015190505b61321d858261319f565b865550613285565b601f19841661323386613019565b60005b8281101561325b57848901518255600182019150602085019450602081019050613236565b868310156132785784890151613274601f891682613181565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132c7826128de565b91506132d2836128de565b92508282039050818111156132ea576132e961328d565b5b92915050565b60006132fb826128de565b9150613306836128de565b925082820190508082111561331e5761331d61328d565b5b92915050565b7f4d617820537570706c7920457863656564656421000000000000000000000000600082015250565b600061335a601483612837565b915061336582613324565b602082019050919050565b600060208201905081810360008301526133898161334d565b9050919050565b7f54686520706f7274616c206973206e6f74206f70656e20796574210000000000600082015250565b60006133c6601b83612837565b91506133d182613390565b602082019050919050565b600060208201905081810360008301526133f5816133b9565b9050919050565b7f4d6178204c696d6974207065722057616c6c6574210000000000000000000000600082015250565b6000613432601583612837565b915061343d826133fc565b602082019050919050565b6000602082019050818103600083015261346181613425565b9050919050565b6000613473826128de565b915061347e836128de565b925082820261348c816128de565b915082820484148315176134a3576134a261328d565b5b5092915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b60006134e0601383612837565b91506134eb826134aa565b602082019050919050565b6000602082019050818103600083015261350f816134d3565b9050919050565b600081905092915050565b50565b6000613531600083613516565b915061353c82613521565b600082019050919050565b600061355282613524565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135b8602f83612837565b91506135c38261355c565b604082019050919050565b600060208201905081810360008301526135e7816135ab565b9050919050565b600081905092915050565b60006136048261282c565b61360e81856135ee565b935061361e818560208601612848565b80840191505092915050565b6000815461363781612fe8565b61364181866135ee565b9450600182166000811461365c5760018114613671576136a4565b60ff19831686528115158202860193506136a4565b61367a85613019565b60005b8381101561369c5781548189015260018201915060208101905061367d565b838801955050505b50505092915050565b60006136b982866135f9565b91506136c582856135f9565b91506136d1828461362a565b9150819050949350505050565b60006136eb600083612837565b91506136f682613521565b600082019050919050565b6000602082019050818103600083015261371a816136de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061375b826128de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378d5761378c61328d565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137f4602683612837565b91506137ff82613798565b604082019050919050565b60006020820190508181036000830152613823816137e7565b9050919050565b600060408201905061383f6000830185612973565b61384c6020830184612973565b9392505050565b60008151905061386281612b87565b92915050565b60006020828403121561387e5761387d612767565b5b600061388c84828501613853565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138cb602083612837565b91506138d682613895565b602082019050919050565b600060208201905081810360008301526138fa816138be565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613937601f83612837565b915061394282613901565b602082019050919050565b600060208201905081810360008301526139668161392a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006139c38261399c565b6139cd81856139a7565b93506139dd818560208601612848565b6139e681612872565b840191505092915050565b6000608082019050613a066000830187612973565b613a136020830186612973565b613a206040830185612be0565b8181036060830152613a3281846139b8565b905095945050505050565b600081519050613a4c8161279d565b92915050565b600060208284031215613a6857613a67612767565b5b6000613a7684828501613a3d565b9150509291505056fea2646970667358221220b2e7db87dcac708ba8a64867ecbee2dce9b5cffc0cfa3ba705f14eabc86f246464736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007527567427564730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025242000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696f2f697066732f516d5441514c7064546d6643396973554e3748794372527a477171426d4532664d456e475466366d6434457133692f68696464656e2e6a736f6e0000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102255760003560e01c80636f8b44b011610123578063b88d4fde116100ab578063e0a808531161006f578063e0a808531461078e578063e985e9c5146107b7578063f0028585146107f4578063f2fde38b14610810578063f8bf51721461083957610225565b8063b88d4fde146106b6578063bac7984a146106d2578063bc951b91146106fb578063c87b56dd14610726578063d5abeb011461076357610225565b80638c770067116100f25780638c770067146105e15780638da5cb5b1461060c57806395d89b4114610637578063a22cb46514610662578063a45ba8e71461068b57610225565b80636f8b44b01461053b57806370a0823114610564578063715018a6146105a15780637ec4a659146105b857610225565b80632db11544116101b1578063518302271161017557806351830227146104525780635503a0e81461047d5780635c975abb146104a857806362b99ad4146104d35780636352211e146104fe57610225565b80632db11544146103af5780633ccfd60b146103cb57806341f43434146103e257806342842e0e1461040d5780634fdd43cb1461042957610225565b806316ba10e0116101f857806316ba10e0146102eb57806316c38b3c1461031457806318160ddd1461033d57806323b872dd146103685780632cfac6ec1461038457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906127c9565b610864565b60405161025e9190612811565b60405180910390f35b34801561027357600080fd5b5061027c6108f6565b60405161028991906128bc565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612914565b610988565b6040516102c69190612982565b60405180910390f35b6102e960048036038101906102e491906129c9565b610a07565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612b3e565b610a20565b005b34801561032057600080fd5b5061033b60048036038101906103369190612bb3565b610a3b565b005b34801561034957600080fd5b50610352610a60565b60405161035f9190612bef565b60405180910390f35b610382600480360381019061037d9190612c0a565b610a77565b005b34801561039057600080fd5b50610399610ac6565b6040516103a69190612bef565b60405180910390f35b6103c960048036038101906103c49190612914565b610acc565b005b3480156103d757600080fd5b506103e0610d6f565b005b3480156103ee57600080fd5b506103f7610df7565b6040516104049190612cbc565b60405180910390f35b61042760048036038101906104229190612c0a565b610e09565b005b34801561043557600080fd5b50610450600480360381019061044b9190612b3e565b610e58565b005b34801561045e57600080fd5b50610467610e73565b6040516104749190612811565b60405180910390f35b34801561048957600080fd5b50610492610e86565b60405161049f91906128bc565b60405180910390f35b3480156104b457600080fd5b506104bd610f14565b6040516104ca9190612811565b60405180910390f35b3480156104df57600080fd5b506104e8610f27565b6040516104f591906128bc565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612914565b610fb5565b6040516105329190612982565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612914565b610fc7565b005b34801561057057600080fd5b5061058b60048036038101906105869190612cd7565b610fd9565b6040516105989190612bef565b60405180910390f35b3480156105ad57600080fd5b506105b6611091565b005b3480156105c457600080fd5b506105df60048036038101906105da9190612b3e565b6110a5565b005b3480156105ed57600080fd5b506105f66110c0565b6040516106039190612bef565b60405180910390f35b34801561061857600080fd5b506106216110c6565b60405161062e9190612982565b60405180910390f35b34801561064357600080fd5b5061064c6110f0565b60405161065991906128bc565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190612d04565b611182565b005b34801561069757600080fd5b506106a061119b565b6040516106ad91906128bc565b60405180910390f35b6106d060048036038101906106cb9190612de5565b611229565b005b3480156106de57600080fd5b506106f960048036038101906106f49190612914565b61127a565b005b34801561070757600080fd5b5061071061128c565b60405161071d9190612bef565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190612914565b611292565b60405161075a91906128bc565b60405180910390f35b34801561076f57600080fd5b506107786113ea565b6040516107859190612bef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612bb3565b6113f0565b005b3480156107c357600080fd5b506107de60048036038101906107d99190612e68565b611415565b6040516107eb9190612811565b60405180910390f35b61080e60048036038101906108099190612f70565b6114a9565b005b34801561081c57600080fd5b5061083760048036038101906108329190612cd7565b61153f565b005b34801561084557600080fd5b5061084e6115c2565b60405161085b9190612bef565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ef5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461090590612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612fe8565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b5050505050905090565b6000610993826115c8565b6109c9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a1181611627565b610a1b8383611724565b505050565b610a28611868565b80600b9081610a3791906131bb565b5050565b610a43611868565b80601360006101000a81548160ff02191690831515021790555050565b6000610a6a6118e6565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab557610ab433611627565b5b610ac08484846118ef565b50505050565b60105481565b80601054600d54610add91906132bc565b81610ae6610a60565b610af091906132f0565b1115610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890613370565b60405180910390fd5b610b39611c11565b601360009054906101000a900460ff1615610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906133dc565b60405180910390fd5b600e5482610b9d610b98611c60565b611c68565b610ba791906132f0565b1115610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613448565b60405180910390fd5b60116000610bf4611c60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c965760125482610c4f9190613468565b341015610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906134f6565b60405180910390fd5b610d52565b601254600183610ca691906132bc565b610cb09190613468565b341015610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce9906134f6565b60405180910390fd5b600160116000610d00611c60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610d63610d5d611c60565b83611cbf565b610d6b611cdd565b5050565b610d77611868565b6000610d816110c6565b73ffffffffffffffffffffffffffffffffffffffff1647604051610da490613547565b60006040518083038185875af1925050503d8060008114610de1576040519150601f19603f3d011682016040523d82523d6000602084013e610de6565b606091505b5050905080610df457600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4757610e4633611627565b5b610e52848484611ce7565b50505050565b610e60611868565b80600c9081610e6f91906131bb565b5050565b601360019054906101000a900460ff1681565b600b8054610e9390612fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90612fe8565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b600a8054610f3490612fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6090612fe8565b8015610fad5780601f10610f8257610100808354040283529160200191610fad565b820191906000526020600020905b815481529060010190602001808311610f9057829003601f168201915b505050505081565b6000610fc082611d07565b9050919050565b610fcf611868565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611040576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611099611868565b6110a36000611dd3565b565b6110ad611868565b80600a90816110bc91906131bb565b5050565b60125481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110ff90612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461112b90612fe8565b80156111785780601f1061114d57610100808354040283529160200191611178565b820191906000526020600020905b81548152906001019060200180831161115b57829003601f168201915b5050505050905090565b8161118c81611627565b6111968383611e99565b505050565b600c80546111a890612fe8565b80601f01602080910402602001604051908101604052809291908181526020018280546111d490612fe8565b80156112215780601f106111f657610100808354040283529160200191611221565b820191906000526020600020905b81548152906001019060200180831161120457829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112675761126633611627565b5b61127385858585611fa4565b5050505050565b611282611868565b8060108190555050565b600e5481565b606061129d826115c8565b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d3906135ce565b60405180910390fd5b60001515601360019054906101000a900460ff1615150361138957600c805461130490612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461133090612fe8565b801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505090506113e5565b6000611393612017565b905060008151116113b357604051806020016040528060008152506113e1565b806113bd846120a9565b600b6040516020016113d1939291906136ad565b6040516020818303038152906040525b9150505b919050565b600d5481565b6113f8611868565b80601360016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114b1611868565b601054815111156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613701565b60405180910390fd5b60005b815181101561153b5761152882828151811061151957611518613721565b5b60200260200101516001611cbf565b808061153390613750565b9150506114fa565b5050565b611547611868565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad9061380a565b60405180910390fd5b6115bf81611dd3565b50565b600f5481565b6000816115d36118e6565b111580156115e2575060005482105b8015611620575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611721576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161169e92919061382a565b602060405180830381865afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df9190613868565b61172057806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117179190612982565b60405180910390fd5b5b50565b600061172f82610fb5565b90508073ffffffffffffffffffffffffffffffffffffffff16611750612177565b73ffffffffffffffffffffffffffffffffffffffff16146117b35761177c81611777612177565b611415565b6117b2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611870611c60565b73ffffffffffffffffffffffffffffffffffffffff1661188e6110c6565b73ffffffffffffffffffffffffffffffffffffffff16146118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db906138e1565b60405180910390fd5b565b60006001905090565b60006118fa82611d07565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611961576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061196d8461217f565b91509150611983818761197e612177565b6121a6565b6119cf5761199886611993612177565b611415565b6119ce576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a35576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4286868660016121ea565b8015611a4d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611b1b85611af78888876121f0565b7c020000000000000000000000000000000000000000000000000000000017612218565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611ba15760006001850190506000600460008381526020019081526020016000205403611b9f576000548114611b9e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c098686866001612243565b505050505050565b600260095403611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9061394d565b60405180910390fd5b6002600981905550565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611cd9828260405180602001604052806000815250612249565b5050565b6001600981905550565b611d0283838360405180602001604052806000815250611229565b505050565b60008082905080611d166118e6565b11611d9c57600054811015611d9b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d99575b60008103611d8f576004600083600190039350838152602001908152602001600020549050611d65565b8092505050611dce565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000611ea6612177565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f53612177565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f989190612811565b60405180910390a35050565b611faf848484610a77565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461201157611fda848484846122e6565b612010576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a805461202690612fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461205290612fe8565b801561209f5780601f106120745761010080835404028352916020019161209f565b820191906000526020600020905b81548152906001019060200180831161208257829003601f168201915b5050505050905090565b6060600060016120b884612436565b01905060008167ffffffffffffffff8111156120d7576120d6612a13565b5b6040519080825280601f01601f1916602001820160405280156121095781602001600182028036833780820191505090505b509050600082602001820190505b60011561216c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816121605761215f61396d565b5b04945060008503612117575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612207868684612589565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6122538383612592565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122e157600080549050600083820390505b61229360008683806001019450866122e6565b6122c9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106122805781600054146122de57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230c612177565b8786866040518563ffffffff1660e01b815260040161232e94939291906139f1565b6020604051808303816000875af192505050801561236a57506040513d601f19601f820116820180604052508101906123679190613a52565b60015b6123e3573d806000811461239a576040519150601f19603f3d011682016040523d82523d6000602084013e61239f565b606091505b5060008151036123db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612494577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161248a5761248961396d565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106124d1576d04ee2d6d415b85acef810000000083816124c7576124c661396d565b5b0492506020810190505b662386f26fc10000831061250057662386f26fc1000083816124f6576124f561396d565b5b0492506010810190505b6305f5e1008310612529576305f5e100838161251f5761251e61396d565b5b0492506008810190505b612710831061254e5761271083816125445761254361396d565b5b0492506004810190505b6064831061257157606483816125675761256661396d565b5b0492506002810190505b600a8310612580576001810190505b80915050919050565b60009392505050565b600080549050600082036125d2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125df60008483856121ea565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126568361264760008660006121f0565b6126508561274d565b17612218565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146126f757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126bc565b5060008203612732576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127486000848385612243565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a681612771565b81146127b157600080fd5b50565b6000813590506127c38161279d565b92915050565b6000602082840312156127df576127de612767565b5b60006127ed848285016127b4565b91505092915050565b60008115159050919050565b61280b816127f6565b82525050565b60006020820190506128266000830184612802565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561286657808201518184015260208101905061284b565b60008484015250505050565b6000601f19601f8301169050919050565b600061288e8261282c565b6128988185612837565b93506128a8818560208601612848565b6128b181612872565b840191505092915050565b600060208201905081810360008301526128d68184612883565b905092915050565b6000819050919050565b6128f1816128de565b81146128fc57600080fd5b50565b60008135905061290e816128e8565b92915050565b60006020828403121561292a57612929612767565b5b6000612938848285016128ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061296c82612941565b9050919050565b61297c81612961565b82525050565b60006020820190506129976000830184612973565b92915050565b6129a681612961565b81146129b157600080fd5b50565b6000813590506129c38161299d565b92915050565b600080604083850312156129e0576129df612767565b5b60006129ee858286016129b4565b92505060206129ff858286016128ff565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a4b82612872565b810181811067ffffffffffffffff82111715612a6a57612a69612a13565b5b80604052505050565b6000612a7d61275d565b9050612a898282612a42565b919050565b600067ffffffffffffffff821115612aa957612aa8612a13565b5b612ab282612872565b9050602081019050919050565b82818337600083830152505050565b6000612ae1612adc84612a8e565b612a73565b905082815260208101848484011115612afd57612afc612a0e565b5b612b08848285612abf565b509392505050565b600082601f830112612b2557612b24612a09565b5b8135612b35848260208601612ace565b91505092915050565b600060208284031215612b5457612b53612767565b5b600082013567ffffffffffffffff811115612b7257612b7161276c565b5b612b7e84828501612b10565b91505092915050565b612b90816127f6565b8114612b9b57600080fd5b50565b600081359050612bad81612b87565b92915050565b600060208284031215612bc957612bc8612767565b5b6000612bd784828501612b9e565b91505092915050565b612be9816128de565b82525050565b6000602082019050612c046000830184612be0565b92915050565b600080600060608486031215612c2357612c22612767565b5b6000612c31868287016129b4565b9350506020612c42868287016129b4565b9250506040612c53868287016128ff565b9150509250925092565b6000819050919050565b6000612c82612c7d612c7884612941565b612c5d565b612941565b9050919050565b6000612c9482612c67565b9050919050565b6000612ca682612c89565b9050919050565b612cb681612c9b565b82525050565b6000602082019050612cd16000830184612cad565b92915050565b600060208284031215612ced57612cec612767565b5b6000612cfb848285016129b4565b91505092915050565b60008060408385031215612d1b57612d1a612767565b5b6000612d29858286016129b4565b9250506020612d3a85828601612b9e565b9150509250929050565b600067ffffffffffffffff821115612d5f57612d5e612a13565b5b612d6882612872565b9050602081019050919050565b6000612d88612d8384612d44565b612a73565b905082815260208101848484011115612da457612da3612a0e565b5b612daf848285612abf565b509392505050565b600082601f830112612dcc57612dcb612a09565b5b8135612ddc848260208601612d75565b91505092915050565b60008060008060808587031215612dff57612dfe612767565b5b6000612e0d878288016129b4565b9450506020612e1e878288016129b4565b9350506040612e2f878288016128ff565b925050606085013567ffffffffffffffff811115612e5057612e4f61276c565b5b612e5c87828801612db7565b91505092959194509250565b60008060408385031215612e7f57612e7e612767565b5b6000612e8d858286016129b4565b9250506020612e9e858286016129b4565b9150509250929050565b600067ffffffffffffffff821115612ec357612ec2612a13565b5b602082029050602081019050919050565b600080fd5b6000612eec612ee784612ea8565b612a73565b90508083825260208201905060208402830185811115612f0f57612f0e612ed4565b5b835b81811015612f385780612f2488826129b4565b845260208401935050602081019050612f11565b5050509392505050565b600082601f830112612f5757612f56612a09565b5b8135612f67848260208601612ed9565b91505092915050565b600060208284031215612f8657612f85612767565b5b600082013567ffffffffffffffff811115612fa457612fa361276c565b5b612fb084828501612f42565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061300057607f821691505b60208210810361301357613012612fb9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261307b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261303e565b613085868361303e565b95508019841693508086168417925050509392505050565b60006130b86130b36130ae846128de565b612c5d565b6128de565b9050919050565b6000819050919050565b6130d28361309d565b6130e66130de826130bf565b84845461304b565b825550505050565b600090565b6130fb6130ee565b6131068184846130c9565b505050565b5b8181101561312a5761311f6000826130f3565b60018101905061310c565b5050565b601f82111561316f5761314081613019565b6131498461302e565b81016020851015613158578190505b61316c6131648561302e565b83018261310b565b50505b505050565b600082821c905092915050565b600061319260001984600802613174565b1980831691505092915050565b60006131ab8383613181565b9150826002028217905092915050565b6131c48261282c565b67ffffffffffffffff8111156131dd576131dc612a13565b5b6131e78254612fe8565b6131f282828561312e565b600060209050601f8311600181146132255760008415613213578287015190505b61321d858261319f565b865550613285565b601f19841661323386613019565b60005b8281101561325b57848901518255600182019150602085019450602081019050613236565b868310156132785784890151613274601f891682613181565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132c7826128de565b91506132d2836128de565b92508282039050818111156132ea576132e961328d565b5b92915050565b60006132fb826128de565b9150613306836128de565b925082820190508082111561331e5761331d61328d565b5b92915050565b7f4d617820537570706c7920457863656564656421000000000000000000000000600082015250565b600061335a601483612837565b915061336582613324565b602082019050919050565b600060208201905081810360008301526133898161334d565b9050919050565b7f54686520706f7274616c206973206e6f74206f70656e20796574210000000000600082015250565b60006133c6601b83612837565b91506133d182613390565b602082019050919050565b600060208201905081810360008301526133f5816133b9565b9050919050565b7f4d6178204c696d6974207065722057616c6c6574210000000000000000000000600082015250565b6000613432601583612837565b915061343d826133fc565b602082019050919050565b6000602082019050818103600083015261346181613425565b9050919050565b6000613473826128de565b915061347e836128de565b925082820261348c816128de565b915082820484148315176134a3576134a261328d565b5b5092915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b60006134e0601383612837565b91506134eb826134aa565b602082019050919050565b6000602082019050818103600083015261350f816134d3565b9050919050565b600081905092915050565b50565b6000613531600083613516565b915061353c82613521565b600082019050919050565b600061355282613524565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135b8602f83612837565b91506135c38261355c565b604082019050919050565b600060208201905081810360008301526135e7816135ab565b9050919050565b600081905092915050565b60006136048261282c565b61360e81856135ee565b935061361e818560208601612848565b80840191505092915050565b6000815461363781612fe8565b61364181866135ee565b9450600182166000811461365c5760018114613671576136a4565b60ff19831686528115158202860193506136a4565b61367a85613019565b60005b8381101561369c5781548189015260018201915060208101905061367d565b838801955050505b50505092915050565b60006136b982866135f9565b91506136c582856135f9565b91506136d1828461362a565b9150819050949350505050565b60006136eb600083612837565b91506136f682613521565b600082019050919050565b6000602082019050818103600083015261371a816136de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061375b826128de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378d5761378c61328d565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137f4602683612837565b91506137ff82613798565b604082019050919050565b60006020820190508181036000830152613823816137e7565b9050919050565b600060408201905061383f6000830185612973565b61384c6020830184612973565b9392505050565b60008151905061386281612b87565b92915050565b60006020828403121561387e5761387d612767565b5b600061388c84828501613853565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138cb602083612837565b91506138d682613895565b602082019050919050565b600060208201905081810360008301526138fa816138be565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613937601f83612837565b915061394282613901565b602082019050919050565b600060208201905081810360008301526139668161392a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006139c38261399c565b6139cd81856139a7565b93506139dd818560208601612848565b6139e681612872565b840191505092915050565b6000608082019050613a066000830187612973565b613a136020830186612973565b613a206040830185612be0565b8181036060830152613a3281846139b8565b905095945050505050565b600081519050613a4c8161279d565b92915050565b600060208284031215613a6857613a67612767565b5b6000613a7684828501613a3d565b9150509291505056fea2646970667358221220b2e7db87dcac708ba8a64867ecbee2dce9b5cffc0cfa3ba705f14eabc86f246464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000007527567427564730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025242000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696f2f697066732f516d5441514c7064546d6643396973554e3748794372527a477171426d4532664d456e475466366d6434457133692f68696464656e2e6a736f6e0000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): RugBuds
Arg [1] : _tokenSymbol (string): RB
Arg [2] : _hiddenMetadataUri (string): https://ipfs.io/ipfs/QmTAQLpdTmfC9isUN7HyCrRzGqqBmE2fMEnGTf6md4Eq3i/hidden.json
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 5275674275647300000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 5242000000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000004f
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d5441514c7064546d66
Arg [9] : 43396973554e3748794372527a477171426d4532664d456e475466366d643445
Arg [10] : 7133692f68696464656e2e6a736f6e0000000000000000000000000000000000
Deployed Bytecode Sourcemap
221:4187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9410:639:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16803:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3680:159:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2856:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2962:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6063:323:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3845:165:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;580:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1147:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3249:139;;;;;;;;;;;;;:::i;:::-;;753:143:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4016:173:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2612:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;739:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;372:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;709:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;339:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11705:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3045:94:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7247:233:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:8;;;;;;;;;;;;;:::i;:::-;;2750:100:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;658:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10488:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3504:170:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;410:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4195:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3145:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;484:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2082:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;448:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2525:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17752:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1731:244:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2142:201:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;530:45:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9410:639:3;9495:4;9834:10;9819:25;;:11;:25;;;;:102;;;;9911:10;9896:25;;:11;:25;;;;9819:102;:179;;;;9988:10;9973:25;;:11;:25;;;;9819:179;9799:199;;9410:639;;;:::o;10312:100::-;10366:13;10399:5;10392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10312:100;:::o;16803:218::-;16879:7;16904:16;16912:7;16904;:16::i;:::-;16899:64;;16929:34;;;;;;;;;;;;;;16899:64;16983:15;:24;16999:7;16983:24;;;;;;;;;;;:30;;;;;;;;;;;;16976:37;;16803:218;;;:::o;3680:159:0:-;3784:8;2274:30:7;2295:8;2274:20;:30::i;:::-;3801:32:0::1;3815:8;3825:7;3801:13;:32::i;:::-;3680:159:::0;;;:::o;2856:100::-;1122:13:8;:11;:13::i;:::-;2940:10:0::1;2928:9;:22;;;;;;:::i;:::-;;2856:100:::0;:::o;2962:77::-;1122:13:8;:11;:13::i;:::-;3027:6:0::1;3018;;:15;;;;;;;;;;;;;;;;;;2962:77:::0;:::o;6063:323:3:-;6124:7;6352:15;:13;:15::i;:::-;6337:12;;6321:13;;:28;:46;6314:53;;6063:323;:::o;3845:165:0:-;3954:4;2102:10:7;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;3967:37:0::1;3986:4;3992:2;3996:7;3967:18;:37::i;:::-;3845:165:::0;;;;:::o;580:31::-;;;;:::o;1147:578::-;1218:11;1092:10;;1080:9;;:22;;;;:::i;:::-;1065:11;1049:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:53;;1041:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;2311:21:9::1;:19;:21::i;:::-;1260:6:0::2;;;;;;;;;;;1259:7;1251:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1358:22;;1343:11;1313:27;1327:12;:10;:12::i;:::-;1313:13;:27::i;:::-;:41;;;;:::i;:::-;:67;;1305:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;1418:8;:22;1427:12;:10;:12::i;:::-;1418:22;;;;;;;;;;;;;;;;;;;;;;;;;1415:262;;;1486:14;;1472:11;:28;;;;:::i;:::-;1459:9;:41;;1451:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1415:262;;;1593:14;;1588:1;1574:11;:15;;;;:::i;:::-;1573:34;;;;:::i;:::-;1560:9;:47;;1552:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;1665:4;1640:8;:22;1649:12;:10;:12::i;:::-;1640:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1415:262;1683:36;1693:12;:10;:12::i;:::-;1707:11;1683:9;:36::i;:::-;2355:20:9::1;:18;:20::i;:::-;1147:578:0::0;;:::o;3249:139::-;1122:13:8;:11;:13::i;:::-;3296:7:0::1;3317;:5;:7::i;:::-;3309:21;;3338;3309:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3295:69;;;3379:2;3371:11;;;::::0;::::1;;3286:102;3249:139::o:0;753:143:7:-;853:42;753:143;:::o;4016:173:0:-;4129:4;2102:10:7;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;4142:41:0::1;4165:4;4171:2;4175:7;4142:22;:41::i;:::-;4016:173:::0;;;;:::o;2612:132::-;1122:13:8;:11;:13::i;:::-;2720:18:0::1;2700:17;:38;;;;;;:::i;:::-;;2612:132:::0;:::o;739:28::-;;;;;;;;;;;;;:::o;372:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;709:25::-;;;;;;;;;;;;;:::o;339:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11705:152:3:-;11777:7;11820:27;11839:7;11820:18;:27::i;:::-;11797:52;;11705:152;;;:::o;3045:94:0:-;1122:13:8;:11;:13::i;:::-;3123:10:0::1;3111:9;:22;;;;3045:94:::0;:::o;7247:233:3:-;7319:7;7360:1;7343:19;;:5;:19;;;7339:60;;7371:28;;;;;;;;;;;;;;7339:60;1406:13;7417:18;:25;7436:5;7417:25;;;;;;;;;;;;;;;;:55;7410:62;;7247:233;;;:::o;1884:103:8:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;2750:100:0:-;1122:13:8;:11;:13::i;:::-;2834:10:0::1;2822:9;:22;;;;;;:::i;:::-;;2750:100:::0;:::o;658:44::-;;;;:::o;1236:87:8:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;10488:104:3:-;10544:13;10577:7;10570:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:104;:::o;3504:170:0:-;3608:8;2274:30:7;2295:8;2274:20;:30::i;:::-;3625:43:0::1;3649:8;3659;3625:23;:43::i;:::-;3504:170:::0;;;:::o;410:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4195:210::-;4336:4;2102:10:7;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;4352:47:0::1;4375:4;4381:2;4385:7;4394:4;4352:22;:47::i;:::-;4195:210:::0;;;;;:::o;3145:98::-;1122:13:8;:11;:13::i;:::-;3226:11:0::1;3213:10;:24;;;;3145:98:::0;:::o;484:41::-;;;;:::o;2082:437::-;2156:13;2186:17;2194:8;2186:7;:17::i;:::-;2178:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2280:5;2268:17;;:8;;;;;;;;;;;:17;;;2264:64;;2303:17;2296:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2264:64;2336:28;2367:10;:8;:10::i;:::-;2336:41;;2422:1;2397:14;2391:28;:32;:122;;;;;;;;;;;;;;;;;2455:14;2471:19;:8;:17;:19::i;:::-;2492:9;2438:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2391:122;2384:129;;;2082:437;;;;:::o;448:31::-;;;;:::o;2525:81::-;1122:13:8;:11;:13::i;:::-;2594:6:0::1;2583:8;;:17;;;;;;;;;;;;;;;;;;2525:81:::0;:::o;17752:164:3:-;17849:4;17873:18;:25;17892:5;17873:25;;;;;;;;;;;;;;;:35;17899:8;17873:35;;;;;;;;;;;;;;;;;;;;;;;;;17866:42;;17752:164;;;;:::o;1731:244:0:-;1122:13:8;:11;:13::i;:::-;1847:10:0::1;;1822:14;:21;:35;;1814:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1874:9;1869:101;1893:14;:21;1889:1;:25;1869:101;;;1931:31;1941:14;1956:1;1941:17;;;;;;;;:::i;:::-;;;;;;;;1960:1;1931:9;:31::i;:::-;1916:4;;;;;:::i;:::-;;;;1869:101;;;;1731:244:::0;:::o;2142:201:8:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;530:45:0:-;;;;:::o;18174:282:3:-;18239:4;18295:7;18276:15;:13;:15::i;:::-;:26;;:66;;;;;18329:13;;18319:7;:23;18276:66;:153;;;;;18428:1;2182:8;18380:17;:26;18398:7;18380:26;;;;;;;;;;;;:44;:49;18276:153;18256:173;;18174:282;;;:::o;2332:419:7:-;2571:1;853:42;2523:45;;;:49;2519:225;;;853:42;2594;;;2645:4;2652:8;2594:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2589:144;;2708:8;2689:28;;;;;;;;;;;:::i;:::-;;;;;;;;2589:144;2519:225;2332:419;:::o;16236:408:3:-;16325:13;16341:16;16349:7;16341;:16::i;:::-;16325:32;;16397:5;16374:28;;:19;:17;:19::i;:::-;:28;;;16370:175;;16422:44;16439:5;16446:19;:17;:19::i;:::-;16422:16;:44::i;:::-;16417:128;;16494:35;;;;;;;;;;;;;;16417:128;16370:175;16590:2;16557:15;:24;16573:7;16557:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16628:7;16624:2;16608:28;;16617:5;16608:28;;;;;;;;;;;;16314:330;16236:408;;:::o;1401:132:8:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;1981:95:0:-;2046:7;2069:1;2062:8;;1981:95;:::o;20442:2825:3:-;20584:27;20614;20633:7;20614:18;:27::i;:::-;20584:57;;20699:4;20658:45;;20674:19;20658:45;;;20654:86;;20712:28;;;;;;;;;;;;;;20654:86;20754:27;20783:23;20810:35;20837:7;20810:26;:35::i;:::-;20753:92;;;;20945:68;20970:15;20987:4;20993:19;:17;:19::i;:::-;20945:24;:68::i;:::-;20940:180;;21033:43;21050:4;21056:19;:17;:19::i;:::-;21033:16;:43::i;:::-;21028:92;;21085:35;;;;;;;;;;;;;;21028:92;20940:180;21151:1;21137:16;;:2;:16;;;21133:52;;21162:23;;;;;;;;;;;;;;21133:52;21198:43;21220:4;21226:2;21230:7;21239:1;21198:21;:43::i;:::-;21334:15;21331:160;;;21474:1;21453:19;21446:30;21331:160;21871:18;:24;21890:4;21871:24;;;;;;;;;;;;;;;;21869:26;;;;;;;;;;;;21940:18;:22;21959:2;21940:22;;;;;;;;;;;;;;;;21938:24;;;;;;;;;;;22262:146;22299:2;22348:45;22363:4;22369:2;22373:19;22348:14;:45::i;:::-;2462:8;22320:73;22262:18;:146::i;:::-;22233:17;:26;22251:7;22233:26;;;;;;;;;;;:175;;;;22579:1;2462:8;22528:19;:47;:52;22524:627;;22601:19;22633:1;22623:7;:11;22601:33;;22790:1;22756:17;:30;22774:11;22756:30;;;;;;;;;;;;:35;22752:384;;22894:13;;22879:11;:28;22875:242;;23074:19;23041:17;:30;23059:11;23041:30;;;;;;;;;;;:52;;;;22875:242;22752:384;22582:569;22524:627;23198:7;23194:2;23179:27;;23188:4;23179:27;;;;;;;;;;;;23217:42;23238:4;23244:2;23248:7;23257:1;23217:20;:42::i;:::-;20573:2694;;;20442:2825;;;:::o;2391:293:9:-;1793:1;2525:7;;:19;2517:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1793:1;2658:7;:18;;;;2391:293::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;7562:178:3:-;7623:7;1406:13;1544:2;7651:18;:25;7670:5;7651:25;;;;;;;;;;;;;;;;:50;;7650:82;7643:89;;7562:178;;;:::o;34314:112::-;34391:27;34401:2;34405:8;34391:27;;;;;;;;;;;;:9;:27::i;:::-;34314:112;;:::o;2692:213:9:-;1749:1;2875:7;:22;;;;2692:213::o;23363:193:3:-;23509:39;23526:4;23532:2;23536:7;23509:39;;;;;;;;;;;;:16;:39::i;:::-;23363:193;;;:::o;12860:1275::-;12927:7;12947:12;12962:7;12947:22;;13030:4;13011:15;:13;:15::i;:::-;:23;13007:1061;;13064:13;;13057:4;:20;13053:1015;;;13102:14;13119:17;:23;13137:4;13119:23;;;;;;;;;;;;13102:40;;13236:1;2182:8;13208:6;:24;:29;13204:845;;13873:113;13890:1;13880:6;:11;13873:113;;13933:17;:25;13951:6;;;;;;;13933:25;;;;;;;;;;;;13924:34;;13873:113;;;14019:6;14012:13;;;;;;13204:845;13079:989;13053:1015;13007:1061;14096:31;;;;;;;;;;;;;;12860:1275;;;;:::o;2503:191:8:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;17361:234:3:-;17508:8;17456:18;:39;17475:19;:17;:19::i;:::-;17456:39;;;;;;;;;;;;;;;:49;17496:8;17456:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17568:8;17532:55;;17547:19;:17;:19::i;:::-;17532:55;;;17578:8;17532:55;;;;;;:::i;:::-;;;;;;;;17361:234;;:::o;24154:407::-;24329:31;24342:4;24348:2;24352:7;24329:12;:31::i;:::-;24393:1;24375:2;:14;;;:19;24371:183;;24414:56;24445:4;24451:2;24455:7;24464:5;24414:30;:56::i;:::-;24409:145;;24498:40;;;;;;;;;;;;;;24409:145;24371:183;24154:407;;;;:::o;3394:104:0:-;3454:13;3483:9;3476:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3394:104;:::o;427:716:10:-;483:13;534:14;571:1;551:17;562:5;551:10;:17::i;:::-;:21;534:38;;587:20;621:6;610:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:41;;643:11;772:6;768:2;764:15;756:6;752:28;745:35;;809:288;816:4;809:288;;;841:5;;;;;;;;983:8;978:2;971:5;967:14;962:30;957:3;949:44;1039:2;1030:11;;;;;;:::i;:::-;;;;;1073:1;1064:5;:10;809:288;1060:21;809:288;1118:6;1111:13;;;;;427:716;;;:::o;40482:105:3:-;40542:7;40569:10;40562:17;;40482:105;:::o;19337:485::-;19439:27;19468:23;19509:38;19550:15;:24;19566:7;19550:24;;;;;;;;;;;19509:65;;19727:18;19704:41;;19784:19;19778:26;19759:45;;19689:126;19337:485;;;:::o;18565:659::-;18714:11;18879:16;18872:5;18868:28;18859:37;;19039:16;19028:9;19024:32;19011:45;;19189:15;19178:9;19175:30;19167:5;19156:9;19153:20;19150:56;19140:66;;18565:659;;;;;:::o;25223:159::-;;;;;:::o;39791:311::-;39926:7;39946:16;2586:3;39972:19;:41;;39946:68;;2586:3;40040:31;40051:4;40057:2;40061:9;40040:10;:31::i;:::-;40032:40;;:62;;40025:69;;;39791:311;;;;;:::o;14683:450::-;14763:14;14931:16;14924:5;14920:28;14911:37;;15108:5;15094:11;15069:23;15065:41;15062:52;15055:5;15052:63;15042:73;;14683:450;;;;:::o;26047:158::-;;;;;:::o;33541:689::-;33672:19;33678:2;33682:8;33672:5;:19::i;:::-;33751:1;33733:2;:14;;;:19;33729:483;;33773:11;33787:13;;33773:27;;33819:13;33841:8;33835:3;:14;33819:30;;33868:233;33899:62;33938:1;33942:2;33946:7;;;;;;33955:5;33899:30;:62::i;:::-;33894:167;;33997:40;;;;;;;;;;;;;;33894:167;34096:3;34088:5;:11;33868:233;;34183:3;34166:13;;:20;34162:34;;34188:8;;;34162:34;33754:458;;33729:483;33541:689;;;:::o;26645:716::-;26808:4;26854:2;26829:45;;;26875:19;:17;:19::i;:::-;26896:4;26902:7;26911:5;26829:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27129:1;27112:6;:13;:18;27108:235;;27158:40;;;;;;;;;;;;;;27108:235;27301:6;27295:13;27286:6;27282:2;27278:15;27271:38;26825:529;26998:54;;;26988:64;;;:6;:64;;;;26981:71;;;26645:716;;;;;;:::o;10146:922:6:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::o;39492:147:3:-;39629:6;39492:147;;;;;:::o;27823:2966::-;27896:20;27919:13;;27896:36;;27959:1;27947:8;:13;27943:44;;27969:18;;;;;;;;;;;;;;27943:44;28000:61;28030:1;28034:2;28038:12;28052:8;28000:21;:61::i;:::-;28544:1;1544:2;28514:1;:26;;28513:32;28501:8;:45;28475:18;:22;28494:2;28475:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28823:139;28860:2;28914:33;28937:1;28941:2;28945:1;28914:14;:33::i;:::-;28881:30;28902:8;28881:20;:30::i;:::-;:66;28823:18;:139::i;:::-;28789:17;:31;28807:12;28789:31;;;;;;;;;;;:173;;;;28979:16;29010:11;29039:8;29024:12;:23;29010:37;;29560:16;29556:2;29552:25;29540:37;;29932:12;29892:8;29851:1;29789:25;29730:1;29669;29642:335;30303:1;30289:12;30285:20;30243:346;30344:3;30335:7;30332:16;30243:346;;30562:7;30552:8;30549:1;30522:25;30519:1;30516;30511:59;30397:1;30388:7;30384:15;30373:26;;30243:346;;;30247:77;30634:1;30622:8;:13;30618:45;;30644:19;;;;;;;;;;;;;;30618:45;30696:3;30680:13;:19;;;;28249:2462;;30721:60;30750:1;30754:2;30758:12;30772:8;30721:20;:60::i;:::-;27885:2904;27823:2966;;:::o;15235:324::-;15305:14;15538:1;15528:8;15525:15;15499:24;15495:46;15485:56;;15235:324;;;:::o;7:75:11:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:509::-;7070:6;7119:2;7107:9;7098:7;7094:23;7090:32;7087:119;;;7125:79;;:::i;:::-;7087:119;7273:1;7262:9;7258:17;7245:31;7303:18;7295:6;7292:30;7289:117;;;7325:79;;:::i;:::-;7289:117;7430:63;7485:7;7476:6;7465:9;7461:22;7430:63;:::i;:::-;7420:73;;7216:287;7001:509;;;;:::o;7516:116::-;7586:21;7601:5;7586:21;:::i;:::-;7579:5;7576:32;7566:60;;7622:1;7619;7612:12;7566:60;7516:116;:::o;7638:133::-;7681:5;7719:6;7706:20;7697:29;;7735:30;7759:5;7735:30;:::i;:::-;7638:133;;;;:::o;7777:323::-;7833:6;7882:2;7870:9;7861:7;7857:23;7853:32;7850:119;;;7888:79;;:::i;:::-;7850:119;8008:1;8033:50;8075:7;8066:6;8055:9;8051:22;8033:50;:::i;:::-;8023:60;;7979:114;7777:323;;;;:::o;8106:118::-;8193:24;8211:5;8193:24;:::i;:::-;8188:3;8181:37;8106:118;;:::o;8230:222::-;8323:4;8361:2;8350:9;8346:18;8338:26;;8374:71;8442:1;8431:9;8427:17;8418:6;8374:71;:::i;:::-;8230:222;;;;:::o;8458:619::-;8535:6;8543;8551;8600:2;8588:9;8579:7;8575:23;8571:32;8568:119;;;8606:79;;:::i;:::-;8568:119;8726:1;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8697:117;8853:2;8879:53;8924:7;8915:6;8904:9;8900:22;8879:53;:::i;:::-;8869:63;;8824:118;8981:2;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8952:118;8458:619;;;;;:::o;9083:60::-;9111:3;9132:5;9125:12;;9083:60;;;:::o;9149:142::-;9199:9;9232:53;9250:34;9259:24;9277:5;9259:24;:::i;:::-;9250:34;:::i;:::-;9232:53;:::i;:::-;9219:66;;9149:142;;;:::o;9297:126::-;9347:9;9380:37;9411:5;9380:37;:::i;:::-;9367:50;;9297:126;;;:::o;9429:158::-;9511:9;9544:37;9575:5;9544:37;:::i;:::-;9531:50;;9429:158;;;:::o;9593:195::-;9712:69;9775:5;9712:69;:::i;:::-;9707:3;9700:82;9593:195;;:::o;9794:286::-;9919:4;9957:2;9946:9;9942:18;9934:26;;9970:103;10070:1;10059:9;10055:17;10046:6;9970:103;:::i;:::-;9794:286;;;;:::o;10086:329::-;10145:6;10194:2;10182:9;10173:7;10169:23;10165:32;10162:119;;;10200:79;;:::i;:::-;10162:119;10320:1;10345:53;10390:7;10381:6;10370:9;10366:22;10345:53;:::i;:::-;10335:63;;10291:117;10086:329;;;;:::o;10421:468::-;10486:6;10494;10543:2;10531:9;10522:7;10518:23;10514:32;10511:119;;;10549:79;;:::i;:::-;10511:119;10669:1;10694:53;10739:7;10730:6;10719:9;10715:22;10694:53;:::i;:::-;10684:63;;10640:117;10796:2;10822:50;10864:7;10855:6;10844:9;10840:22;10822:50;:::i;:::-;10812:60;;10767:115;10421:468;;;;;:::o;10895:307::-;10956:4;11046:18;11038:6;11035:30;11032:56;;;11068:18;;:::i;:::-;11032:56;11106:29;11128:6;11106:29;:::i;:::-;11098:37;;11190:4;11184;11180:15;11172:23;;10895:307;;;:::o;11208:423::-;11285:5;11310:65;11326:48;11367:6;11326:48;:::i;:::-;11310:65;:::i;:::-;11301:74;;11398:6;11391:5;11384:21;11436:4;11429:5;11425:16;11474:3;11465:6;11460:3;11456:16;11453:25;11450:112;;;11481:79;;:::i;:::-;11450:112;11571:54;11618:6;11613:3;11608;11571:54;:::i;:::-;11291:340;11208:423;;;;;:::o;11650:338::-;11705:5;11754:3;11747:4;11739:6;11735:17;11731:27;11721:122;;11762:79;;:::i;:::-;11721:122;11879:6;11866:20;11904:78;11978:3;11970:6;11963:4;11955:6;11951:17;11904:78;:::i;:::-;11895:87;;11711:277;11650:338;;;;:::o;11994:943::-;12089:6;12097;12105;12113;12162:3;12150:9;12141:7;12137:23;12133:33;12130:120;;;12169:79;;:::i;:::-;12130:120;12289:1;12314:53;12359:7;12350:6;12339:9;12335:22;12314:53;:::i;:::-;12304:63;;12260:117;12416:2;12442:53;12487:7;12478:6;12467:9;12463:22;12442:53;:::i;:::-;12432:63;;12387:118;12544:2;12570:53;12615:7;12606:6;12595:9;12591:22;12570:53;:::i;:::-;12560:63;;12515:118;12700:2;12689:9;12685:18;12672:32;12731:18;12723:6;12720:30;12717:117;;;12753:79;;:::i;:::-;12717:117;12858:62;12912:7;12903:6;12892:9;12888:22;12858:62;:::i;:::-;12848:72;;12643:287;11994:943;;;;;;;:::o;12943:474::-;13011:6;13019;13068:2;13056:9;13047:7;13043:23;13039:32;13036:119;;;13074:79;;:::i;:::-;13036:119;13194:1;13219:53;13264:7;13255:6;13244:9;13240:22;13219:53;:::i;:::-;13209:63;;13165:117;13321:2;13347:53;13392:7;13383:6;13372:9;13368:22;13347:53;:::i;:::-;13337:63;;13292:118;12943:474;;;;;:::o;13423:311::-;13500:4;13590:18;13582:6;13579:30;13576:56;;;13612:18;;:::i;:::-;13576:56;13662:4;13654:6;13650:17;13642:25;;13722:4;13716;13712:15;13704:23;;13423:311;;;:::o;13740:117::-;13849:1;13846;13839:12;13880:710;13976:5;14001:81;14017:64;14074:6;14017:64;:::i;:::-;14001:81;:::i;:::-;13992:90;;14102:5;14131:6;14124:5;14117:21;14165:4;14158:5;14154:16;14147:23;;14218:4;14210:6;14206:17;14198:6;14194:30;14247:3;14239:6;14236:15;14233:122;;;14266:79;;:::i;:::-;14233:122;14381:6;14364:220;14398:6;14393:3;14390:15;14364:220;;;14473:3;14502:37;14535:3;14523:10;14502:37;:::i;:::-;14497:3;14490:50;14569:4;14564:3;14560:14;14553:21;;14440:144;14424:4;14419:3;14415:14;14408:21;;14364:220;;;14368:21;13982:608;;13880:710;;;;;:::o;14613:370::-;14684:5;14733:3;14726:4;14718:6;14714:17;14710:27;14700:122;;14741:79;;:::i;:::-;14700:122;14858:6;14845:20;14883:94;14973:3;14965:6;14958:4;14950:6;14946:17;14883:94;:::i;:::-;14874:103;;14690:293;14613:370;;;;:::o;14989:539::-;15073:6;15122:2;15110:9;15101:7;15097:23;15093:32;15090:119;;;15128:79;;:::i;:::-;15090:119;15276:1;15265:9;15261:17;15248:31;15306:18;15298:6;15295:30;15292:117;;;15328:79;;:::i;:::-;15292:117;15433:78;15503:7;15494:6;15483:9;15479:22;15433:78;:::i;:::-;15423:88;;15219:302;14989:539;;;;:::o;15534:180::-;15582:77;15579:1;15572:88;15679:4;15676:1;15669:15;15703:4;15700:1;15693:15;15720:320;15764:6;15801:1;15795:4;15791:12;15781:22;;15848:1;15842:4;15838:12;15869:18;15859:81;;15925:4;15917:6;15913:17;15903:27;;15859:81;15987:2;15979:6;15976:14;15956:18;15953:38;15950:84;;16006:18;;:::i;:::-;15950:84;15771:269;15720:320;;;:::o;16046:141::-;16095:4;16118:3;16110:11;;16141:3;16138:1;16131:14;16175:4;16172:1;16162:18;16154:26;;16046:141;;;:::o;16193:93::-;16230:6;16277:2;16272;16265:5;16261:14;16257:23;16247:33;;16193:93;;;:::o;16292:107::-;16336:8;16386:5;16380:4;16376:16;16355:37;;16292:107;;;;:::o;16405:393::-;16474:6;16524:1;16512:10;16508:18;16547:97;16577:66;16566:9;16547:97;:::i;:::-;16665:39;16695:8;16684:9;16665:39;:::i;:::-;16653:51;;16737:4;16733:9;16726:5;16722:21;16713:30;;16786:4;16776:8;16772:19;16765:5;16762:30;16752:40;;16481:317;;16405:393;;;;;:::o;16804:142::-;16854:9;16887:53;16905:34;16914:24;16932:5;16914:24;:::i;:::-;16905:34;:::i;:::-;16887:53;:::i;:::-;16874:66;;16804:142;;;:::o;16952:75::-;16995:3;17016:5;17009:12;;16952:75;;;:::o;17033:269::-;17143:39;17174:7;17143:39;:::i;:::-;17204:91;17253:41;17277:16;17253:41;:::i;:::-;17245:6;17238:4;17232:11;17204:91;:::i;:::-;17198:4;17191:105;17109:193;17033:269;;;:::o;17308:73::-;17353:3;17308:73;:::o;17387:189::-;17464:32;;:::i;:::-;17505:65;17563:6;17555;17549:4;17505:65;:::i;:::-;17440:136;17387:189;;:::o;17582:186::-;17642:120;17659:3;17652:5;17649:14;17642:120;;;17713:39;17750:1;17743:5;17713:39;:::i;:::-;17686:1;17679:5;17675:13;17666:22;;17642:120;;;17582:186;;:::o;17774:543::-;17875:2;17870:3;17867:11;17864:446;;;17909:38;17941:5;17909:38;:::i;:::-;17993:29;18011:10;17993:29;:::i;:::-;17983:8;17979:44;18176:2;18164:10;18161:18;18158:49;;;18197:8;18182:23;;18158:49;18220:80;18276:22;18294:3;18276:22;:::i;:::-;18266:8;18262:37;18249:11;18220:80;:::i;:::-;17879:431;;17864:446;17774:543;;;:::o;18323:117::-;18377:8;18427:5;18421:4;18417:16;18396:37;;18323:117;;;;:::o;18446:169::-;18490:6;18523:51;18571:1;18567:6;18559:5;18556:1;18552:13;18523:51;:::i;:::-;18519:56;18604:4;18598;18594:15;18584:25;;18497:118;18446:169;;;;:::o;18620:295::-;18696:4;18842:29;18867:3;18861:4;18842:29;:::i;:::-;18834:37;;18904:3;18901:1;18897:11;18891:4;18888:21;18880:29;;18620:295;;;;:::o;18920:1395::-;19037:37;19070:3;19037:37;:::i;:::-;19139:18;19131:6;19128:30;19125:56;;;19161:18;;:::i;:::-;19125:56;19205:38;19237:4;19231:11;19205:38;:::i;:::-;19290:67;19350:6;19342;19336:4;19290:67;:::i;:::-;19384:1;19408:4;19395:17;;19440:2;19432:6;19429:14;19457:1;19452:618;;;;20114:1;20131:6;20128:77;;;20180:9;20175:3;20171:19;20165:26;20156:35;;20128:77;20231:67;20291:6;20284:5;20231:67;:::i;:::-;20225:4;20218:81;20087:222;19422:887;;19452:618;19504:4;19500:9;19492:6;19488:22;19538:37;19570:4;19538:37;:::i;:::-;19597:1;19611:208;19625:7;19622:1;19619:14;19611:208;;;19704:9;19699:3;19695:19;19689:26;19681:6;19674:42;19755:1;19747:6;19743:14;19733:24;;19802:2;19791:9;19787:18;19774:31;;19648:4;19645:1;19641:12;19636:17;;19611:208;;;19847:6;19838:7;19835:19;19832:179;;;19905:9;19900:3;19896:19;19890:26;19948:48;19990:4;19982:6;19978:17;19967:9;19948:48;:::i;:::-;19940:6;19933:64;19855:156;19832:179;20057:1;20053;20045:6;20041:14;20037:22;20031:4;20024:36;19459:611;;;19422:887;;19012:1303;;;18920:1395;;:::o;20321:180::-;20369:77;20366:1;20359:88;20466:4;20463:1;20456:15;20490:4;20487:1;20480:15;20507:194;20547:4;20567:20;20585:1;20567:20;:::i;:::-;20562:25;;20601:20;20619:1;20601:20;:::i;:::-;20596:25;;20645:1;20642;20638:9;20630:17;;20669:1;20663:4;20660:11;20657:37;;;20674:18;;:::i;:::-;20657:37;20507:194;;;;:::o;20707:191::-;20747:3;20766:20;20784:1;20766:20;:::i;:::-;20761:25;;20800:20;20818:1;20800:20;:::i;:::-;20795:25;;20843:1;20840;20836:9;20829:16;;20864:3;20861:1;20858:10;20855:36;;;20871:18;;:::i;:::-;20855:36;20707:191;;;;:::o;20904:170::-;21044:22;21040:1;21032:6;21028:14;21021:46;20904:170;:::o;21080:366::-;21222:3;21243:67;21307:2;21302:3;21243:67;:::i;:::-;21236:74;;21319:93;21408:3;21319:93;:::i;:::-;21437:2;21432:3;21428:12;21421:19;;21080:366;;;:::o;21452:419::-;21618:4;21656:2;21645:9;21641:18;21633:26;;21705:9;21699:4;21695:20;21691:1;21680:9;21676:17;21669:47;21733:131;21859:4;21733:131;:::i;:::-;21725:139;;21452:419;;;:::o;21877:177::-;22017:29;22013:1;22005:6;22001:14;21994:53;21877:177;:::o;22060:366::-;22202:3;22223:67;22287:2;22282:3;22223:67;:::i;:::-;22216:74;;22299:93;22388:3;22299:93;:::i;:::-;22417:2;22412:3;22408:12;22401:19;;22060:366;;;:::o;22432:419::-;22598:4;22636:2;22625:9;22621:18;22613:26;;22685:9;22679:4;22675:20;22671:1;22660:9;22656:17;22649:47;22713:131;22839:4;22713:131;:::i;:::-;22705:139;;22432:419;;;:::o;22857:171::-;22997:23;22993:1;22985:6;22981:14;22974:47;22857:171;:::o;23034:366::-;23176:3;23197:67;23261:2;23256:3;23197:67;:::i;:::-;23190:74;;23273:93;23362:3;23273:93;:::i;:::-;23391:2;23386:3;23382:12;23375:19;;23034:366;;;:::o;23406:419::-;23572:4;23610:2;23599:9;23595:18;23587:26;;23659:9;23653:4;23649:20;23645:1;23634:9;23630:17;23623:47;23687:131;23813:4;23687:131;:::i;:::-;23679:139;;23406:419;;;:::o;23831:410::-;23871:7;23894:20;23912:1;23894:20;:::i;:::-;23889:25;;23928:20;23946:1;23928:20;:::i;:::-;23923:25;;23983:1;23980;23976:9;24005:30;24023:11;24005:30;:::i;:::-;23994:41;;24184:1;24175:7;24171:15;24168:1;24165:22;24145:1;24138:9;24118:83;24095:139;;24214:18;;:::i;:::-;24095:139;23879:362;23831:410;;;;:::o;24247:169::-;24387:21;24383:1;24375:6;24371:14;24364:45;24247:169;:::o;24422:366::-;24564:3;24585:67;24649:2;24644:3;24585:67;:::i;:::-;24578:74;;24661:93;24750:3;24661:93;:::i;:::-;24779:2;24774:3;24770:12;24763:19;;24422:366;;;:::o;24794:419::-;24960:4;24998:2;24987:9;24983:18;24975:26;;25047:9;25041:4;25037:20;25033:1;25022:9;25018:17;25011:47;25075:131;25201:4;25075:131;:::i;:::-;25067:139;;24794:419;;;:::o;25219:147::-;25320:11;25357:3;25342:18;;25219:147;;;;:::o;25372:114::-;;:::o;25492:398::-;25651:3;25672:83;25753:1;25748:3;25672:83;:::i;:::-;25665:90;;25764:93;25853:3;25764:93;:::i;:::-;25882:1;25877:3;25873:11;25866:18;;25492:398;;;:::o;25896:379::-;26080:3;26102:147;26245:3;26102:147;:::i;:::-;26095:154;;26266:3;26259:10;;25896:379;;;:::o;26281:234::-;26421:34;26417:1;26409:6;26405:14;26398:58;26490:17;26485:2;26477:6;26473:15;26466:42;26281:234;:::o;26521:366::-;26663:3;26684:67;26748:2;26743:3;26684:67;:::i;:::-;26677:74;;26760:93;26849:3;26760:93;:::i;:::-;26878:2;26873:3;26869:12;26862:19;;26521:366;;;:::o;26893:419::-;27059:4;27097:2;27086:9;27082:18;27074:26;;27146:9;27140:4;27136:20;27132:1;27121:9;27117:17;27110:47;27174:131;27300:4;27174:131;:::i;:::-;27166:139;;26893:419;;;:::o;27318:148::-;27420:11;27457:3;27442:18;;27318:148;;;;:::o;27472:390::-;27578:3;27606:39;27639:5;27606:39;:::i;:::-;27661:89;27743:6;27738:3;27661:89;:::i;:::-;27654:96;;27759:65;27817:6;27812:3;27805:4;27798:5;27794:16;27759:65;:::i;:::-;27849:6;27844:3;27840:16;27833:23;;27582:280;27472:390;;;;:::o;27892:874::-;27995:3;28032:5;28026:12;28061:36;28087:9;28061:36;:::i;:::-;28113:89;28195:6;28190:3;28113:89;:::i;:::-;28106:96;;28233:1;28222:9;28218:17;28249:1;28244:166;;;;28424:1;28419:341;;;;28211:549;;28244:166;28328:4;28324:9;28313;28309:25;28304:3;28297:38;28390:6;28383:14;28376:22;28368:6;28364:35;28359:3;28355:45;28348:52;;28244:166;;28419:341;28486:38;28518:5;28486:38;:::i;:::-;28546:1;28560:154;28574:6;28571:1;28568:13;28560:154;;;28648:7;28642:14;28638:1;28633:3;28629:11;28622:35;28698:1;28689:7;28685:15;28674:26;;28596:4;28593:1;28589:12;28584:17;;28560:154;;;28743:6;28738:3;28734:16;28727:23;;28426:334;;28211:549;;27999:767;;27892:874;;;;:::o;28772:589::-;28997:3;29019:95;29110:3;29101:6;29019:95;:::i;:::-;29012:102;;29131:95;29222:3;29213:6;29131:95;:::i;:::-;29124:102;;29243:92;29331:3;29322:6;29243:92;:::i;:::-;29236:99;;29352:3;29345:10;;28772:589;;;;;;:::o;29367:364::-;29509:3;29530:66;29594:1;29589:3;29530:66;:::i;:::-;29523:73;;29605:93;29694:3;29605:93;:::i;:::-;29723:1;29718:3;29714:11;29707:18;;29367:364;;;:::o;29737:419::-;29903:4;29941:2;29930:9;29926:18;29918:26;;29990:9;29984:4;29980:20;29976:1;29965:9;29961:17;29954:47;30018:131;30144:4;30018:131;:::i;:::-;30010:139;;29737:419;;;:::o;30162:180::-;30210:77;30207:1;30200:88;30307:4;30304:1;30297:15;30331:4;30328:1;30321:15;30348:233;30387:3;30410:24;30428:5;30410:24;:::i;:::-;30401:33;;30456:66;30449:5;30446:77;30443:103;;30526:18;;:::i;:::-;30443:103;30573:1;30566:5;30562:13;30555:20;;30348:233;;;:::o;30587:225::-;30727:34;30723:1;30715:6;30711:14;30704:58;30796:8;30791:2;30783:6;30779:15;30772:33;30587:225;:::o;30818:366::-;30960:3;30981:67;31045:2;31040:3;30981:67;:::i;:::-;30974:74;;31057:93;31146:3;31057:93;:::i;:::-;31175:2;31170:3;31166:12;31159:19;;30818:366;;;:::o;31190:419::-;31356:4;31394:2;31383:9;31379:18;31371:26;;31443:9;31437:4;31433:20;31429:1;31418:9;31414:17;31407:47;31471:131;31597:4;31471:131;:::i;:::-;31463:139;;31190:419;;;:::o;31615:332::-;31736:4;31774:2;31763:9;31759:18;31751:26;;31787:71;31855:1;31844:9;31840:17;31831:6;31787:71;:::i;:::-;31868:72;31936:2;31925:9;31921:18;31912:6;31868:72;:::i;:::-;31615:332;;;;;:::o;31953:137::-;32007:5;32038:6;32032:13;32023:22;;32054:30;32078:5;32054:30;:::i;:::-;31953:137;;;;:::o;32096:345::-;32163:6;32212:2;32200:9;32191:7;32187:23;32183:32;32180:119;;;32218:79;;:::i;:::-;32180:119;32338:1;32363:61;32416:7;32407:6;32396:9;32392:22;32363:61;:::i;:::-;32353:71;;32309:125;32096:345;;;;:::o;32447:182::-;32587:34;32583:1;32575:6;32571:14;32564:58;32447:182;:::o;32635:366::-;32777:3;32798:67;32862:2;32857:3;32798:67;:::i;:::-;32791:74;;32874:93;32963:3;32874:93;:::i;:::-;32992:2;32987:3;32983:12;32976:19;;32635:366;;;:::o;33007:419::-;33173:4;33211:2;33200:9;33196:18;33188:26;;33260:9;33254:4;33250:20;33246:1;33235:9;33231:17;33224:47;33288:131;33414:4;33288:131;:::i;:::-;33280:139;;33007:419;;;:::o;33432:181::-;33572:33;33568:1;33560:6;33556:14;33549:57;33432:181;:::o;33619:366::-;33761:3;33782:67;33846:2;33841:3;33782:67;:::i;:::-;33775:74;;33858:93;33947:3;33858:93;:::i;:::-;33976:2;33971:3;33967:12;33960:19;;33619:366;;;:::o;33991:419::-;34157:4;34195:2;34184:9;34180:18;34172:26;;34244:9;34238:4;34234:20;34230:1;34219:9;34215:17;34208:47;34272:131;34398:4;34272:131;:::i;:::-;34264:139;;33991:419;;;:::o;34416:180::-;34464:77;34461:1;34454:88;34561:4;34558:1;34551:15;34585:4;34582:1;34575:15;34602:98;34653:6;34687:5;34681:12;34671:22;;34602:98;;;:::o;34706:168::-;34789:11;34823:6;34818:3;34811:19;34863:4;34858:3;34854:14;34839:29;;34706:168;;;;:::o;34880:373::-;34966:3;34994:38;35026:5;34994:38;:::i;:::-;35048:70;35111:6;35106:3;35048:70;:::i;:::-;35041:77;;35127:65;35185:6;35180:3;35173:4;35166:5;35162:16;35127:65;:::i;:::-;35217:29;35239:6;35217:29;:::i;:::-;35212:3;35208:39;35201:46;;34970:283;34880:373;;;;:::o;35259:640::-;35454:4;35492:3;35481:9;35477:19;35469:27;;35506:71;35574:1;35563:9;35559:17;35550:6;35506:71;:::i;:::-;35587:72;35655:2;35644:9;35640:18;35631:6;35587:72;:::i;:::-;35669;35737:2;35726:9;35722:18;35713:6;35669:72;:::i;:::-;35788:9;35782:4;35778:20;35773:2;35762:9;35758:18;35751:48;35816:76;35887:4;35878:6;35816:76;:::i;:::-;35808:84;;35259:640;;;;;;;:::o;35905:141::-;35961:5;35992:6;35986:13;35977:22;;36008:32;36034:5;36008:32;:::i;:::-;35905:141;;;;:::o;36052:349::-;36121:6;36170:2;36158:9;36149:7;36145:23;36141:32;36138:119;;;36176:79;;:::i;:::-;36138:119;36296:1;36321:63;36376:7;36367:6;36356:9;36352:22;36321:63;:::i;:::-;36311:73;;36267:127;36052:349;;;;:::o
Swarm Source
ipfs://b2e7db87dcac708ba8a64867ecbee2dce9b5cffc0cfa3ba705f14eabc86f2464
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.