ERC-721
Overview
Max Total Supply
0 BelvedereAndArteQTheKissByGustavKlimt
Holders
1,824
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BelvedereAndArteQTheKissByGustavKlimtLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
arteQArtDrop
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* * This file is part of the contracts written for artèQ Investment Fund (https://arteq.io). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.0; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "./ERC721URIStorage.sol"; import "./ERC721.sol"; import "./IarteQTaskFinalizer.sol"; /// @author Kam Amini <[email protected]> <[email protected]> /// /// @notice Use at your own risk contract arteQArtDrop is ERC721URIStorage, IERC2981 { string private constant DEFAULT_TOKEN_URI = "DEFAULT_TOKEN_URI"; uint256 public constant MAX_NR_TOKENS_PER_ACCOUNT = 5; uint256 public constant MAX_RESERVATIONS_COUNT = 10000; int256 public constant LOCKED_STAGE = 0; int256 public constant WHITELISTING_STAGE = 2; int256 public constant RESERVATION_STAGE = 3; int256 public constant DISTRIBUTION_STAGE = 4; // Counter for token IDs uint256 private _tokenIdCounter; // Counter for pre-minted token IDs uint256 private _preMintedTokenIdCounter; // number of tokens owned by the contract uint256 _contractBalance; address private _adminContract; // in wei uint256 private _pricePerToken; // in wei uint256 private _serviceFee; string private _defaultTokenURI; address _royaltyWallet; uint256 _royaltyPercentage; // The current art drop stage. It can have the following values: // // 0: Locked / Read-only mode // 2: Selection of the registered wallets (whitelisting) // 3: Reservation / Purchase stage // 4: Distribution of the tokens / Drop stage // // * 1 is missing from the above list. That's to keep the off-chain // and on-chain states in sync. // * Only admin accounts with a quorum of votes can change the // current stage. // * Some functions only work in certain stages. // * When the 4th stage (last stage) is finished, the contract // will be put back into locked mode (stage 0). // * Admins can only advance/retreat the current stage by movements of +1 or -1. int256 private _stage; // A mapping from the whitelisted addresses to the maximum number of tokens they can obtain mapping(address => uint256) _whitelistedAccounts; // Counts the number of whitelisted accounts uint256 _whitelistedAccountsCounter; // Counts the number of reserved tokens uint256 _reservedTokensCounter; // Enabled reservations without a need to be whitelisted bool _canReserveWithoutBeingWhitelisted; // An operator which is allowed to perform certain operations such as adding whitelisted // accounts, removing them, or doing the token reservation for credit card payments. These // accounts can only be defined by a quorom of votes among admins. mapping(address => uint256) _operators; event WhitelistedAccountAdded(address doer, address account, uint256 maxNrOfTokensToObtain); event WhitelistedAccountRemoved(address doer, address account); event PricePerTokenChanged(address doer, uint256 adminTaskId, uint256 oldValue, uint256 newValue); event ServiceFeeChanged(address doer, uint256 adminTaskId, uint256 oldValue, uint256 newValue); event StageChanged(address doer, uint256 adminTaskId, int256 oldValue, int256 newValue); event OperatorAdded(address doer, uint256 adminTaskId, address toBeOperatorAccount); event OperatorRemoved(address doer, uint256 adminTaskId, address toBeRemovedOperatorAccount); event DefaultTokenURIChanged(address doer, uint256 adminTaskId, string newValue); event TokensReserved(address doer, address target, uint256 nrOfTokensToReserve); event Deposited(address doer, uint256 priceOfTokens, uint256 serviceFee, uint256 totalValue); event Returned(address doer, address target, uint256 returnedValue); event Withdrawn(address doer, address target, uint256 amount); event TokenURIChanged(address doer, uint256 tokenId, string newValue); event GenesisTokenURIChanged(address doer, uint256 adminTaskId, string newValue); event RoyaltyWalletChanged(address doer, uint256 adminTaskId, address newRoyaltyWallet); event RoyaltyPercentageChanged(address doer, uint256 adminTaskId, uint256 newRoyaltyPercentage); event CanReserveWithoutBeingWhitelistedChanged(address doer, uint256 adminTaskId, bool newValue); modifier adminApprovalRequired(uint256 adminTaskId) { _; // This must succeed otherwise the tx gets reverted IarteQTaskFinalizer(_adminContract).finalizeTask(msg.sender, adminTaskId); } modifier onlyLockedStage() { require(_stage == LOCKED_STAGE, "arteQArtDrop: only callable in locked stage"); _; } modifier onlyWhitelistingStage() { require(_stage == WHITELISTING_STAGE, "arteQArtDrop: only callable in whitelisting stage"); _; } modifier onlyReservationStage() { require(_stage == RESERVATION_STAGE, "arteQArtDrop: only callable in reservation stage"); _; } modifier onlyReservationAndDistributionStages() { require(_stage == RESERVATION_STAGE || _stage == DISTRIBUTION_STAGE, "arteQArtDrop: only callable in reservation and distribution stage"); _; } modifier onlyDistributionStage() { require(_stage == DISTRIBUTION_STAGE, "arteQArtDrop: only callable in distribution stage"); _; } modifier onlyWhenNotLocked() { require(_stage > 1, "arteQArtDrop: only callable in not-locked stages"); _; } modifier onlyWhenNotInReservationStage() { require(_stage != RESERVATION_STAGE, "arteQArtDrop: only callable in a non-reservation stage"); _; } modifier onlyOperator() { require(_operators[msg.sender] > 0, "arteQArtDrop: not an operator account"); _; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } constructor( address adminContract, string memory name, string memory symbol, uint256 initialPricePerToken, uint256 initialServiceFee, string memory initialDefaultTokenURI, string memory initialGenesisTokenURI ) ERC721(name, symbol) { require(adminContract != address(0), "arteQArtDrop: admin contract cannot be zero"); require(adminContract.code.length > 0, "arteQArtDrop: non-contract account for admin contract"); require(initialPricePerToken > 0, "arteQArtDrop: zero initial price per token"); require(bytes(initialDefaultTokenURI).length > 0, "arteQArtDrop: invalid default token uri"); require(bytes(initialGenesisTokenURI).length > 0, "arteQArtDrop: invalid genesis token uri"); _adminContract = adminContract; _pricePerToken = initialPricePerToken; emit PricePerTokenChanged(msg.sender, 0, 0, _pricePerToken); _serviceFee = initialServiceFee; emit ServiceFeeChanged(msg.sender, 0, 0, _serviceFee); _defaultTokenURI = initialDefaultTokenURI; emit DefaultTokenURIChanged(msg.sender, 0, _defaultTokenURI); _tokenIdCounter = 1; _preMintedTokenIdCounter = 1; _contractBalance = 0; _whitelistedAccountsCounter = 0; _reservedTokensCounter = 0; // Contract is locked/read-only by default. _stage = 0; emit StageChanged(msg.sender, 0, 0, _stage); // Mint genesis token. Contract will be the eternal owner of the genesis token. _mint(address(0), address(this), 0); _setTokenURI(0, initialGenesisTokenURI); _contractBalance += 1; emit GenesisTokenURIChanged(msg.sender, 0, initialGenesisTokenURI); _royaltyWallet = address(this); emit RoyaltyWalletChanged(msg.sender, 0, _royaltyWallet); _royaltyPercentage = 10; emit RoyaltyPercentageChanged(msg.sender, 0, _royaltyPercentage); _canReserveWithoutBeingWhitelisted = false; emit CanReserveWithoutBeingWhitelistedChanged(msg.sender, 0, _canReserveWithoutBeingWhitelisted); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (_exists(tokenId)) { string memory tokenURIValue = super.tokenURI(tokenId); if (keccak256(bytes(tokenURIValue)) == keccak256(bytes(DEFAULT_TOKEN_URI))) { return _defaultTokenURI; } return tokenURIValue; } if (tokenId >= 1 && tokenId < _preMintedTokenIdCounter) { return _defaultTokenURI; } revert("arteQArtDrop: token id does not exist"); } function ownerOf(uint256 tokenId) public view virtual override returns (address) { if (_exists(tokenId)) { return super.ownerOf(tokenId); } if (tokenId >= 1 && tokenId < _preMintedTokenIdCounter) { return address(this); } revert("arteQArtDrop: token is does not exist"); } function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(this)) { return _contractBalance; } return super.balanceOf(owner); } function preMint(uint256 nr) external onlyOperator { for (uint256 i = 0; i < nr; i++) { require(_preMintedTokenIdCounter <= MAX_RESERVATIONS_COUNT, "arteQArtDrop: cannot pre-mint more"); emit Transfer(address(0), address(this), _preMintedTokenIdCounter); _preMintedTokenIdCounter += 1; } _contractBalance += nr; } function pricePerToken() external view returns (uint256) { return _pricePerToken; } function serviceFee() external view returns (uint256) { return _serviceFee; } function defaultTokenURI() external view returns (string memory) { return _defaultTokenURI; } function nrPreMintedTokens() external view returns (uint256) { return _preMintedTokenIdCounter - 1; } function stage() external view returns (int256) { return _stage; } function royaltyPercentage() external view returns (uint256) { return _royaltyPercentage; } function royaltyWallet() external view returns (address) { return _royaltyWallet; } function nrOfWhitelistedAccounts() external view returns (uint256) { return _whitelistedAccountsCounter; } function nrOfReservedTokens() external view returns (uint256) { return _reservedTokensCounter; } function canReserveWithoutBeingWhitelisted() external view returns (bool) { return _canReserveWithoutBeingWhitelisted; } function setPricePerToken(uint256 adminTaskId, uint256 newValue) external onlyWhenNotLocked onlyWhenNotInReservationStage adminApprovalRequired(adminTaskId) { require(newValue > 0, "arteQArtDrop: new price cannot be zero"); uint256 oldValue = _pricePerToken; _pricePerToken = newValue; emit PricePerTokenChanged(msg.sender, adminTaskId, oldValue, _pricePerToken); } function setServiceFee(uint256 adminTaskId, uint256 newValue) external onlyWhenNotLocked onlyWhenNotInReservationStage adminApprovalRequired(adminTaskId) { require(newValue > 0, "arteQArtDrop: new price cannot be zero"); uint256 oldValue = _serviceFee; _serviceFee = newValue; emit ServiceFeeChanged(msg.sender, adminTaskId, oldValue, _serviceFee); } function setDefaultTokenURI(uint256 adminTaskId, string memory newValue) external onlyWhenNotLocked onlyWhenNotInReservationStage adminApprovalRequired(adminTaskId) { require(bytes(newValue).length > 0, "arteQArtDrop: empty string"); _defaultTokenURI = newValue; emit DefaultTokenURIChanged(msg.sender, adminTaskId, _defaultTokenURI); } function setGenesisTokenURI(uint256 adminTaskId, string memory newValue) external onlyLockedStage adminApprovalRequired(adminTaskId) { require(bytes(newValue).length > 0, "arteQArtDrop: empty string"); _setTokenURI(0, newValue); emit GenesisTokenURIChanged(msg.sender, adminTaskId, newValue); } function setRoyaltyWallet(uint256 adminTaskId, address newRoyaltyWallet) external adminApprovalRequired(adminTaskId) { require(newRoyaltyWallet != address(0), "arteQArtDrop: invalid royalty wallet"); _royaltyWallet = newRoyaltyWallet; emit RoyaltyWalletChanged(msg.sender, adminTaskId, newRoyaltyWallet); } function setRoyaltyPercentage(uint256 adminTaskId, uint256 newRoyaltyPercentage) external adminApprovalRequired(adminTaskId) { require(newRoyaltyPercentage >= 0 && newRoyaltyPercentage <= 75, "arteQArtDrop: invalid royalty percentage"); _royaltyPercentage = newRoyaltyPercentage; emit RoyaltyPercentageChanged(msg.sender, adminTaskId, newRoyaltyPercentage); } function setCanReserveWithoutBeingWhitelisted(uint256 adminTaskId, bool newValue) external adminApprovalRequired(adminTaskId) { _canReserveWithoutBeingWhitelisted = newValue; emit CanReserveWithoutBeingWhitelistedChanged(msg.sender, adminTaskId, newValue); } function retreatStage(uint256 adminTaskId) external adminApprovalRequired(adminTaskId) { int256 oldStage = _stage; _stage -= 1; if (_stage == -1) { _stage = 4; } else if (_stage == 1) { _stage = 0; } emit StageChanged(msg.sender, adminTaskId, oldStage, _stage); } function advanceStage(uint256 adminTaskId) external adminApprovalRequired(adminTaskId) { int256 oldStage = _stage; _stage += 1; if (_stage == 5) { _stage = 0; } else if (_stage == 1) { _stage = 2; } emit StageChanged(msg.sender, adminTaskId, oldStage, _stage); } function addOperator(uint256 adminTaskId, address toBeOperatorAccount) external adminApprovalRequired(adminTaskId) { require(toBeOperatorAccount != address(0), "arteQArtDrop: cannot set zero as operator"); require(_operators[toBeOperatorAccount] == 0, "arteQArtDrop: already an operator"); _operators[toBeOperatorAccount] = 1; emit OperatorAdded(msg.sender, adminTaskId, toBeOperatorAccount); } function removeOperator(uint256 adminTaskId, address toBeRemovedOperatorAccount) external adminApprovalRequired(adminTaskId) { require(toBeRemovedOperatorAccount != address(0), "arteQArtDrop: cannot remove zero as operator"); require(_operators[toBeRemovedOperatorAccount] == 1, "arteQArtDrop: not an operator"); _operators[toBeRemovedOperatorAccount] = 0; emit OperatorRemoved(msg.sender, adminTaskId, toBeRemovedOperatorAccount); } function isOperator(address account) external view returns(bool) { return _operators[account] == 1; } function addToWhitelistedAccounts( address[] memory accounts, uint[] memory listOfMaxNrOfTokensToObtain ) external onlyOperator onlyWhitelistingStage { require(accounts.length > 0, "arteQArtDrop: zero length"); require(listOfMaxNrOfTokensToObtain.length > 0, "arteQArtDrop: zero length"); require(accounts.length == listOfMaxNrOfTokensToObtain.length, "arteQArtDrop: different lengths"); for (uint256 i = 0; i < accounts.length; i++) { address account = accounts[i]; uint256 maxNrOfTokensToObtain = listOfMaxNrOfTokensToObtain[i]; require(account != address(0), "arteQArtDrop: cannot whitelist zero address"); require(maxNrOfTokensToObtain >= 1 && maxNrOfTokensToObtain <= MAX_NR_TOKENS_PER_ACCOUNT, "arteQArtDrop: invalid nr of tokens to obtain"); require(account.code.length == 0, "arteQArtDrop: cannot whitelist a contract"); require(_whitelistedAccounts[account] == 0, "arteQArtDrop: already whitelisted"); _whitelistedAccounts[account] = maxNrOfTokensToObtain; _whitelistedAccountsCounter += 1; emit WhitelistedAccountAdded(msg.sender, account, maxNrOfTokensToObtain); } } function removeFromWhitelistedAccounts(address[] memory accounts) external onlyOperator onlyWhitelistingStage { require(accounts.length > 0, "arteQArtDrop: zero length"); for (uint256 i = 0; i < accounts.length; i++) { address account = accounts[i]; require(account != address(0), "arteQArtDrop: cannot remove zero address"); require(_whitelistedAccounts[account] > 0, "arteQArtDrop: account is not whitelisted"); _whitelistedAccounts[account] = 0; _whitelistedAccountsCounter -= 1; emit WhitelistedAccountRemoved(msg.sender, account); } } function whitelistedNrOfTokens(address account) external view returns (uint256) { if (!_canReserveWithoutBeingWhitelisted) { return _whitelistedAccounts[account]; } if (_whitelistedAccounts[account] == 0) { return MAX_NR_TOKENS_PER_ACCOUNT; } return _whitelistedAccounts[account]; } // Only callable by a whitelisted account // // * Account must have sent enough ETH to cover the price of all tokens + service fee // * Account cannot reserve more than what has been whitelisted for function reserveTokens(uint256 nrOfTokensToReserve) external payable onlyReservationAndDistributionStages { require(msg.value > 0, "arteQArtDrop: zero funds"); require(nrOfTokensToReserve > 0, "arteQArtDrop: zero tokens to reserve"); if (_canReserveWithoutBeingWhitelisted && _whitelistedAccounts[msg.sender] == 0) { _whitelistedAccounts[msg.sender] = 5; } require(_whitelistedAccounts[msg.sender] > 0, "arteQArtDrop: not a whitelisted account"); require(nrOfTokensToReserve <= _whitelistedAccounts[msg.sender], "arteQArtDrop: exceeding the reservation allowance"); require((_reservedTokensCounter + nrOfTokensToReserve) <= MAX_RESERVATIONS_COUNT, "arteQArtDrop: exceeding max number of reservations"); // Handle payments uint256 priceOfTokens = nrOfTokensToReserve * _pricePerToken; uint256 priceToPay = priceOfTokens + _serviceFee; require(msg.value >= priceToPay, "arteQArtDrop: insufficient funds"); uint256 remainder = msg.value - priceToPay; if (remainder > 0) { (bool success, ) = msg.sender.call{value: remainder}(new bytes(0)); require(success, "arteQArtDrop: failed to send the remainder"); emit Returned(msg.sender, msg.sender, remainder); } emit Deposited(msg.sender, priceOfTokens, _serviceFee, priceToPay); _reserveTokens(msg.sender, nrOfTokensToReserve); } // This method is called by an operator to complete the reservation of fiat payments // such as credit card, iDeal, etc. function reserveTokensForAccounts( address[] memory accounts, uint256[] memory listOfNrOfTokensToReserve ) external onlyOperator onlyReservationAndDistributionStages { require(accounts.length > 0, "arteQArtDrop: zero length"); require(listOfNrOfTokensToReserve.length > 0, "arteQArtDrop: zero length"); require(accounts.length == listOfNrOfTokensToReserve.length, "arteQArtDrop: different lengths"); for (uint256 i = 0; i < accounts.length; i++) { address account = accounts[i]; uint256 nrOfTokensToReserve = listOfNrOfTokensToReserve[i]; require(account != address(0), "arteQArtDrop: cannot be zero address"); if (_canReserveWithoutBeingWhitelisted && _whitelistedAccounts[account] == 0) { _whitelistedAccounts[account] = 5; } require(_whitelistedAccounts[account] > 0, "arteQArtDrop: not a whitelisted account"); require(nrOfTokensToReserve <= _whitelistedAccounts[account], "arteQArtDrop: exceeding the reservation allowance"); _reserveTokens(account, nrOfTokensToReserve); } } function updateTokenURIs(uint256[] memory tokenIds, string[] memory newTokenURIs) external onlyOperator onlyDistributionStage { require(tokenIds.length > 0, "arteQArtDrop: zero length"); require(newTokenURIs.length > 0, "arteQArtDrop: zero length"); require(tokenIds.length == newTokenURIs.length, "arteQArtDrop: different lengths"); for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; string memory newTokenURI = newTokenURIs[i]; require(tokenId > 0, "arteQArtDrop: cannot alter genesis token"); require(bytes(newTokenURI).length > 0, "arteQArtDrop: empty string"); _setTokenURI(tokenId, newTokenURI); emit TokenURIChanged(msg.sender, tokenId, newTokenURI); } } function transferTo(address target, uint256 amount) external onlyOperator { require(target != address(0), "arteQArtDrop: target cannot be zero"); require(amount > 0, "arteQArtDrop: cannot transfer zero"); require(amount <= address(this).balance, "arteQArtDrop: transfer more than balance"); (bool success, ) = target.call{value: amount}(new bytes(0)); require(success, "arteQArtDrop: failed to transfer"); emit Withdrawn(msg.sender, target, amount); } function royaltyInfo(uint256, uint256 salePrice) external view virtual override returns (address, uint256) { uint256 royalty = (salePrice * _royaltyPercentage) / 100; return (_royaltyWallet, royalty); } function _reserveTokens(address target, uint256 nrOfTokensToReserve) internal { for (uint256 i = 1; i <= nrOfTokensToReserve; i++) { uint256 newTokenId = _tokenIdCounter; _mint(address(this), target, newTokenId); _setTokenURI(newTokenId, DEFAULT_TOKEN_URI); _tokenIdCounter += 1; require(_reservedTokensCounter <= MAX_RESERVATIONS_COUNT, "arteQArtDrop: exceeding max number of reservations"); _reservedTokensCounter += 1; } if ((_contractBalance - 1) > nrOfTokensToReserve) { _contractBalance -= nrOfTokensToReserve; } else { _contractBalance = 1; // eventually, the contract must only own the genesis token } require(_contractBalance >= 1, "arteQArtDrop: contract balance went below 1"); _whitelistedAccounts[target] -= nrOfTokensToReserve; require(_whitelistedAccounts[target] >= 0, "arteQArtDrop: should not happen"); emit TokensReserved(msg.sender, target, nrOfTokensToReserve); } receive() external payable { revert("arteQArtDrop: cannot accept ether"); } fallback() external payable { revert("arteQArtDrop: cannot accept ether"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
/* * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts). * Copyright (c) 2021 BillionBuild (2B) Team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 // Based on OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity 0.8.0; import "./ERC721.sol"; /** * @author Modified by Kam Amini <[email protected]> <[email protected]> <[email protected]> * * @notice Use at your own risk * * Note: 2B has modified the original code to cover its needs as * part of artèQ Investment Fund ecosystem * * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
/* * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts). * Copyright (c) 2021 BillionBuild (2B) Team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.0; import "@openzeppelin/contracts/interfaces/IERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @author Modified by Kam Amini <[email protected]> <[email protected]> <[email protected]> * * @notice Use at your own risk * * Note: 2B has modified the original code to cover its needs as * part of artèQ Investment Fund ecosystem * * @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. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not 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 { require(operator != _msgSender(), "ERC721: 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 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(address(0), 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 from, address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(from, to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, 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 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 {} }
/* * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts). * Copyright (c) 2021 BillionBuild (2B) Team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.0; /// @author Kam Amini <[email protected]> <[email protected]> <[email protected]> /// @title The interface for finalizing tasks. Mainly used by artèQ contracts to /// perform administrative tasks in conjuction with admin contract. interface IarteQTaskFinalizer { event TaskFinalized(address finalizer, address origin, uint256 taskId); function finalizeTask(address origin, uint256 taskId) external; }
// 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 "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../token/ERC721/IERC721Receiver.sol";
// 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; /** * @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; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly 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) { return msg.data; } }
// 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); } }
// 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 "../../utils/introspection/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 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); }
{ "optimizer": { "enabled": true, "runs": 2000, "details": { "yul": true, "yulDetails": { "stackAllocation": true, "optimizerSteps": "dhfoDgvulfnTUtnIf" } } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"adminContract","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialPricePerToken","type":"uint256"},{"internalType":"uint256","name":"initialServiceFee","type":"uint256"},{"internalType":"string","name":"initialDefaultTokenURI","type":"string"},{"internalType":"string","name":"initialGenesisTokenURI","type":"string"}],"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":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"CanReserveWithoutBeingWhitelistedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"DefaultTokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"priceOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"serviceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"GenesisTokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"toBeOperatorAccount","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"toBeRemovedOperatorAccount","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"PricePerTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"returnedValue","type":"uint256"}],"name":"Returned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"RoyaltyPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newRoyaltyWallet","type":"address"}],"name":"RoyaltyWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"ServiceFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"oldValue","type":"int256"},{"indexed":false,"internalType":"int256","name":"newValue","type":"int256"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"TokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"nrOfTokensToReserve","type":"uint256"}],"name":"TokensReserved","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":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxNrOfTokensToObtain","type":"uint256"}],"name":"WhitelistedAccountAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAccountRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DISTRIBUTION_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKED_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NR_TOKENS_PER_ACCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVATIONS_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVATION_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELISTING_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeOperatorAccount","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"listOfMaxNrOfTokensToObtain","type":"uint256[]"}],"name":"addToWhitelistedAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"advanceStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canReserveWithoutBeingWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrOfReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrOfWhitelistedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrPreMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nr","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeFromWhitelistedAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeRemovedOperatorAccount","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nrOfTokensToReserve","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"listOfNrOfTokensToReserve","type":"uint256[]"}],"name":"reserveTokensForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"retreatStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"setCanReserveWithoutBeingWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"setDefaultTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"setGenesisTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setPricePerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"newRoyaltyWallet","type":"address"}],"name":"setRoyaltyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"newTokenURIs","type":"string[]"}],"name":"updateTokenURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"whitelistedNrOfTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620061fb380380620061fb8339810160408190526200003491620006a3565b8551869086906200004d9060009060208501906200056d565b508051620000639060019060208401906200056d565b5050506001600160a01b038716620000985760405162461bcd60e51b81526004016200008f9062000c7c565b60405180910390fd5b6000876001600160a01b0316803b806020016040519081016040528181526000908060200190933c5111620000e15760405162461bcd60e51b81526004016200008f9062000c58565b60008411620001045760405162461bcd60e51b81526004016200008f9062000cd6565b6000825111620001285760405162461bcd60e51b81526004016200008f9062000cc4565b60008151116200014c5760405162461bcd60e51b81526004016200008f9062000c8e565b600a80546001600160a01b0319166001600160a01b038916179055600b8490556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90620001a59033906000908190899062000b7e565b60405180910390a1600c8390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90620001eb9033906000908190889062000b7e565b60405180910390a181516200020890600d9060208501906200056d565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de1336000600d604051620002409392919062000bf7565b60405180910390a160016007819055600855600060098190556012819055601381905560108190556040517f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad5916200029f913391908190819062000b7e565b60405180910390a1620002b56000308162000413565b620002c260008262000500565b600160096000828254620002d7919062000d5a565b90915550506040517ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a89062000313903390600090859062000bc4565b60405180910390a1600e80546001600160a01b0319163017908190556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d91620003719133916000916001600160a01b03919091169062000b22565b60405180910390a1600a600f8190556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e91620003b591339160009162000c2a565b60405180910390a16014805460ff191690556040517f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890620003fe903390600090819062000b50565b60405180910390a15050505050505062000e92565b6001600160a01b0382166200043c5760405162461bcd60e51b81526004016200008f9062000cb2565b620004478162000550565b15620004675760405162461bcd60e51b81526004016200008f9062000c6a565b620004748383836200054b565b6001600160a01b03821660009081526003602052604081208054600192906200049f90849062000d5a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6200050b8262000550565b6200052a5760405162461bcd60e51b81526004016200008f9062000ca0565b600082815260066020908152604090912082516200054b928401906200056d565b505050565b6000908152600260205260409020546001600160a01b0316151590565b8280546200057b9062000df0565b90600052602060002090601f0160209004810192826200059f5760008555620005ea565b82601f10620005ba57805160ff1916838001178555620005ea565b82800160010185558215620005ea579182015b82811115620005ea578251825591602001919060010190620005cd565b50620005f8929150620005fc565b5090565b5b80821115620005f85760008155600101620005fd565b60006200062a620006248462000d14565b62000ce8565b9050828152602081018484840111156200064357600080fd5b6200065084828562000dbd565b509392505050565b8051620006658162000e6d565b92915050565b600082601f8301126200067c578081fd5b81516200068e84826020860162000613565b949350505050565b8051620006658162000e87565b600080600080600080600060e0888a031215620006be578283fd5b620006cc89848a0162000658565b60208901519097506001600160401b03811115620006e8578384fd5b620006f68a828b016200066b565b60408a015190975090506001600160401b0381111562000714578384fd5b620007228a828b016200066b565b9550506060620007358a828b0162000696565b9450506080620007488a828b0162000696565b60a08a015190945090506001600160401b0381111562000766578283fd5b620007748a828b016200066b565b60c08a015190935090506001600160401b0381111562000792578182fd5b620007a08a828b016200066b565b91505092959891949750929550565b620007ba8162000d8f565b82525050565b620007ba8162000d9c565b620007ba8162000da1565b620007ba8162000db0565b6000620007ee8262000d4d565b620007fa818562000d51565b93506200080c81856020860162000dbd565b620008178162000e63565b9093019392505050565b60008154620008308162000df0565b6200083c818662000d51565b94506001821680156200085857600181146200086b576200089d565b60ff19831686526020860193506200089d565b620008768562000d41565b60005b83811015620008975781548882015260019091019060200162000879565b87019450505b50505092915050565b6000620008b560358362000d51565b7f617274655141727444726f703a206e6f6e2d636f6e7472616374206163636f75918101919091527f6e7420666f722061646d696e20636f6e747261637400000000000000000000006020820152604001919050565b60006200091a601c8362000d51565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b600062000959602b8362000d51565b7f617274655141727444726f703a2061646d696e20636f6e74726163742063616e918101919091526a6e6f74206265207a65726f60a81b6020820152604001919050565b6000620009ac60278362000d51565b7f617274655141727444726f703a20696e76616c69642067656e6573697320746f91810191909152666b656e2075726960c81b6020820152604001919050565b6000620009fb602e8362000d51565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091526d32bc34b9ba32b73a103a37b5b2b760911b6020820152604001919050565b600062000a5160208362000d51565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b600062000a9060278362000d51565b7f617274655141727444726f703a20696e76616c69642064656661756c7420746f91810191909152666b656e2075726960c81b6020820152604001919050565b600062000adf602a8362000d51565b7f617274655141727444726f703a207a65726f20696e697469616c2070726963659181019190915269103832b9103a37b5b2b760b11b6020820152604001919050565b6060810162000b328286620007af565b62000b416020830185620007d6565b6200068e6040830184620007af565b6060810162000b608286620007af565b62000b6f6020830185620007d6565b6200068e6040830184620007c0565b6080810162000b8e8287620007af565b62000b9d6020830186620007d6565b62000bac6040830185620007d6565b62000bbb6060830184620007cb565b95945050505050565b6060810162000bd48286620007af565b62000be36020830185620007d6565b818103604083015262000bbb8184620007e1565b6060810162000c078286620007af565b62000c166020830185620007d6565b818103604083015262000bbb818462000821565b6060810162000c3a8286620007af565b62000c496020830185620007d6565b6200068e6040830184620007cb565b602080825281016200066581620008a6565b6020808252810162000665816200090b565b6020808252810162000665816200094a565b6020808252810162000665816200099d565b602080825281016200066581620009ec565b60208082528101620006658162000a42565b60208082528101620006658162000a81565b60208082528101620006658162000ad0565b6040518181016001600160401b038111828210171562000d0c5762000d0c62000e4d565b604052919050565b60006001600160401b0382111562000d305762000d3062000e4d565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b600062000d678262000da1565b915062000d748362000da1565b9250821982111562000d8a5762000d8a62000e21565b500190565b6000620006658262000da4565b151590565b90565b6001600160a01b031690565b6000620006658262000da1565b60005b8381101562000dda57818101518382015260200162000dc0565b8381111562000dea576000848401525b50505050565b60028104600182168062000e0557607f821691505b6020821081141562000e1b5762000e1b62000e37565b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b62000e788162000d8f565b811462000e8457600080fd5b50565b62000e788162000da1565b6153598062000ea26000396000f3fe60806040526004361061032d5760003560e01c80637b8e7710116101a5578063a22cb465116100ec578063bf71113a11610095578063d031370b1161006f578063d031370b146108bd578063e1217108146108d0578063e8755d00146108e5578063e985e9c51461090557610353565b8063bf71113a14610873578063c040e6b814610888578063c87b56dd1461089d57610353565b8063b15f00d5116100c6578063b15f00d514610813578063b735b1ec14610833578063b88d4fde1461085357610353565b8063a22cb465146107b3578063a76089ee146107d3578063ac1251e0146107f357610353565b80638ad433ac1161014e57806395d89b411161012857806395d89b4114610774578063960a021414610789578063963bfe121461079e57610353565b80638ad433ac1461071f5780638b4627c61461073f578063954a21881461075f57610353565b806388b8178e1161017f57806388b8178e146106e05780638a71bb2d146106f55780638abdf5aa1461070a57610353565b80637b8e77101461068b5780637d46a713146106a057806383045b68146106c057610353565b80632a55205a11610274578063454f98581161021d5780636508da03116101f75780636508da03146106215780636d70f7ae1461063657806370a08231146106565780637b1b1de61461067657610353565b8063454f9858146105cc5780636352211e146105ec5780636454aa8d1461060c57610353565b80633f0d2ec11161024e5780633f0d2ec11461057757806341d6f9c21461058c57806342842e0e146105ac57610353565b80632a55205a146105095780632ccb1b30146105375780632e534dff1461055757610353565b80630c06b056116102d657806319350e10116102b057806319350e10146104b45780632246f98b146104d457806323b872dd146104e957610353565b80630c06b056146104545780630d18d07a146104745780631018d8c41461049457610353565b8063081812fc11610307578063081812fc146103e5578063095ea7b314610412578063096f4ccb1461043457610353565b806301ffc9a71461036b57806306fdde03146103a15780630748c178146103c357610353565b366103535760405162461bcd60e51b815260040161034a90614ea0565b60405180910390fd5b60405162461bcd60e51b815260040161034a90614ea0565b34801561037757600080fd5b5061038b610386366004613354565b610925565b6040516103989190614b83565b60405180910390f35b3480156103ad57600080fd5b506103b6610983565b6040516103989190614b9f565b3480156103cf57600080fd5b506103d8610a15565b6040516103989190614b91565b3480156103f157600080fd5b5061040561040036600461338e565b610a2b565b60405161039891906149d0565b34801561041e57600080fd5b5061043261042d366004613235565b610a6e565b005b34801561044057600080fd5b5061043261044f3660046133c9565b610b06565b34801561046057600080fd5b5061043261046f366004613298565b610bbb565b34801561048057600080fd5b5061043261048f3660046133ab565b610de6565b3480156104a057600080fd5b506103d86104af3660046130f1565b610e94565b3480156104c057600080fd5b506104326104cf3660046132f6565b610f01565b3480156104e057600080fd5b506103d86110b1565b3480156104f557600080fd5b50610432610504366004613146565b6110b6565b34801561051557600080fd5b5061052961052436600461342c565b6110ee565b604051610398929190614a65565b34801561054357600080fd5b50610432610552366004613235565b611124565b34801561056357600080fd5b5061043261057236600461338e565b611283565b34801561058357600080fd5b5061040561136b565b34801561059857600080fd5b506104326105a736600461342c565b61137a565b3480156105b857600080fd5b506104326105c7366004613146565b6113d5565b3480156105d857600080fd5b506104326105e736600461338e565b6113f0565b3480156105f857600080fd5b5061040561060736600461338e565b611467565b34801561061857600080fd5b506103d86114bd565b34801561062d57600080fd5b506103d86114c2565b34801561064257600080fd5b5061038b6106513660046130f1565b6114c7565b34801561066257600080fd5b506103d86106713660046130f1565b6114e5565b34801561068257600080fd5b506103d861150a565b34801561069757600080fd5b506103d8611510565b3480156106ac57600080fd5b506104326106bb3660046133ab565b611515565b3480156106cc57600080fd5b506104326106db366004613298565b6115c2565b3480156106ec57600080fd5b506103d8611836565b34801561070157600080fd5b506103d861183c565b34801561071657600080fd5b506103d8611842565b34801561072b57600080fd5b5061043261073a36600461338e565b611848565b34801561074b57600080fd5b5061043261075a3660046133e7565b611919565b34801561076b57600080fd5b506103d8611999565b34801561078057600080fd5b506103b661199f565b34801561079557600080fd5b5061038b6119ae565b3480156107aa57600080fd5b506103b66119b7565b3480156107bf57600080fd5b506104326107ce366004613207565b6119c6565b3480156107df57600080fd5b506104326107ee366004613263565b611a94565b3480156107ff57600080fd5b5061043261080e36600461342c565b611c27565b34801561081f57600080fd5b5061043261082e3660046133e7565b611d06565b34801561083f57600080fd5b5061043261084e3660046133ab565b611db5565b34801561085f57600080fd5b5061043261086e366004613191565b611e38565b34801561087f57600080fd5b506103d8611e77565b34801561089457600080fd5b506103d8611e7c565b3480156108a957600080fd5b506103b66108b836600461338e565b611e82565b6104326108cb36600461338e565b612056565b3480156108dc57600080fd5b506103d86122e9565b3480156108f157600080fd5b5061043261090036600461342c565b6122ef565b34801561091157600080fd5b5061038b61092036600461310e565b612393565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061097b575061097b826123c3565b90505b919050565b60606000805461099290615212565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90615212565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b60006001600854610a26919061516e565b905090565b6000610a3682612465565b610a525760405162461bcd60e51b815260040161034a90614dd0565b506000908152600460205260409020546001600160a01b031690565b6000610a7982612482565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161034a90614e60565b806001600160a01b0316610abf6124b7565b6001600160a01b03161480610adb5750610adb816109206124b7565b610af75760405162461bcd60e51b815260040161034a90614d30565b610b0183836124bb565b505050565b6014805460ff191682151517905560405182907f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890610b4a90339084908690614aa8565b60405180910390a1600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b50505050505050565b33600090815260156020526040902054610be75760405162461bcd60e51b815260040161034a90614c50565b60036010541480610bfa57506004601054145b610c165760405162461bcd60e51b815260040161034a90614df0565b6000825111610c375760405162461bcd60e51b815260040161034a90614c30565b6000815111610c585760405162461bcd60e51b815260040161034a90614c30565b8051825114610c795760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610ca757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000838381518110610cd357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b03161415610d105760405162461bcd60e51b815260040161034a90614c90565b60145460ff168015610d3857506001600160a01b038216600090815260116020526040902054155b15610d5a576001600160a01b0382166000908152601160205260409020600590555b6001600160a01b038216600090815260116020526040902054610d8f5760405162461bcd60e51b815260040161034a90614bb0565b6001600160a01b038216600090815260116020526040902054811115610dc75760405162461bcd60e51b815260040161034a90614be0565b610dd18282612536565b50508080610dde9061523f565b915050610c7c565b816001600160a01b038216610e0d5760405162461bcd60e51b815260040161034a90614e50565b6001600160a01b038216600090815260156020526040902054600114610e455760405162461bcd60e51b815260040161034a90614ec0565b6001600160a01b03821660009081526015602052604080822091909155517fc57d50f4db59caf96f35b762a67c51826b60c25014200dbc625849eda5ebeafe90610b4a90339086908690614a80565b60145460009060ff16610ec057506001600160a01b03811660009081526011602052604090205461097e565b6001600160a01b038216600090815260116020526040902054610ee55750600561097e565b506001600160a01b031660009081526011602052604090205490565b33600090815260156020526040902054610f2d5760405162461bcd60e51b815260040161034a90614c50565b600460105414610f4f5760405162461bcd60e51b815260040161034a90614c10565b6000825111610f705760405162461bcd60e51b815260040161034a90614c30565b6000815111610f915760405162461bcd60e51b815260040161034a90614c30565b8051825114610fb25760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610fe057634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061100c57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600082116110365760405162461bcd60e51b815260040161034a90614f30565b60008151116110575760405162461bcd60e51b815260040161034a90614d10565b61106182826126d1565b7f8b781fcc9d1a958b4e7e04390a81f45bdec2dc61341e7b423a537074275dc70d33838360405161109493929190614b0e565b60405180910390a1505080806110a99061523f565b915050610fb5565b600381565b6110c76110c16124b7565b82612715565b6110e35760405162461bcd60e51b815260040161034a90614e80565b610b0183838361279a565b60008060006064600f548561110391906150af565b61110d9190615085565b600e546001600160a01b0316969095509350505050565b336000908152601560205260409020546111505760405162461bcd60e51b815260040161034a90614c50565b6001600160a01b0382166111765760405162461bcd60e51b815260040161034a90614e00565b600081116111965760405162461bcd60e51b815260040161034a90614d20565b478111156111b65760405162461bcd60e51b815260040161034a90614ef0565b604080516000808252602082019092526001600160a01b0384169083906040516111e091906149ac565b60006040518083038185875af1925050503d806000811461121d576040519150601f19603f3d011682016040523d82523d6000602084013e611222565b606091505b50509050806112435760405162461bcd60e51b815260040161034a90614d90565b7fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb338484604051611276939291906149f9565b60405180910390a1505050565b60108054829160019060006112988385614fd2565b9091555050601054600514156112b25760006010556112c3565b601054600114156112c35760026010555b7f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff92906113359033908590600401614a65565b600060405180830381600087803b15801561134f57600080fd5b505af1158015611363573d6000803e3d6000fd5b505050505050565b600e546001600160a01b031690565b81604b82111561139c5760405162461bcd60e51b815260040161034a90614bd0565b600f8290556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e90610b4a90339086908690614b68565b610b0183838360405180602001604052806000815250611e38565b601080548291600190600061140583856150e4565b909155505060105460001914156114205760046010556112c3565b601054600114156112c35760006010557f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b600061147282612465565b156114875761148082612482565b905061097e565b60018210158015611499575060085482105b156114a557503061097e565b60405162461bcd60e51b815260040161034a90614cc0565b600481565b600281565b6001600160a01b031660009081526015602052604090205460011490565b60006001600160a01b038216301415611501575060095461097e565b61097b826128d4565b600b5490565b600081565b816001600160a01b03821661153c5760405162461bcd60e51b815260040161034a90614d40565b6001600160a01b038216600090815260156020526040902054156115725760405162461bcd60e51b815260040161034a90614e10565b6001600160a01b0382166000908152601560205260409081902060019055517f99e4b7a7ced34a944c9792d0cd08b555d2a3f0db9bd4e8fa401d6e3c9fb621fc90610b4a90339086908690614a80565b336000908152601560205260409020546115ee5760405162461bcd60e51b815260040161034a90614c50565b6002601054146116105760405162461bcd60e51b815260040161034a90614cf0565b60008251116116315760405162461bcd60e51b815260040161034a90614c30565b60008151116116525760405162461bcd60e51b815260040161034a90614c30565b80518251146116735760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b015760008382815181106116a157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106116cd57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b0316141561170a5760405162461bcd60e51b815260040161034a90614ce0565b6001811015801561171c575060058111155b6117385760405162461bcd60e51b815260040161034a90614f20565b816001600160a01b0316803b806020016040519081016040528181526000908060200190933c511561177c5760405162461bcd60e51b815260040161034a90614e70565b6001600160a01b038216600090815260116020526040902054156117b25760405162461bcd60e51b815260040161034a90614de0565b6001600160a01b038216600090815260116020526040812082905560128054600192906117e090849061505c565b90915550506040517f446ecc2d2851a96cb2b0265c02cbb648b2d913382f9f98dd8e923e1277e1571f90611819903390859085906149f9565b60405180910390a15050808061182e9061523f565b915050611676565b61271081565b600f5490565b600c5490565b336000908152601560205260409020546118745760405162461bcd60e51b815260040161034a90614c50565b60005b818110156118fe5761271060085411156118a35760405162461bcd60e51b815260040161034a90614ca0565b60085460405130906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600860008282546118e6919061505c565b909155508190506118f68161523f565b915050611877565b508060096000828254611911919061505c565b909155505050565b601054156119395760405162461bcd60e51b815260040161034a90614c60565b81600082511161195b5760405162461bcd60e51b815260040161034a90614d10565b6119666000836126d1565b7ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a8338484604051610b4a93929190614b0e565b60135490565b60606001805461099290615212565b60145460ff1690565b6060600d805461099290615212565b6119ce6124b7565b6001600160a01b0316826001600160a01b031614156119ff5760405162461bcd60e51b815260040161034a90614c80565b8060056000611a0c6124b7565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a506124b7565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190614b83565b60405180910390a35050565b33600090815260156020526040902054611ac05760405162461bcd60e51b815260040161034a90614c50565b600260105414611ae25760405162461bcd60e51b815260040161034a90614cf0565b6000815111611b035760405162461bcd60e51b815260040161034a90614c30565b60005b8151811015611c23576000828281518110611b3157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611b6e5760405162461bcd60e51b815260040161034a90614f10565b6001600160a01b038116600090815260116020526040902054611ba35760405162461bcd60e51b815260040161034a90614f00565b6001600160a01b03811660009081526011602052604081208190556012805460019290611bd190849061516e565b90915550506040517f38659fb1f550e06bc69d12bed51d9be3a02f37b36bf36eae35b87ae438353d3d90611c0890339084906149de565b60405180910390a15080611c1b8161523f565b915050611b06565b5050565b600160105413611c495760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611c6c5760405162461bcd60e51b815260040161034a90614bf0565b8160008211611c8d5760405162461bcd60e51b815260040161034a90614ee0565b600b8054908390556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90611ccb903390879085908890614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600160105413611d285760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611d4b5760405162461bcd60e51b815260040161034a90614bf0565b816000825111611d6d5760405162461bcd60e51b815260040161034a90614d10565b8151611d8090600d906020850190612e64565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de13384600d604051610b4a93929190614b3b565b816001600160a01b038216611ddc5760405162461bcd60e51b815260040161034a90614c40565b600e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d90610b4a90339086908690614a80565b611e49611e436124b7565b83612715565b611e655760405162461bcd60e51b815260040161034a90614e80565b611e7184848484612918565b50505050565b600581565b60105490565b6060611e8d82612465565b15611f95576000611e9d8361294b565b60408051808201909152601181527f44454641554c545f544f4b454e5f5552490000000000000000000000000000006020918201528151908201209091507fdab376b119f20c9aada0a9f71c7ad4b725b4bf4a650ecfe7a8e84eacf2d9d6b9141561148057600d8054611f0f90615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3b90615212565b8015611f885780601f10611f5d57610100808354040283529160200191611f88565b820191906000526020600020905b815481529060010190602001808311611f6b57829003601f168201915b505050505091505061097e565b60018210158015611fa7575060085482105b1561203e57600d8054611fb990615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe590615212565b80156120325780601f1061200757610100808354040283529160200191612032565b820191906000526020600020905b81548152906001019060200180831161201557829003601f168201915b5050505050905061097e565b60405162461bcd60e51b815260040161034a90614e40565b6003601054148061206957506004601054145b6120855760405162461bcd60e51b815260040161034a90614df0565b600034116120a55760405162461bcd60e51b815260040161034a90614d80565b600081116120c55760405162461bcd60e51b815260040161034a90614d00565b60145460ff1680156120e4575033600090815260116020526040902054155b156120fd57336000908152601160205260409020600590555b336000908152601160205260409020546121295760405162461bcd60e51b815260040161034a90614bb0565b336000908152601160205260409020548111156121585760405162461bcd60e51b815260040161034a90614be0565b61271081601354612169919061505c565b11156121875760405162461bcd60e51b815260040161034a90614eb0565b6000600b548261219791906150af565b90506000600c54826121a9919061505c565b9050803410156121cb5760405162461bcd60e51b815260040161034a90614cb0565b60006121d7823461516e565b905080156122a057604080516000808252602082019092523390839060405161220091906149ac565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b50509050806122635760405162461bcd60e51b815260040161034a90614e90565b7f9968789f2b0cc53b435225867b7d718de6eebc4b48088763c07439fb172865be333384604051612296939291906149f9565b60405180910390a1505b7f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada33384600c54856040516122d79493929190614ad0565b60405180910390a1611e713385612536565b60125490565b6001601054136123115760405162461bcd60e51b815260040161034a90614ed0565b600360105414156123345760405162461bcd60e51b815260040161034a90614bf0565b81600082116123555760405162461bcd60e51b815260040161034a90614ee0565b600c8054908390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90611ccb903390879085908890614ad0565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061245657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061097b575061097b82612a64565b6000908152600260205260409020546001600160a01b0316151590565b6000818152600260205260408120546001600160a01b03168061097b5760405162461bcd60e51b815260040161034a90614d60565b3390565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124fd82612482565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60015b8181116125f65760075461254e308583612aae565b61258d816040518060400160405280601181526020017f44454641554c545f544f4b454e5f5552490000000000000000000000000000008152506126d1565b6001600760008282546125a0919061505c565b909155505060135461271010156125c95760405162461bcd60e51b815260040161034a90614eb0565b6001601360008282546125dc919061505c565b909155508291506125ee90508161523f565b915050612539565b50806001600954612607919061516e565b111561262a57806009600082825461261f919061516e565b909155506126309050565b60016009555b600160095410156126535760405162461bcd60e51b815260040161034a90614dc0565b6001600160a01b0382166000908152601160205260408120805483929061267b90849061516e565b90915550506001600160a01b03821660005260116020527fbdf1d6c0740e266493fa759ede2b8a30466a9d030811c565b76aff5d9b6f66c83383836040516126c5939291906149f9565b60405180910390a15050565b6126da82612465565b6126f65760405162461bcd60e51b815260040161034a90614d70565b60008281526006602090815260409091208251610b0192840190612e64565b600061272082612465565b61273c5760405162461bcd60e51b815260040161034a90614cd0565b600061274783612482565b9050806001600160a01b0316846001600160a01b031614806127825750836001600160a01b031661277784610a2b565b6001600160a01b0316145b8061279257506127928185612393565b949350505050565b826001600160a01b03166127ad82612482565b6001600160a01b0316146127d35760405162461bcd60e51b815260040161034a90614e20565b6001600160a01b0382166127f95760405162461bcd60e51b815260040161034a90614c70565b612804838383610b01565b61280f6000826124bb565b6001600160a01b038316600090815260036020526040812080546001929061283890849061516e565b90915550506001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0382166128fc5760405162461bcd60e51b815260040161034a90614d50565b506001600160a01b031660009081526003602052604090205490565b61292384848461279a565b61292f84848484612b2e565b611e715760405162461bcd60e51b815260040161034a90614c00565b606061295682612465565b6129725760405162461bcd60e51b815260040161034a90614db0565b6000828152600660205260408120805461298b90615212565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615212565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b505050505090506000612a15612c7a565b9050805160001415612a295750905061097e565b815115612a5b578082604051602001612a439291906149b8565b6040516020818303038152906040529250505061097e565b61279284612c8c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6001600160a01b038216612ad45760405162461bcd60e51b815260040161034a90614da0565b612add81612465565b15612afa5760405162461bcd60e51b815260040161034a90614c20565b612b05838383610b01565b6001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b6000612b42846001600160a01b0316612d0f565b15612c6f57836001600160a01b031663150b7a02612b5e6124b7565b8786866040518563ffffffff1660e01b8152600401612b809493929190614a21565b602060405180830381600087803b158015612b9a57600080fd5b505af1925050508015612bca575060408051601f3d908101601f19168201909252612bc791810190613371565b60015b612c24573d808015612bf8576040519150601f19603f3d011682016040523d82523d6000602084013e612bfd565b606091505b508051612c1c5760405162461bcd60e51b815260040161034a90614c00565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612792565b506001949350505050565b60408051602081019091526000815290565b6060612c9782612465565b612cb35760405162461bcd60e51b815260040161034a90614e30565b6000612cbd612c7a565b90506000815111612cdd5760405180602001604052806000815250612d08565b80612ce784612d15565b604051602001612cf89291906149b8565b6040516020818303038152906040525b9392505050565b3b151590565b606081612d56575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261097e565b8160005b8115612d805780612d6a8161523f565b9150612d799050600a83615085565b9150612d5a565b60008167ffffffffffffffff811115612da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dd3576020820181803683370190505b5090505b841561279257612de860018361516e565b9150612df5600a86615265565b612e0090603061505c565b60f81b818381518110612e2357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e5d600a86615085565b9450612dd7565b828054612e7090615212565b90600052602060002090601f016020900481019282612e925760008555612ed8565b82601f10612eab57805160ff1916838001178555612ed8565b82800160010185558215612ed8579182015b82811115612ed8578251825591602001919060010190612ebd565b50612ee4929150612ee8565b5090565b5b80821115612ee45760008155600101612ee9565b6000612f10612f0b84614f6a565b614f40565b90508083825260208201905082856020860285011115612f2f57600080fd5b60005b85811015612f5957612f44878361303a565b83526020928301929190910190600101612f32565b5050509392505050565b6000612f71612f0b84614f6a565b8381529050602081018260005b85811015612f595781358501612f9488826130c6565b8452506020928301929190910190600101612f7e565b6000612fb8612f0b84614f6a565b90508083825260208201905082856020860285011115612fd757600080fd5b60005b85811015612f5957612fec87836130e6565b83526020928301929190910190600101612fda565b600061300f612f0b84614f8e565b90508281526020810184848401111561302757600080fd5b6130328482856151da565b509392505050565b80356123bd816152f1565b600082601f830112613055578081fd5b8135612792848260208601612efd565b600082601f830112613075578081fd5b8135612792848260208601612f63565b600082601f830112613095578081fd5b8135612792848260208601612faa565b80356123bd81615308565b80356123bd81615311565b80516123bd81615311565b600082601f8301126130d6578081fd5b8135612792848260208601613001565b80356123bd8161531a565b600060208284031215613102578081fd5b612d088382840161303a565b60008060408385031215613120578081fd5b61312c8482850161303a565b9150602061313c8582860161303a565b9150509250929050565b60008060006060848603121561315a578081fd5b6131668582860161303a565b925060206131768682870161303a565b9250506040613187868287016130e6565b9150509250925092565b600080600080608085870312156131a6578081fd5b6131b28682870161303a565b935060206131c28782880161303a565b93505060406131d3878288016130e6565b925050606085013567ffffffffffffffff8111156131ef578182fd5b6131fb878288016130c6565b91505092959194509250565b60008060408385031215613219578182fd5b6132258483850161303a565b9150602061313c858286016130a5565b60008060408385031215613247578182fd5b6132538483850161303a565b9150602061313c858286016130e6565b600060208284031215613274578081fd5b8082013567ffffffffffffffff81111561328c578182fd5b61279284828501613045565b600080604083850312156132aa578182fd5b8183013567ffffffffffffffff8111156132c2578283fd5b6132ce85828601613045565b925050602083013567ffffffffffffffff8111156132ea578182fd5b61313c85828601613085565b60008060408385031215613308578182fd5b8183013567ffffffffffffffff811115613320578283fd5b61332c85828601613085565b925050602083013567ffffffffffffffff811115613348578182fd5b61313c85828601613065565b600060208284031215613365578081fd5b612d08838284016130b0565b600060208284031215613382578081fd5b612d08838284016130bb565b60006020828403121561339f578081fd5b612d08838284016130e6565b600080604083850312156133bd578182fd5b61312c848385016130e6565b600080604083850312156133db578182fd5b613225848385016130e6565b600080604083850312156133f9578182fd5b613405848385016130e6565b9150602083013567ffffffffffffffff811115613420578182fd5b61313c858286016130c6565b6000806040838503121561343e578182fd5b613253848385016130e6565b61345381615196565b82525050565b613453816151a1565b600061346d82614fc5565b6134778185614fc9565b93506134878185602086016151e6565b613490816152e7565b9093019392505050565b60006134a582614fc5565b6134af818561097e565b93506134bf8185602086016151e6565b9290920192915050565b613453816151cb565b600081546134df81615212565b6134e98186614fc9565b9450600182168015613502576001811461351457613542565b60ff1983168652602086019350613542565b61351d85614fb9565b60005b8381101561353c57815488820152600190910190602001613520565b87019450505b50505092915050565b6000613558602783614fc9565b7f617274655141727444726f703a206e6f7420612077686974656c697374656420918101919091527f6163636f756e74000000000000000000000000000000000000000000000000006020820152604001919050565b60006135bb601f83614fc9565b7f617274655141727444726f703a20646966666572656e74206c656e677468730091810191909152602001919050565b60006135f8602883614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207065918101919091527f7263656e746167650000000000000000000000000000000000000000000000006020820152604001919050565b600061365b603183614fc9565b7f617274655141727444726f703a20657863656564696e67207468652072657365918101919091527f72766174696f6e20616c6c6f77616e63650000000000000000000000000000006020820152604001919050565b60006136be603683614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2061918101919091527f206e6f6e2d7265736572766174696f6e207374616765000000000000000000006020820152604001919050565b6000613721603283614fc9565b7f4552433732313a207472616e7366657220746f206e6f6e204552433732315265918101919091527f63656976657220696d706c656d656e74657200000000000000000000000000006020820152604001919050565b6000613784603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2064918101919091527f6973747269627574696f6e2073746167650000000000000000000000000000006020820152604001919050565b60006137e7601c83614fc9565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b6000613824601983614fc9565b7f617274655141727444726f703a207a65726f206c656e6774680000000000000091810191909152602001919050565b6000613861602483614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207761918101919091527f6c6c6574000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006138c4602583614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f72206163918101919091527f636f756e740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613927602b83614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206c918101919091527f6f636b65642073746167650000000000000000000000000000000000000000006020820152604001919050565b600061398a602483614fc9565b7f4552433732313a207472616e7366657220746f20746865207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006139ed601983614fc9565b7f4552433732313a20617070726f766520746f2063616c6c65720000000000000091810191909152602001919050565b6000613a2a602483614fc9565b7f617274655141727444726f703a2063616e6e6f74206265207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613a8d602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207072652d6d696e74206d6f918101919091527f72650000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613af0602083614fc9565b7f617274655141727444726f703a20696e73756666696369656e742066756e647391810191909152602001919050565b6000613b2d602583614fc9565b7f617274655141727444726f703a20746f6b656e20697320646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613b90602c83614fc9565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b6000613bf3602b83614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c697374207a918101919091527f65726f20616464726573730000000000000000000000000000000000000000006020820152604001919050565b6000613c56603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2077918101919091527f686974656c697374696e672073746167650000000000000000000000000000006020820152604001919050565b6000613cb9602483614fc9565b7f617274655141727444726f703a207a65726f20746f6b656e7320746f20726573918101919091527f65727665000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613d1c601a83614fc9565b7f617274655141727444726f703a20656d70747920737472696e6700000000000091810191909152602001919050565b6000613d59602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207472616e73666572207a65918101919091527f726f0000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613dbc603883614fc9565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f77918101919091527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020820152604001919050565b6000613e1f602983614fc9565b7f617274655141727444726f703a2063616e6e6f7420736574207a65726f206173918101919091527f206f70657261746f7200000000000000000000000000000000000000000000006020820152604001919050565b6000613e82602a83614fc9565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65918101919091527f726f2061646472657373000000000000000000000000000000000000000000006020820152604001919050565b6000613ee5602983614fc9565b7f4552433732313a206f776e657220717565727920666f72206e6f6e6578697374918101919091527f656e7420746f6b656e00000000000000000000000000000000000000000000006020820152604001919050565b6000613f48602e83614fc9565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020820152604001919050565b6000613fab601883614fc9565b7f617274655141727444726f703a207a65726f2066756e6473000000000000000091810191909152602001919050565b6000613fe8602083614fc9565b7f617274655141727444726f703a206661696c656420746f207472616e7366657291810191909152602001919050565b6000614025602083614fc9565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b6000614062603183614fc9565b7f45524337323155524953746f726167653a2055524920717565727920666f7220918101919091527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020820152604001919050565b60006140c5602b83614fc9565b7f617274655141727444726f703a20636f6e74726163742062616c616e63652077918101919091527f656e742062656c6f7720310000000000000000000000000000000000000000006020820152604001919050565b6000614128602c83614fc9565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b600061418b602183614fc9565b7f617274655141727444726f703a20616c72656164792077686974656c69737465918101919091527f64000000000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006141ee604183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2072918101919091527f65736572766174696f6e20616e6420646973747269627574696f6e207374616760208201527f65000000000000000000000000000000000000000000000000000000000000006040820152606001919050565b6000614277602383614fc9565b7f617274655141727444726f703a207461726765742063616e6e6f74206265207a918101919091527f65726f00000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006142da602183614fc9565b7f617274655141727444726f703a20616c726561647920616e206f70657261746f91810191909152603960f91b6020820152604001919050565b6000614321602983614fc9565b7f4552433732313a207472616e73666572206f6620746f6b656e20746861742069918101919091527f73206e6f74206f776e00000000000000000000000000000000000000000000006020820152604001919050565b6000614384602f83614fc9565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f918101919091527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020820152604001919050565b60006143e7602583614fc9565b7f617274655141727444726f703a20746f6b656e20696420646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b600061444a602c83614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f206173206f70657261746f7200000000000000000000000000000000000000006020820152604001919050565b60006144ad602183614fc9565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6591810191909152603960f91b6020820152604001919050565b60006144f4602983614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c6973742061918101919091527f20636f6e747261637400000000000000000000000000000000000000000000006020820152604001919050565b6000614557603183614fc9565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f918101919091527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020820152604001919050565b60006145ba602a83614fc9565b7f617274655141727444726f703a206661696c656420746f2073656e6420746865918101919091527f2072656d61696e646572000000000000000000000000000000000000000000006020820152604001919050565b600061461d602183614fc9565b7f617274655141727444726f703a2063616e6e6f7420616363657074206574686591810191909152603960f91b6020820152604001919050565b6000614664603283614fc9565b7f617274655141727444726f703a20657863656564696e67206d6178206e756d62918101919091527f6572206f66207265736572766174696f6e7300000000000000000000000000006020820152604001919050565b60006146c7601d83614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f7200000091810191909152602001919050565b6000614704603083614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206e918101919091527f6f742d6c6f636b656420737461676573000000000000000000000000000000006020820152604001919050565b6000614767602683614fc9565b7f617274655141727444726f703a206e65772070726963652063616e6e6f742062918101919091527f65207a65726f00000000000000000000000000000000000000000000000000006020820152604001919050565b60006147ca602883614fc9565b7f617274655141727444726f703a207472616e73666572206d6f7265207468616e918101919091527f2062616c616e63650000000000000000000000000000000000000000000000006020820152604001919050565b600061482d602883614fc9565b7f617274655141727444726f703a206163636f756e74206973206e6f7420776869918101919091527f74656c69737465640000000000000000000000000000000000000000000000006020820152604001919050565b6000614890602883614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f20616464726573730000000000000000000000000000000000000000000000006020820152604001919050565b60006148f3602c83614fc9565b7f617274655141727444726f703a20696e76616c6964206e72206f6620746f6b65918101919091527f6e7320746f206f627461696e00000000000000000000000000000000000000006020820152604001919050565b6000614956602883614fc9565b7f617274655141727444726f703a2063616e6e6f7420616c7465722067656e6573918101919091527f697320746f6b656e0000000000000000000000000000000000000000000000006020820152604001919050565b6000612d08828461349a565b60006149c4828561349a565b9150612792828461349a565b602081016123bd828461344a565b604081016149ec828561344a565b612d08602083018461344a565b60608101614a07828661344a565b614a14602083018561344a565b61279260408301846134c9565b60808101614a2f828761344a565b614a3c602083018661344a565b614a4960408301856134c9565b8181036060830152614a5b8184613462565b9695505050505050565b60408101614a73828561344a565b612d0860208301846134c9565b60608101614a8e828661344a565b614a9b60208301856134c9565b612792604083018461344a565b60608101614ab6828661344a565b614ac360208301856134c9565b6127926040830184613459565b60808101614ade828761344a565b614aeb60208301866134c9565b614af860408301856134c9565b614b0560608301846134c9565b95945050505050565b60608101614b1c828661344a565b614b2960208301856134c9565b8181036040830152614b058184613462565b60608101614b49828661344a565b614b5660208301856134c9565b8181036040830152614b0581846134d2565b60608101614b76828661344a565b614a1460208301856134c9565b602081016123bd8284613459565b602081016123bd82846134c9565b60208082528101612d088184613462565b6020808252810161097b8161354b565b6020808252810161097b816135ae565b6020808252810161097b816135eb565b6020808252810161097b8161364e565b6020808252810161097b816136b1565b6020808252810161097b81613714565b6020808252810161097b81613777565b6020808252810161097b816137da565b6020808252810161097b81613817565b6020808252810161097b81613854565b6020808252810161097b816138b7565b6020808252810161097b8161391a565b6020808252810161097b8161397d565b6020808252810161097b816139e0565b6020808252810161097b81613a1d565b6020808252810161097b81613a80565b6020808252810161097b81613ae3565b6020808252810161097b81613b20565b6020808252810161097b81613b83565b6020808252810161097b81613be6565b6020808252810161097b81613c49565b6020808252810161097b81613cac565b6020808252810161097b81613d0f565b6020808252810161097b81613d4c565b6020808252810161097b81613daf565b6020808252810161097b81613e12565b6020808252810161097b81613e75565b6020808252810161097b81613ed8565b6020808252810161097b81613f3b565b6020808252810161097b81613f9e565b6020808252810161097b81613fdb565b6020808252810161097b81614018565b6020808252810161097b81614055565b6020808252810161097b816140b8565b6020808252810161097b8161411b565b6020808252810161097b8161417e565b6020808252810161097b816141e1565b6020808252810161097b8161426a565b6020808252810161097b816142cd565b6020808252810161097b81614314565b6020808252810161097b81614377565b6020808252810161097b816143da565b6020808252810161097b8161443d565b6020808252810161097b816144a0565b6020808252810161097b816144e7565b6020808252810161097b8161454a565b6020808252810161097b816145ad565b6020808252810161097b81614610565b6020808252810161097b81614657565b6020808252810161097b816146ba565b6020808252810161097b816146f7565b6020808252810161097b8161475a565b6020808252810161097b816147bd565b6020808252810161097b81614820565b6020808252810161097b81614883565b6020808252810161097b816148e6565b6020808252810161097b81614949565b60405181810167ffffffffffffffff81118282101715614f6257614f626152d1565b604052919050565b600067ffffffffffffffff821115614f8457614f846152d1565b5060209081020190565b600067ffffffffffffffff821115614fa857614fa86152d1565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b6000614fdd826151cb565b9150614fe8836151cb565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383138183121516156150215761502161528f565b817f800000000000000000000000000000000000000000000000000000000000000003831281831216156150575761505761528f565b500190565b6000615067826151cb565b9150615072836151cb565b925082198211156150575761505761528f565b6000615090826151cb565b915061509b836151cb565b9250826150aa576150aa6152a5565b500490565b60006150ba826151cb565b91506150c5836151cb565b92508160001904831182151516156150df576150df61528f565b500290565b60006150ef826151cb565b91506150fa836151cb565b9250827f80000000000000000000000000000000000000000000000000000000000000000182128184121516156151335761513361528f565b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821381841216156151695761516961528f565b500390565b6000615179826151cb565b9150615184836151cb565b9250828210156151695761516961528f565b600061097b826151ce565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90565b6001600160a01b031690565b82818337506000910152565b60005b838110156152015781810151838201526020016151e9565b83811115611e715750506000910152565b60028104600182168061522657607f821691505b60208210811415615239576152396152bb565b50919050565b600061524a826151cb565b915060001982141561525e5761525e61528f565b5060010190565b6000615270826151cb565b915061527b836151cb565b92508261528a5761528a6152a5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b6152fa81615196565b811461530557600080fd5b50565b6152fa816151a1565b6152fa816151a6565b6152fa816151cb56fea264697066735822122068530d9e8886897419e0dd2ae38849abbfd5d01e1c59b2d22f28c54dfc9cf64764736f6c63430008000033000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000905438e60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000002c42656c7665646572652026206172746551202d20546865204b69737320627920477573746176204b6c696d740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002542656c766564657265416e6441727465515468654b69737342794775737461764b6c696d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d6577367939514c767153554a32525a793978325558526663584a6d6e77444532507a525a564e4e65766f765a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838545961627a744846573871626a6b487000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061032d5760003560e01c80637b8e7710116101a5578063a22cb465116100ec578063bf71113a11610095578063d031370b1161006f578063d031370b146108bd578063e1217108146108d0578063e8755d00146108e5578063e985e9c51461090557610353565b8063bf71113a14610873578063c040e6b814610888578063c87b56dd1461089d57610353565b8063b15f00d5116100c6578063b15f00d514610813578063b735b1ec14610833578063b88d4fde1461085357610353565b8063a22cb465146107b3578063a76089ee146107d3578063ac1251e0146107f357610353565b80638ad433ac1161014e57806395d89b411161012857806395d89b4114610774578063960a021414610789578063963bfe121461079e57610353565b80638ad433ac1461071f5780638b4627c61461073f578063954a21881461075f57610353565b806388b8178e1161017f57806388b8178e146106e05780638a71bb2d146106f55780638abdf5aa1461070a57610353565b80637b8e77101461068b5780637d46a713146106a057806383045b68146106c057610353565b80632a55205a11610274578063454f98581161021d5780636508da03116101f75780636508da03146106215780636d70f7ae1461063657806370a08231146106565780637b1b1de61461067657610353565b8063454f9858146105cc5780636352211e146105ec5780636454aa8d1461060c57610353565b80633f0d2ec11161024e5780633f0d2ec11461057757806341d6f9c21461058c57806342842e0e146105ac57610353565b80632a55205a146105095780632ccb1b30146105375780632e534dff1461055757610353565b80630c06b056116102d657806319350e10116102b057806319350e10146104b45780632246f98b146104d457806323b872dd146104e957610353565b80630c06b056146104545780630d18d07a146104745780631018d8c41461049457610353565b8063081812fc11610307578063081812fc146103e5578063095ea7b314610412578063096f4ccb1461043457610353565b806301ffc9a71461036b57806306fdde03146103a15780630748c178146103c357610353565b366103535760405162461bcd60e51b815260040161034a90614ea0565b60405180910390fd5b60405162461bcd60e51b815260040161034a90614ea0565b34801561037757600080fd5b5061038b610386366004613354565b610925565b6040516103989190614b83565b60405180910390f35b3480156103ad57600080fd5b506103b6610983565b6040516103989190614b9f565b3480156103cf57600080fd5b506103d8610a15565b6040516103989190614b91565b3480156103f157600080fd5b5061040561040036600461338e565b610a2b565b60405161039891906149d0565b34801561041e57600080fd5b5061043261042d366004613235565b610a6e565b005b34801561044057600080fd5b5061043261044f3660046133c9565b610b06565b34801561046057600080fd5b5061043261046f366004613298565b610bbb565b34801561048057600080fd5b5061043261048f3660046133ab565b610de6565b3480156104a057600080fd5b506103d86104af3660046130f1565b610e94565b3480156104c057600080fd5b506104326104cf3660046132f6565b610f01565b3480156104e057600080fd5b506103d86110b1565b3480156104f557600080fd5b50610432610504366004613146565b6110b6565b34801561051557600080fd5b5061052961052436600461342c565b6110ee565b604051610398929190614a65565b34801561054357600080fd5b50610432610552366004613235565b611124565b34801561056357600080fd5b5061043261057236600461338e565b611283565b34801561058357600080fd5b5061040561136b565b34801561059857600080fd5b506104326105a736600461342c565b61137a565b3480156105b857600080fd5b506104326105c7366004613146565b6113d5565b3480156105d857600080fd5b506104326105e736600461338e565b6113f0565b3480156105f857600080fd5b5061040561060736600461338e565b611467565b34801561061857600080fd5b506103d86114bd565b34801561062d57600080fd5b506103d86114c2565b34801561064257600080fd5b5061038b6106513660046130f1565b6114c7565b34801561066257600080fd5b506103d86106713660046130f1565b6114e5565b34801561068257600080fd5b506103d861150a565b34801561069757600080fd5b506103d8611510565b3480156106ac57600080fd5b506104326106bb3660046133ab565b611515565b3480156106cc57600080fd5b506104326106db366004613298565b6115c2565b3480156106ec57600080fd5b506103d8611836565b34801561070157600080fd5b506103d861183c565b34801561071657600080fd5b506103d8611842565b34801561072b57600080fd5b5061043261073a36600461338e565b611848565b34801561074b57600080fd5b5061043261075a3660046133e7565b611919565b34801561076b57600080fd5b506103d8611999565b34801561078057600080fd5b506103b661199f565b34801561079557600080fd5b5061038b6119ae565b3480156107aa57600080fd5b506103b66119b7565b3480156107bf57600080fd5b506104326107ce366004613207565b6119c6565b3480156107df57600080fd5b506104326107ee366004613263565b611a94565b3480156107ff57600080fd5b5061043261080e36600461342c565b611c27565b34801561081f57600080fd5b5061043261082e3660046133e7565b611d06565b34801561083f57600080fd5b5061043261084e3660046133ab565b611db5565b34801561085f57600080fd5b5061043261086e366004613191565b611e38565b34801561087f57600080fd5b506103d8611e77565b34801561089457600080fd5b506103d8611e7c565b3480156108a957600080fd5b506103b66108b836600461338e565b611e82565b6104326108cb36600461338e565b612056565b3480156108dc57600080fd5b506103d86122e9565b3480156108f157600080fd5b5061043261090036600461342c565b6122ef565b34801561091157600080fd5b5061038b61092036600461310e565b612393565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061097b575061097b826123c3565b90505b919050565b60606000805461099290615212565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90615212565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b60006001600854610a26919061516e565b905090565b6000610a3682612465565b610a525760405162461bcd60e51b815260040161034a90614dd0565b506000908152600460205260409020546001600160a01b031690565b6000610a7982612482565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161034a90614e60565b806001600160a01b0316610abf6124b7565b6001600160a01b03161480610adb5750610adb816109206124b7565b610af75760405162461bcd60e51b815260040161034a90614d30565b610b0183836124bb565b505050565b6014805460ff191682151517905560405182907f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890610b4a90339084908690614aa8565b60405180910390a1600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b50505050505050565b33600090815260156020526040902054610be75760405162461bcd60e51b815260040161034a90614c50565b60036010541480610bfa57506004601054145b610c165760405162461bcd60e51b815260040161034a90614df0565b6000825111610c375760405162461bcd60e51b815260040161034a90614c30565b6000815111610c585760405162461bcd60e51b815260040161034a90614c30565b8051825114610c795760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610ca757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000838381518110610cd357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b03161415610d105760405162461bcd60e51b815260040161034a90614c90565b60145460ff168015610d3857506001600160a01b038216600090815260116020526040902054155b15610d5a576001600160a01b0382166000908152601160205260409020600590555b6001600160a01b038216600090815260116020526040902054610d8f5760405162461bcd60e51b815260040161034a90614bb0565b6001600160a01b038216600090815260116020526040902054811115610dc75760405162461bcd60e51b815260040161034a90614be0565b610dd18282612536565b50508080610dde9061523f565b915050610c7c565b816001600160a01b038216610e0d5760405162461bcd60e51b815260040161034a90614e50565b6001600160a01b038216600090815260156020526040902054600114610e455760405162461bcd60e51b815260040161034a90614ec0565b6001600160a01b03821660009081526015602052604080822091909155517fc57d50f4db59caf96f35b762a67c51826b60c25014200dbc625849eda5ebeafe90610b4a90339086908690614a80565b60145460009060ff16610ec057506001600160a01b03811660009081526011602052604090205461097e565b6001600160a01b038216600090815260116020526040902054610ee55750600561097e565b506001600160a01b031660009081526011602052604090205490565b33600090815260156020526040902054610f2d5760405162461bcd60e51b815260040161034a90614c50565b600460105414610f4f5760405162461bcd60e51b815260040161034a90614c10565b6000825111610f705760405162461bcd60e51b815260040161034a90614c30565b6000815111610f915760405162461bcd60e51b815260040161034a90614c30565b8051825114610fb25760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610fe057634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061100c57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600082116110365760405162461bcd60e51b815260040161034a90614f30565b60008151116110575760405162461bcd60e51b815260040161034a90614d10565b61106182826126d1565b7f8b781fcc9d1a958b4e7e04390a81f45bdec2dc61341e7b423a537074275dc70d33838360405161109493929190614b0e565b60405180910390a1505080806110a99061523f565b915050610fb5565b600381565b6110c76110c16124b7565b82612715565b6110e35760405162461bcd60e51b815260040161034a90614e80565b610b0183838361279a565b60008060006064600f548561110391906150af565b61110d9190615085565b600e546001600160a01b0316969095509350505050565b336000908152601560205260409020546111505760405162461bcd60e51b815260040161034a90614c50565b6001600160a01b0382166111765760405162461bcd60e51b815260040161034a90614e00565b600081116111965760405162461bcd60e51b815260040161034a90614d20565b478111156111b65760405162461bcd60e51b815260040161034a90614ef0565b604080516000808252602082019092526001600160a01b0384169083906040516111e091906149ac565b60006040518083038185875af1925050503d806000811461121d576040519150601f19603f3d011682016040523d82523d6000602084013e611222565b606091505b50509050806112435760405162461bcd60e51b815260040161034a90614d90565b7fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb338484604051611276939291906149f9565b60405180910390a1505050565b60108054829160019060006112988385614fd2565b9091555050601054600514156112b25760006010556112c3565b601054600114156112c35760026010555b7f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff92906113359033908590600401614a65565b600060405180830381600087803b15801561134f57600080fd5b505af1158015611363573d6000803e3d6000fd5b505050505050565b600e546001600160a01b031690565b81604b82111561139c5760405162461bcd60e51b815260040161034a90614bd0565b600f8290556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e90610b4a90339086908690614b68565b610b0183838360405180602001604052806000815250611e38565b601080548291600190600061140583856150e4565b909155505060105460001914156114205760046010556112c3565b601054600114156112c35760006010557f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b600061147282612465565b156114875761148082612482565b905061097e565b60018210158015611499575060085482105b156114a557503061097e565b60405162461bcd60e51b815260040161034a90614cc0565b600481565b600281565b6001600160a01b031660009081526015602052604090205460011490565b60006001600160a01b038216301415611501575060095461097e565b61097b826128d4565b600b5490565b600081565b816001600160a01b03821661153c5760405162461bcd60e51b815260040161034a90614d40565b6001600160a01b038216600090815260156020526040902054156115725760405162461bcd60e51b815260040161034a90614e10565b6001600160a01b0382166000908152601560205260409081902060019055517f99e4b7a7ced34a944c9792d0cd08b555d2a3f0db9bd4e8fa401d6e3c9fb621fc90610b4a90339086908690614a80565b336000908152601560205260409020546115ee5760405162461bcd60e51b815260040161034a90614c50565b6002601054146116105760405162461bcd60e51b815260040161034a90614cf0565b60008251116116315760405162461bcd60e51b815260040161034a90614c30565b60008151116116525760405162461bcd60e51b815260040161034a90614c30565b80518251146116735760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b015760008382815181106116a157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106116cd57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b0316141561170a5760405162461bcd60e51b815260040161034a90614ce0565b6001811015801561171c575060058111155b6117385760405162461bcd60e51b815260040161034a90614f20565b816001600160a01b0316803b806020016040519081016040528181526000908060200190933c511561177c5760405162461bcd60e51b815260040161034a90614e70565b6001600160a01b038216600090815260116020526040902054156117b25760405162461bcd60e51b815260040161034a90614de0565b6001600160a01b038216600090815260116020526040812082905560128054600192906117e090849061505c565b90915550506040517f446ecc2d2851a96cb2b0265c02cbb648b2d913382f9f98dd8e923e1277e1571f90611819903390859085906149f9565b60405180910390a15050808061182e9061523f565b915050611676565b61271081565b600f5490565b600c5490565b336000908152601560205260409020546118745760405162461bcd60e51b815260040161034a90614c50565b60005b818110156118fe5761271060085411156118a35760405162461bcd60e51b815260040161034a90614ca0565b60085460405130906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600860008282546118e6919061505c565b909155508190506118f68161523f565b915050611877565b508060096000828254611911919061505c565b909155505050565b601054156119395760405162461bcd60e51b815260040161034a90614c60565b81600082511161195b5760405162461bcd60e51b815260040161034a90614d10565b6119666000836126d1565b7ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a8338484604051610b4a93929190614b0e565b60135490565b60606001805461099290615212565b60145460ff1690565b6060600d805461099290615212565b6119ce6124b7565b6001600160a01b0316826001600160a01b031614156119ff5760405162461bcd60e51b815260040161034a90614c80565b8060056000611a0c6124b7565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a506124b7565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190614b83565b60405180910390a35050565b33600090815260156020526040902054611ac05760405162461bcd60e51b815260040161034a90614c50565b600260105414611ae25760405162461bcd60e51b815260040161034a90614cf0565b6000815111611b035760405162461bcd60e51b815260040161034a90614c30565b60005b8151811015611c23576000828281518110611b3157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611b6e5760405162461bcd60e51b815260040161034a90614f10565b6001600160a01b038116600090815260116020526040902054611ba35760405162461bcd60e51b815260040161034a90614f00565b6001600160a01b03811660009081526011602052604081208190556012805460019290611bd190849061516e565b90915550506040517f38659fb1f550e06bc69d12bed51d9be3a02f37b36bf36eae35b87ae438353d3d90611c0890339084906149de565b60405180910390a15080611c1b8161523f565b915050611b06565b5050565b600160105413611c495760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611c6c5760405162461bcd60e51b815260040161034a90614bf0565b8160008211611c8d5760405162461bcd60e51b815260040161034a90614ee0565b600b8054908390556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90611ccb903390879085908890614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600160105413611d285760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611d4b5760405162461bcd60e51b815260040161034a90614bf0565b816000825111611d6d5760405162461bcd60e51b815260040161034a90614d10565b8151611d8090600d906020850190612e64565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de13384600d604051610b4a93929190614b3b565b816001600160a01b038216611ddc5760405162461bcd60e51b815260040161034a90614c40565b600e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d90610b4a90339086908690614a80565b611e49611e436124b7565b83612715565b611e655760405162461bcd60e51b815260040161034a90614e80565b611e7184848484612918565b50505050565b600581565b60105490565b6060611e8d82612465565b15611f95576000611e9d8361294b565b60408051808201909152601181527f44454641554c545f544f4b454e5f5552490000000000000000000000000000006020918201528151908201209091507fdab376b119f20c9aada0a9f71c7ad4b725b4bf4a650ecfe7a8e84eacf2d9d6b9141561148057600d8054611f0f90615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3b90615212565b8015611f885780601f10611f5d57610100808354040283529160200191611f88565b820191906000526020600020905b815481529060010190602001808311611f6b57829003601f168201915b505050505091505061097e565b60018210158015611fa7575060085482105b1561203e57600d8054611fb990615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe590615212565b80156120325780601f1061200757610100808354040283529160200191612032565b820191906000526020600020905b81548152906001019060200180831161201557829003601f168201915b5050505050905061097e565b60405162461bcd60e51b815260040161034a90614e40565b6003601054148061206957506004601054145b6120855760405162461bcd60e51b815260040161034a90614df0565b600034116120a55760405162461bcd60e51b815260040161034a90614d80565b600081116120c55760405162461bcd60e51b815260040161034a90614d00565b60145460ff1680156120e4575033600090815260116020526040902054155b156120fd57336000908152601160205260409020600590555b336000908152601160205260409020546121295760405162461bcd60e51b815260040161034a90614bb0565b336000908152601160205260409020548111156121585760405162461bcd60e51b815260040161034a90614be0565b61271081601354612169919061505c565b11156121875760405162461bcd60e51b815260040161034a90614eb0565b6000600b548261219791906150af565b90506000600c54826121a9919061505c565b9050803410156121cb5760405162461bcd60e51b815260040161034a90614cb0565b60006121d7823461516e565b905080156122a057604080516000808252602082019092523390839060405161220091906149ac565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b50509050806122635760405162461bcd60e51b815260040161034a90614e90565b7f9968789f2b0cc53b435225867b7d718de6eebc4b48088763c07439fb172865be333384604051612296939291906149f9565b60405180910390a1505b7f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada33384600c54856040516122d79493929190614ad0565b60405180910390a1611e713385612536565b60125490565b6001601054136123115760405162461bcd60e51b815260040161034a90614ed0565b600360105414156123345760405162461bcd60e51b815260040161034a90614bf0565b81600082116123555760405162461bcd60e51b815260040161034a90614ee0565b600c8054908390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90611ccb903390879085908890614ad0565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061245657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061097b575061097b82612a64565b6000908152600260205260409020546001600160a01b0316151590565b6000818152600260205260408120546001600160a01b03168061097b5760405162461bcd60e51b815260040161034a90614d60565b3390565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124fd82612482565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60015b8181116125f65760075461254e308583612aae565b61258d816040518060400160405280601181526020017f44454641554c545f544f4b454e5f5552490000000000000000000000000000008152506126d1565b6001600760008282546125a0919061505c565b909155505060135461271010156125c95760405162461bcd60e51b815260040161034a90614eb0565b6001601360008282546125dc919061505c565b909155508291506125ee90508161523f565b915050612539565b50806001600954612607919061516e565b111561262a57806009600082825461261f919061516e565b909155506126309050565b60016009555b600160095410156126535760405162461bcd60e51b815260040161034a90614dc0565b6001600160a01b0382166000908152601160205260408120805483929061267b90849061516e565b90915550506001600160a01b03821660005260116020527fbdf1d6c0740e266493fa759ede2b8a30466a9d030811c565b76aff5d9b6f66c83383836040516126c5939291906149f9565b60405180910390a15050565b6126da82612465565b6126f65760405162461bcd60e51b815260040161034a90614d70565b60008281526006602090815260409091208251610b0192840190612e64565b600061272082612465565b61273c5760405162461bcd60e51b815260040161034a90614cd0565b600061274783612482565b9050806001600160a01b0316846001600160a01b031614806127825750836001600160a01b031661277784610a2b565b6001600160a01b0316145b8061279257506127928185612393565b949350505050565b826001600160a01b03166127ad82612482565b6001600160a01b0316146127d35760405162461bcd60e51b815260040161034a90614e20565b6001600160a01b0382166127f95760405162461bcd60e51b815260040161034a90614c70565b612804838383610b01565b61280f6000826124bb565b6001600160a01b038316600090815260036020526040812080546001929061283890849061516e565b90915550506001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0382166128fc5760405162461bcd60e51b815260040161034a90614d50565b506001600160a01b031660009081526003602052604090205490565b61292384848461279a565b61292f84848484612b2e565b611e715760405162461bcd60e51b815260040161034a90614c00565b606061295682612465565b6129725760405162461bcd60e51b815260040161034a90614db0565b6000828152600660205260408120805461298b90615212565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615212565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b505050505090506000612a15612c7a565b9050805160001415612a295750905061097e565b815115612a5b578082604051602001612a439291906149b8565b6040516020818303038152906040529250505061097e565b61279284612c8c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6001600160a01b038216612ad45760405162461bcd60e51b815260040161034a90614da0565b612add81612465565b15612afa5760405162461bcd60e51b815260040161034a90614c20565b612b05838383610b01565b6001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b6000612b42846001600160a01b0316612d0f565b15612c6f57836001600160a01b031663150b7a02612b5e6124b7565b8786866040518563ffffffff1660e01b8152600401612b809493929190614a21565b602060405180830381600087803b158015612b9a57600080fd5b505af1925050508015612bca575060408051601f3d908101601f19168201909252612bc791810190613371565b60015b612c24573d808015612bf8576040519150601f19603f3d011682016040523d82523d6000602084013e612bfd565b606091505b508051612c1c5760405162461bcd60e51b815260040161034a90614c00565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612792565b506001949350505050565b60408051602081019091526000815290565b6060612c9782612465565b612cb35760405162461bcd60e51b815260040161034a90614e30565b6000612cbd612c7a565b90506000815111612cdd5760405180602001604052806000815250612d08565b80612ce784612d15565b604051602001612cf89291906149b8565b6040516020818303038152906040525b9392505050565b3b151590565b606081612d56575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261097e565b8160005b8115612d805780612d6a8161523f565b9150612d799050600a83615085565b9150612d5a565b60008167ffffffffffffffff811115612da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dd3576020820181803683370190505b5090505b841561279257612de860018361516e565b9150612df5600a86615265565b612e0090603061505c565b60f81b818381518110612e2357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e5d600a86615085565b9450612dd7565b828054612e7090615212565b90600052602060002090601f016020900481019282612e925760008555612ed8565b82601f10612eab57805160ff1916838001178555612ed8565b82800160010185558215612ed8579182015b82811115612ed8578251825591602001919060010190612ebd565b50612ee4929150612ee8565b5090565b5b80821115612ee45760008155600101612ee9565b6000612f10612f0b84614f6a565b614f40565b90508083825260208201905082856020860285011115612f2f57600080fd5b60005b85811015612f5957612f44878361303a565b83526020928301929190910190600101612f32565b5050509392505050565b6000612f71612f0b84614f6a565b8381529050602081018260005b85811015612f595781358501612f9488826130c6565b8452506020928301929190910190600101612f7e565b6000612fb8612f0b84614f6a565b90508083825260208201905082856020860285011115612fd757600080fd5b60005b85811015612f5957612fec87836130e6565b83526020928301929190910190600101612fda565b600061300f612f0b84614f8e565b90508281526020810184848401111561302757600080fd5b6130328482856151da565b509392505050565b80356123bd816152f1565b600082601f830112613055578081fd5b8135612792848260208601612efd565b600082601f830112613075578081fd5b8135612792848260208601612f63565b600082601f830112613095578081fd5b8135612792848260208601612faa565b80356123bd81615308565b80356123bd81615311565b80516123bd81615311565b600082601f8301126130d6578081fd5b8135612792848260208601613001565b80356123bd8161531a565b600060208284031215613102578081fd5b612d088382840161303a565b60008060408385031215613120578081fd5b61312c8482850161303a565b9150602061313c8582860161303a565b9150509250929050565b60008060006060848603121561315a578081fd5b6131668582860161303a565b925060206131768682870161303a565b9250506040613187868287016130e6565b9150509250925092565b600080600080608085870312156131a6578081fd5b6131b28682870161303a565b935060206131c28782880161303a565b93505060406131d3878288016130e6565b925050606085013567ffffffffffffffff8111156131ef578182fd5b6131fb878288016130c6565b91505092959194509250565b60008060408385031215613219578182fd5b6132258483850161303a565b9150602061313c858286016130a5565b60008060408385031215613247578182fd5b6132538483850161303a565b9150602061313c858286016130e6565b600060208284031215613274578081fd5b8082013567ffffffffffffffff81111561328c578182fd5b61279284828501613045565b600080604083850312156132aa578182fd5b8183013567ffffffffffffffff8111156132c2578283fd5b6132ce85828601613045565b925050602083013567ffffffffffffffff8111156132ea578182fd5b61313c85828601613085565b60008060408385031215613308578182fd5b8183013567ffffffffffffffff811115613320578283fd5b61332c85828601613085565b925050602083013567ffffffffffffffff811115613348578182fd5b61313c85828601613065565b600060208284031215613365578081fd5b612d08838284016130b0565b600060208284031215613382578081fd5b612d08838284016130bb565b60006020828403121561339f578081fd5b612d08838284016130e6565b600080604083850312156133bd578182fd5b61312c848385016130e6565b600080604083850312156133db578182fd5b613225848385016130e6565b600080604083850312156133f9578182fd5b613405848385016130e6565b9150602083013567ffffffffffffffff811115613420578182fd5b61313c858286016130c6565b6000806040838503121561343e578182fd5b613253848385016130e6565b61345381615196565b82525050565b613453816151a1565b600061346d82614fc5565b6134778185614fc9565b93506134878185602086016151e6565b613490816152e7565b9093019392505050565b60006134a582614fc5565b6134af818561097e565b93506134bf8185602086016151e6565b9290920192915050565b613453816151cb565b600081546134df81615212565b6134e98186614fc9565b9450600182168015613502576001811461351457613542565b60ff1983168652602086019350613542565b61351d85614fb9565b60005b8381101561353c57815488820152600190910190602001613520565b87019450505b50505092915050565b6000613558602783614fc9565b7f617274655141727444726f703a206e6f7420612077686974656c697374656420918101919091527f6163636f756e74000000000000000000000000000000000000000000000000006020820152604001919050565b60006135bb601f83614fc9565b7f617274655141727444726f703a20646966666572656e74206c656e677468730091810191909152602001919050565b60006135f8602883614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207065918101919091527f7263656e746167650000000000000000000000000000000000000000000000006020820152604001919050565b600061365b603183614fc9565b7f617274655141727444726f703a20657863656564696e67207468652072657365918101919091527f72766174696f6e20616c6c6f77616e63650000000000000000000000000000006020820152604001919050565b60006136be603683614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2061918101919091527f206e6f6e2d7265736572766174696f6e207374616765000000000000000000006020820152604001919050565b6000613721603283614fc9565b7f4552433732313a207472616e7366657220746f206e6f6e204552433732315265918101919091527f63656976657220696d706c656d656e74657200000000000000000000000000006020820152604001919050565b6000613784603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2064918101919091527f6973747269627574696f6e2073746167650000000000000000000000000000006020820152604001919050565b60006137e7601c83614fc9565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b6000613824601983614fc9565b7f617274655141727444726f703a207a65726f206c656e6774680000000000000091810191909152602001919050565b6000613861602483614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207761918101919091527f6c6c6574000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006138c4602583614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f72206163918101919091527f636f756e740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613927602b83614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206c918101919091527f6f636b65642073746167650000000000000000000000000000000000000000006020820152604001919050565b600061398a602483614fc9565b7f4552433732313a207472616e7366657220746f20746865207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006139ed601983614fc9565b7f4552433732313a20617070726f766520746f2063616c6c65720000000000000091810191909152602001919050565b6000613a2a602483614fc9565b7f617274655141727444726f703a2063616e6e6f74206265207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613a8d602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207072652d6d696e74206d6f918101919091527f72650000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613af0602083614fc9565b7f617274655141727444726f703a20696e73756666696369656e742066756e647391810191909152602001919050565b6000613b2d602583614fc9565b7f617274655141727444726f703a20746f6b656e20697320646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613b90602c83614fc9565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b6000613bf3602b83614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c697374207a918101919091527f65726f20616464726573730000000000000000000000000000000000000000006020820152604001919050565b6000613c56603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2077918101919091527f686974656c697374696e672073746167650000000000000000000000000000006020820152604001919050565b6000613cb9602483614fc9565b7f617274655141727444726f703a207a65726f20746f6b656e7320746f20726573918101919091527f65727665000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613d1c601a83614fc9565b7f617274655141727444726f703a20656d70747920737472696e6700000000000091810191909152602001919050565b6000613d59602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207472616e73666572207a65918101919091527f726f0000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613dbc603883614fc9565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f77918101919091527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020820152604001919050565b6000613e1f602983614fc9565b7f617274655141727444726f703a2063616e6e6f7420736574207a65726f206173918101919091527f206f70657261746f7200000000000000000000000000000000000000000000006020820152604001919050565b6000613e82602a83614fc9565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65918101919091527f726f2061646472657373000000000000000000000000000000000000000000006020820152604001919050565b6000613ee5602983614fc9565b7f4552433732313a206f776e657220717565727920666f72206e6f6e6578697374918101919091527f656e7420746f6b656e00000000000000000000000000000000000000000000006020820152604001919050565b6000613f48602e83614fc9565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020820152604001919050565b6000613fab601883614fc9565b7f617274655141727444726f703a207a65726f2066756e6473000000000000000091810191909152602001919050565b6000613fe8602083614fc9565b7f617274655141727444726f703a206661696c656420746f207472616e7366657291810191909152602001919050565b6000614025602083614fc9565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b6000614062603183614fc9565b7f45524337323155524953746f726167653a2055524920717565727920666f7220918101919091527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020820152604001919050565b60006140c5602b83614fc9565b7f617274655141727444726f703a20636f6e74726163742062616c616e63652077918101919091527f656e742062656c6f7720310000000000000000000000000000000000000000006020820152604001919050565b6000614128602c83614fc9565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b600061418b602183614fc9565b7f617274655141727444726f703a20616c72656164792077686974656c69737465918101919091527f64000000000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006141ee604183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2072918101919091527f65736572766174696f6e20616e6420646973747269627574696f6e207374616760208201527f65000000000000000000000000000000000000000000000000000000000000006040820152606001919050565b6000614277602383614fc9565b7f617274655141727444726f703a207461726765742063616e6e6f74206265207a918101919091527f65726f00000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006142da602183614fc9565b7f617274655141727444726f703a20616c726561647920616e206f70657261746f91810191909152603960f91b6020820152604001919050565b6000614321602983614fc9565b7f4552433732313a207472616e73666572206f6620746f6b656e20746861742069918101919091527f73206e6f74206f776e00000000000000000000000000000000000000000000006020820152604001919050565b6000614384602f83614fc9565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f918101919091527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020820152604001919050565b60006143e7602583614fc9565b7f617274655141727444726f703a20746f6b656e20696420646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b600061444a602c83614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f206173206f70657261746f7200000000000000000000000000000000000000006020820152604001919050565b60006144ad602183614fc9565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6591810191909152603960f91b6020820152604001919050565b60006144f4602983614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c6973742061918101919091527f20636f6e747261637400000000000000000000000000000000000000000000006020820152604001919050565b6000614557603183614fc9565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f918101919091527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020820152604001919050565b60006145ba602a83614fc9565b7f617274655141727444726f703a206661696c656420746f2073656e6420746865918101919091527f2072656d61696e646572000000000000000000000000000000000000000000006020820152604001919050565b600061461d602183614fc9565b7f617274655141727444726f703a2063616e6e6f7420616363657074206574686591810191909152603960f91b6020820152604001919050565b6000614664603283614fc9565b7f617274655141727444726f703a20657863656564696e67206d6178206e756d62918101919091527f6572206f66207265736572766174696f6e7300000000000000000000000000006020820152604001919050565b60006146c7601d83614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f7200000091810191909152602001919050565b6000614704603083614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206e918101919091527f6f742d6c6f636b656420737461676573000000000000000000000000000000006020820152604001919050565b6000614767602683614fc9565b7f617274655141727444726f703a206e65772070726963652063616e6e6f742062918101919091527f65207a65726f00000000000000000000000000000000000000000000000000006020820152604001919050565b60006147ca602883614fc9565b7f617274655141727444726f703a207472616e73666572206d6f7265207468616e918101919091527f2062616c616e63650000000000000000000000000000000000000000000000006020820152604001919050565b600061482d602883614fc9565b7f617274655141727444726f703a206163636f756e74206973206e6f7420776869918101919091527f74656c69737465640000000000000000000000000000000000000000000000006020820152604001919050565b6000614890602883614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f20616464726573730000000000000000000000000000000000000000000000006020820152604001919050565b60006148f3602c83614fc9565b7f617274655141727444726f703a20696e76616c6964206e72206f6620746f6b65918101919091527f6e7320746f206f627461696e00000000000000000000000000000000000000006020820152604001919050565b6000614956602883614fc9565b7f617274655141727444726f703a2063616e6e6f7420616c7465722067656e6573918101919091527f697320746f6b656e0000000000000000000000000000000000000000000000006020820152604001919050565b6000612d08828461349a565b60006149c4828561349a565b9150612792828461349a565b602081016123bd828461344a565b604081016149ec828561344a565b612d08602083018461344a565b60608101614a07828661344a565b614a14602083018561344a565b61279260408301846134c9565b60808101614a2f828761344a565b614a3c602083018661344a565b614a4960408301856134c9565b8181036060830152614a5b8184613462565b9695505050505050565b60408101614a73828561344a565b612d0860208301846134c9565b60608101614a8e828661344a565b614a9b60208301856134c9565b612792604083018461344a565b60608101614ab6828661344a565b614ac360208301856134c9565b6127926040830184613459565b60808101614ade828761344a565b614aeb60208301866134c9565b614af860408301856134c9565b614b0560608301846134c9565b95945050505050565b60608101614b1c828661344a565b614b2960208301856134c9565b8181036040830152614b058184613462565b60608101614b49828661344a565b614b5660208301856134c9565b8181036040830152614b0581846134d2565b60608101614b76828661344a565b614a1460208301856134c9565b602081016123bd8284613459565b602081016123bd82846134c9565b60208082528101612d088184613462565b6020808252810161097b8161354b565b6020808252810161097b816135ae565b6020808252810161097b816135eb565b6020808252810161097b8161364e565b6020808252810161097b816136b1565b6020808252810161097b81613714565b6020808252810161097b81613777565b6020808252810161097b816137da565b6020808252810161097b81613817565b6020808252810161097b81613854565b6020808252810161097b816138b7565b6020808252810161097b8161391a565b6020808252810161097b8161397d565b6020808252810161097b816139e0565b6020808252810161097b81613a1d565b6020808252810161097b81613a80565b6020808252810161097b81613ae3565b6020808252810161097b81613b20565b6020808252810161097b81613b83565b6020808252810161097b81613be6565b6020808252810161097b81613c49565b6020808252810161097b81613cac565b6020808252810161097b81613d0f565b6020808252810161097b81613d4c565b6020808252810161097b81613daf565b6020808252810161097b81613e12565b6020808252810161097b81613e75565b6020808252810161097b81613ed8565b6020808252810161097b81613f3b565b6020808252810161097b81613f9e565b6020808252810161097b81613fdb565b6020808252810161097b81614018565b6020808252810161097b81614055565b6020808252810161097b816140b8565b6020808252810161097b8161411b565b6020808252810161097b8161417e565b6020808252810161097b816141e1565b6020808252810161097b8161426a565b6020808252810161097b816142cd565b6020808252810161097b81614314565b6020808252810161097b81614377565b6020808252810161097b816143da565b6020808252810161097b8161443d565b6020808252810161097b816144a0565b6020808252810161097b816144e7565b6020808252810161097b8161454a565b6020808252810161097b816145ad565b6020808252810161097b81614610565b6020808252810161097b81614657565b6020808252810161097b816146ba565b6020808252810161097b816146f7565b6020808252810161097b8161475a565b6020808252810161097b816147bd565b6020808252810161097b81614820565b6020808252810161097b81614883565b6020808252810161097b816148e6565b6020808252810161097b81614949565b60405181810167ffffffffffffffff81118282101715614f6257614f626152d1565b604052919050565b600067ffffffffffffffff821115614f8457614f846152d1565b5060209081020190565b600067ffffffffffffffff821115614fa857614fa86152d1565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b6000614fdd826151cb565b9150614fe8836151cb565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383138183121516156150215761502161528f565b817f800000000000000000000000000000000000000000000000000000000000000003831281831216156150575761505761528f565b500190565b6000615067826151cb565b9150615072836151cb565b925082198211156150575761505761528f565b6000615090826151cb565b915061509b836151cb565b9250826150aa576150aa6152a5565b500490565b60006150ba826151cb565b91506150c5836151cb565b92508160001904831182151516156150df576150df61528f565b500290565b60006150ef826151cb565b91506150fa836151cb565b9250827f80000000000000000000000000000000000000000000000000000000000000000182128184121516156151335761513361528f565b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821381841216156151695761516961528f565b500390565b6000615179826151cb565b9150615184836151cb565b9250828210156151695761516961528f565b600061097b826151ce565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90565b6001600160a01b031690565b82818337506000910152565b60005b838110156152015781810151838201526020016151e9565b83811115611e715750506000910152565b60028104600182168061522657607f821691505b60208210811415615239576152396152bb565b50919050565b600061524a826151cb565b915060001982141561525e5761525e61528f565b5060010190565b6000615270826151cb565b915061527b836151cb565b92508261528a5761528a6152a5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b6152fa81615196565b811461530557600080fd5b50565b6152fa816151a1565b6152fa816151a6565b6152fa816151cb56fea264697066735822122068530d9e8886897419e0dd2ae38849abbfd5d01e1c59b2d22f28c54dfc9cf64764736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000905438e60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000002c42656c7665646572652026206172746551202d20546865204b69737320627920477573746176204b6c696d740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002542656c766564657265416e6441727465515468654b69737342794775737461764b6c696d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d6577367939514c767153554a32525a793978325558526663584a6d6e77444532507a525a564e4e65766f765a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838545961627a744846573871626a6b487000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : adminContract (address): 0x554823B9dDB01304252b84DAfedFB2214e7E5FD8
Arg [1] : name (string): Belvedere & arteQ - The Kiss by Gustav Klimt
Arg [2] : symbol (string): BelvedereAndArteQTheKissByGustavKlimt
Arg [3] : initialPricePerToken (uint256): 650000000000000000
Arg [4] : initialServiceFee (uint256): 0
Arg [5] : initialDefaultTokenURI (string): https://arteq.mypinata.cloud/ipfs/Qmew6y9QLvqSUJ2RZy9x2UXRfcXJmnwDE2PzRZVNNevovZ
Arg [6] : initialGenesisTokenURI (string): https://arteq.mypinata.cloud/ipfs/QmcPJzwyWArooPr8neSGQvGwKeAQX8TYabztHFW8qbjkHp
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd8
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000905438e60010000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [8] : 42656c7665646572652026206172746551202d20546865204b69737320627920
Arg [9] : 477573746176204b6c696d740000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [11] : 42656c766564657265416e6441727465515468654b6973734279477573746176
Arg [12] : 4b6c696d74000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [14] : 68747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066
Arg [15] : 732f516d6577367939514c767153554a32525a793978325558526663584a6d6e
Arg [16] : 77444532507a525a564e4e65766f765a00000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [18] : 68747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066
Arg [19] : 732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838
Arg [20] : 545961627a744846573871626a6b487000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.