Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 19,013 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21103024 | 20 days ago | IN | 0 ETH | 0.00010405 | ||||
Set Approval For... | 21080650 | 24 days ago | IN | 0 ETH | 0.00046896 | ||||
Safe Transfer Fr... | 21029738 | 31 days ago | IN | 0 ETH | 0.00093542 | ||||
Safe Transfer Fr... | 21029738 | 31 days ago | IN | 0 ETH | 0.00134631 | ||||
Set Approval For... | 21027625 | 31 days ago | IN | 0 ETH | 0.00030548 | ||||
Set Approval For... | 20976737 | 38 days ago | IN | 0 ETH | 0.00040517 | ||||
Set Approval For... | 20967295 | 39 days ago | IN | 0 ETH | 0.00073391 | ||||
Set Approval For... | 20819745 | 60 days ago | IN | 0 ETH | 0.00075013 | ||||
Set Approval For... | 20731703 | 72 days ago | IN | 0 ETH | 0.00008014 | ||||
Set Approval For... | 20705388 | 76 days ago | IN | 0 ETH | 0.00002722 | ||||
Set Approval For... | 20658709 | 82 days ago | IN | 0 ETH | 0.00003722 | ||||
Set Approval For... | 20658618 | 82 days ago | IN | 0 ETH | 0.00005074 | ||||
Set Approval For... | 20639764 | 85 days ago | IN | 0 ETH | 0.00007317 | ||||
Set Approval For... | 20595620 | 91 days ago | IN | 0 ETH | 0.00003896 | ||||
Safe Transfer Fr... | 20593773 | 92 days ago | IN | 0 ETH | 0.00013252 | ||||
Set Approval For... | 20587016 | 92 days ago | IN | 0 ETH | 0.00004907 | ||||
Set Approval For... | 20582175 | 93 days ago | IN | 0 ETH | 0.00011158 | ||||
Safe Transfer Fr... | 20578619 | 94 days ago | IN | 0 ETH | 0.00027875 | ||||
Set Approval For... | 20573727 | 94 days ago | IN | 0 ETH | 0.00004481 | ||||
Safe Transfer Fr... | 20566888 | 95 days ago | IN | 0 ETH | 0.00013321 | ||||
Safe Transfer Fr... | 20566883 | 95 days ago | IN | 0 ETH | 0.00021242 | ||||
Safe Transfer Fr... | 20566864 | 95 days ago | IN | 0 ETH | 0.00038016 | ||||
Set Approval For... | 20559238 | 96 days ago | IN | 0 ETH | 0.00002391 | ||||
Set Approval For... | 20548823 | 98 days ago | IN | 0 ETH | 0.00006239 | ||||
Set Approval For... | 20547272 | 98 days ago | IN | 0 ETH | 0.00004043 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ProbablyNothing
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./ERC721A.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; contract ProbablyNothing is ERC721A, Ownable, ReentrancyGuard { string public baseURI; uint256 public maxSupply; bytes32 public merkleRoot; bool alOnly; bool mintOpen; mapping(address => bool) public hasMinted; mapping(address => uint256) public numOfMints; event minted(address minter, uint256 id); event burned(address from, address to, uint256 id); constructor( string memory name, string memory symbol, uint256 _maxSupply ) ERC721A(name, symbol, 100, _maxSupply) { maxSupply = _maxSupply; alOnly = true; mintOpen = false; baseURI = "https://ipfs.io/ipfs/QmcQj3Yi1PtytJJ9iepD3awgVLSNzTZB6YMLBFEdrz559F"; } function mint(uint256 _amount, bytes32[] calldata _merkleProof) external nonReentrant { require(totalSupply() + _amount <= maxSupply, "Exceeds max supply"); require(_amount + numOfMints[_msgSender()] <= 2, "Max two per wallet"); require(mintOpen, "Minting is paused"); numOfMints[_msgSender()] += _amount; if(isAllowListed(_msgSender(), _merkleProof) && !hasMinted[_msgSender()]) { if(numOfMints[_msgSender()] == 2){ hasMinted[_msgSender()] = true; } } else { require(!alOnly, "Only allow listed addresses can mint"); } _safeMint(_msgSender(), _amount); emit minted(_msgSender(), totalSupply()); } function ownerMint(address _recipient, uint256 _amount) external onlyOwner { require(totalSupply() + _amount <= maxSupply, "Exceeds max supply"); _safeMint(_recipient, _amount); emit minted(_recipient, totalSupply()); } function isAllowListed(address _recipient, bytes32[] calldata _merkleProof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(_recipient)); bool isal = MerkleProof.verify(_merkleProof, merkleRoot, leaf); return isal; } function setRoot(bytes32 root) external onlyOwner { merkleRoot = root; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return baseURI; } function burn(uint256 tokenId) external { transferFrom(_msgSender(), address(0), tokenId); emit burned(_msgSender(), address(0), tokenId); } function changeURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function flipMintState() external onlyOwner { mintOpen = !mintOpen; } function flipALState() external onlyOwner { alOnly = !alOnly; } function withdraw() public onlyOwner { (bool success,) = owner().call{value: address(this).balance}(""); require(success, "Transfer fail"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; //import "@openzeppelin/contracts/utils/Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } 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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); //require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"minted","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipALState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numOfMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bytes32","name":"root","type":"bytes32"}],"name":"setRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006008553480156200001a57600080fd5b5060405162004f6e38038062004f6e8339818101604052810190620000409190620003ca565b8282606483600081116200008b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200008290620004d4565b60405180910390fd5b60008211620000d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c890620004b2565b60405180910390fd5b8360019080519060200190620000e992919062000285565b5082600290805190602001906200010292919062000285565b508160a08181525050806080818152505050505050620001376200012b620001b760201b60201c565b620001bf60201b60201c565b6001600a8190555080600c819055506001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060405180608001604052806043815260200162004f2b60439139600b9080519060200190620001ad92919062000285565b505050506200074d565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029390620005a6565b90600052602060002090601f016020900481019282620002b7576000855562000303565b82601f10620002d257805160ff191683800117855562000303565b8280016001018555821562000303579182015b8281111562000302578251825591602001919060010190620002e5565b5b50905062000312919062000316565b5090565b5b808211156200033157600081600090555060010162000317565b5090565b60006200034c62000346846200051f565b620004f6565b9050828152602081018484840111156200036b576200036a62000675565b5b6200037884828562000570565b509392505050565b600082601f83011262000398576200039762000670565b5b8151620003aa84826020860162000335565b91505092915050565b600081519050620003c48162000733565b92915050565b600080600060608486031215620003e657620003e56200067f565b5b600084015167ffffffffffffffff8111156200040757620004066200067a565b5b620004158682870162000380565b935050602084015167ffffffffffffffff8111156200043957620004386200067a565b5b620004478682870162000380565b92505060406200045a86828701620003b3565b9150509250925092565b60006200047360278362000555565b9150620004808262000695565b604082019050919050565b60006200049a602e8362000555565b9150620004a782620006e4565b604082019050919050565b60006020820190508181036000830152620004cd8162000464565b9050919050565b60006020820190508181036000830152620004ef816200048b565b9050919050565b60006200050262000515565b9050620005108282620005dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156200053d576200053c62000641565b5b620005488262000684565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200059057808201518184015260208101905062000573565b83811115620005a0576000848401525b50505050565b60006002820490506001821680620005bf57607f821691505b60208210811415620005d657620005d562000612565b5b50919050565b620005e78262000684565b810181811067ffffffffffffffff8211171562000609576200060862000641565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6200073e8162000566565b81146200074a57600080fd5b50565b60805160a0516147ad6200077e600039600081816123d5015281816123fe01526128c50152600050506147ad6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063677621691161011a578063b88d4fde116100ad578063d7224ba01161007c578063d7224ba0146105c5578063dab5f340146105e3578063e5e01c11146105ff578063e985e9c51461061b578063f2fde38b1461064b57610206565b8063b88d4fde1461053f578063ba41b0c61461055b578063c87b56dd14610577578063d5abeb01146105a757610206565b80638da5cb5b116100e95780638da5cb5b146104b757806395d89b41146104d5578063a22cb465146104f3578063b4cc927d1461050f57610206565b8063677621691461042f5780636c0360eb1461045f57806370a082311461047d578063715018a6146104ad57610206565b806338e21cce1161019d5780634674a23c1161016c5780634674a23c1461039f578063484b973c146103a95780634f6ccce7146103c557806359c74f29146103f55780636352211e146103ff57610206565b806338e21cce1461032d5780633ccfd60b1461035d57806342842e0e1461036757806342966c681461038357610206565b806318160ddd116101d957806318160ddd146102a557806323b872dd146102c35780632eb4a7ab146102df5780632f745c59146102fd57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613263565b610667565b60405161023291906138ba565b60405180910390f35b6102436107b1565b60405161025091906138f0565b60405180910390f35b610273600480360381019061026e9190613306565b610843565b60405161028091906137f3565b60405180910390f35b6102a3600480360381019061029e91906131f6565b6108c8565b005b6102ad6109e1565b6040516102ba9190613c12565b60405180910390f35b6102dd60048036038101906102d89190613080565b6109ea565b005b6102e76109fa565b6040516102f491906138d5565b60405180910390f35b610317600480360381019061031291906131f6565b610a00565b6040516103249190613c12565b60405180910390f35b61034760048036038101906103429190613013565b610bfe565b60405161035491906138ba565b60405180910390f35b610365610c1e565b005b610381600480360381019061037c9190613080565b610d50565b005b61039d60048036038101906103989190613306565b610d70565b005b6103a7610dc9565b005b6103c360048036038101906103be91906131f6565b610e71565b005b6103df60048036038101906103da9190613306565b610f92565b6040516103ec9190613c12565b60405180910390f35b6103fd610fe5565b005b61041960048036038101906104149190613306565b61108d565b60405161042691906137f3565b60405180910390f35b61044960048036038101906104449190613156565b6110a3565b60405161045691906138ba565b60405180910390f35b61046761112d565b60405161047491906138f0565b60405180910390f35b61049760048036038101906104929190613013565b6111bb565b6040516104a49190613c12565b60405180910390f35b6104b56112a4565b005b6104bf61132c565b6040516104cc91906137f3565b60405180910390f35b6104dd611356565b6040516104ea91906138f0565b60405180910390f35b61050d600480360381019061050891906131b6565b6113e8565b005b61052960048036038101906105249190613013565b611569565b6040516105369190613c12565b60405180910390f35b610559600480360381019061055491906130d3565b611581565b005b61057560048036038101906105709190613333565b6115dd565b005b610591600480360381019061058c9190613306565b6119a1565b60405161059e91906138f0565b60405180910390f35b6105af611a35565b6040516105bc9190613c12565b60405180910390f35b6105cd611a3b565b6040516105da9190613c12565b60405180910390f35b6105fd60048036038101906105f89190613236565b611a41565b005b610619600480360381019061061491906132bd565b611ac7565b005b61063560048036038101906106309190613040565b611b5d565b60405161064291906138ba565b60405180910390f35b61066560048036038101906106609190613013565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107aa57506107a982611ce9565b5b9050919050565b6060600180546107c090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546107ec90613f01565b80156108395780601f1061080e57610100808354040283529160200191610839565b820191906000526020600020905b81548152906001019060200180831161081c57829003601f168201915b5050505050905090565b600061084e82611d53565b61088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490613bd2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d38261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613ad2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610963611d60565b73ffffffffffffffffffffffffffffffffffffffff16148061099257506109918161098c611d60565b611b5d565b5b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139d2565b60405180910390fd5b6109dc838383611d68565b505050565b60008054905090565b6109f5838383611e1a565b505050565b600d5481565b6000610a0b836111bb565b8210610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390613912565b60405180910390fd5b6000610a566109e1565b905060008060005b83811015610bbc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba85786841415610b99578195505050505050610bf8565b8380610ba490613f64565b9450505b508080610bb490613f64565b915050610a5e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613b72565b60405180910390fd5b92915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b610c26611d60565b73ffffffffffffffffffffffffffffffffffffffff16610c4461132c565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613a52565b60405180910390fd5b6000610ca461132c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cc7906137de565b60006040518083038185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613932565b60405180910390fd5b50565b610d6b83838360405180602001604052806000815250611581565b505050565b610d83610d7b611d60565b6000836109ea565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87610dac611d60565b600083604051610dbe9392919061380e565b60405180910390a150565b610dd1611d60565b73ffffffffffffffffffffffffffffffffffffffff16610def61132c565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613a52565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e79611d60565b73ffffffffffffffffffffffffffffffffffffffff16610e9761132c565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee490613a52565b60405180910390fd5b600c5481610ef96109e1565b610f039190613d3d565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906139f2565b60405180910390fd5b610f4e8282612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c982610f786109e1565b604051610f86929190613891565b60405180910390a15050565b6000610f9c6109e1565b8210610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613992565b60405180910390fd5b819050919050565b610fed611d60565b73ffffffffffffffffffffffffffffffffffffffff1661100b61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613a52565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600061109882612381565b600001519050919050565b600080846040516020016110b791906137c3565b604051602081830303815290604052805190602001209050600061111f858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612584565b905080925050509392505050565b600b805461113a90613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613f01565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613a12565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112ac611d60565b73ffffffffffffffffffffffffffffffffffffffff166112ca61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613a52565b60405180910390fd5b61132a600061259b565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461136590613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461139190613f01565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b5050505050905090565b6113f0611d60565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590613a72565b60405180910390fd5b806006600061146b611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611518611d60565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155d91906138ba565b60405180910390a35050565b60106020528060005260406000206000915090505481565b61158c848484611e1a565b61159884848484612661565b6115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613b12565b60405180910390fd5b50505050565b6002600a541415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613b92565b60405180910390fd5b6002600a81905550600c54836116376109e1565b6116419190613d3d565b1115611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906139f2565b60405180910390fd5b600260106000611690611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846116d69190613d3d565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90613ab2565b60405180910390fd5b600e60019054906101000a900460ff16611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613af2565b60405180910390fd5b8260106000611773611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117bc9190613d3d565b925050819055506117d56117ce611d60565b83836110a3565b80156118325750600f60006117e8611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118eb57600260106000611845611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118e6576001600f6000611894611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61193c565b600e60009054906101000a900460ff161561193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906139b2565b60405180910390fd5b5b61194d611947611d60565b84612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c9611976611d60565b61197e6109e1565b60405161198c929190613891565b60405180910390a16001600a81905550505050565b6060600b80546119b090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613f01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b50505050509050919050565b600c5481565b60085481565b611a49611d60565b73ffffffffffffffffffffffffffffffffffffffff16611a6761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613a52565b60405180910390fd5b80600d8190555050565b611acf611d60565b73ffffffffffffffffffffffffffffffffffffffff16611aed61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a52565b60405180910390fd5b80600b9080519060200190611b59929190612d82565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf9611d60565b73ffffffffffffffffffffffffffffffffffffffff16611c1761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613a52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613952565b60405180910390fd5b611ce68161259b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e2582612381565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e4c611d60565b73ffffffffffffffffffffffffffffffffffffffff161480611ea85750611e71611d60565b73ffffffffffffffffffffffffffffffffffffffff16611e9084610843565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec45750611ec38260000151611ebe611d60565b611b5d565b5b905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613a92565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613a32565b60405180910390fd5b611f8585858560016127f8565b611f956000848460000151611d68565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120039190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120a79190613cf7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121ad9190613d3d565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122f35761222381611d53565b156122f2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461235b86868660016127fe565b505050505050565b61237d828260405180602001604052806000815250612804565b5050565b612389612e08565b61239282611d53565b6123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890613972565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106124355760017f0000000000000000000000000000000000000000000000000000000000000000846124289190613dc7565b6124329190613d3d565b90505b60008390505b818110612543576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252f5780935050505061257f565b50808061253b90613ed7565b91505061243b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690613bb2565b60405180910390fd5b919050565b6000826125918584612ce3565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612d58565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611d60565b8786866040518563ffffffff1660e01b81526004016126cd9493929190613845565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190613290565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613b12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613b52565b60405180910390fd5b61288381611d53565b156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90613b32565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613bf2565b60405180910390fd5b61293360008583866127f8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612a309190613cf7565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a579190613cf7565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c666000888488612661565b612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90613b12565b60405180910390fd5b8180612cb090613f64565b9250508080612cbe90613f64565b915050612bf5565b5080600081905550612cdb60008785886127fe565b505050505050565b60008082905060005b8451811015612d4d576000858281518110612d0a57612d0961402f565b5b60200260200101519050808311612d2c57612d258382612d6b565b9250612d39565b612d368184612d6b565b92505b508080612d4590613f64565b915050612cec565b508091505092915050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b828054612d8e90613f01565b90600052602060002090601f016020900481019282612db05760008555612df7565b82601f10612dc957805160ff1916838001178555612df7565b82800160010185558215612df7579182015b82811115612df6578251825591602001919060010190612ddb565b5b509050612e049190612e42565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e5b576000816000905550600101612e43565b5090565b6000612e72612e6d84613c52565b613c2d565b905082815260208101848484011115612e8e57612e8d61409c565b5b612e99848285613e95565b509392505050565b6000612eb4612eaf84613c83565b613c2d565b905082815260208101848484011115612ed057612ecf61409c565b5b612edb848285613e95565b509392505050565b600081359050612ef281614704565b92915050565b60008083601f840112612f0e57612f0d614092565b5b8235905067ffffffffffffffff811115612f2b57612f2a61408d565b5b602083019150836020820283011115612f4757612f46614097565b5b9250929050565b600081359050612f5d8161471b565b92915050565b600081359050612f7281614732565b92915050565b600081359050612f8781614749565b92915050565b600081519050612f9c81614749565b92915050565b600082601f830112612fb757612fb6614092565b5b8135612fc7848260208601612e5f565b91505092915050565b600082601f830112612fe557612fe4614092565b5b8135612ff5848260208601612ea1565b91505092915050565b60008135905061300d81614760565b92915050565b600060208284031215613029576130286140a6565b5b600061303784828501612ee3565b91505092915050565b60008060408385031215613057576130566140a6565b5b600061306585828601612ee3565b925050602061307685828601612ee3565b9150509250929050565b600080600060608486031215613099576130986140a6565b5b60006130a786828701612ee3565b93505060206130b886828701612ee3565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec6140a6565b5b60006130fb87828801612ee3565b945050602061310c87828801612ee3565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d6140a1565b5b61314a87828801612fa2565b91505092959194509250565b60008060006040848603121561316f5761316e6140a6565b5b600061317d86828701612ee3565b935050602084013567ffffffffffffffff81111561319e5761319d6140a1565b5b6131aa86828701612ef8565b92509250509250925092565b600080604083850312156131cd576131cc6140a6565b5b60006131db85828601612ee3565b92505060206131ec85828601612f4e565b9150509250929050565b6000806040838503121561320d5761320c6140a6565b5b600061321b85828601612ee3565b925050602061322c85828601612ffe565b9150509250929050565b60006020828403121561324c5761324b6140a6565b5b600061325a84828501612f63565b91505092915050565b600060208284031215613279576132786140a6565b5b600061328784828501612f78565b91505092915050565b6000602082840312156132a6576132a56140a6565b5b60006132b484828501612f8d565b91505092915050565b6000602082840312156132d3576132d26140a6565b5b600082013567ffffffffffffffff8111156132f1576132f06140a1565b5b6132fd84828501612fd0565b91505092915050565b60006020828403121561331c5761331b6140a6565b5b600061332a84828501612ffe565b91505092915050565b60008060006040848603121561334c5761334b6140a6565b5b600061335a86828701612ffe565b935050602084013567ffffffffffffffff81111561337b5761337a6140a1565b5b61338786828701612ef8565b92509250509250925092565b61339c81613dfb565b82525050565b6133b36133ae82613dfb565b613fad565b82525050565b6133c281613e0d565b82525050565b6133d181613e19565b82525050565b60006133e282613cb4565b6133ec8185613cca565b93506133fc818560208601613ea4565b613405816140ab565b840191505092915050565b600061341b82613cbf565b6134258185613ce6565b9350613435818560208601613ea4565b61343e816140ab565b840191505092915050565b6000613456602283613ce6565b9150613461826140c9565b604082019050919050565b6000613479600d83613ce6565b915061348482614118565b602082019050919050565b600061349c602683613ce6565b91506134a782614141565b604082019050919050565b60006134bf602a83613ce6565b91506134ca82614190565b604082019050919050565b60006134e2602383613ce6565b91506134ed826141df565b604082019050919050565b6000613505602483613ce6565b91506135108261422e565b604082019050919050565b6000613528603983613ce6565b91506135338261427d565b604082019050919050565b600061354b601283613ce6565b9150613556826142cc565b602082019050919050565b600061356e602b83613ce6565b9150613579826142f5565b604082019050919050565b6000613591602683613ce6565b915061359c82614344565b604082019050919050565b60006135b4602083613ce6565b91506135bf82614393565b602082019050919050565b60006135d7601a83613ce6565b91506135e2826143bc565b602082019050919050565b60006135fa603283613ce6565b9150613605826143e5565b604082019050919050565b600061361d601283613ce6565b915061362882614434565b602082019050919050565b6000613640602283613ce6565b915061364b8261445d565b604082019050919050565b6000613663600083613cdb565b915061366e826144ac565b600082019050919050565b6000613686601183613ce6565b9150613691826144af565b602082019050919050565b60006136a9603383613ce6565b91506136b4826144d8565b604082019050919050565b60006136cc601d83613ce6565b91506136d782614527565b602082019050919050565b60006136ef602183613ce6565b91506136fa82614550565b604082019050919050565b6000613712602e83613ce6565b915061371d8261459f565b604082019050919050565b6000613735601f83613ce6565b9150613740826145ee565b602082019050919050565b6000613758602f83613ce6565b915061376382614617565b604082019050919050565b600061377b602d83613ce6565b915061378682614666565b604082019050919050565b600061379e602283613ce6565b91506137a9826146b5565b604082019050919050565b6137bd81613e8b565b82525050565b60006137cf82846133a2565b60148201915081905092915050565b60006137e982613656565b9150819050919050565b60006020820190506138086000830184613393565b92915050565b60006060820190506138236000830186613393565b6138306020830185613393565b61383d60408301846137b4565b949350505050565b600060808201905061385a6000830187613393565b6138676020830186613393565b61387460408301856137b4565b818103606083015261388681846133d7565b905095945050505050565b60006040820190506138a66000830185613393565b6138b360208301846137b4565b9392505050565b60006020820190506138cf60008301846133b9565b92915050565b60006020820190506138ea60008301846133c8565b92915050565b6000602082019050818103600083015261390a8184613410565b905092915050565b6000602082019050818103600083015261392b81613449565b9050919050565b6000602082019050818103600083015261394b8161346c565b9050919050565b6000602082019050818103600083015261396b8161348f565b9050919050565b6000602082019050818103600083015261398b816134b2565b9050919050565b600060208201905081810360008301526139ab816134d5565b9050919050565b600060208201905081810360008301526139cb816134f8565b9050919050565b600060208201905081810360008301526139eb8161351b565b9050919050565b60006020820190508181036000830152613a0b8161353e565b9050919050565b60006020820190508181036000830152613a2b81613561565b9050919050565b60006020820190508181036000830152613a4b81613584565b9050919050565b60006020820190508181036000830152613a6b816135a7565b9050919050565b60006020820190508181036000830152613a8b816135ca565b9050919050565b60006020820190508181036000830152613aab816135ed565b9050919050565b60006020820190508181036000830152613acb81613610565b9050919050565b60006020820190508181036000830152613aeb81613633565b9050919050565b60006020820190508181036000830152613b0b81613679565b9050919050565b60006020820190508181036000830152613b2b8161369c565b9050919050565b60006020820190508181036000830152613b4b816136bf565b9050919050565b60006020820190508181036000830152613b6b816136e2565b9050919050565b60006020820190508181036000830152613b8b81613705565b9050919050565b60006020820190508181036000830152613bab81613728565b9050919050565b60006020820190508181036000830152613bcb8161374b565b9050919050565b60006020820190508181036000830152613beb8161376e565b9050919050565b60006020820190508181036000830152613c0b81613791565b9050919050565b6000602082019050613c2760008301846137b4565b92915050565b6000613c37613c48565b9050613c438282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6d57613c6c61405e565b5b613c76826140ab565b9050602081019050919050565b600067ffffffffffffffff821115613c9e57613c9d61405e565b5b613ca7826140ab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613d0282613e4f565b9150613d0d83613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613d3257613d31613fd1565b5b828201905092915050565b6000613d4882613e8b565b9150613d5383613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613fd1565b5b828201905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fd1565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fd1565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fd1565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c614000565b5b50919050565b613f3c826140ab565b810181811067ffffffffffffffff82111715613f5b57613f5a61405e565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fd1565b5b600182019050919050565b6000613fb882613fbf565b9050919050565b6000613fca826140bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f77206c6973746564206164647265737365732063616e2060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d61782074776f207065722077616c6c65740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61470d81613dfb565b811461471857600080fd5b50565b61472481613e0d565b811461472f57600080fd5b50565b61473b81613e19565b811461474657600080fd5b50565b61475281613e23565b811461475d57600080fd5b50565b61476981613e8b565b811461477457600080fd5b5056fea26469706673582212201e5780d0f6e92d715930318d69025e1c4d2e3173cc148e25432fe7979d695d2864736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d63516a33596931507479744a4a396965704433617767564c534e7a545a4236594d4c42464564727a35353946000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001dfc000000000000000000000000000000000000000000000000000000000000001050726f6261626c79204e6f7468696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002504e000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063677621691161011a578063b88d4fde116100ad578063d7224ba01161007c578063d7224ba0146105c5578063dab5f340146105e3578063e5e01c11146105ff578063e985e9c51461061b578063f2fde38b1461064b57610206565b8063b88d4fde1461053f578063ba41b0c61461055b578063c87b56dd14610577578063d5abeb01146105a757610206565b80638da5cb5b116100e95780638da5cb5b146104b757806395d89b41146104d5578063a22cb465146104f3578063b4cc927d1461050f57610206565b8063677621691461042f5780636c0360eb1461045f57806370a082311461047d578063715018a6146104ad57610206565b806338e21cce1161019d5780634674a23c1161016c5780634674a23c1461039f578063484b973c146103a95780634f6ccce7146103c557806359c74f29146103f55780636352211e146103ff57610206565b806338e21cce1461032d5780633ccfd60b1461035d57806342842e0e1461036757806342966c681461038357610206565b806318160ddd116101d957806318160ddd146102a557806323b872dd146102c35780632eb4a7ab146102df5780632f745c59146102fd57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613263565b610667565b60405161023291906138ba565b60405180910390f35b6102436107b1565b60405161025091906138f0565b60405180910390f35b610273600480360381019061026e9190613306565b610843565b60405161028091906137f3565b60405180910390f35b6102a3600480360381019061029e91906131f6565b6108c8565b005b6102ad6109e1565b6040516102ba9190613c12565b60405180910390f35b6102dd60048036038101906102d89190613080565b6109ea565b005b6102e76109fa565b6040516102f491906138d5565b60405180910390f35b610317600480360381019061031291906131f6565b610a00565b6040516103249190613c12565b60405180910390f35b61034760048036038101906103429190613013565b610bfe565b60405161035491906138ba565b60405180910390f35b610365610c1e565b005b610381600480360381019061037c9190613080565b610d50565b005b61039d60048036038101906103989190613306565b610d70565b005b6103a7610dc9565b005b6103c360048036038101906103be91906131f6565b610e71565b005b6103df60048036038101906103da9190613306565b610f92565b6040516103ec9190613c12565b60405180910390f35b6103fd610fe5565b005b61041960048036038101906104149190613306565b61108d565b60405161042691906137f3565b60405180910390f35b61044960048036038101906104449190613156565b6110a3565b60405161045691906138ba565b60405180910390f35b61046761112d565b60405161047491906138f0565b60405180910390f35b61049760048036038101906104929190613013565b6111bb565b6040516104a49190613c12565b60405180910390f35b6104b56112a4565b005b6104bf61132c565b6040516104cc91906137f3565b60405180910390f35b6104dd611356565b6040516104ea91906138f0565b60405180910390f35b61050d600480360381019061050891906131b6565b6113e8565b005b61052960048036038101906105249190613013565b611569565b6040516105369190613c12565b60405180910390f35b610559600480360381019061055491906130d3565b611581565b005b61057560048036038101906105709190613333565b6115dd565b005b610591600480360381019061058c9190613306565b6119a1565b60405161059e91906138f0565b60405180910390f35b6105af611a35565b6040516105bc9190613c12565b60405180910390f35b6105cd611a3b565b6040516105da9190613c12565b60405180910390f35b6105fd60048036038101906105f89190613236565b611a41565b005b610619600480360381019061061491906132bd565b611ac7565b005b61063560048036038101906106309190613040565b611b5d565b60405161064291906138ba565b60405180910390f35b61066560048036038101906106609190613013565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107aa57506107a982611ce9565b5b9050919050565b6060600180546107c090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546107ec90613f01565b80156108395780601f1061080e57610100808354040283529160200191610839565b820191906000526020600020905b81548152906001019060200180831161081c57829003601f168201915b5050505050905090565b600061084e82611d53565b61088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490613bd2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d38261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613ad2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610963611d60565b73ffffffffffffffffffffffffffffffffffffffff16148061099257506109918161098c611d60565b611b5d565b5b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139d2565b60405180910390fd5b6109dc838383611d68565b505050565b60008054905090565b6109f5838383611e1a565b505050565b600d5481565b6000610a0b836111bb565b8210610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390613912565b60405180910390fd5b6000610a566109e1565b905060008060005b83811015610bbc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba85786841415610b99578195505050505050610bf8565b8380610ba490613f64565b9450505b508080610bb490613f64565b915050610a5e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613b72565b60405180910390fd5b92915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b610c26611d60565b73ffffffffffffffffffffffffffffffffffffffff16610c4461132c565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613a52565b60405180910390fd5b6000610ca461132c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cc7906137de565b60006040518083038185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613932565b60405180910390fd5b50565b610d6b83838360405180602001604052806000815250611581565b505050565b610d83610d7b611d60565b6000836109ea565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87610dac611d60565b600083604051610dbe9392919061380e565b60405180910390a150565b610dd1611d60565b73ffffffffffffffffffffffffffffffffffffffff16610def61132c565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613a52565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e79611d60565b73ffffffffffffffffffffffffffffffffffffffff16610e9761132c565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee490613a52565b60405180910390fd5b600c5481610ef96109e1565b610f039190613d3d565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906139f2565b60405180910390fd5b610f4e8282612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c982610f786109e1565b604051610f86929190613891565b60405180910390a15050565b6000610f9c6109e1565b8210610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613992565b60405180910390fd5b819050919050565b610fed611d60565b73ffffffffffffffffffffffffffffffffffffffff1661100b61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613a52565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600061109882612381565b600001519050919050565b600080846040516020016110b791906137c3565b604051602081830303815290604052805190602001209050600061111f858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612584565b905080925050509392505050565b600b805461113a90613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613f01565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613a12565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112ac611d60565b73ffffffffffffffffffffffffffffffffffffffff166112ca61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613a52565b60405180910390fd5b61132a600061259b565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461136590613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461139190613f01565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b5050505050905090565b6113f0611d60565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590613a72565b60405180910390fd5b806006600061146b611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611518611d60565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155d91906138ba565b60405180910390a35050565b60106020528060005260406000206000915090505481565b61158c848484611e1a565b61159884848484612661565b6115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613b12565b60405180910390fd5b50505050565b6002600a541415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613b92565b60405180910390fd5b6002600a81905550600c54836116376109e1565b6116419190613d3d565b1115611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906139f2565b60405180910390fd5b600260106000611690611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846116d69190613d3d565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90613ab2565b60405180910390fd5b600e60019054906101000a900460ff16611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613af2565b60405180910390fd5b8260106000611773611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117bc9190613d3d565b925050819055506117d56117ce611d60565b83836110a3565b80156118325750600f60006117e8611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118eb57600260106000611845611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118e6576001600f6000611894611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61193c565b600e60009054906101000a900460ff161561193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906139b2565b60405180910390fd5b5b61194d611947611d60565b84612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c9611976611d60565b61197e6109e1565b60405161198c929190613891565b60405180910390a16001600a81905550505050565b6060600b80546119b090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613f01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b50505050509050919050565b600c5481565b60085481565b611a49611d60565b73ffffffffffffffffffffffffffffffffffffffff16611a6761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613a52565b60405180910390fd5b80600d8190555050565b611acf611d60565b73ffffffffffffffffffffffffffffffffffffffff16611aed61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a52565b60405180910390fd5b80600b9080519060200190611b59929190612d82565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf9611d60565b73ffffffffffffffffffffffffffffffffffffffff16611c1761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613a52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613952565b60405180910390fd5b611ce68161259b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e2582612381565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e4c611d60565b73ffffffffffffffffffffffffffffffffffffffff161480611ea85750611e71611d60565b73ffffffffffffffffffffffffffffffffffffffff16611e9084610843565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec45750611ec38260000151611ebe611d60565b611b5d565b5b905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613a92565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613a32565b60405180910390fd5b611f8585858560016127f8565b611f956000848460000151611d68565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120039190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120a79190613cf7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121ad9190613d3d565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122f35761222381611d53565b156122f2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461235b86868660016127fe565b505050505050565b61237d828260405180602001604052806000815250612804565b5050565b612389612e08565b61239282611d53565b6123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890613972565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106124355760017f0000000000000000000000000000000000000000000000000000000000000064846124289190613dc7565b6124329190613d3d565b90505b60008390505b818110612543576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252f5780935050505061257f565b50808061253b90613ed7565b91505061243b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690613bb2565b60405180910390fd5b919050565b6000826125918584612ce3565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612d58565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611d60565b8786866040518563ffffffff1660e01b81526004016126cd9493929190613845565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190613290565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613b12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613b52565b60405180910390fd5b61288381611d53565b156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90613b32565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613bf2565b60405180910390fd5b61293360008583866127f8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612a309190613cf7565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a579190613cf7565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c666000888488612661565b612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90613b12565b60405180910390fd5b8180612cb090613f64565b9250508080612cbe90613f64565b915050612bf5565b5080600081905550612cdb60008785886127fe565b505050505050565b60008082905060005b8451811015612d4d576000858281518110612d0a57612d0961402f565b5b60200260200101519050808311612d2c57612d258382612d6b565b9250612d39565b612d368184612d6b565b92505b508080612d4590613f64565b915050612cec565b508091505092915050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b828054612d8e90613f01565b90600052602060002090601f016020900481019282612db05760008555612df7565b82601f10612dc957805160ff1916838001178555612df7565b82800160010185558215612df7579182015b82811115612df6578251825591602001919060010190612ddb565b5b509050612e049190612e42565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e5b576000816000905550600101612e43565b5090565b6000612e72612e6d84613c52565b613c2d565b905082815260208101848484011115612e8e57612e8d61409c565b5b612e99848285613e95565b509392505050565b6000612eb4612eaf84613c83565b613c2d565b905082815260208101848484011115612ed057612ecf61409c565b5b612edb848285613e95565b509392505050565b600081359050612ef281614704565b92915050565b60008083601f840112612f0e57612f0d614092565b5b8235905067ffffffffffffffff811115612f2b57612f2a61408d565b5b602083019150836020820283011115612f4757612f46614097565b5b9250929050565b600081359050612f5d8161471b565b92915050565b600081359050612f7281614732565b92915050565b600081359050612f8781614749565b92915050565b600081519050612f9c81614749565b92915050565b600082601f830112612fb757612fb6614092565b5b8135612fc7848260208601612e5f565b91505092915050565b600082601f830112612fe557612fe4614092565b5b8135612ff5848260208601612ea1565b91505092915050565b60008135905061300d81614760565b92915050565b600060208284031215613029576130286140a6565b5b600061303784828501612ee3565b91505092915050565b60008060408385031215613057576130566140a6565b5b600061306585828601612ee3565b925050602061307685828601612ee3565b9150509250929050565b600080600060608486031215613099576130986140a6565b5b60006130a786828701612ee3565b93505060206130b886828701612ee3565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec6140a6565b5b60006130fb87828801612ee3565b945050602061310c87828801612ee3565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d6140a1565b5b61314a87828801612fa2565b91505092959194509250565b60008060006040848603121561316f5761316e6140a6565b5b600061317d86828701612ee3565b935050602084013567ffffffffffffffff81111561319e5761319d6140a1565b5b6131aa86828701612ef8565b92509250509250925092565b600080604083850312156131cd576131cc6140a6565b5b60006131db85828601612ee3565b92505060206131ec85828601612f4e565b9150509250929050565b6000806040838503121561320d5761320c6140a6565b5b600061321b85828601612ee3565b925050602061322c85828601612ffe565b9150509250929050565b60006020828403121561324c5761324b6140a6565b5b600061325a84828501612f63565b91505092915050565b600060208284031215613279576132786140a6565b5b600061328784828501612f78565b91505092915050565b6000602082840312156132a6576132a56140a6565b5b60006132b484828501612f8d565b91505092915050565b6000602082840312156132d3576132d26140a6565b5b600082013567ffffffffffffffff8111156132f1576132f06140a1565b5b6132fd84828501612fd0565b91505092915050565b60006020828403121561331c5761331b6140a6565b5b600061332a84828501612ffe565b91505092915050565b60008060006040848603121561334c5761334b6140a6565b5b600061335a86828701612ffe565b935050602084013567ffffffffffffffff81111561337b5761337a6140a1565b5b61338786828701612ef8565b92509250509250925092565b61339c81613dfb565b82525050565b6133b36133ae82613dfb565b613fad565b82525050565b6133c281613e0d565b82525050565b6133d181613e19565b82525050565b60006133e282613cb4565b6133ec8185613cca565b93506133fc818560208601613ea4565b613405816140ab565b840191505092915050565b600061341b82613cbf565b6134258185613ce6565b9350613435818560208601613ea4565b61343e816140ab565b840191505092915050565b6000613456602283613ce6565b9150613461826140c9565b604082019050919050565b6000613479600d83613ce6565b915061348482614118565b602082019050919050565b600061349c602683613ce6565b91506134a782614141565b604082019050919050565b60006134bf602a83613ce6565b91506134ca82614190565b604082019050919050565b60006134e2602383613ce6565b91506134ed826141df565b604082019050919050565b6000613505602483613ce6565b91506135108261422e565b604082019050919050565b6000613528603983613ce6565b91506135338261427d565b604082019050919050565b600061354b601283613ce6565b9150613556826142cc565b602082019050919050565b600061356e602b83613ce6565b9150613579826142f5565b604082019050919050565b6000613591602683613ce6565b915061359c82614344565b604082019050919050565b60006135b4602083613ce6565b91506135bf82614393565b602082019050919050565b60006135d7601a83613ce6565b91506135e2826143bc565b602082019050919050565b60006135fa603283613ce6565b9150613605826143e5565b604082019050919050565b600061361d601283613ce6565b915061362882614434565b602082019050919050565b6000613640602283613ce6565b915061364b8261445d565b604082019050919050565b6000613663600083613cdb565b915061366e826144ac565b600082019050919050565b6000613686601183613ce6565b9150613691826144af565b602082019050919050565b60006136a9603383613ce6565b91506136b4826144d8565b604082019050919050565b60006136cc601d83613ce6565b91506136d782614527565b602082019050919050565b60006136ef602183613ce6565b91506136fa82614550565b604082019050919050565b6000613712602e83613ce6565b915061371d8261459f565b604082019050919050565b6000613735601f83613ce6565b9150613740826145ee565b602082019050919050565b6000613758602f83613ce6565b915061376382614617565b604082019050919050565b600061377b602d83613ce6565b915061378682614666565b604082019050919050565b600061379e602283613ce6565b91506137a9826146b5565b604082019050919050565b6137bd81613e8b565b82525050565b60006137cf82846133a2565b60148201915081905092915050565b60006137e982613656565b9150819050919050565b60006020820190506138086000830184613393565b92915050565b60006060820190506138236000830186613393565b6138306020830185613393565b61383d60408301846137b4565b949350505050565b600060808201905061385a6000830187613393565b6138676020830186613393565b61387460408301856137b4565b818103606083015261388681846133d7565b905095945050505050565b60006040820190506138a66000830185613393565b6138b360208301846137b4565b9392505050565b60006020820190506138cf60008301846133b9565b92915050565b60006020820190506138ea60008301846133c8565b92915050565b6000602082019050818103600083015261390a8184613410565b905092915050565b6000602082019050818103600083015261392b81613449565b9050919050565b6000602082019050818103600083015261394b8161346c565b9050919050565b6000602082019050818103600083015261396b8161348f565b9050919050565b6000602082019050818103600083015261398b816134b2565b9050919050565b600060208201905081810360008301526139ab816134d5565b9050919050565b600060208201905081810360008301526139cb816134f8565b9050919050565b600060208201905081810360008301526139eb8161351b565b9050919050565b60006020820190508181036000830152613a0b8161353e565b9050919050565b60006020820190508181036000830152613a2b81613561565b9050919050565b60006020820190508181036000830152613a4b81613584565b9050919050565b60006020820190508181036000830152613a6b816135a7565b9050919050565b60006020820190508181036000830152613a8b816135ca565b9050919050565b60006020820190508181036000830152613aab816135ed565b9050919050565b60006020820190508181036000830152613acb81613610565b9050919050565b60006020820190508181036000830152613aeb81613633565b9050919050565b60006020820190508181036000830152613b0b81613679565b9050919050565b60006020820190508181036000830152613b2b8161369c565b9050919050565b60006020820190508181036000830152613b4b816136bf565b9050919050565b60006020820190508181036000830152613b6b816136e2565b9050919050565b60006020820190508181036000830152613b8b81613705565b9050919050565b60006020820190508181036000830152613bab81613728565b9050919050565b60006020820190508181036000830152613bcb8161374b565b9050919050565b60006020820190508181036000830152613beb8161376e565b9050919050565b60006020820190508181036000830152613c0b81613791565b9050919050565b6000602082019050613c2760008301846137b4565b92915050565b6000613c37613c48565b9050613c438282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6d57613c6c61405e565b5b613c76826140ab565b9050602081019050919050565b600067ffffffffffffffff821115613c9e57613c9d61405e565b5b613ca7826140ab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613d0282613e4f565b9150613d0d83613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613d3257613d31613fd1565b5b828201905092915050565b6000613d4882613e8b565b9150613d5383613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613fd1565b5b828201905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fd1565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fd1565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fd1565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c614000565b5b50919050565b613f3c826140ab565b810181811067ffffffffffffffff82111715613f5b57613f5a61405e565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fd1565b5b600182019050919050565b6000613fb882613fbf565b9050919050565b6000613fca826140bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f77206c6973746564206164647265737365732063616e2060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d61782074776f207065722077616c6c65740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61470d81613dfb565b811461471857600080fd5b50565b61472481613e0d565b811461472f57600080fd5b50565b61473b81613e19565b811461474657600080fd5b50565b61475281613e23565b811461475d57600080fd5b50565b61476981613e8b565b811461477457600080fd5b5056fea26469706673582212201e5780d0f6e92d715930318d69025e1c4d2e3173cc148e25432fe7979d695d2864736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001dfc000000000000000000000000000000000000000000000000000000000000001050726f6261626c79204e6f7468696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002504e000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Probably Nothing
Arg [1] : symbol (string): PN
Arg [2] : _maxSupply (uint256): 7676
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001dfc
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [4] : 50726f6261626c79204e6f7468696e6700000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 504e000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
172:2796:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:358:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5544:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7024:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2486:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7842:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;297:25:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3100:721:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;366:41:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2805:161;;;:::i;:::-;;8036:151:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2368:160:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2724:75;;;:::i;:::-;;1628:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2642:174:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2637:81:13;;;:::i;:::-;;5374:116:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1881:266:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;240:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:208:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:12;;;:::i;:::-;;1029:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5692:96:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;413:45:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8245:300:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;894:728:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2243:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;267:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:43:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2153:84:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2534:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7610:178:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3880:358:4;4002:4;4044:25;4029:40;;;:11;:40;;;;:98;;;;4094:33;4079:48;;;:11;:48;;;;4029:98;:158;;;;4152:35;4137:50;;;:11;:50;;;;4029:158;:204;;;;4197:36;4221:11;4197:23;:36::i;:::-;4029:204;4016:217;;3880:358;;;:::o;5544:92::-;5598:13;5626:5;5619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:92;:::o;7024:200::-;7092:7;7115:16;7123:7;7115;:16::i;:::-;7107:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7195:15;:24;7211:7;7195:24;;;;;;;;;;;;;;;;;;;;;7188:31;;7024:200;;;:::o;6602:369::-;6670:13;6686:24;6702:7;6686:15;:24::i;:::-;6670:40;;6730:5;6724:11;;:2;:11;;;;6716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6812:5;6796:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;6821:37;6838:5;6845:12;:10;:12::i;:::-;6821:16;:37::i;:::-;6796:62;6781:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;6938:28;6947:2;6951:7;6960:5;6938:8;:28::i;:::-;6664:307;6602:369;;:::o;2486:92::-;2539:7;2561:12;;2554:19;;2486:92;:::o;7842:136::-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;:::-;7842:136;;;:::o;297:25:13:-;;;;:::o;3100:721:4:-;3205:7;3238:16;3248:5;3238:9;:16::i;:::-;3230:5;:24;3222:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3299:22;3324:13;:11;:13::i;:::-;3299:38;;3343:19;3372:25;3421:9;3416:339;3440:14;3436:1;:18;3416:339;;;3469:31;3503:11;:14;3515:1;3503:14;;;;;;;;;;;3469:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3555:1;3529:28;;:9;:14;;;:28;;;3525:87;;3589:9;:14;;;3569:34;;3525:87;3644:5;3623:26;;:17;:26;;;3619:130;;;3680:5;3665:11;:20;3661:57;;;3706:1;3699:8;;;;;;;;;3661:57;3727:13;;;;;:::i;:::-;;;;3619:130;3461:294;3456:3;;;;;:::i;:::-;;;;3416:339;;;;3760:56;;;;;;;;;;:::i;:::-;;;;;;;;3100:721;;;;;:::o;366:41:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;2805:161::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2853:12:13::1;2870:7;:5;:7::i;:::-;:12;;2890:21;2870:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2852:64;;;2934:7;2926:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;2842:124;2805:161::o:0;8036:151:4:-;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;:::-;8036:151;;;:::o;2368:160:13:-;2418:47;2431:12;:10;:12::i;:::-;2453:1;2457:7;2418:12;:47::i;:::-;2480:41;2487:12;:10;:12::i;:::-;2509:1;2513:7;2480:41;;;;;;;;:::i;:::-;;;;;;;;2368:160;:::o;2724:75::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2786:6:13::1;;;;;;;;;;;2785:7;2776:6;;:16;;;;;;;;;;;;;;;;;;2724:75::o:0;1628:247::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1748:9:13::1;;1737:7;1721:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;1713:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1790:30;1800:10;1812:7;1790:9;:30::i;:::-;1835:33;1842:10;1854:13;:11;:13::i;:::-;1835:33;;;;;;;:::i;:::-;;;;;;;;1628:247:::0;;:::o;2642:174:4:-;2709:7;2740:13;:11;:13::i;:::-;2732:5;:21;2724:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2806:5;2799:12;;2642:174;;;:::o;2637:81:13:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2703:8:13::1;;;;;;;;;;;2702:9;2691:8;;:20;;;;;;;;;;;;;;;;;;2637:81::o:0;5374:116:4:-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;;5453:32;;5374:116;;;:::o;1881:266:13:-;1977:4;1993:12;2035:10;2018:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2008:39;;;;;;1993:54;;2057:9;2069:50;2088:12;;2069:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2102:10;;2114:4;2069:18;:50::i;:::-;2057:62;;2136:4;2129:11;;;;1881:266;;;;;:::o;240:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4289:208:4:-;4353:7;4393:1;4376:19;;:5;:19;;;;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4464:12;:19;4477:5;4464:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4456:36;;4449:43;;4289:208;;;:::o;1661:101:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5692:96:4:-;5748:13;5776:7;5769:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:96;:::o;7283:269::-;7385:12;:10;:12::i;:::-;7373:24;;:8;:24;;;;7365:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7480:8;7435:18;:32;7454:12;:10;:12::i;:::-;7435:32;;;;;;;;;;;;;;;:42;7468:8;7435:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7528:8;7499:48;;7514:12;:10;:12::i;:::-;7499:48;;;7538:8;7499:48;;;;;;:::i;:::-;;;;;;;;7283:269;;:::o;413:45:13:-;;;;;;;;;;;;;;;;;:::o;8245:300:4:-;8376:28;8386:4;8392:2;8396:7;8376:9;:28::i;:::-;8425:48;8448:4;8454:2;8458:7;8467:5;8425:22;:48::i;:::-;8410:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;8245:300;;;;:::o;894:728:13:-;1680:1:14;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;1025:9:13::1;;1014:7;998:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;990:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1113:1;1085:10;:24;1096:12;:10;:12::i;:::-;1085:24;;;;;;;;;;;;;;;;1075:7;:34;;;;:::i;:::-;:39;;1067:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1155:8;;;;;;;;;;;1147:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1224:7;1196:10;:24;1207:12;:10;:12::i;:::-;1196:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;1245:41;1259:12;:10;:12::i;:::-;1273;;1245:13;:41::i;:::-;:69;;;;;1291:9;:23;1301:12;:10;:12::i;:::-;1291:23;;;;;;;;;;;;;;;;;;;;;;;;;1290:24;1245:69;1242:281;;;1361:1;1333:10;:24;1344:12;:10;:12::i;:::-;1333:24;;;;;;;;;;;;;;;;:29;1330:96;;;1407:4;1381:9;:23;1391:12;:10;:12::i;:::-;1381:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;1330:96;1242:281;;;1465:6;;;;;;;;;;;1464:7;1456:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1242:281;1533:32;1543:12;:10;:12::i;:::-;1557:7;1533:9;:32::i;:::-;1580:35;1587:12;:10;:12::i;:::-;1601:13;:11;:13::i;:::-;1580:35;;;;;;;:::i;:::-;;;;;;;;1637:1:14::0;2562:7;:22;;;;894:728:13;;;:::o;2243:119::-;2316:13;2348:7;2341:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2243:119;;;:::o;267:24::-;;;;:::o;12517:43:4:-;;;;:::o;2153:84:13:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2226:4:13::1;2213:10;:17;;;;2153:84:::0;:::o;2534:97::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8:13::1;2606:7;:18;;;;;;;;;;;;:::i;:::-;;2534:97:::0;:::o;7610:178:4:-;7727:4;7748:18;:25;7767:5;7748:25;;;;;;;;;;;;;;;:35;7774:8;7748:35;;;;;;;;;;;;;;;;;;;;;;;;;7741:42;;7610:178;;;;:::o;1911:198:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8775:103:4:-;8832:4;8861:12;;8851:7;:22;8844:29;;8775:103;;;:::o;588:96:1:-;641:7;667:10;660:17;;588:96;:::o;12348:165:4:-;12467:2;12440:15;:24;12456:7;12440:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12500:7;12496:2;12480:28;;12489:5;12480:28;;;;;;;;;;;;12348:165;;;:::o;10763:1486::-;10855:35;10893:20;10905:7;10893:11;:20::i;:::-;10855:58;;10920:22;10962:13;:18;;;10946:34;;:12;:10;:12::i;:::-;:34;;;:80;;;;11014:12;:10;:12::i;:::-;10990:36;;:20;11002:7;10990:11;:20::i;:::-;:36;;;10946:80;:140;;;;11036:50;11053:13;:18;;;11073:12;:10;:12::i;:::-;11036:16;:50::i;:::-;10946:140;10920:167;;11109:17;11094:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11236:4;11214:26;;:13;:18;;;:26;;;11199:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:43;11397:4;11403:2;11407:7;11416:1;11375:21;:43::i;:::-;11472:49;11489:1;11493:7;11502:13;:18;;;11472:8;:49::i;:::-;11558:1;11528:12;:18;11541:4;11528:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11593:1;11565:12;:16;11578:2;11565:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11623:43;;;;;;;;11638:2;11623:43;;;;;;11649:15;11623:43;;;;;11600:11;:20;11612:7;11600:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11890:19;11922:1;11912:7;:11;;;;:::i;:::-;11890:33;;11974:1;11933:43;;:11;:24;11945:11;11933:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;11929:229;;;11990:20;11998:11;11990:7;:20::i;:::-;11986:166;;;12049:94;;;;;;;;12075:13;:18;;;12049:94;;;;;;12105:13;:28;;;12049:94;;;;;12022:11;:24;12034:11;12022:24;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11986:166;11929:229;12188:7;12184:2;12169:27;;12178:4;12169:27;;;;;;;;;;;;12202:42;12223:4;12229:2;12233:7;12242:1;12202:20;:42::i;:::-;10849:1400;;;10763:1486;;;:::o;8882:96::-;8946:27;8956:2;8960:8;8946:27;;;;;;;;;;;;:9;:27::i;:::-;8882:96;;:::o;4739:586::-;4812:21;;:::i;:::-;4851:16;4859:7;4851;:16::i;:::-;4843:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4921:26;4968:12;4957:7;:23;4953:91;;5036:1;5021:12;5011:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4990:47;;4953:91;5055:12;5070:7;5055:22;;5050:207;5087:18;5079:4;:26;5050:207;;5123:31;5157:11;:17;5169:4;5157:17;;;;;;;;;;;5123:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5212:1;5186:28;;:9;:14;;;:28;;;5182:69;;5233:9;5226:16;;;;;;;5182:69;5115:142;5107:6;;;;;:::i;:::-;;;;5050:207;;;;5263:57;;;;;;;;;;:::i;:::-;;;;;;;;4739:586;;;;:::o;1154:184:11:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;2263:187:12:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14018:667:4:-;14150:4;14166:15;:2;:13;;;:15::i;:::-;14162:519;;;14219:2;14203:36;;;14240:12;:10;:12::i;:::-;14254:4;14260:7;14269:5;14203:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14191:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14447:1;14430:6;:13;:18;14426:209;;;14462:61;;;;;;;;;;:::i;:::-;;;;;;;;14426:209;14605:6;14599:13;14590:6;14586:2;14582:15;14575:38;14191:452;14333:45;;;14323:55;;;:6;:55;;;;14316:62;;;;;14162:519;14670:4;14663:11;;14018:667;;;;;;;:::o;15133:136::-;;;;;:::o;15641:135::-;;;;;:::o;9304:1239::-;9404:20;9427:12;;9404:35;;9467:1;9453:16;;:2;:16;;;;9445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9642:21;9650:12;9642:7;:21::i;:::-;9641:22;9633:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9723:12;9711:8;:24;;9703:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9781:61;9811:1;9815:2;9819:12;9833:8;9781:21;:61::i;:::-;9849:30;9882:12;:16;9895:2;9882:16;;;;;;;;;;;;;;;9849:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:116;;;;;;;;9972:8;9942:11;:19;;;:39;;;;:::i;:::-;9923:116;;;;;;10024:8;9989:11;:24;;;:44;;;;:::i;:::-;9923:116;;;;;9904:12;:16;9917:2;9904:16;;;;;;;;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10073:43;;;;;;;;10088:2;10073:43;;;;;;10099:15;10073:43;;;;;10045:11;:25;10057:12;10045:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10123:20;10146:12;10123:35;;10170:9;10165:274;10189:8;10185:1;:12;10165:274;;;10242:12;10238:2;10217:38;;10234:1;10217:38;;;;;;;;;;;;10280:59;10311:1;10315:2;10319:12;10333:5;10280:22;:59::i;:::-;10263:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;10418:14;;;;;:::i;:::-;;;;10199:3;;;;;:::i;:::-;;;;10165:274;;;;10460:12;10445;:27;;;;10478:60;10507:1;10511:2;10515:12;10529:8;10478:20;:60::i;:::-;9398:1145;;;9304:1239;;;:::o;1689:662:11:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;2357:218:11:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:16:-;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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:704::-;5497:6;5505;5513;5562:2;5550:9;5541:7;5537:23;5533:32;5530:119;;;5568:79;;:::i;:::-;5530:119;5688:1;5713:53;5758:7;5749:6;5738:9;5734:22;5713:53;:::i;:::-;5703:63;;5659:117;5843:2;5832:9;5828:18;5815:32;5874:18;5866:6;5863:30;5860:117;;;5896:79;;:::i;:::-;5860:117;6009:80;6081:7;6072:6;6061:9;6057:22;6009:80;:::i;:::-;5991:98;;;;5786:313;5402:704;;;;;:::o;6112:468::-;6177:6;6185;6234:2;6222:9;6213:7;6209:23;6205:32;6202:119;;;6240:79;;:::i;:::-;6202:119;6360:1;6385:53;6430:7;6421:6;6410:9;6406:22;6385:53;:::i;:::-;6375:63;;6331:117;6487:2;6513:50;6555:7;6546:6;6535:9;6531:22;6513:50;:::i;:::-;6503:60;;6458:115;6112:468;;;;;:::o;6586:474::-;6654:6;6662;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:53;6907:7;6898:6;6887:9;6883:22;6862:53;:::i;:::-;6852:63;;6808:117;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6586:474;;;;;:::o;7066:329::-;7125:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7300:1;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7271:117;7066:329;;;;:::o;7401:327::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:52;7703:7;7694:6;7683:9;7679:22;7659:52;:::i;:::-;7649:62;;7605:116;7401:327;;;;:::o;7734:349::-;7803:6;7852:2;7840:9;7831:7;7827:23;7823:32;7820:119;;;7858:79;;:::i;:::-;7820:119;7978:1;8003:63;8058:7;8049:6;8038:9;8034:22;8003:63;:::i;:::-;7993:73;;7949:127;7734:349;;;;:::o;8089:509::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8361:1;8350:9;8346:17;8333:31;8391:18;8383:6;8380:30;8377:117;;;8413:79;;:::i;:::-;8377:117;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8304:287;8089:509;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:704::-;9034:6;9042;9050;9099:2;9087:9;9078:7;9074:23;9070:32;9067:119;;;9105:79;;:::i;:::-;9067:119;9225:1;9250:53;9295:7;9286:6;9275:9;9271:22;9250:53;:::i;:::-;9240:63;;9196:117;9380:2;9369:9;9365:18;9352:32;9411:18;9403:6;9400:30;9397:117;;;9433:79;;:::i;:::-;9397:117;9546:80;9618:7;9609:6;9598:9;9594:22;9546:80;:::i;:::-;9528:98;;;;9323:313;8939:704;;;;;:::o;9649:118::-;9736:24;9754:5;9736:24;:::i;:::-;9731:3;9724:37;9649:118;;:::o;9773:157::-;9878:45;9898:24;9916:5;9898:24;:::i;:::-;9878:45;:::i;:::-;9873:3;9866:58;9773:157;;:::o;9936:109::-;10017:21;10032:5;10017:21;:::i;:::-;10012:3;10005:34;9936:109;;:::o;10051:118::-;10138:24;10156:5;10138:24;:::i;:::-;10133:3;10126:37;10051:118;;:::o;10175:360::-;10261:3;10289:38;10321:5;10289:38;:::i;:::-;10343:70;10406:6;10401:3;10343:70;:::i;:::-;10336:77;;10422:52;10467:6;10462:3;10455:4;10448:5;10444:16;10422:52;:::i;:::-;10499:29;10521:6;10499:29;:::i;:::-;10494:3;10490:39;10483:46;;10265:270;10175:360;;;;:::o;10541:364::-;10629:3;10657:39;10690:5;10657:39;:::i;:::-;10712:71;10776:6;10771:3;10712:71;:::i;:::-;10705:78;;10792:52;10837:6;10832:3;10825:4;10818:5;10814:16;10792:52;:::i;:::-;10869:29;10891:6;10869:29;:::i;:::-;10864:3;10860:39;10853:46;;10633:272;10541:364;;;;:::o;10911:366::-;11053:3;11074:67;11138:2;11133:3;11074:67;:::i;:::-;11067:74;;11150:93;11239:3;11150:93;:::i;:::-;11268:2;11263:3;11259:12;11252:19;;10911:366;;;:::o;11283:::-;11425:3;11446:67;11510:2;11505:3;11446:67;:::i;:::-;11439:74;;11522:93;11611:3;11522:93;:::i;:::-;11640:2;11635:3;11631:12;11624:19;;11283:366;;;:::o;11655:::-;11797:3;11818:67;11882:2;11877:3;11818:67;:::i;:::-;11811:74;;11894:93;11983:3;11894:93;:::i;:::-;12012:2;12007:3;12003:12;11996:19;;11655:366;;;:::o;12027:::-;12169:3;12190:67;12254:2;12249:3;12190:67;:::i;:::-;12183:74;;12266:93;12355:3;12266:93;:::i;:::-;12384:2;12379:3;12375:12;12368:19;;12027:366;;;:::o;12399:::-;12541:3;12562:67;12626:2;12621:3;12562:67;:::i;:::-;12555:74;;12638:93;12727:3;12638:93;:::i;:::-;12756:2;12751:3;12747:12;12740:19;;12399:366;;;:::o;12771:::-;12913:3;12934:67;12998:2;12993:3;12934:67;:::i;:::-;12927:74;;13010:93;13099:3;13010:93;:::i;:::-;13128:2;13123:3;13119:12;13112:19;;12771:366;;;:::o;13143:::-;13285:3;13306:67;13370:2;13365:3;13306:67;:::i;:::-;13299:74;;13382:93;13471:3;13382:93;:::i;:::-;13500:2;13495:3;13491:12;13484:19;;13143:366;;;:::o;13515:::-;13657:3;13678:67;13742:2;13737:3;13678:67;:::i;:::-;13671:74;;13754:93;13843:3;13754:93;:::i;:::-;13872:2;13867:3;13863:12;13856:19;;13515:366;;;:::o;13887:::-;14029:3;14050:67;14114:2;14109:3;14050:67;:::i;:::-;14043:74;;14126:93;14215:3;14126:93;:::i;:::-;14244:2;14239:3;14235:12;14228:19;;13887:366;;;:::o;14259:::-;14401:3;14422:67;14486:2;14481:3;14422:67;:::i;:::-;14415:74;;14498:93;14587:3;14498:93;:::i;:::-;14616:2;14611:3;14607:12;14600:19;;14259:366;;;:::o;14631:::-;14773:3;14794:67;14858:2;14853:3;14794:67;:::i;:::-;14787:74;;14870:93;14959:3;14870:93;:::i;:::-;14988:2;14983:3;14979:12;14972:19;;14631:366;;;:::o;15003:::-;15145:3;15166:67;15230:2;15225:3;15166:67;:::i;:::-;15159:74;;15242:93;15331:3;15242:93;:::i;:::-;15360:2;15355:3;15351:12;15344:19;;15003:366;;;:::o;15375:::-;15517:3;15538:67;15602:2;15597:3;15538:67;:::i;:::-;15531:74;;15614:93;15703:3;15614:93;:::i;:::-;15732:2;15727:3;15723:12;15716:19;;15375:366;;;:::o;15747:::-;15889:3;15910:67;15974:2;15969:3;15910:67;:::i;:::-;15903:74;;15986:93;16075:3;15986:93;:::i;:::-;16104:2;16099:3;16095:12;16088:19;;15747:366;;;:::o;16119:::-;16261:3;16282:67;16346:2;16341:3;16282:67;:::i;:::-;16275:74;;16358:93;16447:3;16358:93;:::i;:::-;16476:2;16471:3;16467:12;16460:19;;16119:366;;;:::o;16491:398::-;16650:3;16671:83;16752:1;16747:3;16671:83;:::i;:::-;16664:90;;16763:93;16852:3;16763:93;:::i;:::-;16881:1;16876:3;16872:11;16865:18;;16491:398;;;:::o;16895:366::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18755:366;;;:::o;19127:::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19127:366;;;:::o;19499:::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19499:366;;;:::o;19871:::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;19871:366;;;:::o;20243:118::-;20330:24;20348:5;20330:24;:::i;:::-;20325:3;20318:37;20243:118;;:::o;20367:256::-;20479:3;20494:75;20565:3;20556:6;20494:75;:::i;:::-;20594:2;20589:3;20585:12;20578:19;;20614:3;20607:10;;20367:256;;;;:::o;20629:379::-;20813:3;20835:147;20978:3;20835:147;:::i;:::-;20828:154;;20999:3;20992:10;;20629:379;;;:::o;21014:222::-;21107:4;21145:2;21134:9;21130:18;21122:26;;21158:71;21226:1;21215:9;21211:17;21202:6;21158:71;:::i;:::-;21014:222;;;;:::o;21242:442::-;21391:4;21429:2;21418:9;21414:18;21406:26;;21442:71;21510:1;21499:9;21495:17;21486:6;21442:71;:::i;:::-;21523:72;21591:2;21580:9;21576:18;21567:6;21523:72;:::i;:::-;21605;21673:2;21662:9;21658:18;21649:6;21605:72;:::i;:::-;21242:442;;;;;;:::o;21690:640::-;21885:4;21923:3;21912:9;21908:19;21900:27;;21937:71;22005:1;21994:9;21990:17;21981:6;21937:71;:::i;:::-;22018:72;22086:2;22075:9;22071:18;22062:6;22018:72;:::i;:::-;22100;22168:2;22157:9;22153:18;22144:6;22100:72;:::i;:::-;22219:9;22213:4;22209:20;22204:2;22193:9;22189:18;22182:48;22247:76;22318:4;22309:6;22247:76;:::i;:::-;22239:84;;21690:640;;;;;;;:::o;22336:332::-;22457:4;22495:2;22484:9;22480:18;22472:26;;22508:71;22576:1;22565:9;22561:17;22552:6;22508:71;:::i;:::-;22589:72;22657:2;22646:9;22642:18;22633:6;22589:72;:::i;:::-;22336:332;;;;;:::o;22674:210::-;22761:4;22799:2;22788:9;22784:18;22776:26;;22812:65;22874:1;22863:9;22859:17;22850:6;22812:65;:::i;:::-;22674:210;;;;:::o;22890:222::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23034:71;23102:1;23091:9;23087:17;23078:6;23034:71;:::i;:::-;22890:222;;;;:::o;23118:313::-;23231:4;23269:2;23258:9;23254:18;23246:26;;23318:9;23312:4;23308:20;23304:1;23293:9;23289:17;23282:47;23346:78;23419:4;23410:6;23346:78;:::i;:::-;23338:86;;23118:313;;;;:::o;23437:419::-;23603:4;23641:2;23630:9;23626:18;23618:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23718:131;23844:4;23718:131;:::i;:::-;23710:139;;23437:419;;;:::o;23862:::-;24028:4;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;23862:419;;;:::o;24287:::-;24453:4;24491:2;24480:9;24476:18;24468:26;;24540:9;24534:4;24530:20;24526:1;24515:9;24511:17;24504:47;24568:131;24694:4;24568:131;:::i;:::-;24560:139;;24287:419;;;:::o;24712:::-;24878:4;24916:2;24905:9;24901:18;24893:26;;24965:9;24959:4;24955:20;24951:1;24940:9;24936:17;24929:47;24993:131;25119:4;24993:131;:::i;:::-;24985:139;;24712:419;;;:::o;25137:::-;25303:4;25341:2;25330:9;25326:18;25318:26;;25390:9;25384:4;25380:20;25376:1;25365:9;25361:17;25354:47;25418:131;25544:4;25418:131;:::i;:::-;25410:139;;25137:419;;;:::o;25562:::-;25728:4;25766:2;25755:9;25751:18;25743:26;;25815:9;25809:4;25805:20;25801:1;25790:9;25786:17;25779:47;25843:131;25969:4;25843:131;:::i;:::-;25835:139;;25562:419;;;:::o;25987:::-;26153:4;26191:2;26180:9;26176:18;26168:26;;26240:9;26234:4;26230:20;26226:1;26215:9;26211:17;26204:47;26268:131;26394:4;26268:131;:::i;:::-;26260:139;;25987:419;;;:::o;26412:::-;26578:4;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26412:419;;;:::o;26837:::-;27003:4;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;26837:419;;;:::o;27262:::-;27428:4;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27262:419;;;:::o;27687:::-;27853:4;27891:2;27880:9;27876:18;27868:26;;27940:9;27934:4;27930:20;27926:1;27915:9;27911:17;27904:47;27968:131;28094:4;27968:131;:::i;:::-;27960:139;;27687:419;;;:::o;28112:::-;28278:4;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28112:419;;;:::o;28537:::-;28703:4;28741:2;28730:9;28726:18;28718:26;;28790:9;28784:4;28780:20;28776:1;28765:9;28761:17;28754:47;28818:131;28944:4;28818:131;:::i;:::-;28810:139;;28537:419;;;:::o;28962:::-;29128:4;29166:2;29155:9;29151:18;29143:26;;29215:9;29209:4;29205:20;29201:1;29190:9;29186:17;29179:47;29243:131;29369:4;29243:131;:::i;:::-;29235:139;;28962:419;;;:::o;29387:::-;29553:4;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29387:419;;;:::o;29812:::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:::-;30403:4;30441:2;30430:9;30426:18;30418:26;;30490:9;30484:4;30480:20;30476:1;30465:9;30461:17;30454:47;30518:131;30644:4;30518:131;:::i;:::-;30510:139;;30237:419;;;:::o;30662:::-;30828:4;30866:2;30855:9;30851:18;30843:26;;30915:9;30909:4;30905:20;30901:1;30890:9;30886:17;30879:47;30943:131;31069:4;30943:131;:::i;:::-;30935:139;;30662:419;;;:::o;31087:::-;31253:4;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31087:419;;;:::o;31512:::-;31678:4;31716:2;31705:9;31701:18;31693:26;;31765:9;31759:4;31755:20;31751:1;31740:9;31736:17;31729:47;31793:131;31919:4;31793:131;:::i;:::-;31785:139;;31512:419;;;:::o;31937:::-;32103:4;32141:2;32130:9;32126:18;32118:26;;32190:9;32184:4;32180:20;32176:1;32165:9;32161:17;32154:47;32218:131;32344:4;32218:131;:::i;:::-;32210:139;;31937:419;;;:::o;32362:::-;32528:4;32566:2;32555:9;32551:18;32543:26;;32615:9;32609:4;32605:20;32601:1;32590:9;32586:17;32579:47;32643:131;32769:4;32643:131;:::i;:::-;32635:139;;32362:419;;;:::o;32787:::-;32953:4;32991:2;32980:9;32976:18;32968:26;;33040:9;33034:4;33030:20;33026:1;33015:9;33011:17;33004:47;33068:131;33194:4;33068:131;:::i;:::-;33060:139;;32787:419;;;:::o;33212:::-;33378:4;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33212:419;;;:::o;33637:222::-;33730:4;33768:2;33757:9;33753:18;33745:26;;33781:71;33849:1;33838:9;33834:17;33825:6;33781:71;:::i;:::-;33637:222;;;;:::o;33865:129::-;33899:6;33926:20;;:::i;:::-;33916:30;;33955:33;33983:4;33975:6;33955:33;:::i;:::-;33865:129;;;:::o;34000:75::-;34033:6;34066:2;34060:9;34050:19;;34000:75;:::o;34081:307::-;34142:4;34232:18;34224:6;34221:30;34218:56;;;34254:18;;:::i;:::-;34218:56;34292:29;34314:6;34292:29;:::i;:::-;34284:37;;34376:4;34370;34366:15;34358:23;;34081:307;;;:::o;34394:308::-;34456:4;34546:18;34538:6;34535:30;34532:56;;;34568:18;;:::i;:::-;34532:56;34606:29;34628:6;34606:29;:::i;:::-;34598:37;;34690:4;34684;34680:15;34672:23;;34394:308;;;:::o;34708:98::-;34759:6;34793:5;34787:12;34777:22;;34708:98;;;:::o;34812:99::-;34864:6;34898:5;34892:12;34882:22;;34812:99;;;:::o;34917:168::-;35000:11;35034:6;35029:3;35022:19;35074:4;35069:3;35065:14;35050:29;;34917:168;;;;:::o;35091:147::-;35192:11;35229:3;35214:18;;35091:147;;;;:::o;35244:169::-;35328:11;35362:6;35357:3;35350:19;35402:4;35397:3;35393:14;35378:29;;35244:169;;;;:::o;35419:273::-;35459:3;35478:20;35496:1;35478:20;:::i;:::-;35473:25;;35512:20;35530:1;35512:20;:::i;:::-;35507:25;;35634:1;35598:34;35594:42;35591:1;35588:49;35585:75;;;35640:18;;:::i;:::-;35585:75;35684:1;35681;35677:9;35670:16;;35419:273;;;;:::o;35698:305::-;35738:3;35757:20;35775:1;35757:20;:::i;:::-;35752:25;;35791:20;35809:1;35791:20;:::i;:::-;35786:25;;35945:1;35877:66;35873:74;35870:1;35867:81;35864:107;;;35951:18;;:::i;:::-;35864:107;35995:1;35992;35988:9;35981:16;;35698:305;;;;:::o;36009:191::-;36049:4;36069:20;36087:1;36069:20;:::i;:::-;36064:25;;36103:20;36121:1;36103:20;:::i;:::-;36098:25;;36142:1;36139;36136:8;36133:34;;;36147:18;;:::i;:::-;36133:34;36192:1;36189;36185:9;36177:17;;36009:191;;;;:::o;36206:::-;36246:4;36266:20;36284:1;36266:20;:::i;:::-;36261:25;;36300:20;36318:1;36300:20;:::i;:::-;36295:25;;36339:1;36336;36333:8;36330:34;;;36344:18;;:::i;:::-;36330:34;36389:1;36386;36382:9;36374:17;;36206:191;;;;:::o;36403:96::-;36440:7;36469:24;36487:5;36469:24;:::i;:::-;36458:35;;36403:96;;;:::o;36505:90::-;36539:7;36582:5;36575:13;36568:21;36557:32;;36505:90;;;:::o;36601:77::-;36638:7;36667:5;36656:16;;36601:77;;;:::o;36684:149::-;36720:7;36760:66;36753:5;36749:78;36738:89;;36684:149;;;:::o;36839:118::-;36876:7;36916:34;36909:5;36905:46;36894:57;;36839:118;;;:::o;36963:126::-;37000:7;37040:42;37033:5;37029:54;37018:65;;36963:126;;;:::o;37095:77::-;37132:7;37161:5;37150:16;;37095:77;;;:::o;37178:154::-;37262:6;37257:3;37252;37239:30;37324:1;37315:6;37310:3;37306:16;37299:27;37178:154;;;:::o;37338:307::-;37406:1;37416:113;37430:6;37427:1;37424:13;37416:113;;;37515:1;37510:3;37506:11;37500:18;37496:1;37491:3;37487:11;37480:39;37452:2;37449:1;37445:10;37440:15;;37416:113;;;37547:6;37544:1;37541:13;37538:101;;;37627:1;37618:6;37613:3;37609:16;37602:27;37538:101;37387:258;37338:307;;;:::o;37651:171::-;37690:3;37713:24;37731:5;37713:24;:::i;:::-;37704:33;;37759:4;37752:5;37749:15;37746:41;;;37767:18;;:::i;:::-;37746:41;37814:1;37807:5;37803:13;37796:20;;37651:171;;;:::o;37828:320::-;37872:6;37909:1;37903:4;37899:12;37889:22;;37956:1;37950:4;37946:12;37977:18;37967:81;;38033:4;38025:6;38021:17;38011:27;;37967:81;38095:2;38087:6;38084:14;38064:18;38061:38;38058:84;;;38114:18;;:::i;:::-;38058:84;37879:269;37828:320;;;:::o;38154:281::-;38237:27;38259:4;38237:27;:::i;:::-;38229:6;38225:40;38367:6;38355:10;38352:22;38331:18;38319:10;38316:34;38313:62;38310:88;;;38378:18;;:::i;:::-;38310:88;38418:10;38414:2;38407:22;38197:238;38154:281;;:::o;38441:233::-;38480:3;38503:24;38521:5;38503:24;:::i;:::-;38494:33;;38549:66;38542:5;38539:77;38536:103;;;38619:18;;:::i;:::-;38536:103;38666:1;38659:5;38655:13;38648:20;;38441:233;;;:::o;38680:100::-;38719:7;38748:26;38768:5;38748:26;:::i;:::-;38737:37;;38680:100;;;:::o;38786:94::-;38825:7;38854:20;38868:5;38854:20;:::i;:::-;38843:31;;38786:94;;;:::o;38886:180::-;38934:77;38931:1;38924:88;39031:4;39028:1;39021:15;39055:4;39052:1;39045:15;39072:180;39120:77;39117:1;39110:88;39217:4;39214:1;39207:15;39241:4;39238:1;39231:15;39258:180;39306:77;39303:1;39296:88;39403:4;39400:1;39393:15;39427:4;39424:1;39417:15;39444:180;39492:77;39489:1;39482:88;39589:4;39586:1;39579:15;39613:4;39610:1;39603:15;39630:117;39739:1;39736;39729:12;39753:117;39862:1;39859;39852:12;39876:117;39985:1;39982;39975:12;39999:117;40108:1;40105;40098:12;40122:117;40231:1;40228;40221:12;40245:117;40354:1;40351;40344:12;40368:102;40409:6;40460:2;40456:7;40451:2;40444:5;40440:14;40436:28;40426:38;;40368:102;;;:::o;40476:94::-;40509:8;40557:5;40553:2;40549:14;40528:35;;40476:94;;;:::o;40576:221::-;40716:34;40712:1;40704:6;40700:14;40693:58;40785:4;40780:2;40772:6;40768:15;40761:29;40576:221;:::o;40803:163::-;40943:15;40939:1;40931:6;40927:14;40920:39;40803:163;:::o;40972:225::-;41112:34;41108:1;41100:6;41096:14;41089:58;41181:8;41176:2;41168:6;41164:15;41157:33;40972:225;:::o;41203:229::-;41343:34;41339:1;41331:6;41327:14;41320:58;41412:12;41407:2;41399:6;41395:15;41388:37;41203:229;:::o;41438:222::-;41578:34;41574:1;41566:6;41562:14;41555:58;41647:5;41642:2;41634:6;41630:15;41623:30;41438:222;:::o;41666:223::-;41806:34;41802:1;41794:6;41790:14;41783:58;41875:6;41870:2;41862:6;41858:15;41851:31;41666:223;:::o;41895:244::-;42035:34;42031:1;42023:6;42019:14;42012:58;42104:27;42099:2;42091:6;42087:15;42080:52;41895:244;:::o;42145:168::-;42285:20;42281:1;42273:6;42269:14;42262:44;42145:168;:::o;42319:230::-;42459:34;42455:1;42447:6;42443:14;42436:58;42528:13;42523:2;42515:6;42511:15;42504:38;42319:230;:::o;42555:225::-;42695:34;42691:1;42683:6;42679:14;42672:58;42764:8;42759:2;42751:6;42747:15;42740:33;42555:225;:::o;42786:182::-;42926:34;42922:1;42914:6;42910:14;42903:58;42786:182;:::o;42974:176::-;43114:28;43110:1;43102:6;43098:14;43091:52;42974:176;:::o;43156:237::-;43296:34;43292:1;43284:6;43280:14;43273:58;43365:20;43360:2;43352:6;43348:15;43341:45;43156:237;:::o;43399:168::-;43539:20;43535:1;43527:6;43523:14;43516:44;43399:168;:::o;43573:221::-;43713:34;43709:1;43701:6;43697:14;43690:58;43782:4;43777:2;43769:6;43765:15;43758:29;43573:221;:::o;43800:114::-;;:::o;43920:167::-;44060:19;44056:1;44048:6;44044:14;44037:43;43920:167;:::o;44093:238::-;44233:34;44229:1;44221:6;44217:14;44210:58;44302:21;44297:2;44289:6;44285:15;44278:46;44093:238;:::o;44337:179::-;44477:31;44473:1;44465:6;44461:14;44454:55;44337:179;:::o;44522:220::-;44662:34;44658:1;44650:6;44646:14;44639:58;44731:3;44726:2;44718:6;44714:15;44707:28;44522:220;:::o;44748:233::-;44888:34;44884:1;44876:6;44872:14;44865:58;44957:16;44952:2;44944:6;44940:15;44933:41;44748:233;:::o;44987:181::-;45127:33;45123:1;45115:6;45111:14;45104:57;44987:181;:::o;45174:234::-;45314:34;45310:1;45302:6;45298:14;45291:58;45383:17;45378:2;45370:6;45366:15;45359:42;45174:234;:::o;45414:232::-;45554:34;45550:1;45542:6;45538:14;45531:58;45623:15;45618:2;45610:6;45606:15;45599:40;45414:232;:::o;45652:221::-;45792:34;45788:1;45780:6;45776:14;45769:58;45861:4;45856:2;45848:6;45844:15;45837:29;45652:221;:::o;45879:122::-;45952:24;45970:5;45952:24;:::i;:::-;45945:5;45942:35;45932:63;;45991:1;45988;45981:12;45932:63;45879:122;:::o;46007:116::-;46077:21;46092:5;46077:21;:::i;:::-;46070:5;46067:32;46057:60;;46113:1;46110;46103:12;46057:60;46007:116;:::o;46129:122::-;46202:24;46220:5;46202:24;:::i;:::-;46195:5;46192:35;46182:63;;46241:1;46238;46231:12;46182:63;46129:122;:::o;46257:120::-;46329:23;46346:5;46329:23;:::i;:::-;46322:5;46319:34;46309:62;;46367:1;46364;46357:12;46309:62;46257:120;:::o;46383:122::-;46456:24;46474:5;46456:24;:::i;:::-;46449:5;46446:35;46436:63;;46495:1;46492;46485:12;46436:63;46383:122;:::o
Swarm Source
ipfs://1e5780d0f6e92d715930318d69025e1c4d2e3173cc148e25432fe7979d695d28
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.