Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 165 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15197444 | 765 days ago | IN | 0 ETH | 0.00030608 | ||||
Mint | 15152804 | 772 days ago | IN | 0 ETH | 0.0006684 | ||||
Set Approval For... | 15152798 | 772 days ago | IN | 0 ETH | 0.00038467 | ||||
Mint | 15152793 | 772 days ago | IN | 0 ETH | 0.0010869 | ||||
Mint | 15152666 | 772 days ago | IN | 0 ETH | 0.00120274 | ||||
Set Approval For... | 15113211 | 778 days ago | IN | 0 ETH | 0.00030544 | ||||
Set Approval For... | 15113197 | 778 days ago | IN | 0 ETH | 0.00055231 | ||||
Set Approval For... | 15109239 | 779 days ago | IN | 0 ETH | 0.00106091 | ||||
Mint | 15107970 | 779 days ago | IN | 0 ETH | 0.00064231 | ||||
Mint | 15107924 | 779 days ago | IN | 0 ETH | 0.00074121 | ||||
Mint | 15107837 | 779 days ago | IN | 0 ETH | 0.00068545 | ||||
Mint | 15107779 | 779 days ago | IN | 0 ETH | 0.00083619 | ||||
Mint | 15107585 | 779 days ago | IN | 0 ETH | 0.00120449 | ||||
Mint | 15107498 | 779 days ago | IN | 0 ETH | 0.00160274 | ||||
Mint | 15107452 | 779 days ago | IN | 0 ETH | 0.0018209 | ||||
Mint | 15107318 | 779 days ago | IN | 0 ETH | 0.00181943 | ||||
Mint | 15107271 | 779 days ago | IN | 0 ETH | 0.00080999 | ||||
Mint | 15107246 | 779 days ago | IN | 0 ETH | 0.00085669 | ||||
Mint | 15107240 | 779 days ago | IN | 0 ETH | 0.00076441 | ||||
Mint | 15107234 | 779 days ago | IN | 0 ETH | 0.0008473 | ||||
Mint | 15107220 | 779 days ago | IN | 0 ETH | 0.00087329 | ||||
Mint | 15107212 | 779 days ago | IN | 0 ETH | 0.00104498 | ||||
Mint | 15107205 | 779 days ago | IN | 0 ETH | 0.00104941 | ||||
Mint | 15107200 | 779 days ago | IN | 0 ETH | 0.00110448 | ||||
Mint | 15107157 | 779 days ago | IN | 0 ETH | 0.00135204 |
Loading...
Loading
Contract Name:
SavageKittens
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-08 */ // File: SavageKittens.sol // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if ( !_checkContractOnERC721Received( address(0), to, updatedIndex++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/MyNFT.sol pragma solidity ^0.8.4; contract SavageKittens is ERC721A, Ownable { uint256 public maxSupply = 1000; uint256 public maxPerWallet = 20; uint256 public maxPerTx = 20; uint256 public _price = 0 ether; bool public activated; string public unrevealedTokenURI = ""; string public baseURI = "https://gateway.pinata.cloud/ipfs/QmS7fb9ucSg5P8qj13eP8aVPduUYebCqQzTN1EMSeVNE85/"; mapping(uint256 => string) private _tokenURIs; address private _ownerWallet = 0x46a4ed210Daf81801C80CF47B63dFF0283B8Ae17; constructor( string memory name, string memory symbol, address ownerWallet ) ERC721A(name, symbol) { _ownerWallet = ownerWallet; } //// OVERIDES function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), "")) : unrevealedTokenURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } //// MINT function mint(uint256 numberOfTokens) external payable { require(activated, "Inactive"); require(totalSupply() + numberOfTokens <= maxSupply, "All minted"); require(numberOfTokens <= maxPerTx, "Too many for Tx"); require( _numberMinted(msg.sender) + numberOfTokens <= maxPerWallet, "Too many for address" ); _safeMint(msg.sender, numberOfTokens); } //// SETTERS function setTokenURI(string calldata newURI) external onlyOwner { baseURI = newURI; } function setMaxSupply(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } function setIsActive(bool _isActive) external onlyOwner { activated = _isActive; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"ownerWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526103e86009556014600a556014600b556000600c5560405180602001604052806000815250600e90805190602001906200004092919062000288565b506040518060800160405280605181526020016200320860519139600f90805190602001906200007292919062000288565b507346a4ed210daf81801c80cf47b63dff0283b8ae17601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d557600080fd5b5060405162003259380380620032598339818101604052810190620000fb9190620003cd565b828281600290805190602001906200011592919062000288565b5080600390805190602001906200012e92919062000288565b506200013f620001b160201b60201c565b6000819055505050620001676200015b620001ba60201b60201c565b620001c260201b60201c565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000639565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002969062000530565b90600052602060002090601f016020900481019282620002ba576000855562000306565b82601f10620002d557805160ff191683800117855562000306565b8280016001018555821562000306579182015b8281111562000305578251825591602001919060010190620002e8565b5b50905062000315919062000319565b5090565b5b80821115620003345760008160009055506001016200031a565b5090565b60006200034f620003498462000490565b62000467565b9050828152602081018484840111156200036e576200036d620005ff565b5b6200037b848285620004fa565b509392505050565b60008151905062000394816200061f565b92915050565b600082601f830112620003b257620003b1620005fa565b5b8151620003c484826020860162000338565b91505092915050565b600080600060608486031215620003e957620003e862000609565b5b600084015167ffffffffffffffff8111156200040a576200040962000604565b5b62000418868287016200039a565b935050602084015167ffffffffffffffff8111156200043c576200043b62000604565b5b6200044a868287016200039a565b92505060406200045d8682870162000383565b9150509250925092565b60006200047362000486565b905062000481828262000566565b919050565b6000604051905090565b600067ffffffffffffffff821115620004ae57620004ad620005cb565b5b620004b9826200060e565b9050602081019050919050565b6000620004d382620004da565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200051a578082015181840152602081019050620004fd565b838111156200052a576000848401525b50505050565b600060028204905060018216806200054957607f821691505b6020821081141562000560576200055f6200059c565b5b50919050565b62000571826200060e565b810181811067ffffffffffffffff82111715620005935762000592620005cb565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200062a81620004c6565b81146200063657600080fd5b50565b612bbf80620006496000396000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063b88d4fde1161008a578063e0df5b6f11610064578063e0df5b6f146105ed578063e985e9c514610616578063f2fde38b14610653578063f968adbe1461067c576101b7565b8063b88d4fde1461055c578063c87b56dd14610585578063d5abeb01146105c2576101b7565b806395d89b41116100c657806395d89b41146104c1578063a0712d68146104ec578063a22cb46514610508578063b2873d5c14610531576101b7565b806370a0823114610442578063715018a61461047f5780638da5cb5b14610496576101b7565b806323b872dd11610159578063453c231011610133578063453c2310146103865780636352211e146103b15780636c0360eb146103ee5780636f8b44b014610419576101b7565b806323b872dd1461030b5780632750fc781461033457806342842e0e1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a578063186601ca146102b5578063235b6ea1146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906121dd565b6106a7565b6040516101f091906125ae565b60405180910390f35b34801561020557600080fd5b5061020e610739565b60405161021b91906125c9565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612284565b6107cb565b6040516102589190612547565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612170565b610847565b005b34801561029657600080fd5b5061029f6109ee565b6040516102ac91906126cb565b60405180910390f35b3480156102c157600080fd5b506102ca610a05565b6040516102d791906125ae565b60405180910390f35b3480156102ec57600080fd5b506102f5610a18565b60405161030291906126cb565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061205a565b610a1e565b005b34801561034057600080fd5b5061035b600480360381019061035691906121b0565b610a2e565b005b34801561036957600080fd5b50610384600480360381019061037f919061205a565b610a53565b005b34801561039257600080fd5b5061039b610a73565b6040516103a891906126cb565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190612284565b610a79565b6040516103e59190612547565b60405180910390f35b3480156103fa57600080fd5b50610403610a8b565b60405161041091906125c9565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b9190612284565b610b19565b005b34801561044e57600080fd5b5061046960048036038101906104649190611fed565b610b2b565b60405161047691906126cb565b60405180910390f35b34801561048b57600080fd5b50610494610be4565b005b3480156104a257600080fd5b506104ab610bf8565b6040516104b89190612547565b60405180910390f35b3480156104cd57600080fd5b506104d6610c22565b6040516104e391906125c9565b60405180910390f35b61050660048036038101906105019190612284565b610cb4565b005b34801561051457600080fd5b5061052f600480360381019061052a9190612130565b610e04565b005b34801561053d57600080fd5b50610546610f7c565b60405161055391906125c9565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906120ad565b61100a565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612284565b61107d565b6040516105b991906125c9565b60405180910390f35b3480156105ce57600080fd5b506105d76111a1565b6040516105e491906126cb565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612237565b6111a7565b005b34801561062257600080fd5b5061063d6004803603810190610638919061201a565b6111c5565b60405161064a91906125ae565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190611fed565b611259565b005b34801561068857600080fd5b506106916112dd565b60405161069e91906126cb565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610748906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128a0565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d6826112e3565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085282611342565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ba576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d9611410565b73ffffffffffffffffffffffffffffffffffffffff161461093c5761090581610900611410565b6111c5565b61093b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109f8611418565b6001546000540303905090565b600d60009054906101000a900460ff1681565b600c5481565b610a29838383611421565b505050565b610a366117cb565b80600d60006101000a81548160ff02191690831515021790555050565b610a6e8383836040518060200160405280600081525061100a565b505050565b600a5481565b6000610a8482611342565b9050919050565b600f8054610a98906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac4906128a0565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b505050505081565b610b216117cb565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b93576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610bec6117cb565b610bf66000611849565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c31906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d906128a0565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa9061262b565b60405180910390fd5b60095481610d0f6109ee565b610d199190612794565b1115610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d51906125eb565b60405180910390fd5b600b54811115610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061268b565b60405180910390fd5b600a5481610dac3361190f565b610db69190612794565b1115610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee906126ab565b60405180910390fd5b610e013382611966565b50565b610e0c611410565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e7e611410565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f2b611410565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f7091906125ae565b60405180910390a35050565b600e8054610f89906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906128a0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b611015848484611421565b60008373ffffffffffffffffffffffffffffffffffffffff163b146110775761104084848484611984565b611076576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611088826112e3565b6110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be9061266b565b60405180910390fd5b6000600f80546110d6906128a0565b9050141561116e57600e80546110eb906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611117906128a0565b80156111645780601f1061113957610100808354040283529160200191611164565b820191906000526020600020905b81548152906001019060200180831161114757829003601f168201915b505050505061119a565b600f61117983611ae4565b60405160200161118a929190612518565b6040516020818303038152906040525b9050919050565b60095481565b6111af6117cb565b8181600f91906111c0929190611e1b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112616117cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c89061260b565b60405180910390fd5b6112da81611849565b50565b600b5481565b6000816112ee611418565b111580156112fd575060005482105b801561133b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611351611418565b116113d9576000548110156113d85760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156113d6575b60008114156113cc5760046000836001900393508381526020019081526020016000205490506113a1565b809250505061140b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600061142c82611342565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611493576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114b4611410565b73ffffffffffffffffffffffffffffffffffffffff1614806114e357506114e2856114dd611410565b6111c5565b5b8061152857506114f1611410565b73ffffffffffffffffffffffffffffffffffffffff16611510846107cb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611561576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156115c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115d58585856001611b3e565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6116d286611b44565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561175c57600060018401905060006004600083815260200190815260200160002054141561175a576000548114611759578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117c48585856001611b4e565b5050505050565b6117d3611b54565b73ffffffffffffffffffffffffffffffffffffffff166117f1610bf8565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e9061264b565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611980828260405180602001604052806000815250611b5c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026119aa611410565b8786866040518563ffffffff1660e01b81526004016119cc9493929190612562565b602060405180830381600087803b1580156119e657600080fd5b505af1925050508015611a1757506040513d601f19601f82011682018060405250810190611a14919061220a565b60015b611a91573d8060008114611a47576040519150601f19603f3d011682016040523d82523d6000602084013e611a4c565b606091505b50600081511415611a89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611b2a57600183039250600a81066030018353600a81049050611b0a565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611c04576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c116000858386611b3e565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611c7660018514611e11565b901b60a042901b611c8686611b44565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611d8a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d3a6000878480600101955087611984565b611d70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611ccb578260005414611d8557600080fd5b611df5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611d8b575b816000819055505050611e0b6000858386611b4e565b50505050565b6000819050919050565b828054611e27906128a0565b90600052602060002090601f016020900481019282611e495760008555611e90565b82601f10611e6257803560ff1916838001178555611e90565b82800160010185558215611e90579182015b82811115611e8f578235825591602001919060010190611e74565b5b509050611e9d9190611ea1565b5090565b5b80821115611eba576000816000905550600101611ea2565b5090565b6000611ed1611ecc8461270b565b6126e6565b905082815260208101848484011115611eed57611eec61299f565b5b611ef884828561285e565b509392505050565b600081359050611f0f81612b2d565b92915050565b600081359050611f2481612b44565b92915050565b600081359050611f3981612b5b565b92915050565b600081519050611f4e81612b5b565b92915050565b600082601f830112611f6957611f68612995565b5b8135611f79848260208601611ebe565b91505092915050565b60008083601f840112611f9857611f97612995565b5b8235905067ffffffffffffffff811115611fb557611fb4612990565b5b602083019150836001820283011115611fd157611fd061299a565b5b9250929050565b600081359050611fe781612b72565b92915050565b600060208284031215612003576120026129a9565b5b600061201184828501611f00565b91505092915050565b60008060408385031215612031576120306129a9565b5b600061203f85828601611f00565b925050602061205085828601611f00565b9150509250929050565b600080600060608486031215612073576120726129a9565b5b600061208186828701611f00565b935050602061209286828701611f00565b92505060406120a386828701611fd8565b9150509250925092565b600080600080608085870312156120c7576120c66129a9565b5b60006120d587828801611f00565b94505060206120e687828801611f00565b93505060406120f787828801611fd8565b925050606085013567ffffffffffffffff811115612118576121176129a4565b5b61212487828801611f54565b91505092959194509250565b60008060408385031215612147576121466129a9565b5b600061215585828601611f00565b925050602061216685828601611f15565b9150509250929050565b60008060408385031215612187576121866129a9565b5b600061219585828601611f00565b92505060206121a685828601611fd8565b9150509250929050565b6000602082840312156121c6576121c56129a9565b5b60006121d484828501611f15565b91505092915050565b6000602082840312156121f3576121f26129a9565b5b600061220184828501611f2a565b91505092915050565b6000602082840312156122205761221f6129a9565b5b600061222e84828501611f3f565b91505092915050565b6000806020838503121561224e5761224d6129a9565b5b600083013567ffffffffffffffff81111561226c5761226b6129a4565b5b61227885828601611f82565b92509250509250929050565b60006020828403121561229a576122996129a9565b5b60006122a884828501611fd8565b91505092915050565b6122ba816127ea565b82525050565b6122c9816127fc565b82525050565b60006122da82612751565b6122e48185612767565b93506122f481856020860161286d565b6122fd816129ae565b840191505092915050565b60006123138261275c565b61231d8185612778565b935061232d81856020860161286d565b612336816129ae565b840191505092915050565b600061234c8261275c565b6123568185612789565b935061236681856020860161286d565b80840191505092915050565b6000815461237f816128a0565b6123898186612789565b945060018216600081146123a457600181146123b5576123e8565b60ff198316865281860193506123e8565b6123be8561273c565b60005b838110156123e0578154818901526001820191506020810190506123c1565b838801955050505b50505092915050565b60006123fe600a83612778565b9150612409826129bf565b602082019050919050565b6000612421602683612778565b915061242c826129e8565b604082019050919050565b6000612444600883612778565b915061244f82612a37565b602082019050919050565b6000612467602083612778565b915061247282612a60565b602082019050919050565b600061248a602f83612778565b915061249582612a89565b604082019050919050565b60006124ad600083612789565b91506124b882612ad8565b600082019050919050565b60006124d0600f83612778565b91506124db82612adb565b602082019050919050565b60006124f3601483612778565b91506124fe82612b04565b602082019050919050565b61251281612854565b82525050565b60006125248285612372565b91506125308284612341565b915061253b826124a0565b91508190509392505050565b600060208201905061255c60008301846122b1565b92915050565b600060808201905061257760008301876122b1565b61258460208301866122b1565b6125916040830185612509565b81810360608301526125a381846122cf565b905095945050505050565b60006020820190506125c360008301846122c0565b92915050565b600060208201905081810360008301526125e38184612308565b905092915050565b60006020820190508181036000830152612604816123f1565b9050919050565b6000602082019050818103600083015261262481612414565b9050919050565b6000602082019050818103600083015261264481612437565b9050919050565b600060208201905081810360008301526126648161245a565b9050919050565b600060208201905081810360008301526126848161247d565b9050919050565b600060208201905081810360008301526126a4816124c3565b9050919050565b600060208201905081810360008301526126c4816124e6565b9050919050565b60006020820190506126e06000830184612509565b92915050565b60006126f0612701565b90506126fc82826128d2565b919050565b6000604051905090565b600067ffffffffffffffff82111561272657612725612961565b5b61272f826129ae565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061279f82612854565b91506127aa83612854565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127df576127de612903565b5b828201905092915050565b60006127f582612834565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561288b578082015181840152602081019050612870565b8381111561289a576000848401525b50505050565b600060028204905060018216806128b857607f821691505b602082108114156128cc576128cb612932565b5b50919050565b6128db826129ae565b810181811067ffffffffffffffff821117156128fa576128f9612961565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b612b36816127ea565b8114612b4157600080fd5b50565b612b4d816127fc565b8114612b5857600080fd5b50565b612b6481612808565b8114612b6f57600080fd5b50565b612b7b81612854565b8114612b8657600080fd5b5056fea26469706673582212207f4147fdf6a7287d036492a497f3ce9ba6a972e502a401a4d65f1105746a273e64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d533766623975635367355038716a31336550386156506475555965624371517a544e31454d5365564e4538352f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000046a4ed210daf81801c80cf47b63dff0283b8ae1700000000000000000000000000000000000000000000000000000000000000115341564147454b495454454e532e57544600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065341564147450000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806370a08231116100ec578063b88d4fde1161008a578063e0df5b6f11610064578063e0df5b6f146105ed578063e985e9c514610616578063f2fde38b14610653578063f968adbe1461067c576101b7565b8063b88d4fde1461055c578063c87b56dd14610585578063d5abeb01146105c2576101b7565b806395d89b41116100c657806395d89b41146104c1578063a0712d68146104ec578063a22cb46514610508578063b2873d5c14610531576101b7565b806370a0823114610442578063715018a61461047f5780638da5cb5b14610496576101b7565b806323b872dd11610159578063453c231011610133578063453c2310146103865780636352211e146103b15780636c0360eb146103ee5780636f8b44b014610419576101b7565b806323b872dd1461030b5780632750fc781461033457806342842e0e1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a578063186601ca146102b5578063235b6ea1146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906121dd565b6106a7565b6040516101f091906125ae565b60405180910390f35b34801561020557600080fd5b5061020e610739565b60405161021b91906125c9565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612284565b6107cb565b6040516102589190612547565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612170565b610847565b005b34801561029657600080fd5b5061029f6109ee565b6040516102ac91906126cb565b60405180910390f35b3480156102c157600080fd5b506102ca610a05565b6040516102d791906125ae565b60405180910390f35b3480156102ec57600080fd5b506102f5610a18565b60405161030291906126cb565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061205a565b610a1e565b005b34801561034057600080fd5b5061035b600480360381019061035691906121b0565b610a2e565b005b34801561036957600080fd5b50610384600480360381019061037f919061205a565b610a53565b005b34801561039257600080fd5b5061039b610a73565b6040516103a891906126cb565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190612284565b610a79565b6040516103e59190612547565b60405180910390f35b3480156103fa57600080fd5b50610403610a8b565b60405161041091906125c9565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b9190612284565b610b19565b005b34801561044e57600080fd5b5061046960048036038101906104649190611fed565b610b2b565b60405161047691906126cb565b60405180910390f35b34801561048b57600080fd5b50610494610be4565b005b3480156104a257600080fd5b506104ab610bf8565b6040516104b89190612547565b60405180910390f35b3480156104cd57600080fd5b506104d6610c22565b6040516104e391906125c9565b60405180910390f35b61050660048036038101906105019190612284565b610cb4565b005b34801561051457600080fd5b5061052f600480360381019061052a9190612130565b610e04565b005b34801561053d57600080fd5b50610546610f7c565b60405161055391906125c9565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906120ad565b61100a565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612284565b61107d565b6040516105b991906125c9565b60405180910390f35b3480156105ce57600080fd5b506105d76111a1565b6040516105e491906126cb565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612237565b6111a7565b005b34801561062257600080fd5b5061063d6004803603810190610638919061201a565b6111c5565b60405161064a91906125ae565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190611fed565b611259565b005b34801561068857600080fd5b506106916112dd565b60405161069e91906126cb565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610748906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128a0565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d6826112e3565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085282611342565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ba576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d9611410565b73ffffffffffffffffffffffffffffffffffffffff161461093c5761090581610900611410565b6111c5565b61093b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109f8611418565b6001546000540303905090565b600d60009054906101000a900460ff1681565b600c5481565b610a29838383611421565b505050565b610a366117cb565b80600d60006101000a81548160ff02191690831515021790555050565b610a6e8383836040518060200160405280600081525061100a565b505050565b600a5481565b6000610a8482611342565b9050919050565b600f8054610a98906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac4906128a0565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b505050505081565b610b216117cb565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b93576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610bec6117cb565b610bf66000611849565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c31906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d906128a0565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa9061262b565b60405180910390fd5b60095481610d0f6109ee565b610d199190612794565b1115610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d51906125eb565b60405180910390fd5b600b54811115610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061268b565b60405180910390fd5b600a5481610dac3361190f565b610db69190612794565b1115610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee906126ab565b60405180910390fd5b610e013382611966565b50565b610e0c611410565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610e7e611410565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f2b611410565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f7091906125ae565b60405180910390a35050565b600e8054610f89906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906128a0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b611015848484611421565b60008373ffffffffffffffffffffffffffffffffffffffff163b146110775761104084848484611984565b611076576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611088826112e3565b6110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be9061266b565b60405180910390fd5b6000600f80546110d6906128a0565b9050141561116e57600e80546110eb906128a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611117906128a0565b80156111645780601f1061113957610100808354040283529160200191611164565b820191906000526020600020905b81548152906001019060200180831161114757829003601f168201915b505050505061119a565b600f61117983611ae4565b60405160200161118a929190612518565b6040516020818303038152906040525b9050919050565b60095481565b6111af6117cb565b8181600f91906111c0929190611e1b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112616117cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c89061260b565b60405180910390fd5b6112da81611849565b50565b600b5481565b6000816112ee611418565b111580156112fd575060005482105b801561133b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611351611418565b116113d9576000548110156113d85760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156113d6575b60008114156113cc5760046000836001900393508381526020019081526020016000205490506113a1565b809250505061140b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600061142c82611342565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611493576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114b4611410565b73ffffffffffffffffffffffffffffffffffffffff1614806114e357506114e2856114dd611410565b6111c5565b5b8061152857506114f1611410565b73ffffffffffffffffffffffffffffffffffffffff16611510846107cb565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611561576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156115c8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115d58585856001611b3e565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6116d286611b44565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561175c57600060018401905060006004600083815260200190815260200160002054141561175a576000548114611759578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117c48585856001611b4e565b5050505050565b6117d3611b54565b73ffffffffffffffffffffffffffffffffffffffff166117f1610bf8565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e9061264b565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611980828260405180602001604052806000815250611b5c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026119aa611410565b8786866040518563ffffffff1660e01b81526004016119cc9493929190612562565b602060405180830381600087803b1580156119e657600080fd5b505af1925050508015611a1757506040513d601f19601f82011682018060405250810190611a14919061220a565b60015b611a91573d8060008114611a47576040519150601f19603f3d011682016040523d82523d6000602084013e611a4c565b606091505b50600081511415611a89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611b2a57600183039250600a81066030018353600a81049050611b0a565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611c04576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c116000858386611b3e565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611c7660018514611e11565b901b60a042901b611c8686611b44565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611d8a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d3a6000878480600101955087611984565b611d70576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611ccb578260005414611d8557600080fd5b611df5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611d8b575b816000819055505050611e0b6000858386611b4e565b50505050565b6000819050919050565b828054611e27906128a0565b90600052602060002090601f016020900481019282611e495760008555611e90565b82601f10611e6257803560ff1916838001178555611e90565b82800160010185558215611e90579182015b82811115611e8f578235825591602001919060010190611e74565b5b509050611e9d9190611ea1565b5090565b5b80821115611eba576000816000905550600101611ea2565b5090565b6000611ed1611ecc8461270b565b6126e6565b905082815260208101848484011115611eed57611eec61299f565b5b611ef884828561285e565b509392505050565b600081359050611f0f81612b2d565b92915050565b600081359050611f2481612b44565b92915050565b600081359050611f3981612b5b565b92915050565b600081519050611f4e81612b5b565b92915050565b600082601f830112611f6957611f68612995565b5b8135611f79848260208601611ebe565b91505092915050565b60008083601f840112611f9857611f97612995565b5b8235905067ffffffffffffffff811115611fb557611fb4612990565b5b602083019150836001820283011115611fd157611fd061299a565b5b9250929050565b600081359050611fe781612b72565b92915050565b600060208284031215612003576120026129a9565b5b600061201184828501611f00565b91505092915050565b60008060408385031215612031576120306129a9565b5b600061203f85828601611f00565b925050602061205085828601611f00565b9150509250929050565b600080600060608486031215612073576120726129a9565b5b600061208186828701611f00565b935050602061209286828701611f00565b92505060406120a386828701611fd8565b9150509250925092565b600080600080608085870312156120c7576120c66129a9565b5b60006120d587828801611f00565b94505060206120e687828801611f00565b93505060406120f787828801611fd8565b925050606085013567ffffffffffffffff811115612118576121176129a4565b5b61212487828801611f54565b91505092959194509250565b60008060408385031215612147576121466129a9565b5b600061215585828601611f00565b925050602061216685828601611f15565b9150509250929050565b60008060408385031215612187576121866129a9565b5b600061219585828601611f00565b92505060206121a685828601611fd8565b9150509250929050565b6000602082840312156121c6576121c56129a9565b5b60006121d484828501611f15565b91505092915050565b6000602082840312156121f3576121f26129a9565b5b600061220184828501611f2a565b91505092915050565b6000602082840312156122205761221f6129a9565b5b600061222e84828501611f3f565b91505092915050565b6000806020838503121561224e5761224d6129a9565b5b600083013567ffffffffffffffff81111561226c5761226b6129a4565b5b61227885828601611f82565b92509250509250929050565b60006020828403121561229a576122996129a9565b5b60006122a884828501611fd8565b91505092915050565b6122ba816127ea565b82525050565b6122c9816127fc565b82525050565b60006122da82612751565b6122e48185612767565b93506122f481856020860161286d565b6122fd816129ae565b840191505092915050565b60006123138261275c565b61231d8185612778565b935061232d81856020860161286d565b612336816129ae565b840191505092915050565b600061234c8261275c565b6123568185612789565b935061236681856020860161286d565b80840191505092915050565b6000815461237f816128a0565b6123898186612789565b945060018216600081146123a457600181146123b5576123e8565b60ff198316865281860193506123e8565b6123be8561273c565b60005b838110156123e0578154818901526001820191506020810190506123c1565b838801955050505b50505092915050565b60006123fe600a83612778565b9150612409826129bf565b602082019050919050565b6000612421602683612778565b915061242c826129e8565b604082019050919050565b6000612444600883612778565b915061244f82612a37565b602082019050919050565b6000612467602083612778565b915061247282612a60565b602082019050919050565b600061248a602f83612778565b915061249582612a89565b604082019050919050565b60006124ad600083612789565b91506124b882612ad8565b600082019050919050565b60006124d0600f83612778565b91506124db82612adb565b602082019050919050565b60006124f3601483612778565b91506124fe82612b04565b602082019050919050565b61251281612854565b82525050565b60006125248285612372565b91506125308284612341565b915061253b826124a0565b91508190509392505050565b600060208201905061255c60008301846122b1565b92915050565b600060808201905061257760008301876122b1565b61258460208301866122b1565b6125916040830185612509565b81810360608301526125a381846122cf565b905095945050505050565b60006020820190506125c360008301846122c0565b92915050565b600060208201905081810360008301526125e38184612308565b905092915050565b60006020820190508181036000830152612604816123f1565b9050919050565b6000602082019050818103600083015261262481612414565b9050919050565b6000602082019050818103600083015261264481612437565b9050919050565b600060208201905081810360008301526126648161245a565b9050919050565b600060208201905081810360008301526126848161247d565b9050919050565b600060208201905081810360008301526126a4816124c3565b9050919050565b600060208201905081810360008301526126c4816124e6565b9050919050565b60006020820190506126e06000830184612509565b92915050565b60006126f0612701565b90506126fc82826128d2565b919050565b6000604051905090565b600067ffffffffffffffff82111561272657612725612961565b5b61272f826129ae565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061279f82612854565b91506127aa83612854565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127df576127de612903565b5b828201905092915050565b60006127f582612834565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561288b578082015181840152602081019050612870565b8381111561289a576000848401525b50505050565b600060028204905060018216806128b857607f821691505b602082108114156128cc576128cb612932565b5b50919050565b6128db826129ae565b810181811067ffffffffffffffff821117156128fa576128f9612961565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b612b36816127ea565b8114612b4157600080fd5b50565b612b4d816127fc565b8114612b5857600080fd5b50565b612b6481612808565b8114612b6f57600080fd5b50565b612b7b81612854565b8114612b8657600080fd5b5056fea26469706673582212207f4147fdf6a7287d036492a497f3ce9ba6a972e502a401a4d65f1105746a273e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000046a4ed210daf81801c80cf47b63dff0283b8ae1700000000000000000000000000000000000000000000000000000000000000115341564147454b495454454e532e57544600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065341564147450000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): SAVAGEKITTENS.WTF
Arg [1] : symbol (string): SAVAGE
Arg [2] : ownerWallet (address): 0x46a4ed210Daf81801C80CF47B63dFF0283B8Ae17
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000046a4ed210daf81801c80cf47b63dff0283b8ae17
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [4] : 5341564147454b495454454e532e575446000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 5341564147450000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
42921:2064:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16670:665;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21926:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24123:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23583:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15724:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43123:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43083:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25132:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44886:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25373:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43009:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21715:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43195:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44776:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17399:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2804:103;;;;;;;;;;;;;:::i;:::-;;2156:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22095:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44209:433;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24440:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43151:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25629:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43651:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42971:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44669:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24851:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3062:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43048:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16670:665;16800:4;17120:10;17105:25;;:11;:25;;;;:102;;;;17197:10;17182:25;;:11;:25;;;;17105:102;:179;;;;17274:10;17259:25;;:11;:25;;;;17105:179;17085:199;;16670:665;;;:::o;21926:100::-;21980:13;22013:5;22006:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21926:100;:::o;24123:245::-;24227:7;24257:16;24265:7;24257;:16::i;:::-;24252:64;;24282:34;;;;;;;;;;;;;;24252:64;24336:15;:24;24352:7;24336:24;;;;;;;;;;;;;;;;;;;;;24329:31;;24123:245;;;:::o;23583:474::-;23656:13;23688:27;23707:7;23688:18;:27::i;:::-;23656:61;;23738:5;23732:11;;:2;:11;;;23728:48;;;23752:24;;;;;;;;;;;;;;23728:48;23816:5;23793:28;;:19;:17;:19::i;:::-;:28;;;23789:175;;23841:44;23858:5;23865:19;:17;:19::i;:::-;23841:16;:44::i;:::-;23836:128;;23913:35;;;;;;;;;;;;;;23836:128;23789:175;24003:2;23976:15;:24;23992:7;23976:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24041:7;24037:2;24021:28;;24030:5;24021:28;;;;;;;;;;;;23645:412;23583:474;;:::o;15724:315::-;15777:7;16005:15;:13;:15::i;:::-;15990:12;;15974:13;;:28;:46;15967:53;;15724:315;:::o;43123:21::-;;;;;;;;;;;;;:::o;43083:31::-;;;;:::o;25132:170::-;25266:28;25276:4;25282:2;25286:7;25266:9;:28::i;:::-;25132:170;;;:::o;44886:96::-;2042:13;:11;:13::i;:::-;44965:9:::1;44953;;:21;;;;;;;;;;;;;;;;;;44886:96:::0;:::o;25373:185::-;25511:39;25528:4;25534:2;25538:7;25511:39;;;;;;;;;;;;:16;:39::i;:::-;25373:185;;;:::o;43009:32::-;;;;:::o;21715:144::-;21779:7;21822:27;21841:7;21822:18;:27::i;:::-;21799:52;;21715:144;;;:::o;43195:107::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44776:102::-;2042:13;:11;:13::i;:::-;44860:10:::1;44848:9;:22;;;;44776:102:::0;:::o;17399:224::-;17463:7;17504:1;17487:19;;:5;:19;;;17483:60;;;17515:28;;;;;;;;;;;;;;17483:60;12694:13;17561:18;:25;17580:5;17561:25;;;;;;;;;;;;;;;;:54;17554:61;;17399:224;;;:::o;2804:103::-;2042:13;:11;:13::i;:::-;2869:30:::1;2896:1;2869:18;:30::i;:::-;2804:103::o:0;2156:87::-;2202:7;2229:6;;;;;;;;;;;2222:13;;2156:87;:::o;22095:104::-;22151:13;22184:7;22177:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22095:104;:::o;44209:433::-;44283:9;;;;;;;;;;;44275:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;44358:9;;44340:14;44324:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;44316:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44419:8;;44401:14;:26;;44393:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;44526:12;;44508:14;44480:25;44494:10;44480:13;:25::i;:::-;:42;;;;:::i;:::-;:58;;44458:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;44597:37;44607:10;44619:14;44597:9;:37::i;:::-;44209:433;:::o;24440:340::-;24583:19;:17;:19::i;:::-;24571:31;;:8;:31;;;24567:61;;;24611:17;;;;;;;;;;;;;;24567:61;24693:8;24641:18;:39;24660:19;:17;:19::i;:::-;24641:39;;;;;;;;;;;;;;;:49;24681:8;24641:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;24753:8;24717:55;;24732:19;:17;:19::i;:::-;24717:55;;;24763:8;24717:55;;;;;;:::i;:::-;;;;;;;;24440:340;;:::o;43151:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25629:396::-;25796:28;25806:4;25812:2;25816:7;25796:9;:28::i;:::-;25857:1;25839:2;:14;;;:19;25835:183;;25878:56;25909:4;25915:2;25919:7;25928:5;25878:30;:56::i;:::-;25873:145;;25962:40;;;;;;;;;;;;;;25873:145;25835:183;25629:396;;;;:::o;43651:425::-;43752:13;43805:16;43813:7;43805;:16::i;:::-;43783:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;43952:1;43933:7;43927:21;;;;;:::i;:::-;;;:26;;:141;;44050:18;43927:141;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43997:7;44006:18;44016:7;44006:9;:18::i;:::-;43980:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43927:141;43907:161;;43651:425;;;:::o;42971:31::-;;;;:::o;44669:99::-;2042:13;:11;:13::i;:::-;44754:6:::1;;44744:7;:16;;;;;;;:::i;:::-;;44669:99:::0;;:::o;24851:214::-;24993:4;25022:18;:25;25041:5;25022:25;;;;;;;;;;;;;;;:35;25048:8;25022:35;;;;;;;;;;;;;;;;;;;;;;;;;25015:42;;24851:214;;;;:::o;3062:201::-;2042:13;:11;:13::i;:::-;3171:1:::1;3151:22;;:8;:22;;;;3143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3227:28;3246:8;3227:18;:28::i;:::-;3062:201:::0;:::o;43048:28::-;;;;:::o;26280:273::-;26337:4;26393:7;26374:15;:13;:15::i;:::-;:26;;:66;;;;;26427:13;;26417:7;:23;26374:66;:152;;;;;26525:1;13464:8;26478:17;:26;26496:7;26478:26;;;;;;;;;;;;:43;:48;26374:152;26354:172;;26280:273;;;:::o;19102:1161::-;19196:7;19221:12;19236:7;19221:22;;19304:4;19285:15;:13;:15::i;:::-;:23;19281:915;;19338:13;;19331:4;:20;19327:869;;;19376:14;19393:17;:23;19411:4;19393:23;;;;;;;;;;;;19376:40;;19509:1;13464:8;19482:6;:23;:28;19478:699;;;20001:113;20018:1;20008:6;:11;20001:113;;;20061:17;:25;20079:6;;;;;;;20061:25;;;;;;;;;;;;20052:34;;20001:113;;;20147:6;20140:13;;;;;;19478:699;19353:843;19327:869;19281:915;20224:31;;;;;;;;;;;;;;19102:1161;;;;:::o;40648:105::-;40708:7;40735:10;40728:17;;40648:105;:::o;44084:101::-;44149:7;44176:1;44169:8;;44084:101;:::o;31778:2528::-;31893:27;31923;31942:7;31923:18;:27::i;:::-;31893:57;;32008:4;31967:45;;31983:19;31967:45;;;31963:99;;32034:28;;;;;;;;;;;;;;31963:99;32075:22;32124:4;32101:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32145:43;32162:4;32168:19;:17;:19::i;:::-;32145:16;:43::i;:::-;32101:87;:147;;;;32229:19;:17;:19::i;:::-;32205:43;;:20;32217:7;32205:11;:20::i;:::-;:43;;;32101:147;32075:174;;32267:17;32262:66;;32293:35;;;;;;;;;;;;;;32262:66;32357:1;32343:16;;:2;:16;;;32339:52;;;32368:23;;;;;;;;;;;;;;32339:52;32404:43;32426:4;32432:2;32436:7;32445:1;32404:21;:43::i;:::-;32520:15;:24;32536:7;32520:24;;;;;;;;;;;;32513:31;;;;;;;;;;;32912:18;:24;32931:4;32912:24;;;;;;;;;;;;;;;;32910:26;;;;;;;;;;;;32981:18;:22;33000:2;32981:22;;;;;;;;;;;;;;;;32979:24;;;;;;;;;;;13742:8;13348:3;33362:15;:41;;33320:21;33338:2;33320:17;:21::i;:::-;:84;:128;33274:17;:26;33292:7;33274:26;;;;;;;;;;;:174;;;;33618:1;13742:8;33568:19;:46;:51;33564:626;;;33640:19;33672:1;33662:7;:11;33640:33;;33829:1;33795:17;:30;33813:11;33795:30;;;;;;;;;;;;:35;33791:384;;;33933:13;;33918:11;:28;33914:242;;34113:19;34080:17;:30;34098:11;34080:30;;;;;;;;;;;:52;;;;33914:242;33791:384;33621:569;33564:626;34237:7;34233:2;34218:27;;34227:4;34218:27;;;;;;;;;;;;34256:42;34277:4;34283:2;34287:7;34296:1;34256:20;:42::i;:::-;31882:2424;;31778:2528;;;:::o;2321:132::-;2396:12;:10;:12::i;:::-;2385:23;;:7;:5;:7::i;:::-;:23;;;2377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2321:132::o;3423:191::-;3497:16;3516:6;;;;;;;;;;;3497:25;;3542:8;3533:6;;:17;;;;;;;;;;;;;;;;;;3597:8;3566:40;;3587:8;3566:40;;;;;;;;;;;;3486:128;3423:191;:::o;17705:202::-;17766:7;12694:13;12831:2;17807:18;:25;17826:5;17807:25;;;;;;;;;;;;;;;;:49;;17806:93;17786:113;;17705:202;;;:::o;26637:104::-;26706:27;26716:2;26720:8;26706:27;;;;;;;;;;;;:9;:27::i;:::-;26637:104;;:::o;38002:831::-;38165:4;38224:2;38199:45;;;38263:19;:17;:19::i;:::-;38301:4;38324:7;38350:5;38199:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38182:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38601:1;38584:6;:13;:18;38580:235;;;38630:40;;;;;;;;;;;;;;38580:235;38773:6;38767:13;38758:6;38754:2;38750:15;38743:38;38182:644;38470:54;;;38443:81;;;:6;:81;;;;38419:105;;;38002:831;;;;;;:::o;40859:1992::-;40943:17;41367:3;41360:4;41354:11;41350:21;41343:28;;41458:3;41452:4;41445:17;41564:3;42020:5;42150:1;42145:3;42141:11;42134:18;;42287:2;42281:4;42277:13;42273:2;42269:22;42264:3;42256:36;42328:2;42322:4;42318:13;42310:21;;41912:697;42347:4;41912:697;;;42538:1;42533:3;42529:11;42522:18;;42589:2;42583:4;42579:13;42575:2;42571:22;42566:3;42558:36;42442:2;42436:4;42432:13;42424:21;;41912:697;;;41916:430;42648:3;42643;42639:13;42763:2;42758:3;42754:12;42747:19;;42826:6;42821:3;42814:19;40987:1857;;40859:1992;;;:::o;39481:159::-;;;;;:::o;23112:180::-;23203:14;23269:5;23259:15;;23112:180;;;:::o;40299:158::-;;;;;:::o;707:98::-;760:7;787:10;780:17;;707:98;:::o;27114:2461::-;27237:20;27260:13;;27237:36;;27302:1;27288:16;;:2;:16;;;27284:48;;;27313:19;;;;;;;;;;;;;;27284:48;27359:1;27347:8;:13;27343:44;;;27369:18;;;;;;;;;;;;;;27343:44;27400:61;27430:1;27434:2;27438:12;27452:8;27400:21;:61::i;:::-;28038:1;12831:2;28009:1;:25;;28008:31;27979:8;:61;27936:18;:22;27955:2;27936:22;;;;;;;;;;;;;;;;:104;;;;;;;;;;;13607:3;28439:29;28466:1;28454:8;:13;28439:14;:29::i;:::-;:56;;13348:3;28376:15;:41;;28334:21;28352:2;28334:17;:21::i;:::-;:84;:162;28283:17;:31;28301:12;28283:31;;;;;;;;;;;:213;;;;28513:20;28536:12;28513:35;;28563:11;28592:8;28577:12;:23;28563:37;;28639:1;28621:2;:14;;;:19;28617:826;;28661:504;28717:12;28713:2;28692:38;;28709:1;28692:38;;;;;;;;;;;;28784:212;28853:1;28886:2;28919:14;;;;;;28964:5;28784:30;:212::i;:::-;28753:365;;29054:40;;;;;;;;;;;;;;28753:365;29160:3;29145:12;:18;28661:504;;29246:12;29229:13;;:29;29225:43;;29260:8;;;29225:43;28617:826;;;29309:119;29365:14;;;;;;29361:2;29340:40;;29357:1;29340:40;;;;;;;;;;;;29423:3;29408:12;:18;29309:119;;28617:826;29473:12;29457:13;:28;;;;27713:1784;;29507:60;29536:1;29540:2;29544:12;29558:8;29507:20;:60::i;:::-;27226:2349;27114:2461;;;:::o;23379:142::-;23437:14;23498:5;23488:15;;23379:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:118::-;7389:24;7407:5;7389:24;:::i;:::-;7384:3;7377:37;7302:118;;:::o;7426:109::-;7507:21;7522:5;7507:21;:::i;:::-;7502:3;7495:34;7426:109;;:::o;7541:360::-;7627:3;7655:38;7687:5;7655:38;:::i;:::-;7709:70;7772:6;7767:3;7709:70;:::i;:::-;7702:77;;7788:52;7833:6;7828:3;7821:4;7814:5;7810:16;7788:52;:::i;:::-;7865:29;7887:6;7865:29;:::i;:::-;7860:3;7856:39;7849:46;;7631:270;7541:360;;;;:::o;7907:364::-;7995:3;8023:39;8056:5;8023:39;:::i;:::-;8078:71;8142:6;8137:3;8078:71;:::i;:::-;8071:78;;8158:52;8203:6;8198:3;8191:4;8184:5;8180:16;8158:52;:::i;:::-;8235:29;8257:6;8235:29;:::i;:::-;8230:3;8226:39;8219:46;;7999:272;7907:364;;;;:::o;8277:377::-;8383:3;8411:39;8444:5;8411:39;:::i;:::-;8466:89;8548:6;8543:3;8466:89;:::i;:::-;8459:96;;8564:52;8609:6;8604:3;8597:4;8590:5;8586:16;8564:52;:::i;:::-;8641:6;8636:3;8632:16;8625:23;;8387:267;8277:377;;;;:::o;8684:845::-;8787:3;8824:5;8818:12;8853:36;8879:9;8853:36;:::i;:::-;8905:89;8987:6;8982:3;8905:89;:::i;:::-;8898:96;;9025:1;9014:9;9010:17;9041:1;9036:137;;;;9187:1;9182:341;;;;9003:520;;9036:137;9120:4;9116:9;9105;9101:25;9096:3;9089:38;9156:6;9151:3;9147:16;9140:23;;9036:137;;9182:341;9249:38;9281:5;9249:38;:::i;:::-;9309:1;9323:154;9337:6;9334:1;9331:13;9323:154;;;9411:7;9405:14;9401:1;9396:3;9392:11;9385:35;9461:1;9452:7;9448:15;9437:26;;9359:4;9356:1;9352:12;9347:17;;9323:154;;;9506:6;9501:3;9497:16;9490:23;;9189:334;;9003:520;;8791:738;;8684:845;;;;:::o;9535:366::-;9677:3;9698:67;9762:2;9757:3;9698:67;:::i;:::-;9691:74;;9774:93;9863:3;9774:93;:::i;:::-;9892:2;9887:3;9883:12;9876:19;;9535:366;;;:::o;9907:::-;10049:3;10070:67;10134:2;10129:3;10070:67;:::i;:::-;10063:74;;10146:93;10235:3;10146:93;:::i;:::-;10264:2;10259:3;10255:12;10248:19;;9907:366;;;:::o;10279:365::-;10421:3;10442:66;10506:1;10501:3;10442:66;:::i;:::-;10435:73;;10517:93;10606:3;10517:93;:::i;:::-;10635:2;10630:3;10626:12;10619:19;;10279:365;;;:::o;10650:366::-;10792:3;10813:67;10877:2;10872:3;10813:67;:::i;:::-;10806:74;;10889:93;10978:3;10889:93;:::i;:::-;11007:2;11002:3;10998:12;10991:19;;10650:366;;;:::o;11022:::-;11164:3;11185:67;11249:2;11244:3;11185:67;:::i;:::-;11178:74;;11261:93;11350:3;11261:93;:::i;:::-;11379:2;11374:3;11370:12;11363:19;;11022:366;;;:::o;11394:400::-;11554:3;11575:84;11657:1;11652:3;11575:84;:::i;:::-;11568:91;;11668:93;11757:3;11668:93;:::i;:::-;11786:1;11781:3;11777:11;11770:18;;11394:400;;;:::o;11800:366::-;11942:3;11963:67;12027:2;12022:3;11963:67;:::i;:::-;11956:74;;12039:93;12128:3;12039:93;:::i;:::-;12157:2;12152:3;12148:12;12141:19;;11800:366;;;:::o;12172:::-;12314:3;12335:67;12399:2;12394:3;12335:67;:::i;:::-;12328:74;;12411:93;12500:3;12411:93;:::i;:::-;12529:2;12524:3;12520:12;12513:19;;12172:366;;;:::o;12544:118::-;12631:24;12649:5;12631:24;:::i;:::-;12626:3;12619:37;12544:118;;:::o;12668:695::-;12946:3;12968:92;13056:3;13047:6;12968:92;:::i;:::-;12961:99;;13077:95;13168:3;13159:6;13077:95;:::i;:::-;13070:102;;13189:148;13333:3;13189:148;:::i;:::-;13182:155;;13354:3;13347:10;;12668:695;;;;;:::o;13369:222::-;13462:4;13500:2;13489:9;13485:18;13477:26;;13513:71;13581:1;13570:9;13566:17;13557:6;13513:71;:::i;:::-;13369:222;;;;:::o;13597:640::-;13792:4;13830:3;13819:9;13815:19;13807:27;;13844:71;13912:1;13901:9;13897:17;13888:6;13844:71;:::i;:::-;13925:72;13993:2;13982:9;13978:18;13969:6;13925:72;:::i;:::-;14007;14075:2;14064:9;14060:18;14051:6;14007:72;:::i;:::-;14126:9;14120:4;14116:20;14111:2;14100:9;14096:18;14089:48;14154:76;14225:4;14216:6;14154:76;:::i;:::-;14146:84;;13597:640;;;;;;;:::o;14243:210::-;14330:4;14368:2;14357:9;14353:18;14345:26;;14381:65;14443:1;14432:9;14428:17;14419:6;14381:65;:::i;:::-;14243:210;;;;:::o;14459:313::-;14572:4;14610:2;14599:9;14595:18;14587:26;;14659:9;14653:4;14649:20;14645:1;14634:9;14630:17;14623:47;14687:78;14760:4;14751:6;14687:78;:::i;:::-;14679:86;;14459:313;;;;:::o;14778:419::-;14944:4;14982:2;14971:9;14967:18;14959:26;;15031:9;15025:4;15021:20;15017:1;15006:9;15002:17;14995:47;15059:131;15185:4;15059:131;:::i;:::-;15051:139;;14778:419;;;:::o;15203:::-;15369:4;15407:2;15396:9;15392:18;15384:26;;15456:9;15450:4;15446:20;15442:1;15431:9;15427:17;15420:47;15484:131;15610:4;15484:131;:::i;:::-;15476:139;;15203:419;;;:::o;15628:::-;15794:4;15832:2;15821:9;15817:18;15809:26;;15881:9;15875:4;15871:20;15867:1;15856:9;15852:17;15845:47;15909:131;16035:4;15909:131;:::i;:::-;15901:139;;15628:419;;;:::o;16053:::-;16219:4;16257:2;16246:9;16242:18;16234:26;;16306:9;16300:4;16296:20;16292:1;16281:9;16277:17;16270:47;16334:131;16460:4;16334:131;:::i;:::-;16326:139;;16053:419;;;:::o;16478:::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16731:9;16725:4;16721:20;16717:1;16706:9;16702:17;16695:47;16759:131;16885:4;16759:131;:::i;:::-;16751:139;;16478:419;;;:::o;16903:::-;17069:4;17107:2;17096:9;17092:18;17084:26;;17156:9;17150:4;17146:20;17142:1;17131:9;17127:17;17120:47;17184:131;17310:4;17184:131;:::i;:::-;17176:139;;16903:419;;;:::o;17328:::-;17494:4;17532:2;17521:9;17517:18;17509:26;;17581:9;17575:4;17571:20;17567:1;17556:9;17552:17;17545:47;17609:131;17735:4;17609:131;:::i;:::-;17601:139;;17328:419;;;:::o;17753:222::-;17846:4;17884:2;17873:9;17869:18;17861:26;;17897:71;17965:1;17954:9;17950:17;17941:6;17897:71;:::i;:::-;17753:222;;;;:::o;17981:129::-;18015:6;18042:20;;:::i;:::-;18032:30;;18071:33;18099:4;18091:6;18071:33;:::i;:::-;17981:129;;;:::o;18116:75::-;18149:6;18182:2;18176:9;18166:19;;18116:75;:::o;18197:307::-;18258:4;18348:18;18340:6;18337:30;18334:56;;;18370:18;;:::i;:::-;18334:56;18408:29;18430:6;18408:29;:::i;:::-;18400:37;;18492:4;18486;18482:15;18474:23;;18197:307;;;:::o;18510:141::-;18559:4;18582:3;18574:11;;18605:3;18602:1;18595:14;18639:4;18636:1;18626:18;18618:26;;18510:141;;;:::o;18657:98::-;18708:6;18742:5;18736:12;18726:22;;18657:98;;;:::o;18761:99::-;18813:6;18847:5;18841:12;18831:22;;18761:99;;;:::o;18866:168::-;18949:11;18983:6;18978:3;18971:19;19023:4;19018:3;19014:14;18999:29;;18866:168;;;;:::o;19040:169::-;19124:11;19158:6;19153:3;19146:19;19198:4;19193:3;19189:14;19174:29;;19040:169;;;;:::o;19215:148::-;19317:11;19354:3;19339:18;;19215:148;;;;:::o;19369:305::-;19409:3;19428:20;19446:1;19428:20;:::i;:::-;19423:25;;19462:20;19480:1;19462:20;:::i;:::-;19457:25;;19616:1;19548:66;19544:74;19541:1;19538:81;19535:107;;;19622:18;;:::i;:::-;19535:107;19666:1;19663;19659:9;19652:16;;19369:305;;;;:::o;19680:96::-;19717:7;19746:24;19764:5;19746:24;:::i;:::-;19735:35;;19680:96;;;:::o;19782:90::-;19816:7;19859:5;19852:13;19845:21;19834:32;;19782:90;;;:::o;19878:149::-;19914:7;19954:66;19947:5;19943:78;19932:89;;19878:149;;;:::o;20033:126::-;20070:7;20110:42;20103:5;20099:54;20088:65;;20033:126;;;:::o;20165:77::-;20202:7;20231:5;20220:16;;20165:77;;;:::o;20248:154::-;20332:6;20327:3;20322;20309:30;20394:1;20385:6;20380:3;20376:16;20369:27;20248:154;;;:::o;20408:307::-;20476:1;20486:113;20500:6;20497:1;20494:13;20486:113;;;20585:1;20580:3;20576:11;20570:18;20566:1;20561:3;20557:11;20550:39;20522:2;20519:1;20515:10;20510:15;;20486:113;;;20617:6;20614:1;20611:13;20608:101;;;20697:1;20688:6;20683:3;20679:16;20672:27;20608:101;20457:258;20408:307;;;:::o;20721:320::-;20765:6;20802:1;20796:4;20792:12;20782:22;;20849:1;20843:4;20839:12;20870:18;20860:81;;20926:4;20918:6;20914:17;20904:27;;20860:81;20988:2;20980:6;20977:14;20957:18;20954:38;20951:84;;;21007:18;;:::i;:::-;20951:84;20772:269;20721:320;;;:::o;21047:281::-;21130:27;21152:4;21130:27;:::i;:::-;21122:6;21118:40;21260:6;21248:10;21245:22;21224:18;21212:10;21209:34;21206:62;21203:88;;;21271:18;;:::i;:::-;21203:88;21311:10;21307:2;21300:22;21090:238;21047:281;;:::o;21334:180::-;21382:77;21379:1;21372:88;21479:4;21476:1;21469:15;21503:4;21500:1;21493:15;21520:180;21568:77;21565:1;21558:88;21665:4;21662:1;21655:15;21689:4;21686:1;21679:15;21706:180;21754:77;21751:1;21744:88;21851:4;21848:1;21841:15;21875:4;21872:1;21865:15;21892:117;22001:1;21998;21991:12;22015:117;22124:1;22121;22114:12;22138:117;22247:1;22244;22237:12;22261:117;22370:1;22367;22360:12;22384:117;22493:1;22490;22483:12;22507:117;22616:1;22613;22606:12;22630:102;22671:6;22722:2;22718:7;22713:2;22706:5;22702:14;22698:28;22688:38;;22630:102;;;:::o;22738:160::-;22878:12;22874:1;22866:6;22862:14;22855:36;22738:160;:::o;22904:225::-;23044:34;23040:1;23032:6;23028:14;23021:58;23113:8;23108:2;23100:6;23096:15;23089:33;22904:225;:::o;23135:158::-;23275:10;23271:1;23263:6;23259:14;23252:34;23135:158;:::o;23299:182::-;23439:34;23435:1;23427:6;23423:14;23416:58;23299:182;:::o;23487:234::-;23627:34;23623:1;23615:6;23611:14;23604:58;23696:17;23691:2;23683:6;23679:15;23672:42;23487:234;:::o;23727:114::-;;:::o;23847:165::-;23987:17;23983:1;23975:6;23971:14;23964:41;23847:165;:::o;24018:170::-;24158:22;24154:1;24146:6;24142:14;24135:46;24018:170;:::o;24194:122::-;24267:24;24285:5;24267:24;:::i;:::-;24260:5;24257:35;24247:63;;24306:1;24303;24296:12;24247:63;24194:122;:::o;24322:116::-;24392:21;24407:5;24392:21;:::i;:::-;24385:5;24382:32;24372:60;;24428:1;24425;24418:12;24372:60;24322:116;:::o;24444:120::-;24516:23;24533:5;24516:23;:::i;:::-;24509:5;24506:34;24496:62;;24554:1;24551;24544:12;24496:62;24444:120;:::o;24570:122::-;24643:24;24661:5;24643:24;:::i;:::-;24636:5;24633:35;24623:63;;24682:1;24679;24672:12;24623:63;24570:122;:::o
Swarm Source
ipfs://7f4147fdf6a7287d036492a497f3ce9ba6a972e502a401a4d65f1105746a273e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.