Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 GUARDIAN
Holders
624
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GUARDIANLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
StarBlockCollection
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ // ββββββββββββββββββββββββββββββββββββββββ¦βββββββββββββββββββββββββββββββββ // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ // ββββββββββββββββββββββββββββββββββββββββ¦βββββββββββββββββββββββββββββββββ // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ // SPDX-License-Identifier: MIT // StarBlock Contracts, more: https://www.starblock.io/ pragma solidity ^0.8.10; //import "erc721a/contracts/extensions/ERC721AQueryable.sol"; //import "@openzeppelin/contracts/token/common/ERC2981.sol"; //import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; //import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; //import "@openzeppelin/contracts/access/Ownable.sol"; //import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; //import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "./ERC721AQueryable.sol"; import "./ERC2981.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./IERC721Metadata.sol"; interface IStarBlockCollection is IERC721AQueryable, IERC2981 { struct SaleConfig { uint256 startTime;// 0 for not set uint256 endTime;// 0 for will not end uint256 price; uint256 maxAmountPerAddress;// 0 for not limit the amount per address } event UpdateWhitelistSaleConfig(SaleConfig _whitelistSaleConfig); event UpdateWhitelistSaleEndTime(uint256 _oldEndTime, uint256 _newEndTime); event UpdatePublicSaleConfig(SaleConfig _publicSaleConfig); event UpdatePublicSaleEndTime(uint256 _oldEndTime, uint256 _newEndTime); event UpdateChargeToken(IERC20 _chargeToken); function supportsInterface(bytes4 _interfaceId) external view override(IERC165, IERC721A) returns (bool); function maxSupply() external view returns (uint256); function exists(uint256 _tokenId) external view returns (bool); function maxAmountForArtist() external view returns (uint256); function artistMinted() external view returns (uint256); function chargeToken() external view returns (IERC20); // function whitelistSaleConfig() external view returns (SaleConfig memory); function whitelistSaleConfig() external view returns (uint256 _startTime, uint256 _endTime, uint256 _price, uint256 _maxAmountPerAddress); function whitelist(address _user) external view returns (bool); function whitelistAllowed(address _user) external view returns (uint256); function whitelistAmount() external view returns (uint256); function whitelistSaleMinted(address _user) external view returns (uint256); // function publicSaleConfig() external view returns (SaleConfig memory); function publicSaleConfig() external view returns (uint256 _startTime, uint256 _endTime, uint256 _price, uint256 _maxAmountPerAddress); function publicSaleMinted(address _user) external view returns (uint256); function userCanMintTotalAmount() external view returns (uint256); function whitelistMint(uint256 _amount) external payable; function publicMint(uint256 _amount) external payable; } //The ERC721 collection for Artist on StarBlock NFT Marketplace, the owner is Artist and the protocol fee is for StarBlock. contract StarBlockCollection is IStarBlockCollection, ERC721AQueryable, ERC2981, Ownable, ReentrancyGuard { using SafeERC20 for IERC20; uint256 public immutable maxSupply; string private baseTokenURI; uint256 public immutable maxAmountForArtist; uint256 public artistMinted;// the total minted amount for artist by artistMint method IERC20 public chargeToken;// the charge token for mint, zero for ETH address payable public protocolFeeReceiver;// fee receiver address for protocol uint256 public protocolFeeNumerator; // div _feeDenominator()(is 10000) is the real ratio SaleConfig public whitelistSaleConfig; mapping(address => bool) public whitelist;// whitelists mapping(address => uint256) public whitelistAllowed;// whitelists and allowed amount uint256 public whitelistAmount; mapping(address => uint256) public whitelistSaleMinted; //public mint config SaleConfig public publicSaleConfig; mapping(address => uint256) public publicSaleMinted; modifier callerIsUser() { require(tx.origin == msg.sender, "StarBlockCollection: The caller is another contract"); _; } constructor( string memory _name, string memory _symbol, uint256 _maxSupply, IERC20 _chargeToken, string memory _baseTokenURI, uint256 _maxAmountForArtist, address payable _protocolFeeReceiver, uint256 _protocolFeeNumerator, address _royaltyReceiver, uint96 _royaltyFeeNumerator ) ERC721A(_name, _symbol) { require(_maxSupply > 0 && _maxAmountForArtist <= _maxSupply && _protocolFeeReceiver != address(0) && _protocolFeeNumerator <= _feeDenominator() && _royaltyFeeNumerator <= _feeDenominator(), "StarBlockCollection: invalid parameters!"); maxSupply = _maxSupply; chargeToken = _chargeToken; baseTokenURI = _baseTokenURI; maxAmountForArtist = _maxAmountForArtist; protocolFeeReceiver = _protocolFeeReceiver; protocolFeeNumerator = _protocolFeeNumerator; if(_royaltyReceiver != address(0)){ _setDefaultRoyalty(_royaltyReceiver, _royaltyFeeNumerator); } } function whitelistMint(uint256 _amount) external payable callerIsUser { if(whitelistSaleConfig.maxAmountPerAddress == 0){ require(whitelistAllowed[msg.sender] >= (whitelistSaleMinted[msg.sender] + _amount), "StarBlockCollection: whitelist reached allowed!"); }else{ require(whitelist[msg.sender], "StarBlockCollection: not in whitelist!"); } _checkUserCanMint(whitelistSaleConfig, _amount, whitelistSaleMinted[msg.sender]); whitelistSaleMinted[msg.sender] += _amount; if(whitelistSaleConfig.price > 0 || (whitelistSaleConfig.price == 0 && msg.value > 0)){ _charge(whitelistSaleConfig.price * _amount); } _safeMint(msg.sender, _amount); } function publicMint(uint256 _amount) external payable callerIsUser { _checkUserCanMint(publicSaleConfig, _amount, publicSaleMinted[msg.sender]); publicSaleMinted[msg.sender] += _amount; if(publicSaleConfig.price > 0 || (publicSaleConfig.price == 0 && msg.value > 0)){ _charge(publicSaleConfig.price * _amount); } _safeMint(msg.sender, _amount); } function artistMint(uint256 _amount) external onlyOwner nonReentrant { require(_amount > 0, "StarBlockCollection: amount should be greater than 0!"); require((artistMinted + _amount) <= maxAmountForArtist, "StarBlockCollection: reached max amount for artist!"); require((totalSupply() + _amount) <= maxSupply, "StarBlockCollection: reached max supply!"); artistMinted += _amount; _safeMint(msg.sender, _amount); } function userCanMintTotalAmount() public view returns (uint256) { return maxSupply - (totalSupply() + maxAmountForArtist - artistMinted); } function _checkUserCanMint(SaleConfig memory _saleConfig, uint256 _amount, uint256 _mintedAmount) internal view { require(_amount > 0, "StarBlockCollection: amount should be greater than 0!"); require(userCanMintTotalAmount() >= _amount, "StarBlockCollection: reached max supply!"); require(_saleConfig.startTime > 0, "StarBlockCollection: sale has not set!"); require(_saleConfig.startTime <= block.timestamp, "StarBlockCollection: sale has not started yet!"); require(_saleConfig.endTime == 0 || _saleConfig.endTime >= block.timestamp, "StarBlockCollection: sale has ended!"); require(_saleConfig.maxAmountPerAddress == 0 || (_mintedAmount + _amount) <= _saleConfig.maxAmountPerAddress, "StarBlockCollection: reached max amount per address!"); } function _charge(uint256 _amount) internal nonReentrant { bool success = true; uint256 shouldChargedETH; if(address(chargeToken) != address(0)){ uint256 balance = chargeToken.balanceOf(msg.sender); require(balance >= _amount, "StarBlockCollection: not enough token!"); chargeToken.safeTransferFrom(msg.sender, address(this), _amount); }else{ require(msg.value >= _amount, "StarBlockCollection: not enough ETH!"); shouldChargedETH = _amount; } if (msg.value > shouldChargedETH) {//return if over success = _transferETH(payable(msg.sender), msg.value - shouldChargedETH); } require(success, "StarBlockCollection: charge failed!"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 _interfaceId) public view virtual override(IStarBlockCollection, ERC2981, ERC721A) returns (bool) { return _interfaceId == type(IStarBlockCollection).interfaceId || _interfaceId == type(IERC721).interfaceId || _interfaceId == type(IERC721Metadata).interfaceId || _interfaceId == type(IERC721A).interfaceId || _interfaceId == type(IERC721AQueryable).interfaceId || ERC2981.supportsInterface(_interfaceId) || ERC721A.supportsInterface(_interfaceId); } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string calldata _baseTokenURI) external onlyOwner nonReentrant { baseTokenURI = _baseTokenURI; } function addWhitelists(address[] memory addresses) external onlyOwner nonReentrant { require(whitelistSaleConfig.startTime > 0 && whitelistSaleConfig.maxAmountPerAddress > 0, "StarBlockCollection: error whitelist sale config!"); require(addresses.length > 0, "StarBlockCollection: addresses can not be empty!"); for (uint256 i = 0; i < addresses.length; i++) { if(!whitelist[addresses[i]]){ whitelist[addresses[i]] = true; whitelistAmount ++; } } } function removeWhitelists(address[] memory addresses) external onlyOwner nonReentrant { require(addresses.length > 0, "StarBlockCollection: addresses can not be empty!"); for (uint256 i = 0; i < addresses.length; i++) { if(whitelist[addresses[i]]){ whitelist[addresses[i]] = false; whitelistAmount --; } } } function setWhitelistAllowed(address[] memory addresses, uint256[] memory allowedAmounts) external onlyOwner nonReentrant { require(whitelistSaleConfig.startTime > 0 && whitelistSaleConfig.maxAmountPerAddress == 0, "StarBlockCollection: error whitelist sale config!"); require(addresses.length > 0 && addresses.length == allowedAmounts.length, "StarBlockCollection: error parameters!"); for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; uint256 amount = allowedAmounts[i]; if(amount > 0){ if(whitelistAllowed[addr] == 0){ whitelistAmount ++; } whitelistAllowed[addr] = amount; } } } function removeWhitelistAllowed(address[] memory addresses) external onlyOwner nonReentrant { require(addresses.length > 0, "StarBlockCollection: error parameters!"); for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; if(whitelistAllowed[addr] > 0){ whitelistAllowed[addr] = 0; whitelistAmount --; } } } function setInfo(IERC20 _chargeToken, SaleConfig memory _whitelistSaleConfig, SaleConfig memory _publicSaleConfig, address _royaltyReceiver, uint96 _royaltyFeeNumerator) external onlyOwner nonReentrant { updateChargeToken(_chargeToken); updateWhitelistSaleConfig(_whitelistSaleConfig); updatePublicSaleConfig(_publicSaleConfig); if(_royaltyReceiver != address(0)){ _setDefaultRoyalty(_royaltyReceiver, _royaltyFeeNumerator); } } function _checkSaleConfig(SaleConfig memory _saleConfig) internal pure returns (bool) { return (_saleConfig.startTime == 0 || (_saleConfig.endTime == 0 || (_saleConfig.startTime < _saleConfig.endTime))); } function updateWhitelistSaleConfig(SaleConfig memory _whitelistSaleConfig) public onlyOwner { require(whitelistSaleConfig.startTime == 0 || whitelistSaleConfig.startTime > block.timestamp, "StarBlockCollection: can only change the unstarted sale config!"); require(_whitelistSaleConfig.startTime == 0 || _whitelistSaleConfig.startTime > block.timestamp, "StarBlockCollection: the new config should not be started!"); require(_whitelistSaleConfig.startTime < (block.timestamp + 180 days), "StarBlockCollection: start time should be within 180 days!"); require(_whitelistSaleConfig.endTime < (block.timestamp + 900 days), "StarBlockCollection: end time should be within 900 days!"); require(_checkSaleConfig(_whitelistSaleConfig), "StarBlockCollection: invalid parameters!"); whitelistSaleConfig.startTime = _whitelistSaleConfig.startTime; whitelistSaleConfig.endTime = _whitelistSaleConfig.endTime; whitelistSaleConfig.price = _whitelistSaleConfig.price; whitelistSaleConfig.maxAmountPerAddress = _whitelistSaleConfig.maxAmountPerAddress; emit UpdateWhitelistSaleConfig(_whitelistSaleConfig); } function updateWhitelistSaleEndTime(uint256 _newEndTime) external onlyOwner nonReentrant { require(whitelistSaleConfig.startTime > 0 && whitelistSaleConfig.startTime < _newEndTime, "StarBlockCollection: the new end time should be greater than start time!"); whitelistSaleConfig.endTime = _newEndTime; emit UpdateWhitelistSaleEndTime(whitelistSaleConfig.endTime, _newEndTime); } function updatePublicSaleConfig(SaleConfig memory _publicSaleConfig) public onlyOwner { require(publicSaleConfig.startTime == 0 || publicSaleConfig.startTime > block.timestamp, "StarBlockCollection: can only change the unstarted sale config!"); require(_publicSaleConfig.startTime == 0 || _publicSaleConfig.startTime > block.timestamp, "StarBlockCollection: the new config should not be started!"); require(_publicSaleConfig.startTime < (block.timestamp + 180 days), "StarBlockCollection: start time should be within 180 days!"); require(_publicSaleConfig.endTime < (block.timestamp + 900 days), "StarBlockCollection: end time should be within 900 days!"); require(_checkSaleConfig(_publicSaleConfig), "StarBlockCollection: invalid parameters!"); publicSaleConfig.startTime = _publicSaleConfig.startTime; publicSaleConfig.endTime = _publicSaleConfig.endTime; publicSaleConfig.price = _publicSaleConfig.price; publicSaleConfig.maxAmountPerAddress = _publicSaleConfig.maxAmountPerAddress; emit UpdatePublicSaleConfig(_publicSaleConfig); } function updatePublicSaleEndTime(uint256 _newEndTime) external onlyOwner nonReentrant { require(publicSaleConfig.startTime > 0 && publicSaleConfig.startTime < _newEndTime, "StarBlockCollection: the new end time should be greater than start time!"); publicSaleConfig.endTime = _newEndTime; emit UpdatePublicSaleEndTime(publicSaleConfig.endTime, _newEndTime); } function updateChargeToken(IERC20 _chargeToken) public onlyOwner { require(whitelistSaleConfig.startTime == 0 || whitelistSaleConfig.startTime > block.timestamp, "StarBlockCollection: whitelist sale has started!"); require(publicSaleConfig.startTime == 0 || publicSaleConfig.startTime > block.timestamp, "StarBlockCollection: public sale has started!"); chargeToken = _chargeToken; emit UpdateChargeToken(_chargeToken); } function updateProtocolFeeReceiverAndNumerator(address payable _protocolFeeReceiver, uint256 _protocolFeeNumerator) external nonReentrant { require(msg.sender == protocolFeeReceiver, "StarBlockCollection: only protocolFeeReceiver can set!"); require(_protocolFeeReceiver != address(0), "StarBlockCollection: _protocolFeeReceiver can not be zero!"); require(_protocolFeeNumerator <= protocolFeeNumerator, "StarBlockCollection: can only set lower protocol fee numerator!"); protocolFeeReceiver = _protocolFeeReceiver; protocolFeeNumerator = _protocolFeeNumerator; } function withdrawMoney() external onlyOwner { uint256 revenue = _getRevenueAmount(); uint256 artistRevenue = revenue; uint256 protocolFee = 0; if(protocolFeeNumerator > 0 && revenue > 0){ protocolFee = revenue * protocolFeeNumerator / _feeDenominator(); artistRevenue = revenue - protocolFee; } bool success = false; if(artistRevenue > 0){ success = _transferRevenue(payable(owner()), artistRevenue); } if(success && protocolFee > 0){ success = _transferRevenue(protocolFeeReceiver, protocolFee); } require(success, "StarBlockCollection: withdrawMoney failed!"); } function _getRevenueAmount() internal view returns (uint256 _amount){ if(address(chargeToken) != address(0)){ _amount = chargeToken.balanceOf(address(this)); }else{ _amount = address(this).balance; } } function _transferRevenue(address payable _user, uint256 _amount) internal nonReentrant returns (bool _success) { if(address(chargeToken) != address(0)){ chargeToken.safeTransfer(_user, _amount); _success = true; }else{ _success = _transferETH(_user, _amount); } } function _transferETH(address payable _user, uint256 _amount) internal returns (bool _success) { (_success, ) = _user.call{value: _amount}(""); } function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) public onlyOwner nonReentrant { _setDefaultRoyalty(_receiver, _feeNumerator); } function deleteDefaultRoyalty() external onlyOwner nonReentrant { _deleteDefaultRoyalty(); } function exists(uint256 _tokenId) external view returns (bool) { return _exists(_tokenId); } } interface IStarBlockCollectionFactory { event CollectionDeployed(IStarBlockCollection _collection, address _user, string _uuid); function collections(IStarBlockCollection _collection) external view returns (address); function collectionsAmount() external view returns (uint256); function collectionProtocolFeeReceiver() external view returns (address payable); function collectionProtocolFeeNumerator() external view returns (uint256); function deployCollection( string memory _uuid, string memory _name, string memory _symbol, uint256 _maxSupply, IERC20 _chargeToken, string memory _baseTokenURI, uint256 _maxAmountForArtist, address _royaltyReceiver, uint96 _royaltyFeeNumerator ) external returns (IStarBlockCollection _collection); } contract StarBlockCollectionFactory is IStarBlockCollectionFactory, Ownable, ReentrancyGuard { uint256 public constant FEE_DENOMINATOR = 10000; mapping(IStarBlockCollection => address) public collections; uint256 public collectionsAmount; address payable public collectionProtocolFeeReceiver; uint256 public collectionProtocolFeeNumerator; //should less than FEE_DENOMINATOR constructor( address payable _collectionProtocolFeeReceiver, uint256 _collectionProtocolFeeNumerator ) { require(_collectionProtocolFeeReceiver != address(0) && _collectionProtocolFeeNumerator <= FEE_DENOMINATOR, "StarBlockCollectionFactory: invalid parameters!"); collectionProtocolFeeReceiver = _collectionProtocolFeeReceiver; collectionProtocolFeeNumerator = _collectionProtocolFeeNumerator; } function deployCollection( string memory _uuid, string memory _name, string memory _symbol, uint256 _maxSupply, IERC20 _chargeToken, string memory _baseTokenURI, uint256 _maxAmountForArtist, address _royaltyReceiver, uint96 _royaltyFeeNumerator ) external nonReentrant returns (IStarBlockCollection _collection) { _collection = new StarBlockCollection(_name, _symbol, _maxSupply, _chargeToken, _baseTokenURI, _maxAmountForArtist, collectionProtocolFeeReceiver, collectionProtocolFeeNumerator, _royaltyReceiver, _royaltyFeeNumerator); Ownable(address(_collection)).transferOwnership(msg.sender); collections[_collection] = msg.sender; collectionsAmount ++; emit CollectionDeployed(_collection, msg.sender, _uuid); } function updateCollectionProtocolFeeReceiverAndNumerator(address payable _collectionProtocolFeeReceiver, uint256 _collectionProtocolFeeNumerator) external onlyOwner nonReentrant { require(_collectionProtocolFeeReceiver != address(0), "StarBlockCollectionFactory: _collectionProtocolFeeReceiver can not be zero!"); require(_collectionProtocolFeeNumerator <= FEE_DENOMINATOR, "StarBlockCollectionFactory: _collectionProtocolFeeNumerator should not be greater than 10000!"); collectionProtocolFeeReceiver = _collectionProtocolFeeReceiver; collectionProtocolFeeNumerator = _collectionProtocolFeeNumerator; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) 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 // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "./IERC2981.sol"; import "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import './ERC721A.sol'; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) 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 // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"contract IERC20","name":"_chargeToken","type":"address"},{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"uint256","name":"_maxAmountForArtist","type":"uint256"},{"internalType":"address payable","name":"_protocolFeeReceiver","type":"address"},{"internalType":"uint256","name":"_protocolFeeNumerator","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeeNumerator","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"contract IERC20","name":"_chargeToken","type":"address"}],"name":"UpdateChargeToken","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"indexed":false,"internalType":"struct IStarBlockCollection.SaleConfig","name":"_publicSaleConfig","type":"tuple"}],"name":"UpdatePublicSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"UpdatePublicSaleEndTime","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"indexed":false,"internalType":"struct IStarBlockCollection.SaleConfig","name":"_whitelistSaleConfig","type":"tuple"}],"name":"UpdateWhitelistSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"UpdateWhitelistSaleEndTime","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addWhitelists","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":"uint256","name":"_amount","type":"uint256"}],"name":"artistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountForArtist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeWhitelistAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeWhitelists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_chargeToken","type":"address"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"internalType":"struct IStarBlockCollection.SaleConfig","name":"_whitelistSaleConfig","type":"tuple"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"internalType":"struct IStarBlockCollection.SaleConfig","name":"_publicSaleConfig","type":"tuple"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeeNumerator","type":"uint96"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"allowedAmounts","type":"uint256[]"}],"name":"setWhitelistAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_chargeToken","type":"address"}],"name":"updateChargeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_protocolFeeReceiver","type":"address"},{"internalType":"uint256","name":"_protocolFeeNumerator","type":"uint256"}],"name":"updateProtocolFeeReceiverAndNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"internalType":"struct IStarBlockCollection.SaleConfig","name":"_publicSaleConfig","type":"tuple"}],"name":"updatePublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"updatePublicSaleEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"internalType":"struct IStarBlockCollection.SaleConfig","name":"_whitelistSaleConfig","type":"tuple"}],"name":"updateWhitelistSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"updateWhitelistSaleEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCanMintTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerAddress","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistSaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162004c3a38038062004c3a8339810160408190526200003491620004a8565b89518a908a906200004d90600290602085019062000300565b5080516200006390600390602084019062000300565b505060008055506200007533620001ad565b6001600b5587158015906200008a5750878511155b80156200009f57506001600160a01b03841615155b8015620000ae57506127108311155b8015620000c657506127106001600160601b03821611155b620001295760405162461bcd60e51b815260206004820152602860248201527f53746172426c6f636b436f6c6c656374696f6e3a20696e76616c696420706172604482015267616d65746572732160c01b60648201526084015b60405180910390fd5b6080889052600e80546001600160a01b0319166001600160a01b03891617905585516200015e90600c90602089019062000300565b5060a0859052600f80546001600160a01b0319166001600160a01b038681169190911790915560108490558216156200019d576200019d8282620001ff565b50505050505050505050620005e0565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b03821611156200026f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000120565b6001600160a01b038216620002c75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000120565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b8280546200030e90620005a3565b90600052602060002090601f0160209004810192826200033257600085556200037d565b82601f106200034d57805160ff19168380011785556200037d565b828001600101855582156200037d579182015b828111156200037d57825182559160200191906001019062000360565b506200038b9291506200038f565b5090565b5b808211156200038b576000815560010162000390565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620003ce57600080fd5b81516001600160401b0380821115620003eb57620003eb620003a6565b604051601f8301601f19908116603f01168101908282118183101715620004165762000416620003a6565b816040528381526020925086838588010111156200043357600080fd5b600091505b8382101562000457578582018301518183018401529082019062000438565b83821115620004695760008385830101525b9695505050505050565b80516001600160a01b03811681146200048b57600080fd5b919050565b80516001600160601b03811681146200048b57600080fd5b6000806000806000806000806000806101408b8d031215620004c957600080fd5b8a516001600160401b0380821115620004e157600080fd5b620004ef8e838f01620003bc565b9b5060208d01519150808211156200050657600080fd5b620005148e838f01620003bc565b9a5060408d015199506200052b60608e0162000473565b985060808d01519150808211156200054257600080fd5b50620005518d828e01620003bc565b96505060a08b015194506200056960c08c0162000473565b935060e08b01519250620005816101008c0162000473565b9150620005926101208c0162000490565b90509295989b9194979a5092959850565b600181811c90821680620005b857607f821691505b60208210811415620005da57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051614618620006226000396000818161094b01528181611a1c01526122dc0152600081816109df01528181611a62015261237501526146186000f3fe6080604052600436106103505760003560e01c8063868ff4a2116101c6578063bf113baf116100f7578063d756ae7011610095578063ed329fa81161006f578063ed329fa814610a61578063f2fde38b14610a77578063f5197d5814610a97578063fb26a0c914610aad57600080fd5b8063d756ae7014610a01578063de61474614610a21578063e985e9c514610a4157600080fd5b8063c87b56dd116100d1578063c87b56dd1461096d578063c8eaf28f1461098d578063cc74cd6b146109ad578063d5abeb01146109cd57600080fd5b8063bf113baf146108ec578063c23dc68f1461090c578063c5be767a1461093957600080fd5b8063a22cb46511610164578063aa1b103f1161013e578063aa1b103f14610882578063ac44600214610897578063b88d4fde146108ac578063ba141075146108cc57600080fd5b8063a22cb4651461081f578063a343b6201461083f578063a3fd2c441461085f57600080fd5b80639224abb2116101a05780639224abb21461079a57806395d89b41146107ba57806399a2557a146107cf5780639b19251a146107ef57600080fd5b8063868ff4a2146107545780638da5cb5b146107675780638dde3c4b1461078557600080fd5b80633bf58382116102a05780636352211e1161023e578063715018a611610218578063715018a6146106c55780637984f679146106da57806383903646146106fa5780638462151c1461072757600080fd5b80636352211e14610642578063656cf9181461066257806370a08231146106a557600080fd5b80634f558e791161027a5780634f558e79146105a85780634fd20137146105c857806355f804b3146105f55780635bbb21771461061557600080fd5b80633bf583821461054857806342842e0e14610568578063477e179e1461058857600080fd5b806323b872dd1161030d5780632a55205a116102e75780632a55205a146104b65780632db11544146104f55780632e7e74501461050857806339a51be51461052857600080fd5b806323b872dd14610449578063244b7e9314610469578063281bd7981461049657600080fd5b806301ffc9a71461035557806304634d8d1461038a57806306fdde03146103ac578063081812fc146103ce578063095ea7b31461040657806318160ddd14610426575b600080fd5b34801561036157600080fd5b5061037561037036600461384a565b610ac3565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b506103aa6103a5366004613898565b610b69565b005b3480156103b857600080fd5b506103c1610bd7565b6040516103819190613925565b3480156103da57600080fd5b506103ee6103e9366004613938565b610c69565b6040516001600160a01b039091168152602001610381565b34801561041257600080fd5b506103aa610421366004613951565b610cad565b34801561043257600080fd5b50600154600054035b604051908152602001610381565b34801561045557600080fd5b506103aa61046436600461397d565b610d4d565b34801561047557600080fd5b5061043b6104843660046139be565b601d6020526000908152604090205481565b3480156104a257600080fd5b506103aa6104b1366004613ab8565b610ede565b3480156104c257600080fd5b506104d66104d1366004613aec565b61100f565b604080516001600160a01b039093168352602083019190915201610381565b6103aa610503366004613938565b6110bb565b34801561051457600080fd5b506103aa610523366004613b73565b611188565b34801561053457600080fd5b50600f546103ee906001600160a01b031681565b34801561055457600080fd5b506103aa610563366004613938565b61121a565b34801561057457600080fd5b506103aa61058336600461397d565b6112e1565b34801561059457600080fd5b506103aa6105a3366004613ab8565b611301565b3480156105b457600080fd5b506103756105c3366004613938565b61140b565b3480156105d457600080fd5b5061043b6105e33660046139be565b60186020526000908152604090205481565b34801561060157600080fd5b506103aa610610366004613be1565b611416565b34801561062157600080fd5b50610635610630366004613cad565b61147e565b6040516103819190613d1d565b34801561064e57600080fd5b506103ee61065d366004613938565b61154b565b34801561066e57600080fd5b506011546012546013546014546106859392919084565b604080519485526020850193909352918301526060820152608001610381565b3480156106b157600080fd5b5061043b6106c03660046139be565b611556565b3480156106d157600080fd5b506103aa6115a4565b3480156106e657600080fd5b506103aa6106f53660046139be565b6115da565b34801561070657600080fd5b5061043b6107153660046139be565b60166020526000908152604090205481565b34801561073357600080fd5b506107476107423660046139be565b611740565b6040516103819190613d5f565b6103aa610762366004613938565b61184f565b34801561077357600080fd5b50600a546001600160a01b03166103ee565b34801561079157600080fd5b5061043b611a15565b3480156107a657600080fd5b506103aa6107b5366004613938565b611a8b565b3480156107c657600080fd5b506103c1611b46565b3480156107db57600080fd5b506107476107ea366004613d97565b611b55565b3480156107fb57600080fd5b5061037561080a3660046139be565b60156020526000908152604090205460ff1681565b34801561082b57600080fd5b506103aa61083a366004613dda565b611cd2565b34801561084b57600080fd5b506103aa61085a366004613951565b611d68565b34801561086b57600080fd5b50601954601a54601b54601c546106859392919084565b34801561088e57600080fd5b506103aa611f28565b3480156108a357600080fd5b506103aa611f8b565b3480156108b857600080fd5b506103aa6108c7366004613e13565b6120bf565b3480156108d857600080fd5b506103aa6108e7366004613ed6565b612103565b3480156108f857600080fd5b506103aa610907366004613938565b61226b565b34801561091857600080fd5b5061092c610927366004613938565b6123f4565b6040516103819190613ef2565b34801561094557600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561097957600080fd5b506103c1610988366004613938565b61246c565b34801561099957600080fd5b506103aa6109a8366004613ab8565b6124f0565b3480156109b957600080fd5b506103aa6109c8366004613f00565b612651565b3480156109d957600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a0d57600080fd5b50600e546103ee906001600160a01b031681565b348015610a2d57600080fd5b506103aa610a3c366004613ed6565b6127b3565b348015610a4d57600080fd5b50610375610a5c366004613f63565b61291b565b348015610a6d57600080fd5b5061043b600d5481565b348015610a8357600080fd5b506103aa610a923660046139be565b612949565b348015610aa357600080fd5b5061043b60105481565b348015610ab957600080fd5b5061043b60175481565b60006001600160e01b03198216630c9c2fbd60e01b1480610af457506001600160e01b031982166380ac58cd60e01b145b80610b0f57506001600160e01b03198216635b5e139f60e01b145b80610b2a57506001600160e01b0319821663184371e560e31b145b80610b4557506001600160e01b0319821663422353cf60e11b145b80610b545750610b54826129e1565b80610b635750610b6382612a16565b92915050565b600a546001600160a01b03163314610b9c5760405162461bcd60e51b8152600401610b9390613f91565b60405180910390fd5b6002600b541415610bbf5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55610bce8282612a64565b50506001600b55565b606060028054610be690613ffd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1290613ffd565b8015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b5050505050905090565b6000610c7482612b61565b610c91576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cb88261154b565b9050336001600160a01b03821614610cf157610cd4813361291b565b610cf1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610d5882612b88565b9050836001600160a01b0316816001600160a01b031614610d8b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610dd857610dbb863361291b565b610dd857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610dff57604051633a954ecd60e21b815260040160405180910390fd5b8015610e0a57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610e955760018401600081815260046020526040902054610e93576000548114610e935760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a546001600160a01b03163314610f085760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415610f2b5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b558051610f4e5760405162461bcd60e51b8152600401610b9390614038565b60005b8151811015610bce5760156000838381518110610f7057610f70614088565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615610ffd57600060156000848481518110610fb457610fb4614088565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff1916921515929092179091556017805491610ff7836140b4565b91905055505b80611007816140cb565b915050610f51565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916110845750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906110a3906001600160601b0316876140e6565b6110ad9190614105565b915196919550909350505050565b3233146110da5760405162461bcd60e51b8152600401610b9390614127565b604080516080810182526019548152601a54602080830191909152601b5482840152601c546060830152336000908152601d909152919091205461112091908390612be9565b336000908152601d60205260408120805483929061113f90849061417a565b9091555050601b5415158061115f5750601b5415801561115f5750600034115b1561117b57601b5461117b906111769083906140e6565b612de9565b6111853382612fea565b50565b600a546001600160a01b031633146111b25760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156111d55760405162461bcd60e51b8152600401610b9390613fc6565b6002600b556111e3856115da565b6111ec84612103565b6111f5836127b3565b6001600160a01b0382161561120e5761120e8282612a64565b50506001600b55505050565b600a546001600160a01b031633146112445760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156112675760405162461bcd60e51b8152600401610b9390613fc6565b6002600b556019541580159061127e575060195481115b61129a5760405162461bcd60e51b8152600401610b9390614192565b601a81905560408051828152602081018390527fa0f93c463cff1d72335b2b6316e7b4bba938d9331afb9468df671a322ed1cefe91015b60405180910390a1506001600b55565b6112fc838383604051806020016040528060008152506120bf565b505050565b600a546001600160a01b0316331461132b5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561134e5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5580516113715760405162461bcd60e51b8152600401610b9390614200565b60005b8151811015610bce57600082828151811061139157611391614088565b60200260200101519050600060166000836001600160a01b03166001600160a01b031681526020019081526020016000205411156113f8576001600160a01b038116600090815260166020526040812081905560178054916113f2836140b4565b91905055505b5080611403816140cb565b915050611374565b6000610b6382612b61565b600a546001600160a01b031633146114405760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156114635760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55611474600c838361379b565b50506001600b5550565b80516060906000816001600160401b0381111561149d5761149d6139db565b6040519080825280602002602001820160405280156114ef57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816114bb5790505b50905060005b8281146115435761151e85828151811061151157611511614088565b60200260200101516123f4565b82828151811061153057611530614088565b60209081029190910101526001016114f5565b509392505050565b6000610b6382612b88565b60006001600160a01b03821661157f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600a546001600160a01b031633146115ce5760405162461bcd60e51b8152600401610b9390613f91565b6115d86000613008565b565b600a546001600160a01b031633146116045760405162461bcd60e51b8152600401610b9390613f91565b6011541580611614575060115442105b6116795760405162461bcd60e51b815260206004820152603060248201527f53746172426c6f636b436f6c6c656374696f6e3a2077686974656c697374207360448201526f616c652068617320737461727465642160801b6064820152608401610b93565b6019541580611689575060195442105b6116eb5760405162461bcd60e51b815260206004820152602d60248201527f53746172426c6f636b436f6c6c656374696f6e3a207075626c69632073616c6560448201526c2068617320737461727465642160981b6064820152608401610b93565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527fe0a413e7aedf234615d1ccebc9ea233dd62e470f100af095f071a03d3f252a90906020015b60405180910390a150565b6060600080600061175085611556565b90506000816001600160401b0381111561176c5761176c6139db565b604051908082528060200260200182016040528015611795578160200160208202803683370190505b5090506117c260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b838614611843576117d58161305a565b91508160400151156117e65761183b565b81516001600160a01b0316156117fb57815194505b876001600160a01b0316856001600160a01b0316141561183b578083878060010198508151811061182e5761182e614088565b6020026020010181815250505b6001016117c5565b50909695505050505050565b32331461186e5760405162461bcd60e51b8152600401610b9390614127565b60145461190b573360009081526018602052604090205461189090829061417a565b3360009081526016602052604090205410156119065760405162461bcd60e51b815260206004820152602f60248201527f53746172426c6f636b436f6c6c656374696f6e3a2077686974656c697374207260448201526e65616368656420616c6c6f7765642160881b6064820152608401610b93565b611979565b3360009081526015602052604090205460ff166119795760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420696e2077686974604482015265656c6973742160d01b6064820152608401610b93565b604080516080810182526011548152601254602080830191909152601354828401526014546060830152336000908152601890915291909120546119bf91908390612be9565b33600090815260186020526040812080548392906119de90849061417a565b90915550506013541515806119fe57506013541580156119fe5750600034115b1561117b5760135461117b906111769083906140e6565b6000600d547f0000000000000000000000000000000000000000000000000000000000000000611a486001546000540390565b611a52919061417a565b611a5c9190614246565b611a86907f0000000000000000000000000000000000000000000000000000000000000000614246565b905090565b600a546001600160a01b03163314611ab55760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415611ad85760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5560115415801590611aef575060115481115b611b0b5760405162461bcd60e51b8152600401610b9390614192565b601281905560408051828152602081018390527f4fc9d20e1e480ba626cd47884005a55db11ebacbb1d7cc61bd0b4718ff19fc4891016112d1565b606060038054610be690613ffd565b6060818310611b7757604051631960ccad60e11b815260040160405180910390fd5b600080611b8360005490565b905080841115611b91578093505b6000611b9c87611556565b905084861015611bbb5785850381811015611bb5578091505b50611bbf565b5060005b6000816001600160401b03811115611bd957611bd96139db565b604051908082528060200260200182016040528015611c02578160200160208202803683370190505b50905081611c15579350611ccb92505050565b6000611c20886123f4565b905060008160400151611c31575080515b885b888114158015611c435750848714155b15611cbf57611c518161305a565b9250826040015115611c6257611cb7565b82516001600160a01b031615611c7757825191505b8a6001600160a01b0316826001600160a01b03161415611cb75780848880600101995081518110611caa57611caa614088565b6020026020010181815250505b600101611c33565b50505092835250909150505b9392505050565b6001600160a01b038216331415611cfc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600b541415611d8b5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600f546001600160a01b03163314611e095760405162461bcd60e51b815260206004820152603660248201527f53746172426c6f636b436f6c6c656374696f6e3a206f6e6c792070726f746f636044820152756f6c46656552656365697665722063616e207365742160501b6064820152608401610b93565b6001600160a01b038216611e855760405162461bcd60e51b815260206004820152603a60248201527f53746172426c6f636b436f6c6c656374696f6e3a205f70726f746f636f6c466560448201527f6552656365697665722063616e206e6f74206265207a65726f210000000000006064820152608401610b93565b601054811115611efd5760405162461bcd60e51b815260206004820152603f60248201527f53746172426c6f636b436f6c6c656374696f6e3a2063616e206f6e6c7920736560448201527f74206c6f7765722070726f746f636f6c20666565206e756d657261746f7221006064820152608401610b93565b600f80546001600160a01b0319166001600160a01b0393909316929092179091556010556001600b55565b600a546001600160a01b03163314611f525760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415611f755760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55611f846000600855565b6001600b55565b600a546001600160a01b03163314611fb55760405162461bcd60e51b8152600401610b9390613f91565b6000611fbf613096565b90506000819050600080601054118015611fd95750600083115b156120085760105461271090611fef90856140e6565b611ff99190614105565b90506120058184614246565b91505b6000821561202e5761202b612025600a546001600160a01b031690565b8461311b565b90505b80801561203b5750600082115b1561205957600f54612056906001600160a01b03168361311b565b90505b806120b95760405162461bcd60e51b815260206004820152602a60248201527f53746172426c6f636b436f6c6c656374696f6e3a2077697468647261774d6f6e6044820152696579206661696c65642160b01b6064820152608401610b93565b50505050565b6120ca848484610d4d565b6001600160a01b0383163b156120b9576120e68484848461318d565b6120b9576040516368d2bf6b60e11b815260040160405180910390fd5b600a546001600160a01b0316331461212d5760405162461bcd60e51b8152600401610b9390613f91565b601154158061213d575060115442105b6121595760405162461bcd60e51b8152600401610b939061425d565b805115806121675750805142105b6121835760405162461bcd60e51b8152600401610b93906142ba565b6121904262ed4e0061417a565b8151106121af5760405162461bcd60e51b8152600401610b9390614317565b6121bd426304a2860061417a565b8160200151106121df5760405162461bcd60e51b8152600401610b9390614374565b6121e881613276565b6122045760405162461bcd60e51b8152600401610b93906143d1565b805160118190556020808301805160125560408085018051601355606080870180516014558351968752935194860194909452519084015251908201527fb70d34e17a11eb825953259eaf178e59ee5b22e112160173c7ef35ca7cec171790608001611735565b600a546001600160a01b031633146122955760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156122b85760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55806122da5760405162461bcd60e51b8152600401610b9390614419565b7f000000000000000000000000000000000000000000000000000000000000000081600d54612309919061417a565b11156123735760405162461bcd60e51b815260206004820152603360248201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860448201527220616d6f756e7420666f72206172746973742160681b6064820152608401610b93565b7f0000000000000000000000000000000000000000000000000000000000000000816123a26001546000540390565b6123ac919061417a565b11156123ca5760405162461bcd60e51b8152600401610b939061446e565b80600d60008282546123dc919061417a565b909155506123ec90503382612fea565b506001600b55565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106124485792915050565b6124518361305a565b90508060400151156124635792915050565b611ccb8361329a565b606061247782612b61565b61249457604051630a14c4b560e41b815260040160405180910390fd5b600061249e6132cf565b90508051600014156124bf5760405180602001604052806000815250611ccb565b806124c9846132de565b6040516020016124da9291906144b6565b6040516020818303038152906040529392505050565b600a546001600160a01b0316331461251a5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561253d5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5560115415801590612554575060145415155b6125705760405162461bcd60e51b8152600401610b93906144e5565b60008151116125915760405162461bcd60e51b8152600401610b9390614038565b60005b8151811015610bce57601560008383815181106125b3576125b3614088565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661263f576001601560008484815181106125f6576125f6614088565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff1916921515929092179091556017805491612639836140cb565b91905055505b80612649816140cb565b915050612594565b600a546001600160a01b0316331461267b5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561269e5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55601154158015906126b45750601454155b6126d05760405162461bcd60e51b8152600401610b93906144e5565b600082511180156126e2575080518251145b6126fe5760405162461bcd60e51b8152600401610b9390614200565b60005b825181101561147457600083828151811061271e5761271e614088565b60200260200101519050600083838151811061273c5761273c614088565b60200260200101519050600081111561279e576001600160a01b038216600090815260166020526040902054612782576017805490600061277c836140cb565b91905055505b6001600160a01b03821660009081526016602052604090208190555b505080806127ab906140cb565b915050612701565b600a546001600160a01b031633146127dd5760405162461bcd60e51b8152600401610b9390613f91565b60195415806127ed575060195442105b6128095760405162461bcd60e51b8152600401610b939061425d565b805115806128175750805142105b6128335760405162461bcd60e51b8152600401610b93906142ba565b6128404262ed4e0061417a565b81511061285f5760405162461bcd60e51b8152600401610b9390614317565b61286d426304a2860061417a565b81602001511061288f5760405162461bcd60e51b8152600401610b9390614374565b61289881613276565b6128b45760405162461bcd60e51b8152600401610b93906143d1565b8051601981905560208083018051601a5560408085018051601b5560608087018051601c558351968752935194860194909452519084015251908201527fe45e8a559f8cf5559a3dc85a487abc9ef56c3cdfb5dc791399bfbb9ecd259a1390608001611735565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b031633146129735760405162461bcd60e51b8152600401610b9390613f91565b6001600160a01b0381166129d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b93565b61118581613008565b60006001600160e01b0319821663152a902d60e11b1480610b6357506301ffc9a760e01b6001600160e01b0319831614610b63565b60006301ffc9a760e01b6001600160e01b031983161480612a4757506380ac58cd60e01b6001600160e01b03198316145b80610b635750506001600160e01b031916635b5e139f60e01b1490565b6127106001600160601b0382161115612ad25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b93565b6001600160a01b038216612b285760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b93565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000805482108015610b63575050600090815260046020526040902054600160e01b161590565b600081600054811015612bd057600081815260046020526040902054600160e01b8116612bce575b80611ccb575060001901600081815260046020526040902054612bb0565b505b604051636f96cda160e11b815260040160405180910390fd5b60008211612c095760405162461bcd60e51b8152600401610b9390614419565b81612c12611a15565b1015612c305760405162461bcd60e51b8152600401610b939061446e565b8251612c8d5760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c6520686173206e6f60448201526574207365742160d01b6064820152608401610b93565b8251421015612cf55760405162461bcd60e51b815260206004820152602e60248201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c6520686173206e6f60448201526d742073746172746564207965742160901b6064820152608401610b93565b60208301511580612d0a575042836020015110155b612d625760405162461bcd60e51b8152602060048201526024808201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c652068617320656e6044820152636465642160e01b6064820152608401610b93565b60608301511580612d8057506060830151612d7d838361417a565b11155b6112fc5760405162461bcd60e51b815260206004820152603460248201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860448201527320616d6f756e742070657220616464726573732160601b6064820152608401610b93565b6002600b541415612e0c5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600e546001906000906001600160a01b031615612f1457600e546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e959190614536565b905083811015612ef65760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420656e6f75676820604482015265746f6b656e2160d01b6064820152608401610b93565b600e54612f0e906001600160a01b031633308761332d565b50612f73565b82341015612f705760405162461bcd60e51b8152602060048201526024808201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420656e6f756768206044820152634554482160e01b6064820152608401610b93565b50815b80341115612f9157612f8e33612f898334614246565b613398565b91505b816114745760405162461bcd60e51b815260206004820152602360248201527f53746172426c6f636b436f6c6c656374696f6e3a20636861726765206661696c60448201526265642160e81b6064820152608401610b93565b6130048282604051806020016040528060008152506133f4565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610b6390613461565b600e546000906001600160a01b03161561311657600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a869190614536565b504790565b60006002600b5414156131405760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600e546001600160a01b03161561317557600e5461316d906001600160a01b031684846134a8565b506001613182565b61317f8383613398565b90505b6001600b5592915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906131c290339089908890889060040161454f565b6020604051808303816000875af19250505080156131fd575060408051601f3d908101601f191682019092526131fa9181019061458c565b60015b613258573d80801561322b576040519150601f19603f3d011682016040523d82523d6000602084013e613230565b606091505b508051613250576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b80516000901580610b63575060208201511580610b63575050602081015190511090565b604080516080810182526000808252602082018190529181018290526060810191909152610b636132ca83612b88565b613461565b6060600c8054610be690613ffd565b604080516080810191829052607f0190826030600a8206018353600a90045b801561331b57600183039250600a81066030018353600a90046132fd565b50819003601f19909101908152919050565b6040516001600160a01b03808516602483015283166044820152606481018290526120b99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134d8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133e5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ea565b606091505b5090949350505050565b6133fe83836135aa565b6001600160a01b0383163b156112fc576000548281035b613428600086838060010194508661318d565b613445576040516368d2bf6b60e11b815260040160405180910390fd5b81811061341557816000541461345a57600080fd5b5050505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6040516001600160a01b0383166024820152604481018290526112fc90849063a9059cbb60e01b90606401613361565b600061352d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136879092919063ffffffff16565b8051909150156112fc578080602001905181019061354b91906145a9565b6112fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b93565b6000546001600160a01b0383166135d357604051622e076360e81b815260040160405180910390fd5b816135f15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061363b5760005550505050565b606061326e8484600085856001600160a01b0385163b6136e95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b93565b600080866001600160a01b0316858760405161370591906145c6565b60006040518083038185875af1925050503d8060008114613742576040519150601f19603f3d011682016040523d82523d6000602084013e613747565b606091505b5091509150613757828286613762565b979650505050505050565b60608315613771575081611ccb565b8251156137815782518084602001fd5b8160405162461bcd60e51b8152600401610b939190613925565b8280546137a790613ffd565b90600052602060002090601f0160209004810192826137c9576000855561380f565b82601f106137e25782800160ff1982351617855561380f565b8280016001018555821561380f579182015b8281111561380f5782358255916020019190600101906137f4565b5061381b92915061381f565b5090565b5b8082111561381b5760008155600101613820565b6001600160e01b03198116811461118557600080fd5b60006020828403121561385c57600080fd5b8135611ccb81613834565b6001600160a01b038116811461118557600080fd5b80356001600160601b038116811461389357600080fd5b919050565b600080604083850312156138ab57600080fd5b82356138b681613867565b91506138c46020840161387c565b90509250929050565b60005b838110156138e85781810151838201526020016138d0565b838111156120b95750506000910152565b600081518084526139118160208601602086016138cd565b601f01601f19169290920160200192915050565b602081526000611ccb60208301846138f9565b60006020828403121561394a57600080fd5b5035919050565b6000806040838503121561396457600080fd5b823561396f81613867565b946020939093013593505050565b60008060006060848603121561399257600080fd5b833561399d81613867565b925060208401356139ad81613867565b929592945050506040919091013590565b6000602082840312156139d057600080fd5b8135611ccb81613867565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613a1957613a196139db565b604052919050565b60006001600160401b03821115613a3a57613a3a6139db565b5060051b60200190565b600082601f830112613a5557600080fd5b81356020613a6a613a6583613a21565b6139f1565b82815260059290921b84018101918181019086841115613a8957600080fd5b8286015b84811015613aad578035613aa081613867565b8352918301918301613a8d565b509695505050505050565b600060208284031215613aca57600080fd5b81356001600160401b03811115613ae057600080fd5b61326e84828501613a44565b60008060408385031215613aff57600080fd5b50508035926020909101359150565b600060808284031215613b2057600080fd5b604051608081018181106001600160401b0382111715613b4257613b426139db565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b60008060008060006101608688031215613b8c57600080fd5b8535613b9781613867565b9450613ba68760208801613b0e565b9350613bb58760a08801613b0e565b9250610120860135613bc681613867565b9150613bd5610140870161387c565b90509295509295909350565b60008060208385031215613bf457600080fd5b82356001600160401b0380821115613c0b57600080fd5b818501915085601f830112613c1f57600080fd5b813581811115613c2e57600080fd5b866020828501011115613c4057600080fd5b60209290920196919550909350505050565b600082601f830112613c6357600080fd5b81356020613c73613a6583613a21565b82815260059290921b84018101918181019086841115613c9257600080fd5b8286015b84811015613aad5780358352918301918301613c96565b600060208284031215613cbf57600080fd5b81356001600160401b03811115613cd557600080fd5b61326e84828501613c52565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561184357613d4c838551613ce1565b9284019260809290920191600101613d39565b6020808252825182820181905260009190848201906040850190845b8181101561184357835183529284019291840191600101613d7b565b600080600060608486031215613dac57600080fd5b8335613db781613867565b95602085013595506040909401359392505050565b801515811461118557600080fd5b60008060408385031215613ded57600080fd5b8235613df881613867565b91506020830135613e0881613dcc565b809150509250929050565b60008060008060808587031215613e2957600080fd5b8435613e3481613867565b9350602085810135613e4581613867565b93506040860135925060608601356001600160401b0380821115613e6857600080fd5b818801915088601f830112613e7c57600080fd5b813581811115613e8e57613e8e6139db565b613ea0601f8201601f191685016139f1565b91508082528984828501011115613eb657600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060808284031215613ee857600080fd5b611ccb8383613b0e565b60808101610b638284613ce1565b60008060408385031215613f1357600080fd5b82356001600160401b0380821115613f2a57600080fd5b613f3686838701613a44565b93506020850135915080821115613f4c57600080fd5b50613f5985828601613c52565b9150509250929050565b60008060408385031215613f7657600080fd5b8235613f8181613867565b91506020830135613e0881613867565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600181811c9082168061401157607f821691505b6020821081141561403257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526030908201527f53746172426c6f636b436f6c6c656374696f6e3a20616464726573736573206360408201526f616e206e6f7420626520656d7074792160801b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816140c3576140c361409e565b506000190190565b60006000198214156140df576140df61409e565b5060010190565b60008160001904831182151516156141005761410061409e565b500290565b60008261412257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526033908201527f53746172426c6f636b436f6c6c656374696f6e3a205468652063616c6c6572206040820152721a5cc8185b9bdd1a195c8818dbdb9d1c9858dd606a1b606082015260800190565b6000821982111561418d5761418d61409e565b500190565b60208082526048908201527f53746172426c6f636b436f6c6c656374696f6e3a20746865206e657720656e6460408201527f2074696d652073686f756c642062652067726561746572207468616e2073746160608201526772742074696d652160c01b608082015260a00190565b60208082526026908201527f53746172426c6f636b436f6c6c656374696f6e3a206572726f7220706172616d60408201526565746572732160d01b606082015260800190565b6000828210156142585761425861409e565b500390565b6020808252603f908201527f53746172426c6f636b436f6c6c656374696f6e3a2063616e206f6e6c7920636860408201527f616e67652074686520756e737461727465642073616c6520636f6e6669672100606082015260800190565b6020808252603a908201527f53746172426c6f636b436f6c6c656374696f6e3a20746865206e657720636f6e60408201527f6669672073686f756c64206e6f74206265207374617274656421000000000000606082015260800190565b6020808252603a908201527f53746172426c6f636b436f6c6c656374696f6e3a2073746172742074696d652060408201527f73686f756c642062652077697468696e20313830206461797321000000000000606082015260800190565b60208082526038908201527f53746172426c6f636b436f6c6c656374696f6e3a20656e642074696d6520736860408201527f6f756c642062652077697468696e203930302064617973210000000000000000606082015260800190565b60208082526028908201527f53746172426c6f636b436f6c6c656374696f6e3a20696e76616c696420706172604082015267616d65746572732160c01b606082015260800190565b60208082526035908201527f53746172426c6f636b436f6c6c656374696f6e3a20616d6f756e742073686f756040820152746c642062652067726561746572207468616e20302160581b606082015260800190565b60208082526028908201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860408201526720737570706c792160c01b606082015260800190565b600083516144c88184602088016138cd565b8351908301906144dc8183602088016138cd565b01949350505050565b60208082526031908201527f53746172426c6f636b436f6c6c656374696f6e3a206572726f722077686974656040820152706c6973742073616c6520636f6e6669672160781b606082015260800190565b60006020828403121561454857600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614582908301846138f9565b9695505050505050565b60006020828403121561459e57600080fd5b8151611ccb81613834565b6000602082840312156145bb57600080fd5b8151611ccb81613dcc565b600082516145d88184602087016138cd565b919091019291505056fea264697066735822122090e9632fde8c1bc17c01e5208b90218d8d1ca96cb3454bdf504080716f6c195564736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000002710000000000000000000000000c481a850aead5002598b7ed355cbb3349c14807200000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c44a46ae2eceef2e6f2fd35ab84f38f0032b2d6c00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000003d8c18655473bf155768c8d9fd1f10a022b345f00000000000000000000000000000000000000000000000000000000000002ee0000000000000000000000000000000000000000000000000000000000000008477561726469616e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008475541524449414e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e73746172626c6f636b2e696f2f6173736574732f3436322f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103505760003560e01c8063868ff4a2116101c6578063bf113baf116100f7578063d756ae7011610095578063ed329fa81161006f578063ed329fa814610a61578063f2fde38b14610a77578063f5197d5814610a97578063fb26a0c914610aad57600080fd5b8063d756ae7014610a01578063de61474614610a21578063e985e9c514610a4157600080fd5b8063c87b56dd116100d1578063c87b56dd1461096d578063c8eaf28f1461098d578063cc74cd6b146109ad578063d5abeb01146109cd57600080fd5b8063bf113baf146108ec578063c23dc68f1461090c578063c5be767a1461093957600080fd5b8063a22cb46511610164578063aa1b103f1161013e578063aa1b103f14610882578063ac44600214610897578063b88d4fde146108ac578063ba141075146108cc57600080fd5b8063a22cb4651461081f578063a343b6201461083f578063a3fd2c441461085f57600080fd5b80639224abb2116101a05780639224abb21461079a57806395d89b41146107ba57806399a2557a146107cf5780639b19251a146107ef57600080fd5b8063868ff4a2146107545780638da5cb5b146107675780638dde3c4b1461078557600080fd5b80633bf58382116102a05780636352211e1161023e578063715018a611610218578063715018a6146106c55780637984f679146106da57806383903646146106fa5780638462151c1461072757600080fd5b80636352211e14610642578063656cf9181461066257806370a08231146106a557600080fd5b80634f558e791161027a5780634f558e79146105a85780634fd20137146105c857806355f804b3146105f55780635bbb21771461061557600080fd5b80633bf583821461054857806342842e0e14610568578063477e179e1461058857600080fd5b806323b872dd1161030d5780632a55205a116102e75780632a55205a146104b65780632db11544146104f55780632e7e74501461050857806339a51be51461052857600080fd5b806323b872dd14610449578063244b7e9314610469578063281bd7981461049657600080fd5b806301ffc9a71461035557806304634d8d1461038a57806306fdde03146103ac578063081812fc146103ce578063095ea7b31461040657806318160ddd14610426575b600080fd5b34801561036157600080fd5b5061037561037036600461384a565b610ac3565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b506103aa6103a5366004613898565b610b69565b005b3480156103b857600080fd5b506103c1610bd7565b6040516103819190613925565b3480156103da57600080fd5b506103ee6103e9366004613938565b610c69565b6040516001600160a01b039091168152602001610381565b34801561041257600080fd5b506103aa610421366004613951565b610cad565b34801561043257600080fd5b50600154600054035b604051908152602001610381565b34801561045557600080fd5b506103aa61046436600461397d565b610d4d565b34801561047557600080fd5b5061043b6104843660046139be565b601d6020526000908152604090205481565b3480156104a257600080fd5b506103aa6104b1366004613ab8565b610ede565b3480156104c257600080fd5b506104d66104d1366004613aec565b61100f565b604080516001600160a01b039093168352602083019190915201610381565b6103aa610503366004613938565b6110bb565b34801561051457600080fd5b506103aa610523366004613b73565b611188565b34801561053457600080fd5b50600f546103ee906001600160a01b031681565b34801561055457600080fd5b506103aa610563366004613938565b61121a565b34801561057457600080fd5b506103aa61058336600461397d565b6112e1565b34801561059457600080fd5b506103aa6105a3366004613ab8565b611301565b3480156105b457600080fd5b506103756105c3366004613938565b61140b565b3480156105d457600080fd5b5061043b6105e33660046139be565b60186020526000908152604090205481565b34801561060157600080fd5b506103aa610610366004613be1565b611416565b34801561062157600080fd5b50610635610630366004613cad565b61147e565b6040516103819190613d1d565b34801561064e57600080fd5b506103ee61065d366004613938565b61154b565b34801561066e57600080fd5b506011546012546013546014546106859392919084565b604080519485526020850193909352918301526060820152608001610381565b3480156106b157600080fd5b5061043b6106c03660046139be565b611556565b3480156106d157600080fd5b506103aa6115a4565b3480156106e657600080fd5b506103aa6106f53660046139be565b6115da565b34801561070657600080fd5b5061043b6107153660046139be565b60166020526000908152604090205481565b34801561073357600080fd5b506107476107423660046139be565b611740565b6040516103819190613d5f565b6103aa610762366004613938565b61184f565b34801561077357600080fd5b50600a546001600160a01b03166103ee565b34801561079157600080fd5b5061043b611a15565b3480156107a657600080fd5b506103aa6107b5366004613938565b611a8b565b3480156107c657600080fd5b506103c1611b46565b3480156107db57600080fd5b506107476107ea366004613d97565b611b55565b3480156107fb57600080fd5b5061037561080a3660046139be565b60156020526000908152604090205460ff1681565b34801561082b57600080fd5b506103aa61083a366004613dda565b611cd2565b34801561084b57600080fd5b506103aa61085a366004613951565b611d68565b34801561086b57600080fd5b50601954601a54601b54601c546106859392919084565b34801561088e57600080fd5b506103aa611f28565b3480156108a357600080fd5b506103aa611f8b565b3480156108b857600080fd5b506103aa6108c7366004613e13565b6120bf565b3480156108d857600080fd5b506103aa6108e7366004613ed6565b612103565b3480156108f857600080fd5b506103aa610907366004613938565b61226b565b34801561091857600080fd5b5061092c610927366004613938565b6123f4565b6040516103819190613ef2565b34801561094557600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561097957600080fd5b506103c1610988366004613938565b61246c565b34801561099957600080fd5b506103aa6109a8366004613ab8565b6124f0565b3480156109b957600080fd5b506103aa6109c8366004613f00565b612651565b3480156109d957600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000271081565b348015610a0d57600080fd5b50600e546103ee906001600160a01b031681565b348015610a2d57600080fd5b506103aa610a3c366004613ed6565b6127b3565b348015610a4d57600080fd5b50610375610a5c366004613f63565b61291b565b348015610a6d57600080fd5b5061043b600d5481565b348015610a8357600080fd5b506103aa610a923660046139be565b612949565b348015610aa357600080fd5b5061043b60105481565b348015610ab957600080fd5b5061043b60175481565b60006001600160e01b03198216630c9c2fbd60e01b1480610af457506001600160e01b031982166380ac58cd60e01b145b80610b0f57506001600160e01b03198216635b5e139f60e01b145b80610b2a57506001600160e01b0319821663184371e560e31b145b80610b4557506001600160e01b0319821663422353cf60e11b145b80610b545750610b54826129e1565b80610b635750610b6382612a16565b92915050565b600a546001600160a01b03163314610b9c5760405162461bcd60e51b8152600401610b9390613f91565b60405180910390fd5b6002600b541415610bbf5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55610bce8282612a64565b50506001600b55565b606060028054610be690613ffd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1290613ffd565b8015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b5050505050905090565b6000610c7482612b61565b610c91576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cb88261154b565b9050336001600160a01b03821614610cf157610cd4813361291b565b610cf1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610d5882612b88565b9050836001600160a01b0316816001600160a01b031614610d8b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610dd857610dbb863361291b565b610dd857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610dff57604051633a954ecd60e21b815260040160405180910390fd5b8015610e0a57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610e955760018401600081815260046020526040902054610e93576000548114610e935760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a546001600160a01b03163314610f085760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415610f2b5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b558051610f4e5760405162461bcd60e51b8152600401610b9390614038565b60005b8151811015610bce5760156000838381518110610f7057610f70614088565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615610ffd57600060156000848481518110610fb457610fb4614088565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff1916921515929092179091556017805491610ff7836140b4565b91905055505b80611007816140cb565b915050610f51565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916110845750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906110a3906001600160601b0316876140e6565b6110ad9190614105565b915196919550909350505050565b3233146110da5760405162461bcd60e51b8152600401610b9390614127565b604080516080810182526019548152601a54602080830191909152601b5482840152601c546060830152336000908152601d909152919091205461112091908390612be9565b336000908152601d60205260408120805483929061113f90849061417a565b9091555050601b5415158061115f5750601b5415801561115f5750600034115b1561117b57601b5461117b906111769083906140e6565b612de9565b6111853382612fea565b50565b600a546001600160a01b031633146111b25760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156111d55760405162461bcd60e51b8152600401610b9390613fc6565b6002600b556111e3856115da565b6111ec84612103565b6111f5836127b3565b6001600160a01b0382161561120e5761120e8282612a64565b50506001600b55505050565b600a546001600160a01b031633146112445760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156112675760405162461bcd60e51b8152600401610b9390613fc6565b6002600b556019541580159061127e575060195481115b61129a5760405162461bcd60e51b8152600401610b9390614192565b601a81905560408051828152602081018390527fa0f93c463cff1d72335b2b6316e7b4bba938d9331afb9468df671a322ed1cefe91015b60405180910390a1506001600b55565b6112fc838383604051806020016040528060008152506120bf565b505050565b600a546001600160a01b0316331461132b5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561134e5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5580516113715760405162461bcd60e51b8152600401610b9390614200565b60005b8151811015610bce57600082828151811061139157611391614088565b60200260200101519050600060166000836001600160a01b03166001600160a01b031681526020019081526020016000205411156113f8576001600160a01b038116600090815260166020526040812081905560178054916113f2836140b4565b91905055505b5080611403816140cb565b915050611374565b6000610b6382612b61565b600a546001600160a01b031633146114405760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156114635760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55611474600c838361379b565b50506001600b5550565b80516060906000816001600160401b0381111561149d5761149d6139db565b6040519080825280602002602001820160405280156114ef57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816114bb5790505b50905060005b8281146115435761151e85828151811061151157611511614088565b60200260200101516123f4565b82828151811061153057611530614088565b60209081029190910101526001016114f5565b509392505050565b6000610b6382612b88565b60006001600160a01b03821661157f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600a546001600160a01b031633146115ce5760405162461bcd60e51b8152600401610b9390613f91565b6115d86000613008565b565b600a546001600160a01b031633146116045760405162461bcd60e51b8152600401610b9390613f91565b6011541580611614575060115442105b6116795760405162461bcd60e51b815260206004820152603060248201527f53746172426c6f636b436f6c6c656374696f6e3a2077686974656c697374207360448201526f616c652068617320737461727465642160801b6064820152608401610b93565b6019541580611689575060195442105b6116eb5760405162461bcd60e51b815260206004820152602d60248201527f53746172426c6f636b436f6c6c656374696f6e3a207075626c69632073616c6560448201526c2068617320737461727465642160981b6064820152608401610b93565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527fe0a413e7aedf234615d1ccebc9ea233dd62e470f100af095f071a03d3f252a90906020015b60405180910390a150565b6060600080600061175085611556565b90506000816001600160401b0381111561176c5761176c6139db565b604051908082528060200260200182016040528015611795578160200160208202803683370190505b5090506117c260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b838614611843576117d58161305a565b91508160400151156117e65761183b565b81516001600160a01b0316156117fb57815194505b876001600160a01b0316856001600160a01b0316141561183b578083878060010198508151811061182e5761182e614088565b6020026020010181815250505b6001016117c5565b50909695505050505050565b32331461186e5760405162461bcd60e51b8152600401610b9390614127565b60145461190b573360009081526018602052604090205461189090829061417a565b3360009081526016602052604090205410156119065760405162461bcd60e51b815260206004820152602f60248201527f53746172426c6f636b436f6c6c656374696f6e3a2077686974656c697374207260448201526e65616368656420616c6c6f7765642160881b6064820152608401610b93565b611979565b3360009081526015602052604090205460ff166119795760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420696e2077686974604482015265656c6973742160d01b6064820152608401610b93565b604080516080810182526011548152601254602080830191909152601354828401526014546060830152336000908152601890915291909120546119bf91908390612be9565b33600090815260186020526040812080548392906119de90849061417a565b90915550506013541515806119fe57506013541580156119fe5750600034115b1561117b5760135461117b906111769083906140e6565b6000600d547f0000000000000000000000000000000000000000000000000000000000000000611a486001546000540390565b611a52919061417a565b611a5c9190614246565b611a86907f0000000000000000000000000000000000000000000000000000000000002710614246565b905090565b600a546001600160a01b03163314611ab55760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415611ad85760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5560115415801590611aef575060115481115b611b0b5760405162461bcd60e51b8152600401610b9390614192565b601281905560408051828152602081018390527f4fc9d20e1e480ba626cd47884005a55db11ebacbb1d7cc61bd0b4718ff19fc4891016112d1565b606060038054610be690613ffd565b6060818310611b7757604051631960ccad60e11b815260040160405180910390fd5b600080611b8360005490565b905080841115611b91578093505b6000611b9c87611556565b905084861015611bbb5785850381811015611bb5578091505b50611bbf565b5060005b6000816001600160401b03811115611bd957611bd96139db565b604051908082528060200260200182016040528015611c02578160200160208202803683370190505b50905081611c15579350611ccb92505050565b6000611c20886123f4565b905060008160400151611c31575080515b885b888114158015611c435750848714155b15611cbf57611c518161305a565b9250826040015115611c6257611cb7565b82516001600160a01b031615611c7757825191505b8a6001600160a01b0316826001600160a01b03161415611cb75780848880600101995081518110611caa57611caa614088565b6020026020010181815250505b600101611c33565b50505092835250909150505b9392505050565b6001600160a01b038216331415611cfc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600b541415611d8b5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600f546001600160a01b03163314611e095760405162461bcd60e51b815260206004820152603660248201527f53746172426c6f636b436f6c6c656374696f6e3a206f6e6c792070726f746f636044820152756f6c46656552656365697665722063616e207365742160501b6064820152608401610b93565b6001600160a01b038216611e855760405162461bcd60e51b815260206004820152603a60248201527f53746172426c6f636b436f6c6c656374696f6e3a205f70726f746f636f6c466560448201527f6552656365697665722063616e206e6f74206265207a65726f210000000000006064820152608401610b93565b601054811115611efd5760405162461bcd60e51b815260206004820152603f60248201527f53746172426c6f636b436f6c6c656374696f6e3a2063616e206f6e6c7920736560448201527f74206c6f7765722070726f746f636f6c20666565206e756d657261746f7221006064820152608401610b93565b600f80546001600160a01b0319166001600160a01b0393909316929092179091556010556001600b55565b600a546001600160a01b03163314611f525760405162461bcd60e51b8152600401610b9390613f91565b6002600b541415611f755760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55611f846000600855565b6001600b55565b600a546001600160a01b03163314611fb55760405162461bcd60e51b8152600401610b9390613f91565b6000611fbf613096565b90506000819050600080601054118015611fd95750600083115b156120085760105461271090611fef90856140e6565b611ff99190614105565b90506120058184614246565b91505b6000821561202e5761202b612025600a546001600160a01b031690565b8461311b565b90505b80801561203b5750600082115b1561205957600f54612056906001600160a01b03168361311b565b90505b806120b95760405162461bcd60e51b815260206004820152602a60248201527f53746172426c6f636b436f6c6c656374696f6e3a2077697468647261774d6f6e6044820152696579206661696c65642160b01b6064820152608401610b93565b50505050565b6120ca848484610d4d565b6001600160a01b0383163b156120b9576120e68484848461318d565b6120b9576040516368d2bf6b60e11b815260040160405180910390fd5b600a546001600160a01b0316331461212d5760405162461bcd60e51b8152600401610b9390613f91565b601154158061213d575060115442105b6121595760405162461bcd60e51b8152600401610b939061425d565b805115806121675750805142105b6121835760405162461bcd60e51b8152600401610b93906142ba565b6121904262ed4e0061417a565b8151106121af5760405162461bcd60e51b8152600401610b9390614317565b6121bd426304a2860061417a565b8160200151106121df5760405162461bcd60e51b8152600401610b9390614374565b6121e881613276565b6122045760405162461bcd60e51b8152600401610b93906143d1565b805160118190556020808301805160125560408085018051601355606080870180516014558351968752935194860194909452519084015251908201527fb70d34e17a11eb825953259eaf178e59ee5b22e112160173c7ef35ca7cec171790608001611735565b600a546001600160a01b031633146122955760405162461bcd60e51b8152600401610b9390613f91565b6002600b5414156122b85760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55806122da5760405162461bcd60e51b8152600401610b9390614419565b7f000000000000000000000000000000000000000000000000000000000000000081600d54612309919061417a565b11156123735760405162461bcd60e51b815260206004820152603360248201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860448201527220616d6f756e7420666f72206172746973742160681b6064820152608401610b93565b7f0000000000000000000000000000000000000000000000000000000000002710816123a26001546000540390565b6123ac919061417a565b11156123ca5760405162461bcd60e51b8152600401610b939061446e565b80600d60008282546123dc919061417a565b909155506123ec90503382612fea565b506001600b55565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106124485792915050565b6124518361305a565b90508060400151156124635792915050565b611ccb8361329a565b606061247782612b61565b61249457604051630a14c4b560e41b815260040160405180910390fd5b600061249e6132cf565b90508051600014156124bf5760405180602001604052806000815250611ccb565b806124c9846132de565b6040516020016124da9291906144b6565b6040516020818303038152906040529392505050565b600a546001600160a01b0316331461251a5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561253d5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b5560115415801590612554575060145415155b6125705760405162461bcd60e51b8152600401610b93906144e5565b60008151116125915760405162461bcd60e51b8152600401610b9390614038565b60005b8151811015610bce57601560008383815181106125b3576125b3614088565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661263f576001601560008484815181106125f6576125f6614088565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff1916921515929092179091556017805491612639836140cb565b91905055505b80612649816140cb565b915050612594565b600a546001600160a01b0316331461267b5760405162461bcd60e51b8152600401610b9390613f91565b6002600b54141561269e5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55601154158015906126b45750601454155b6126d05760405162461bcd60e51b8152600401610b93906144e5565b600082511180156126e2575080518251145b6126fe5760405162461bcd60e51b8152600401610b9390614200565b60005b825181101561147457600083828151811061271e5761271e614088565b60200260200101519050600083838151811061273c5761273c614088565b60200260200101519050600081111561279e576001600160a01b038216600090815260166020526040902054612782576017805490600061277c836140cb565b91905055505b6001600160a01b03821660009081526016602052604090208190555b505080806127ab906140cb565b915050612701565b600a546001600160a01b031633146127dd5760405162461bcd60e51b8152600401610b9390613f91565b60195415806127ed575060195442105b6128095760405162461bcd60e51b8152600401610b939061425d565b805115806128175750805142105b6128335760405162461bcd60e51b8152600401610b93906142ba565b6128404262ed4e0061417a565b81511061285f5760405162461bcd60e51b8152600401610b9390614317565b61286d426304a2860061417a565b81602001511061288f5760405162461bcd60e51b8152600401610b9390614374565b61289881613276565b6128b45760405162461bcd60e51b8152600401610b93906143d1565b8051601981905560208083018051601a5560408085018051601b5560608087018051601c558351968752935194860194909452519084015251908201527fe45e8a559f8cf5559a3dc85a487abc9ef56c3cdfb5dc791399bfbb9ecd259a1390608001611735565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b031633146129735760405162461bcd60e51b8152600401610b9390613f91565b6001600160a01b0381166129d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b93565b61118581613008565b60006001600160e01b0319821663152a902d60e11b1480610b6357506301ffc9a760e01b6001600160e01b0319831614610b63565b60006301ffc9a760e01b6001600160e01b031983161480612a4757506380ac58cd60e01b6001600160e01b03198316145b80610b635750506001600160e01b031916635b5e139f60e01b1490565b6127106001600160601b0382161115612ad25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b93565b6001600160a01b038216612b285760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b93565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000805482108015610b63575050600090815260046020526040902054600160e01b161590565b600081600054811015612bd057600081815260046020526040902054600160e01b8116612bce575b80611ccb575060001901600081815260046020526040902054612bb0565b505b604051636f96cda160e11b815260040160405180910390fd5b60008211612c095760405162461bcd60e51b8152600401610b9390614419565b81612c12611a15565b1015612c305760405162461bcd60e51b8152600401610b939061446e565b8251612c8d5760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c6520686173206e6f60448201526574207365742160d01b6064820152608401610b93565b8251421015612cf55760405162461bcd60e51b815260206004820152602e60248201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c6520686173206e6f60448201526d742073746172746564207965742160901b6064820152608401610b93565b60208301511580612d0a575042836020015110155b612d625760405162461bcd60e51b8152602060048201526024808201527f53746172426c6f636b436f6c6c656374696f6e3a2073616c652068617320656e6044820152636465642160e01b6064820152608401610b93565b60608301511580612d8057506060830151612d7d838361417a565b11155b6112fc5760405162461bcd60e51b815260206004820152603460248201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860448201527320616d6f756e742070657220616464726573732160601b6064820152608401610b93565b6002600b541415612e0c5760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600e546001906000906001600160a01b031615612f1457600e546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e959190614536565b905083811015612ef65760405162461bcd60e51b815260206004820152602660248201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420656e6f75676820604482015265746f6b656e2160d01b6064820152608401610b93565b600e54612f0e906001600160a01b031633308761332d565b50612f73565b82341015612f705760405162461bcd60e51b8152602060048201526024808201527f53746172426c6f636b436f6c6c656374696f6e3a206e6f7420656e6f756768206044820152634554482160e01b6064820152608401610b93565b50815b80341115612f9157612f8e33612f898334614246565b613398565b91505b816114745760405162461bcd60e51b815260206004820152602360248201527f53746172426c6f636b436f6c6c656374696f6e3a20636861726765206661696c60448201526265642160e81b6064820152608401610b93565b6130048282604051806020016040528060008152506133f4565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610b6390613461565b600e546000906001600160a01b03161561311657600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a869190614536565b504790565b60006002600b5414156131405760405162461bcd60e51b8152600401610b9390613fc6565b6002600b55600e546001600160a01b03161561317557600e5461316d906001600160a01b031684846134a8565b506001613182565b61317f8383613398565b90505b6001600b5592915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906131c290339089908890889060040161454f565b6020604051808303816000875af19250505080156131fd575060408051601f3d908101601f191682019092526131fa9181019061458c565b60015b613258573d80801561322b576040519150601f19603f3d011682016040523d82523d6000602084013e613230565b606091505b508051613250576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b80516000901580610b63575060208201511580610b63575050602081015190511090565b604080516080810182526000808252602082018190529181018290526060810191909152610b636132ca83612b88565b613461565b6060600c8054610be690613ffd565b604080516080810191829052607f0190826030600a8206018353600a90045b801561331b57600183039250600a81066030018353600a90046132fd565b50819003601f19909101908152919050565b6040516001600160a01b03808516602483015283166044820152606481018290526120b99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134d8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133e5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ea565b606091505b5090949350505050565b6133fe83836135aa565b6001600160a01b0383163b156112fc576000548281035b613428600086838060010194508661318d565b613445576040516368d2bf6b60e11b815260040160405180910390fd5b81811061341557816000541461345a57600080fd5b5050505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6040516001600160a01b0383166024820152604481018290526112fc90849063a9059cbb60e01b90606401613361565b600061352d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136879092919063ffffffff16565b8051909150156112fc578080602001905181019061354b91906145a9565b6112fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b93565b6000546001600160a01b0383166135d357604051622e076360e81b815260040160405180910390fd5b816135f15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061363b5760005550505050565b606061326e8484600085856001600160a01b0385163b6136e95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b93565b600080866001600160a01b0316858760405161370591906145c6565b60006040518083038185875af1925050503d8060008114613742576040519150601f19603f3d011682016040523d82523d6000602084013e613747565b606091505b5091509150613757828286613762565b979650505050505050565b60608315613771575081611ccb565b8251156137815782518084602001fd5b8160405162461bcd60e51b8152600401610b939190613925565b8280546137a790613ffd565b90600052602060002090601f0160209004810192826137c9576000855561380f565b82601f106137e25782800160ff1982351617855561380f565b8280016001018555821561380f579182015b8281111561380f5782358255916020019190600101906137f4565b5061381b92915061381f565b5090565b5b8082111561381b5760008155600101613820565b6001600160e01b03198116811461118557600080fd5b60006020828403121561385c57600080fd5b8135611ccb81613834565b6001600160a01b038116811461118557600080fd5b80356001600160601b038116811461389357600080fd5b919050565b600080604083850312156138ab57600080fd5b82356138b681613867565b91506138c46020840161387c565b90509250929050565b60005b838110156138e85781810151838201526020016138d0565b838111156120b95750506000910152565b600081518084526139118160208601602086016138cd565b601f01601f19169290920160200192915050565b602081526000611ccb60208301846138f9565b60006020828403121561394a57600080fd5b5035919050565b6000806040838503121561396457600080fd5b823561396f81613867565b946020939093013593505050565b60008060006060848603121561399257600080fd5b833561399d81613867565b925060208401356139ad81613867565b929592945050506040919091013590565b6000602082840312156139d057600080fd5b8135611ccb81613867565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613a1957613a196139db565b604052919050565b60006001600160401b03821115613a3a57613a3a6139db565b5060051b60200190565b600082601f830112613a5557600080fd5b81356020613a6a613a6583613a21565b6139f1565b82815260059290921b84018101918181019086841115613a8957600080fd5b8286015b84811015613aad578035613aa081613867565b8352918301918301613a8d565b509695505050505050565b600060208284031215613aca57600080fd5b81356001600160401b03811115613ae057600080fd5b61326e84828501613a44565b60008060408385031215613aff57600080fd5b50508035926020909101359150565b600060808284031215613b2057600080fd5b604051608081018181106001600160401b0382111715613b4257613b426139db565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b60008060008060006101608688031215613b8c57600080fd5b8535613b9781613867565b9450613ba68760208801613b0e565b9350613bb58760a08801613b0e565b9250610120860135613bc681613867565b9150613bd5610140870161387c565b90509295509295909350565b60008060208385031215613bf457600080fd5b82356001600160401b0380821115613c0b57600080fd5b818501915085601f830112613c1f57600080fd5b813581811115613c2e57600080fd5b866020828501011115613c4057600080fd5b60209290920196919550909350505050565b600082601f830112613c6357600080fd5b81356020613c73613a6583613a21565b82815260059290921b84018101918181019086841115613c9257600080fd5b8286015b84811015613aad5780358352918301918301613c96565b600060208284031215613cbf57600080fd5b81356001600160401b03811115613cd557600080fd5b61326e84828501613c52565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561184357613d4c838551613ce1565b9284019260809290920191600101613d39565b6020808252825182820181905260009190848201906040850190845b8181101561184357835183529284019291840191600101613d7b565b600080600060608486031215613dac57600080fd5b8335613db781613867565b95602085013595506040909401359392505050565b801515811461118557600080fd5b60008060408385031215613ded57600080fd5b8235613df881613867565b91506020830135613e0881613dcc565b809150509250929050565b60008060008060808587031215613e2957600080fd5b8435613e3481613867565b9350602085810135613e4581613867565b93506040860135925060608601356001600160401b0380821115613e6857600080fd5b818801915088601f830112613e7c57600080fd5b813581811115613e8e57613e8e6139db565b613ea0601f8201601f191685016139f1565b91508082528984828501011115613eb657600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060808284031215613ee857600080fd5b611ccb8383613b0e565b60808101610b638284613ce1565b60008060408385031215613f1357600080fd5b82356001600160401b0380821115613f2a57600080fd5b613f3686838701613a44565b93506020850135915080821115613f4c57600080fd5b50613f5985828601613c52565b9150509250929050565b60008060408385031215613f7657600080fd5b8235613f8181613867565b91506020830135613e0881613867565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600181811c9082168061401157607f821691505b6020821081141561403257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526030908201527f53746172426c6f636b436f6c6c656374696f6e3a20616464726573736573206360408201526f616e206e6f7420626520656d7074792160801b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816140c3576140c361409e565b506000190190565b60006000198214156140df576140df61409e565b5060010190565b60008160001904831182151516156141005761410061409e565b500290565b60008261412257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526033908201527f53746172426c6f636b436f6c6c656374696f6e3a205468652063616c6c6572206040820152721a5cc8185b9bdd1a195c8818dbdb9d1c9858dd606a1b606082015260800190565b6000821982111561418d5761418d61409e565b500190565b60208082526048908201527f53746172426c6f636b436f6c6c656374696f6e3a20746865206e657720656e6460408201527f2074696d652073686f756c642062652067726561746572207468616e2073746160608201526772742074696d652160c01b608082015260a00190565b60208082526026908201527f53746172426c6f636b436f6c6c656374696f6e3a206572726f7220706172616d60408201526565746572732160d01b606082015260800190565b6000828210156142585761425861409e565b500390565b6020808252603f908201527f53746172426c6f636b436f6c6c656374696f6e3a2063616e206f6e6c7920636860408201527f616e67652074686520756e737461727465642073616c6520636f6e6669672100606082015260800190565b6020808252603a908201527f53746172426c6f636b436f6c6c656374696f6e3a20746865206e657720636f6e60408201527f6669672073686f756c64206e6f74206265207374617274656421000000000000606082015260800190565b6020808252603a908201527f53746172426c6f636b436f6c6c656374696f6e3a2073746172742074696d652060408201527f73686f756c642062652077697468696e20313830206461797321000000000000606082015260800190565b60208082526038908201527f53746172426c6f636b436f6c6c656374696f6e3a20656e642074696d6520736860408201527f6f756c642062652077697468696e203930302064617973210000000000000000606082015260800190565b60208082526028908201527f53746172426c6f636b436f6c6c656374696f6e3a20696e76616c696420706172604082015267616d65746572732160c01b606082015260800190565b60208082526035908201527f53746172426c6f636b436f6c6c656374696f6e3a20616d6f756e742073686f756040820152746c642062652067726561746572207468616e20302160581b606082015260800190565b60208082526028908201527f53746172426c6f636b436f6c6c656374696f6e3a2072656163686564206d617860408201526720737570706c792160c01b606082015260800190565b600083516144c88184602088016138cd565b8351908301906144dc8183602088016138cd565b01949350505050565b60208082526031908201527f53746172426c6f636b436f6c6c656374696f6e3a206572726f722077686974656040820152706c6973742073616c6520636f6e6669672160781b606082015260800190565b60006020828403121561454857600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614582908301846138f9565b9695505050505050565b60006020828403121561459e57600080fd5b8151611ccb81613834565b6000602082840312156145bb57600080fd5b8151611ccb81613dcc565b600082516145d88184602087016138cd565b919091019291505056fea264697066735822122090e9632fde8c1bc17c01e5208b90218d8d1ca96cb3454bdf504080716f6c195564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000002710000000000000000000000000c481a850aead5002598b7ed355cbb3349c14807200000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c44a46ae2eceef2e6f2fd35ab84f38f0032b2d6c00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000003d8c18655473bf155768c8d9fd1f10a022b345f00000000000000000000000000000000000000000000000000000000000002ee0000000000000000000000000000000000000000000000000000000000000008477561726469616e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008475541524449414e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e73746172626c6f636b2e696f2f6173736574732f3436322f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Guardian
Arg [1] : _symbol (string): GUARDIAN
Arg [2] : _maxSupply (uint256): 10000
Arg [3] : _chargeToken (address): 0xC481A850aEad5002598b7eD355cBB3349c148072
Arg [4] : _baseTokenURI (string): https://api.starblock.io/assets/462/
Arg [5] : _maxAmountForArtist (uint256): 0
Arg [6] : _protocolFeeReceiver (address): 0xC44A46ae2eCEef2e6F2fD35aB84F38F0032B2d6C
Arg [7] : _protocolFeeNumerator (uint256): 2000
Arg [8] : _royaltyReceiver (address): 0x03d8C18655473bf155768c8d9FD1f10A022B345F
Arg [9] : _royaltyFeeNumerator (uint96): 750
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 000000000000000000000000c481a850aead5002598b7ed355cbb3349c148072
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000c44a46ae2eceef2e6f2fd35ab84f38f0032b2d6c
Arg [7] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [8] : 00000000000000000000000003d8c18655473bf155768c8d9fd1f10a022b345f
Arg [9] : 00000000000000000000000000000000000000000000000000000000000002ee
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [11] : 477561726469616e000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [13] : 475541524449414e000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [15] : 68747470733a2f2f6170692e73746172626c6f636b2e696f2f6173736574732f
Arg [16] : 3436322f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
4321:15474:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9995:597;;;;;;;;;;-1:-1:-1;9995:597:16;;;;;:::i;:::-;;:::i;:::-;;;565:14:17;;558:22;540:41;;528:2;513:18;9995:597:16;;;;;;;;19414:159;;;;;;;;;;-1:-1:-1;19414:159:16;;;;;:::i;:::-;;:::i;:::-;;11161:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13048:200::-;;;;;;;;;;-1:-1:-1;13048:200:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2336:32:17;;;2318:51;;2306:2;2291:18;13048:200:4;2172:203:17;12611:376:4;;;;;;;;;;-1:-1:-1;12611:376:4;;;;;:::i;:::-;;:::i;4736:309::-;;;;;;;;;;-1:-1:-1;4998:12:4;;4789:7;4982:13;:28;4736:309;;;2846:25:17;;;2834:2;2819:18;4736:309:4;2700:177:17;22055:2739:4;;;;;;;;;;-1:-1:-1;22055:2739:4;;;;;:::i;:::-;;:::i;5292:51:16:-;;;;;;;;;;-1:-1:-1;5292:51:16;;;;;:::i;:::-;;;;;;;;;;;;;;11395:391;;;;;;;;;;-1:-1:-1;11395:391:16;;;;;:::i;:::-;;:::i;1632:432:3:-;;;;;;;;;;-1:-1:-1;1632:432:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5735:32:17;;;5717:51;;5799:2;5784:18;;5777:34;;;;5690:18;1632:432:3;5543:274:17;7303:403:16;;;;;;:::i;:::-;;:::i;12992:526::-;;;;;;;;;;-1:-1:-1;12992:526:16;;;;;:::i;:::-;;:::i;4759:42::-;;;;;;;;;;-1:-1:-1;4759:42:16;;;;-1:-1:-1;;;;;4759:42:16;;;16479:387;;;;;;;;;;-1:-1:-1;16479:387:16;;;;;:::i;:::-;;:::i;13912:179:4:-;;;;;;;;;;-1:-1:-1;13912:179:4;;;;;:::i;:::-;;:::i;12560:426:16:-;;;;;;;;;;-1:-1:-1;12560:426:16;;;;;:::i;:::-;;:::i;19689:104::-;;;;;;;;;;-1:-1:-1;19689:104:16;;;;;:::i;:::-;;:::i;5166:54::-;;;;;;;;;;-1:-1:-1;5166:54:16;;;;;:::i;:::-;;;;;;;;;;;;;;10715:128;;;;;;;;;;-1:-1:-1;10715:128:16;;;;;:::i;:::-;;:::i;1654:459:5:-;;;;;;;;;;-1:-1:-1;1654:459:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10957:142:4:-;;;;;;;;;;-1:-1:-1;10957:142:4;;;;;:::i;:::-;;:::i;4938:37:16:-;;;;;;;;;;-1:-1:-1;4938:37:16;;;;;;;;;;;;;;;;;;;10315:25:17;;;10371:2;10356:18;;10349:34;;;;10399:18;;;10392:34;10457:2;10442:18;;10435:34;10302:3;10287:19;4938:37:16;10084:391:17;6319:221:4;;;;;;;;;;-1:-1:-1;6319:221:4;;;;;:::i;:::-;;:::i;1661:101:13:-;;;;;;;;;;;;;:::i;16872:457:16:-;;;;;;;;;;-1:-1:-1;16872:457:16;;;;;:::i;:::-;;:::i;5041:51::-;;;;;;;;;;-1:-1:-1;5041:51:16;;;;;:::i;:::-;;;;;;;;;;;;;;5372:871:5;;;;;;;;;;-1:-1:-1;5372:871:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6547:750:16:-;;;;;;:::i;:::-;;:::i;1029:85:13:-;;;;;;;;;;-1:-1:-1;1101:6:13;;-1:-1:-1;;;;;1101:6:13;1029:85;;8175:151:16;;;;;;;;;;;;;:::i;14940:405::-;;;;;;;;;;-1:-1:-1;14940:405:16;;;;;:::i;:::-;;:::i;11323:102:4:-;;;;;;;;;;;;;:::i;2489:2446:5:-;;;;;;;;;;-1:-1:-1;2489:2446:5;;;;;:::i;:::-;;:::i;4981:41:16:-;;;;;;;;;;-1:-1:-1;4981:41:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;13315:303:4;;;;;;;;;;-1:-1:-1;13315:303:4;;;;;:::i;:::-;;:::i;17335:607:16:-;;;;;;;;;;-1:-1:-1;17335:607:16;;;;;:::i;:::-;;:::i;5252:34::-;;;;;;;;;;-1:-1:-1;5252:34:16;;;;;;;;;;;;;;;19579:104;;;;;;;;;;;;;:::i;17948:704::-;;;;;;;;;;;;;:::i;14157:388:4:-;;;;;;;;;;-1:-1:-1;14157:388:4;;;;;:::i;:::-;;:::i;13747:1187:16:-;;;;;;;;;;-1:-1:-1;13747:1187:16;;;;;:::i;:::-;;:::i;7712:457::-;;;;;;;;;;-1:-1:-1;7712:457:16;;;;;:::i;:::-;;:::i;1091:410:5:-;;;;;;;;;;-1:-1:-1;1091:410:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4544:43:16:-;;;;;;;;;;;;;;;11491:313:4;;;;;;;;;;-1:-1:-1;11491:313:4;;;;;:::i;:::-;;:::i;10849:540:16:-;;;;;;;;;;-1:-1:-1;10849:540:16;;;;;:::i;:::-;;:::i;11792:762::-;;;;;;;;;;-1:-1:-1;11792:762:16;;;;;:::i;:::-;;:::i;4470:34::-;;;;;;;;;;;;;;;4685:25;;;;;;;;;;-1:-1:-1;4685:25:16;;;;-1:-1:-1;;;;;4685:25:16;;;15351:1122;;;;;;;;;;-1:-1:-1;15351:1122:16;;;;;:::i;:::-;;:::i;13684:162:4:-;;;;;;;;;;-1:-1:-1;13684:162:4;;;;;:::i;:::-;;:::i;4593:27:16:-;;;;;;;;;;;;;;;;1911:198:13;;;;;;;;;;-1:-1:-1;1911:198:13;;;;;:::i;:::-;;:::i;4843:35:16:-;;;;;;;;;;;;;;;;5130:30;;;;;;;;;;;;;;;;9995:597;10121:4;-1:-1:-1;;;;;;10144:54:16;;-1:-1:-1;;;10144:54:16;;:116;;-1:-1:-1;;;;;;;10219:41:16;;-1:-1:-1;;;10219:41:16;10144:116;:186;;;-1:-1:-1;;;;;;;10281:49:16;;-1:-1:-1;;;10281:49:16;10144:186;:249;;;-1:-1:-1;;;;;;;10351:42:16;;-1:-1:-1;;;10351:42:16;10144:249;:321;;;-1:-1:-1;;;;;;;10414:51:16;;-1:-1:-1;;;10414:51:16;10144:321;:381;;;;10486:39;10512:12;10486:25;:39::i;:::-;10144:441;;;;10546:39;10572:12;10546:25;:39::i;:::-;10137:448;9995:597;-1:-1:-1;;9995:597:16:o;19414:159::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;;;;;;;;;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;19522:44:16::2;19541:9:::0;19552:13;19522:18:::2;:44::i;:::-;-1:-1:-1::0;;1701:1:14::1;2628:7;:22:::0;19414:159:16:o;11161:98:4:-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;-1:-1:-1;;;13165:34:4;;;;;;;;;;;13135:64;-1:-1:-1;13217:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;13217:24:4;;13048:200::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;-1:-1:-1;719:10:1;-1:-1:-1;;;;;12730:28:4;;;12726:172;;12777:44;12794:5;719:10:1;13684:162:4;:::i;12777:44::-;12772:126;;12848:35;;-1:-1:-1;;;12848:35:4;;;;;;;;;;;12772:126;12908:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;12908:29:4;-1:-1:-1;;;;;12908:29:4;;;;;;;;;12952:28;;12908:24;;12952:28;;;;;;;12673:314;12611:376;;:::o;22055:2739::-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;-1:-1:-1;;;;;22256:45:4;22272:19;-1:-1:-1;;;;;22256:45:4;;22252:86;;22310:28;;-1:-1:-1;;;22310:28:4;;;;;;;;;;;22252:86;22350:27;20821:21;;;20652:15;20862:4;20855:36;20943:4;20927:21;;21031:26;;719:10:1;21766:30:4;;;-1:-1:-1;;;;;21468:26:4;;21745:19;;;21742:55;22526:173;;22612:43;22629:4;719:10:1;13684:162:4;:::i;22612:43::-;22607:92;;22664:35;;-1:-1:-1;;;22664:35:4;;;;;;;;;;;22607:92;-1:-1:-1;;;;;22714:16:4;;22710:52;;22739:23;;-1:-1:-1;;;22739:23:4;;;;;;;;;;;22710:52;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;-1:-1:-1;;;;;23429:24:4;;;;;;;:18;:24;;;;;;23427:26;;-1:-1:-1;;23427:26:4;;;23497:22;;;;;;;;;23495:24;;-1:-1:-1;23495:24:4;;;10863:11;10839:22;10835:40;10822:62;-1:-1:-1;;;10822:62:4;23783:26;;;;:17;:26;;;;;:171;-1:-1:-1;;;24071:46:4;;24067:616;;24174:1;24164:11;;24142:19;24295:30;;;:17;:30;;;;;;24291:378;;24431:13;;24416:11;:28;24412:239;;24576:30;;;;:17;:30;;;;;:52;;;24412:239;24124:559;24067:616;24727:7;24723:2;-1:-1:-1;;;;;24708:27:4;24717:4;-1:-1:-1;;;;;24708:27:4;;;;;;;;;;;22174:2620;;;22055:2739;;;:::o;11395:391:16:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;11499:16:16;;11491:81:::2;;;;-1:-1:-1::0;;;11491:81:16::2;;;;;;;:::i;:::-;11587:9;11582:198;11606:9;:16;11602:1;:20;11582:198;;;11646:9;:23;11656:9;11666:1;11656:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;11646:23:16::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;11646:23:16;;::::2;;11643:127;;;11714:5;11688:9;:23;11698:9;11708:1;11698:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;11688:23:16::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;11688:23:16;;;:31;;-1:-1:-1;;11688:31:16::2;::::0;::::2;;::::0;;;::::2;::::0;;;11737:15:::2;:18:::0;;;::::2;::::0;::::2;:::i;:::-;;;;;;11643:127;11624:3:::0;::::2;::::0;::::2;:::i;:::-;;;;11582:198;;1632:432:3::0;1729:7;1786:27;;;:17;:27;;;;;;;;1757:56;;;;;;;;;-1:-1:-1;;;;;1757:56:3;;;;;-1:-1:-1;;;1757:56:3;;;-1:-1:-1;;;;;1757:56:3;;;;;;;;1729:7;;1824:90;;-1:-1:-1;1874:29:3;;;;;;;;;1884:19;1874:29;-1:-1:-1;;;;;1874:29:3;;;;-1:-1:-1;;;1874:29:3;;-1:-1:-1;;;;;1874:29:3;;;;;1824:90;1962:23;;;;1924:21;;2422:5;;1949:36;;-1:-1:-1;;;;;1949:36:3;:10;:36;:::i;:::-;1948:58;;;;:::i;:::-;2025:16;;;;;-1:-1:-1;1632:432:3;;-1:-1:-1;;;;1632:432:3:o;7303:403:16:-;5392:9;5405:10;5392:23;5384:87;;;;-1:-1:-1;;;5384:87:16;;;;;;;:::i;:::-;7380:74:::1;::::0;;::::1;::::0;::::1;::::0;;7398:16:::1;7380:74:::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;7442:10:::1;-1:-1:-1::0;7425:28:16;;;:16:::1;:28:::0;;;;;;;;7380:74:::1;::::0;;7416:7;;7380:17:::1;:74::i;:::-;7482:10;7465:28;::::0;;;:16:::1;:28;::::0;;;;:39;;7497:7;;7465:28;:39:::1;::::0;7497:7;;7465:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;7517:22:16;;:26;;;:76:::1;;-1:-1:-1::0;7548:22:16;;:27;:44;::::1;;;;7591:1;7579:9;:13;7548:44;7514:146;;;7616:22:::0;;7608:41:::1;::::0;7616:32:::1;::::0;7641:7;;7616:32:::1;:::i;:::-;7608:7;:41::i;:::-;7669:30;7679:10;7691:7;7669:9;:30::i;:::-;7303:403:::0;:::o;12992:526::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;13246:31:16::2;13264:12:::0;13246:17:::2;:31::i;:::-;13287:47;13313:20;13287:25;:47::i;:::-;13344:41;13367:17;13344:22;:41::i;:::-;-1:-1:-1::0;;;;;13398:30:16;::::2;::::0;13395:117:::2;;13443:58;13462:16;13480:20;13443:18;:58::i;:::-;-1:-1:-1::0;;1701:1:14::1;2628:7;:22:::0;-1:-1:-1;;;12992:526:16:o;16479:387::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;16583:16:16::2;:26:::0;:30;;;;:74:::2;;-1:-1:-1::0;16617:16:16::2;:26:::0;:40;-1:-1:-1;16583:74:16::2;16575:159;;;;-1:-1:-1::0;;;16575:159:16::2;;;;;;;:::i;:::-;16744:24:::0;:38;;;16797:62:::2;::::0;;19122:25:17;;;19178:2;19163:18;;19156:34;;;16797:62:16::2;::::0;19095:18:17;16797:62:16::2;;;;;;;;-1:-1:-1::0;1701:1:14::1;2628:7;:22:::0;16479:387:16:o;13912:179:4:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;12560:426:16:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;12670:16:16;;12662:71:::2;;;;-1:-1:-1::0;;;12662:71:16::2;;;;;;;:::i;:::-;12748:9;12743:237;12767:9;:16;12763:1;:20;12743:237;;;12804:12;12819:9;12829:1;12819:12;;;;;;;;:::i;:::-;;;;;;;12804:27;;12873:1;12848:16;:22;12865:4;-1:-1:-1::0;;;;;12848:22:16::2;-1:-1:-1::0;;;;;12848:22:16::2;;;;;;;;;;;;;:26;12845:125;;;-1:-1:-1::0;;;;;12893:22:16;::::2;12918:1;12893:22:::0;;;:16:::2;:22;::::0;;;;:26;;;12937:15:::2;:18:::0;;;::::2;::::0;::::2;:::i;:::-;;;;;;12845:125;-1:-1:-1::0;12785:3:16;::::2;::::0;::::2;:::i;:::-;;;;12743:237;;19689:104:::0;19746:4;19769:17;19777:8;19769:7;:17::i;10715:128::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;10808:28:16::2;:12;10823:13:::0;;10808:28:::2;:::i;:::-;-1:-1:-1::0;;1701:1:14::1;2628:7;:22:::0;-1:-1:-1;10715:128:16:o;1654:459:5:-;1827:15;;1743:23;;1802:22;1827:15;-1:-1:-1;;;;;1893:36:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1893:36:5;;-1:-1:-1;;1893:36:5;;;;;;;;;;;;1856:73;;1948:9;1943:123;1964:14;1959:1;:19;1943:123;;2019:32;2039:8;2048:1;2039:11;;;;;;;;:::i;:::-;;;;;;;2019:19;:32::i;:::-;2003:10;2014:1;2003:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;1980:3;;1943:123;;;-1:-1:-1;2086:10:5;1654:459;-1:-1:-1;;;1654:459:5:o;10957:142:4:-;11021:7;11063:27;11082:7;11063:18;:27::i;6319:221::-;6383:7;-1:-1:-1;;;;;6406:19:4;;6402:60;;6434:28;;-1:-1:-1;;;6434:28:4;;;;;;;;;;;6402:60;-1:-1:-1;;;;;;6479:25:4;;;;;:18;:25;;;;;;-1:-1:-1;;;;;6479:54:4;;6319:221::o;1661:101:13:-;1101:6;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;16872:457:16:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16955:19:16::1;:29:::0;:34;;:85:::1;;-1:-1:-1::0;16993:19:16::1;:29:::0;17025:15:::1;-1:-1:-1::0;16955:85:16::1;16947:146;;;::::0;-1:-1:-1;;;16947:146:16;;19810:2:17;16947:146:16::1;::::0;::::1;19792:21:17::0;19849:2;19829:18;;;19822:30;19888:34;19868:18;;;19861:62;-1:-1:-1;;;19939:18:17;;;19932:46;19995:19;;16947:146:16::1;19608:412:17::0;16947:146:16::1;17111:16;:26:::0;:31;;:79:::1;;-1:-1:-1::0;17146:16:16::1;:26:::0;17175:15:::1;-1:-1:-1::0;17111:79:16::1;17103:137;;;::::0;-1:-1:-1;;;17103:137:16;;20227:2:17;17103:137:16::1;::::0;::::1;20209:21:17::0;20266:2;20246:18;;;20239:30;20305:34;20285:18;;;20278:62;-1:-1:-1;;;20356:18:17;;;20349:43;20409:19;;17103:137:16::1;20025:409:17::0;17103:137:16::1;17250:11;:26:::0;;-1:-1:-1;;;;;;17250:26:16::1;-1:-1:-1::0;;;;;17250:26:16;::::1;::::0;;::::1;::::0;;;17291:31:::1;::::0;2318:51:17;;;17291:31:16::1;::::0;2306:2:17;2291:18;17291:31:16::1;;;;;;;;16872:457:::0;:::o;5372:871:5:-;5442:16;5494:19;5527:25;5566:22;5591:16;5601:5;5591:9;:16::i;:::-;5566:41;;5621:25;5663:14;-1:-1:-1;;;;;5649:29:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5649:29:5;;5621:57;;5692:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:31:5;5742:9;5737:461;5786:14;5771:11;:29;5737:461;;5837:15;5850:1;5837:12;:15::i;:::-;5825:27;;5874:9;:16;;;5870:71;;;5914:8;;5870:71;5962:14;;-1:-1:-1;;;;;5962:28:5;;5958:109;;6034:14;;;-1:-1:-1;5958:109:5;6109:5;-1:-1:-1;;;;;6088:26:5;:17;-1:-1:-1;;;;;6088:26:5;;6084:100;;;6164:1;6138:8;6147:13;;;;;;6138:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6084:100;5802:3;;5737:461;;;-1:-1:-1;6218:8:5;;5372:871;-1:-1:-1;;;;;;5372:871:5:o;6547:750:16:-;5392:9;5405:10;5392:23;5384:87;;;;-1:-1:-1;;;5384:87:16;;;;;;;:::i;:::-;6630:39;;6627:309:::1;;6750:10;6730:31;::::0;;;:19:::1;:31;::::0;;;;;:41:::1;::::0;6764:7;;6730:41:::1;:::i;:::-;6714:10;6697:28;::::0;;;:16:::1;:28;::::0;;;;;:75:::1;;6689:135;;;::::0;-1:-1:-1;;;6689:135:16;;20641:2:17;6689:135:16::1;::::0;::::1;20623:21:17::0;20680:2;20660:18;;;20653:30;20719:34;20699:18;;;20692:62;-1:-1:-1;;;20770:18:17;;;20763:45;20825:19;;6689:135:16::1;20439:411:17::0;6689:135:16::1;6627:309;;;6871:10;6861:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;6853:72;;;::::0;-1:-1:-1;;;6853:72:16;;21057:2:17;6853:72:16::1;::::0;::::1;21039:21:17::0;21096:2;21076:18;;;21069:30;21135:34;21115:18;;;21108:62;-1:-1:-1;;;21186:18:17;;;21179:36;21232:19;;6853:72:16::1;20855:402:17::0;6853:72:16::1;6945:80;::::0;;::::1;::::0;::::1;::::0;;6963:19:::1;6945:80:::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;7013:10:::1;-1:-1:-1::0;6993:31:16;;;:19:::1;:31:::0;;;;;;;;6945:80:::1;::::0;;6984:7;;6945:17:::1;:80::i;:::-;7064:10;7044:31;::::0;;;:19:::1;:31;::::0;;;;:42;;7079:7;;7044:31;:42:::1;::::0;7079:7;;7044:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;7099:25:16;;:29;;;:82:::1;;-1:-1:-1::0;7133:25:16;;:30;:47;::::1;;;;7179:1;7167:9;:13;7133:47;7096:155;;;7204:25:::0;;7196:44:::1;::::0;7204:35:::1;::::0;7232:7;;7204:35:::1;:::i;8175:151::-:0;8230:7;8306:12;;8285:18;8269:13;4998:12:4;;4789:7;4982:13;:28;;4736:309;8269:13:16;:34;;;;:::i;:::-;:49;;;;:::i;:::-;8256:63;;:9;:63;:::i;:::-;8249:70;;8175:151;:::o;14940:405::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;15047:19:16::2;:29:::0;:33;;;;:80:::2;;-1:-1:-1::0;15084:19:16::2;:29:::0;:43;-1:-1:-1;15047:80:16::2;15039:165;;;;-1:-1:-1::0;;;15039:165:16::2;;;;;;;:::i;:::-;15214:27:::0;:41;;;15270:68:::2;::::0;;19122:25:17;;;19178:2;19163:18;;19156:34;;;15270:68:16::2;::::0;19095:18:17;15270:68:16::2;18948:248:17::0;11323:102:4;11379:13;11411:7;11404:14;;;;;:::i;2489:2446:5:-;2620:16;2685:4;2676:5;:13;2672:45;;2698:19;;-1:-1:-1;;;2698:19:5;;;;;;;;;;;2672:45;2731:19;2764:17;2784:14;4487:7:4;4513:13;;4440:93;2784:14:5;2764:34;-1:-1:-1;3029:9:5;3022:4;:16;3018:71;;;3065:9;3058:16;;3018:71;3102:25;3130:16;3140:5;3130:9;:16::i;:::-;3102:44;;3321:4;3313:5;:12;3309:271;;;3367:12;;;3401:31;;;3397:109;;;3476:11;3456:31;;3397:109;3327:193;3309:271;;;-1:-1:-1;3564:1:5;3309:271;3593:25;3635:17;-1:-1:-1;;;;;3621:32:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3621:32:5;-1:-1:-1;3593:60:5;-1:-1:-1;3671:22:5;3667:76;;3720:8;-1:-1:-1;3713:15:5;;-1:-1:-1;;;3713:15:5;3667:76;3884:31;3918:26;3938:5;3918:19;:26::i;:::-;3884:60;;3958:25;4200:9;:16;;;4195:90;;-1:-1:-1;4256:14:5;;4195:90;4315:5;4298:467;4327:4;4322:1;:9;;:45;;;;;4350:17;4335:11;:32;;4322:45;4298:467;;;4404:15;4417:1;4404:12;:15::i;:::-;4392:27;;4441:9;:16;;;4437:71;;;4481:8;;4437:71;4529:14;;-1:-1:-1;;;;;4529:28:5;;4525:109;;4601:14;;;-1:-1:-1;4525:109:5;4676:5;-1:-1:-1;;;;;4655:26:5;:17;-1:-1:-1;;;;;4655:26:5;;4651:100;;;4731:1;4705:8;4714:13;;;;;;4705:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4651:100;4369:3;;4298:467;;;-1:-1:-1;;;4847:29:5;;;-1:-1:-1;4854:8:5;;-1:-1:-1;;2489:2446:5;;;;;;:::o;13315:303:4:-;-1:-1:-1;;;;;13413:31:4;;719:10:1;13413:31:4;13409:61;;;13453:17;;-1:-1:-1;;;13453:17:4;;;;;;;;;;;13409:61;719:10:1;13481:39:4;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;13481:49:4;;;;;;;;;;;;:60;;-1:-1:-1;;13481:60:4;;;;;;;;;;13556:55;;540:41:17;;;13481:49:4;;719:10:1;13556:55:4;;513:18:17;13556:55:4;;;;;;;13315:303;;:::o;17335:607:16:-;1744:1:14;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:14;;;;;;;:::i;:::-;1744:1;2455:7;:18;17505:19:16::1;::::0;-1:-1:-1;;;;;17505:19:16::1;17491:10;:33;17483:100;;;::::0;-1:-1:-1;;;17483:100:16;;21594:2:17;17483:100:16::1;::::0;::::1;21576:21:17::0;21633:2;21613:18;;;21606:30;21672:34;21652:18;;;21645:62;-1:-1:-1;;;21723:18:17;;;21716:52;21785:19;;17483:100:16::1;21392:418:17::0;17483:100:16::1;-1:-1:-1::0;;;;;17601:34:16;::::1;17593:105;;;::::0;-1:-1:-1;;;17593:105:16;;22017:2:17;17593:105:16::1;::::0;::::1;21999:21:17::0;22056:2;22036:18;;;22029:30;22095:34;22075:18;;;22068:62;22166:28;22146:18;;;22139:56;22212:19;;17593:105:16::1;21815:422:17::0;17593:105:16::1;17741:20;;17716:21;:45;;17708:121;;;::::0;-1:-1:-1;;;17708:121:16;;22444:2:17;17708:121:16::1;::::0;::::1;22426:21:17::0;22483:2;22463:18;;;22456:30;22522:34;22502:18;;;22495:62;22593:33;22573:18;;;22566:61;22644:19;;17708:121:16::1;22242:427:17::0;17708:121:16::1;17839:19;:42:::0;;-1:-1:-1;;;;;;17839:42:16::1;-1:-1:-1::0;;;;;17839:42:16;;;::::1;::::0;;;::::1;::::0;;;17891:20:::1;:44:::0;-1:-1:-1;2628:7:14;:22;17335:607:16:o;19579:104::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;19653:23:16::2;3160:19:3::0;;3153:26;3093:93;19653:23:16::2;1701:1:14::1;2628:7;:22:::0;19579:104:16:o;17948:704::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;18002:15:16::1;18020:19;:17;:19::i;:::-;18002:37;;18049:21;18073:7;18049:31;;18090:19;18149:1:::0;18126:20:::1;;:24;:39;;;;;18164:1;18154:7;:11;18126:39;18123:183;;;18204:20;::::0;2422:5:3;;18194:30:16::1;::::0;:7;:30:::1;:::i;:::-;:50;;;;:::i;:::-;18180:64:::0;-1:-1:-1;18274:21:16::1;18180:64:::0;18274:7;:21:::1;:::i;:::-;18258:37;;18123:183;18315:12;18348:17:::0;;18345:105:::1;;18390:49;18415:7;1101:6:13::0;;-1:-1:-1;;;;;1101:6:13;;1029:85;18415:7:16::1;18425:13;18390:16;:49::i;:::-;18380:59;;18345:105;18462:7;:26;;;;;18487:1;18473:11;:15;18462:26;18459:115;;;18530:19;::::0;18513:50:::1;::::0;-1:-1:-1;;;;;18530:19:16::1;18551:11:::0;18513:16:::1;:50::i;:::-;18503:60;;18459:115;18591:7;18583:62;;;::::0;-1:-1:-1;;;18583:62:16;;22876:2:17;18583:62:16::1;::::0;::::1;22858:21:17::0;22915:2;22895:18;;;22888:30;22954:34;22934:18;;;22927:62;-1:-1:-1;;;23005:18:17;;;22998:40;23055:19;;18583:62:16::1;22674:406:17::0;18583:62:16::1;17992:660;;;;17948:704::o:0;14157:388:4:-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;-1:-1:-1;;;;;14363:14:4;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;-1:-1:-1;;;14484:40:4;;;;;;;;;;;13747:1187:16;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;13857:19:16::1;:29:::0;:34;;:85:::1;;-1:-1:-1::0;13895:19:16::1;:29:::0;13927:15:::1;-1:-1:-1::0;13857:85:16::1;13849:161;;;;-1:-1:-1::0;;;13849:161:16::1;;;;;;;:::i;:::-;14028:30:::0;;:35;;:87:::1;;-1:-1:-1::0;14067:30:16;;14100:15:::1;-1:-1:-1::0;14028:87:16::1;14020:158;;;;-1:-1:-1::0;;;14020:158:16::1;;;;;;;:::i;:::-;14230:26;:15;14248:8;14230:26;:::i;:::-;14196:30:::0;;:61:::1;14188:132;;;;-1:-1:-1::0;;;14188:132:16::1;;;;;;;:::i;:::-;14370:26;:15;14388:8;14370:26;:::i;:::-;14338:20;:28;;;:59;14330:128;;;;-1:-1:-1::0;;;14330:128:16::1;;;;;;;:::i;:::-;14476:38;14493:20;14476:16;:38::i;:::-;14468:91;;;;-1:-1:-1::0;;;14468:91:16::1;;;;;;;:::i;:::-;14610:30:::0;;14578:19:::1;:62:::0;;;14680:28:::1;::::0;;::::1;::::0;;14650:27;:58;14746:26:::1;::::0;;::::1;::::0;;14718:25;:54;14824:40:::1;::::0;;::::1;::::0;;14782:39;:82;14880:47;;25408:32:17;;;25478:24;;25456:20;;;25449:54;;;;25541:24;25519:20;;;25512:54;25604:24;25582:20;;;25575:54;14880:47:16::1;::::0;25395:3:17;25380:19;14880:47:16::1;25205:430:17::0;7712:457:16;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;7799:11:16;7791:77:::2;;;;-1:-1:-1::0;;;7791:77:16::2;;;;;;;:::i;:::-;7914:18;7902:7;7887:12;;:22;;;;:::i;:::-;7886:46;;7878:110;;;::::0;-1:-1:-1;;;7878:110:16;;26264:2:17;7878:110:16::2;::::0;::::2;26246:21:17::0;26303:2;26283:18;;;26276:30;26342:34;26322:18;;;26315:62;-1:-1:-1;;;26393:18:17;;;26386:49;26452:19;;7878:110:16::2;26062:415:17::0;7878:110:16::2;8035:9;8023:7;8007:13;4998:12:4::0;;4789:7;4982:13;:28;;4736:309;8007:13:16::2;:23;;;;:::i;:::-;8006:38;;7998:91;;;;-1:-1:-1::0;;;7998:91:16::2;;;;;;;:::i;:::-;8115:7;8099:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8132:30:16::2;::::0;-1:-1:-1;8142:10:16::2;8154:7:::0;8132:9:::2;:30::i;:::-;-1:-1:-1::0;1701:1:14::1;2628:7;:22:::0;7712:457:16:o;1091:410:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4487:7:4;4513:13;1274:7:5;:25;1241:101;;1322:9;1091:410;-1:-1:-1;;1091:410:5:o;1241:101::-;1363:21;1376:7;1363:12;:21::i;:::-;1351:33;;1398:9;:16;;;1394:63;;;1437:9;1091:410;-1:-1:-1;;1091:410:5:o;1394:63::-;1473:21;1486:7;1473:12;:21::i;11491:313:4:-;11564:13;11594:16;11602:7;11594;:16::i;:::-;11589:59;;11619:29;;-1:-1:-1;;;11619:29:4;;;;;;;;;;;11589:59;11659:21;11683:10;:8;:10::i;:::-;11659:34;;11716:7;11710:21;11735:1;11710:26;;:87;;;;;;;;;;;;;;;;;11763:7;11772:18;11782:7;11772:9;:18::i;:::-;11746:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11703:94;11491:313;-1:-1:-1;;;11491:313:4:o;10849:540:16:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;10950:19:16::2;:29:::0;:33;;;;:80:::2;;-1:-1:-1::0;10987:39:16;;:43;;10950:80:::2;10942:142;;;;-1:-1:-1::0;;;10942:142:16::2;;;;;;;:::i;:::-;11121:1;11102:9;:16;:20;11094:81;;;;-1:-1:-1::0;;;11094:81:16::2;;;;;;;:::i;:::-;11190:9;11185:198;11209:9;:16;11205:1;:20;11185:198;;;11250:9;:23;11260:9;11270:1;11260:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;11250:23:16::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;11250:23:16;;::::2;;11246:127;;11318:4;11292:9;:23;11302:9;11312:1;11302:12;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;11292:23:16::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;11292:23:16;;;:30;;-1:-1:-1;;11292:30:16::2;::::0;::::2;;::::0;;;::::2;::::0;;;11340:15:::2;:18:::0;;;::::2;::::0;::::2;:::i;:::-;;;;;;11246:127;11227:3:::0;::::2;::::0;::::2;:::i;:::-;;;;11185:198;;11792:762:::0;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1744:1:14::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:14::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;11932:19:16::2;:29:::0;:33;;;;:81:::2;;-1:-1:-1::0;11969:39:16;;:44;11932:81:::2;11924:143;;;;-1:-1:-1::0;;;11924:143:16::2;;;;;;;:::i;:::-;12104:1;12085:9;:16;:20;:65;;;;;12129:14;:21;12109:9;:16;:41;12085:65;12077:116;;;;-1:-1:-1::0;;;12077:116:16::2;;;;;;;:::i;:::-;12208:9;12203:345;12227:9;:16;12223:1;:20;12203:345;;;12264:12;12279:9;12289:1;12279:12;;;;;;;;:::i;:::-;;;;;;;12264:27;;12305:14;12322;12337:1;12322:17;;;;;;;;:::i;:::-;;;;;;;12305:34;;12365:1;12356:6;:10;12353:185;;;-1:-1:-1::0;;;;;12388:22:16;::::2;;::::0;;;:16:::2;:22;::::0;;;;;12385:90:::2;;12438:15;:18:::0;;;:15:::2;:18;::::0;::::2;:::i;:::-;;;;;;12385:90;-1:-1:-1::0;;;;;12492:22:16;::::2;;::::0;;;:16:::2;:22;::::0;;;;:31;;;12353:185:::2;12250:298;;12245:3;;;;;:::i;:::-;;;;12203:345;;15351:1122:::0;1101:6:13;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;15455:16:16::1;:26:::0;:31;;:79:::1;;-1:-1:-1::0;15490:16:16::1;:26:::0;15519:15:::1;-1:-1:-1::0;15455:79:16::1;15447:155;;;;-1:-1:-1::0;;;15447:155:16::1;;;;;;;:::i;:::-;15620:27:::0;;:32;;:81:::1;;-1:-1:-1::0;15656:27:16;;15686:15:::1;-1:-1:-1::0;15620:81:16::1;15612:152;;;;-1:-1:-1::0;;;15612:152:16::1;;;;;;;:::i;:::-;15813:26;:15;15831:8;15813:26;:::i;:::-;15782:27:::0;;:58:::1;15774:129;;;;-1:-1:-1::0;;;15774:129:16::1;;;;;;;:::i;:::-;15950:26;:15;15968:8;15950:26;:::i;:::-;15921:17;:25;;;:56;15913:125;;;;-1:-1:-1::0;;;15913:125:16::1;;;;;;;:::i;:::-;16056:35;16073:17;16056:16;:35::i;:::-;16048:88;;;;-1:-1:-1::0;;;16048:88:16::1;;;;;;;:::i;:::-;16176:27:::0;;16147:16:::1;:56:::0;;;16240:25:::1;::::0;;::::1;::::0;;16213:24;:52;16300:23:::1;::::0;;::::1;::::0;;16275:22;:48;16372:37:::1;::::0;;::::1;::::0;;16333:36;:76;16425:41;;25408:32:17;;;25478:24;;25456:20;;;25449:54;;;;25541:24;25519:20;;;25512:54;25604:24;25582:20;;;25575:54;16425:41:16::1;::::0;25395:3:17;25380:19;16425:41:16::1;25205:430:17::0;13684:162:4;-1:-1:-1;;;;;13804:25:4;;;13781:4;13804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13684:162::o;1911:198:13:-;1101:6;;-1:-1:-1;;;;;1101:6:13;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:13;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:13;;27986:2:17;1991:73:13::1;::::0;::::1;27968:21:17::0;28025:2;28005:18;;;27998:30;28064:34;28044:18;;;28037:62;-1:-1:-1;;;28115:18:17;;;28108:36;28161:19;;1991:73:13::1;27784:402:17::0;1991:73:13::1;2074:28;2093:8;2074:18;:28::i;1369:213:3:-:0;1471:4;-1:-1:-1;;;;;;1494:41:3;;-1:-1:-1;;;1494:41:3;;:81;;-1:-1:-1;;;;;;;;;;937:40:2;;;1539:36:3;829:155:2;5653:607:4;5738:4;-1:-1:-1;;;;;;;;;6033:25:4;;;;:101;;-1:-1:-1;;;;;;;;;;6109:25:4;;;6033:101;:177;;;-1:-1:-1;;;;;;;;6185:25:4;-1:-1:-1;;;6185:25:4;;5653:607::o;2695:327:3:-;2422:5;-1:-1:-1;;;;;2797:33:3;;;;2789:88;;;;-1:-1:-1;;;2789:88:3;;28393:2:17;2789:88:3;;;28375:21:17;28432:2;28412:18;;;28405:30;28471:34;28451:18;;;28444:62;-1:-1:-1;;;28522:18:17;;;28515:40;28572:19;;2789:88:3;28191:406:17;2789:88:3;-1:-1:-1;;;;;2895:22:3;;2887:60;;;;-1:-1:-1;;;2887:60:3;;28804:2:17;2887:60:3;;;28786:21:17;28843:2;28823:18;;;28816:30;28882:27;28862:18;;;28855:55;28927:18;;2887:60:3;28602:349:17;2887:60:3;2980:35;;;;;;;;;-1:-1:-1;;;;;2980:35:3;;;;;;-1:-1:-1;;;;;2980:35:3;;;;;;;;;;-1:-1:-1;;;2958:57:3;;;;:19;:57;2695:327::o;14791:268:4:-;14848:4;14935:13;;14925:7;:23;14883:150;;;;-1:-1:-1;;14985:26:4;;;;:17;:26;;;;;;-1:-1:-1;;;14985:43:4;:48;;14791:268::o;7949:1105::-;8016:7;8050;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:23;;;:17;:23;;;;;;-1:-1:-1;;;8289:23:4;;8285:687;;8800:111;8807:11;8800:111;;-1:-1:-1;;;8877:6:4;8859:25;;;;:17;:25;;;;;;8800:111;;8285:687;8163:827;8137:853;9016:31;;-1:-1:-1;;;9016:31:4;;;;;;;;;;;8336:816:16;8476:1;8466:7;:11;8458:77;;;;-1:-1:-1;;;8458:77:16;;;;;;;:::i;:::-;8581:7;8553:24;:22;:24::i;:::-;:35;;8545:88;;;;-1:-1:-1;;;8545:88:16;;;;;;;:::i;:::-;8651:21;;8643:76;;;;-1:-1:-1;;;8643:76:16;;29158:2:17;8643:76:16;;;29140:21:17;29197:2;29177:18;;;29170:30;29236:34;29216:18;;;29209:62;-1:-1:-1;;;29287:18:17;;;29280:36;29333:19;;8643:76:16;28956:402:17;8643:76:16;8737:21;;8762:15;-1:-1:-1;8737:40:16;8729:99;;;;-1:-1:-1;;;8729:99:16;;29565:2:17;8729:99:16;;;29547:21:17;29604:2;29584:18;;;29577:30;29643:34;29623:18;;;29616:62;-1:-1:-1;;;29694:18:17;;;29687:44;29748:19;;8729:99:16;29363:410:17;8729:99:16;8846:19;;;;:24;;:66;;;8897:15;8874:11;:19;;;:38;;8846:66;8838:115;;;;-1:-1:-1;;;8838:115:16;;29980:2:17;8838:115:16;;;29962:21:17;30019:2;29999:18;;;29992:30;30058:34;30038:18;;;30031:62;-1:-1:-1;;;30109:18:17;;;30102:34;30153:19;;8838:115:16;29778:400:17;8838:115:16;8971:31;;;;:36;;:100;;-1:-1:-1;9040:31:16;;;;9012:23;9028:7;9012:13;:23;:::i;:::-;9011:60;;8971:100;8963:182;;;;-1:-1:-1;;;8963:182:16;;30385:2:17;8963:182:16;;;30367:21:17;30424:2;30404:18;;;30397:30;30463:34;30443:18;;;30436:62;-1:-1:-1;;;30514:18:17;;;30507:50;30574:19;;8963:182:16;30183:416:17;9158:770:16;1744:1:14;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:14;;;;;;;:::i;:::-;1744:1;2455:7;:18;9298:11:16::1;::::0;9239:4:::1;::::0;9224:12:::1;::::0;-1:-1:-1;;;;;9298:11:16::1;9290:34:::0;9287:413:::1;;9357:11;::::0;:33:::1;::::0;-1:-1:-1;;;9357:33:16;;9379:10:::1;9357:33;::::0;::::1;2318:51:17::0;9339:15:16::1;::::0;-1:-1:-1;;;;;9357:11:16::1;::::0;:21:::1;::::0;2291:18:17;;9357:33:16::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9339:51;;9423:7;9412;:18;;9404:69;;;::::0;-1:-1:-1;;;9404:69:16;;30995:2:17;9404:69:16::1;::::0;::::1;30977:21:17::0;31034:2;31014:18;;;31007:30;31073:34;31053:18;;;31046:62;-1:-1:-1;;;31124:18:17;;;31117:36;31170:19;;9404:69:16::1;30793:402:17::0;9404:69:16::1;9487:11;::::0;:64:::1;::::0;-1:-1:-1;;;;;9487:11:16::1;9516:10;9536:4;9543:7:::0;9487:28:::1;:64::i;:::-;9325:237;9287:413;;;9601:7;9588:9;:20;;9580:69;;;::::0;-1:-1:-1;;;9580:69:16;;31402:2:17;9580:69:16::1;::::0;::::1;31384:21:17::0;31441:2;31421:18;;;31414:30;31480:34;31460:18;;;31453:62;-1:-1:-1;;;31531:18:17;;;31524:34;31575:19;;9580:69:16::1;31200:400:17::0;9580:69:16::1;-1:-1:-1::0;9682:7:16;9287:413:::1;9725:16;9713:9;:28;9709:148;;;9783:63;9804:10;9817:28;9829:16:::0;9817:9:::1;:28;:::i;:::-;9783:12;:63::i;:::-;9773:73;;9709:148;9874:7;9866:55;;;::::0;-1:-1:-1;;;9866:55:16;;31807:2:17;9866:55:16::1;::::0;::::1;31789:21:17::0;31846:2;31826:18;;;31819:30;31885:34;31865:18;;;31858:62;-1:-1:-1;;;31936:18:17;;;31929:33;31979:19;;9866:55:16::1;31605:399:17::0;15138:102:4;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::o;2263:187:13:-;2355:6;;;-1:-1:-1;;;;;2371:17:13;;;-1:-1:-1;;;;;;2371:17:13;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;9587:151:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9706:24:4;;;;:17;:24;;;;;;9687:44;;:18;:44::i;18658:253:16:-;18747:11;;18710:15;;-1:-1:-1;;;;;18747:11:16;18739:34;18736:169;;18798:11;;:36;;-1:-1:-1;;;18798:36:16;;18828:4;18798:36;;;2318:51:17;-1:-1:-1;;;;;18798:11:16;;;;:21;;2291:18:17;;18798:36:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18736:169::-;-1:-1:-1;18873:21:16;18658:253;:::o;18917:328::-;19014:13;1744:1:14;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:14;;;;;;;:::i;:::-;1744:1;2455:7;:18;19050:11:16::1;::::0;-1:-1:-1;;;;;19050:11:16::1;19042:34:::0;19039:200:::1;;19091:11;::::0;:40:::1;::::0;-1:-1:-1;;;;;19091:11:16::1;19116:5:::0;19123:7;19091:24:::1;:40::i;:::-;-1:-1:-1::0;19156:4:16::1;19039:200;;;19200:28;19213:5;19220:7;19200:12;:28::i;:::-;19189:39;;19039:200;1701:1:14::0;2628:7;:22;18917:328:16;;-1:-1:-1;;18917:328:16:o;28649:697:4:-;28827:88;;-1:-1:-1;;;28827:88:4;;28807:4;;-1:-1:-1;;;;;28827:45:4;;;;;:88;;719:10:1;;28894:4:4;;28900:7;;28909:5;;28827:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28827:88:4;;;;;;;;-1:-1:-1;;28827:88:4;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29105:13:4;;29101:229;;29150:40;;-1:-1:-1;;;29150:40:4;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;-1:-1:-1;;;;;;28983:64:4;-1:-1:-1;;;28983:64:4;;-1:-1:-1;28823:517:4;28649:697;;;;;;:::o;13524:217:16:-;13628:21;;13604:4;;13628:26;;:105;;-1:-1:-1;13659:19:16;;;;:24;;:73;;-1:-1:-1;;13712:19:16;;;;13688:21;;:43;;13524:217::o;10226:156:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10328:47:4;10347:27;10366:7;10347:18;:27::i;:::-;10328:18;:47::i;10598:111:16:-;10658:13;10690:12;10683:19;;;;;:::i;33078:1920:4:-;33541:4;33535:11;;33548:3;33531:21;;33624:17;;;;34307:11;;;34188:5;34437:2;34451;34441:13;;34433:22;34307:11;34420:36;34491:2;34481:13;;34082:682;34509:4;34082:682;;;34695:1;34690:3;34686:11;34679:18;;34745:2;34739:4;34735:13;34731:2;34727:22;34722:3;34714:36;34602:2;34592:13;;34082:682;;;-1:-1:-1;34792:13:4;;;-1:-1:-1;;34905:12:4;;;34963:19;;;34905:12;33078:1920;-1:-1:-1;33078:1920:4:o;898:241:15:-;1063:68;;-1:-1:-1;;;;;33015:15:17;;;1063:68:15;;;32997:34:17;33067:15;;33047:18;;;33040:43;33099:18;;;33092:34;;;1036:96:15;;1056:5;;-1:-1:-1;;;1086:27:15;32932:18:17;;1063:68:15;;;;-1:-1:-1;;1063:68:15;;;;;;;;;;;;;;-1:-1:-1;;;;;1063:68:15;-1:-1:-1;;;;;;1063:68:15;;;;;;;;;;1036:19;:96::i;19251:157:16:-;19331:13;19371:5;-1:-1:-1;;;;;19371:10:16;19389:7;19371:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19356:45:16;;19251:157;-1:-1:-1;;;;19251:157:16:o;15641:661:4:-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;-1:-1:-1;;;;;15817:14:4;;;:19;15813:473;;15856:11;15870:13;15917:14;;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;-1:-1:-1;;;16076:40:4;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15838:448;;15641:661;;;:::o;9143:358::-;-1:-1:-1;;;;;;;;;;;;;9252:41:4;;;;1661:3;9337:32;;;-1:-1:-1;;;;;9303:67:4;-1:-1:-1;;;9303:67:4;-1:-1:-1;;;9399:23:4;;:28;;-1:-1:-1;;;9380:47:4;;;;2166:3;9466:27;;;;-1:-1:-1;;;9437:57:4;-1:-1:-1;9143:358:4:o;687:205:15:-;826:58;;-1:-1:-1;;;;;5735:32:17;;826:58:15;;;5717:51:17;5784:18;;;5777:34;;;799:86:15;;819:5;;-1:-1:-1;;;849:23:15;5690:18:17;;826:58:15;5543:274:17;3193:706:15;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:15;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:15;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:15;;33799:2:17;3797:85:15;;;33781:21:17;33838:2;33818:18;;;33811:30;33877:34;33857:18;;;33850:62;-1:-1:-1;;;33928:18:17;;;33921:40;33978:19;;3797:85:15;33597:406:17;16563:1492:4;16627:20;16650:13;-1:-1:-1;;;;;16677:16:4;;16673:48;;16702:19;;-1:-1:-1;;;16702:19:4;;;;;;;;;;;16673:48;16735:13;16731:44;;16757:18;;-1:-1:-1;;;16757:18:4;;;;;;;;;;;16731:44;-1:-1:-1;;;;;17250:22:4;;;;;;:18;:22;;1156:2;17250:22;;:70;;17288:31;17276:44;;17250:70;;;10863:11;10839:22;10835:40;-1:-1:-1;12522:15:4;;12497:23;12493:45;10832:51;10822:62;17556:31;;;;:17;:31;;;;;:170;17574:12;17799:23;;;17836:99;17862:35;;17887:9;;;;;-1:-1:-1;;;;;17862:35:4;;;17879:1;;17862:35;;17879:1;;17862:35;17930:3;17920:7;:13;17836:99;;17949:13;:19;-1:-1:-1;13912:179:4;;;:::o;3861:223:0:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;3994;-1:-1:-1;;;;;1465:19:0;;;5228:60;;;;-1:-1:-1;;;5228:60:0;;34617:2:17;5228:60:0;;;34599:21:17;34656:2;34636:18;;;34629:30;34695:31;34675:18;;;34668:59;34744:18;;5228:60:0;34415:353:17;5228:60:0;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:0;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:0:o;7561:692::-;7707:12;7735:7;7731:516;;;-1:-1:-1;7765:10:0;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;-1:-1:-1;;;8202:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:17;-1:-1:-1;;;;;;88:32:17;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:17;;657:42;;647:70;;713:1;710;703:12;728:179;795:20;;-1:-1:-1;;;;;844:38:17;;834:49;;824:77;;897:1;894;887:12;824:77;728:179;;;:::o;912:319::-;979:6;987;1040:2;1028:9;1019:7;1015:23;1011:32;1008:52;;;1056:1;1053;1046:12;1008:52;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;:::-;1164:5;-1:-1:-1;1188:37:17;1221:2;1206:18;;1188:37;:::i;:::-;1178:47;;912:319;;;;;:::o;1236:258::-;1308:1;1318:113;1332:6;1329:1;1326:13;1318:113;;;1408:11;;;1402:18;1389:11;;;1382:39;1354:2;1347:10;1318:113;;;1449:6;1446:1;1443:13;1440:48;;;-1:-1:-1;;1484:1:17;1466:16;;1459:27;1236:258::o;1499:::-;1541:3;1579:5;1573:12;1606:6;1601:3;1594:19;1622:63;1678:6;1671:4;1666:3;1662:14;1655:4;1648:5;1644:16;1622:63;:::i;:::-;1739:2;1718:15;-1:-1:-1;;1714:29:17;1705:39;;;;1746:4;1701:50;;1499:258;-1:-1:-1;;1499:258:17:o;1762:220::-;1911:2;1900:9;1893:21;1874:4;1931:45;1972:2;1961:9;1957:18;1949:6;1931:45;:::i;1987:180::-;2046:6;2099:2;2087:9;2078:7;2074:23;2070:32;2067:52;;;2115:1;2112;2105:12;2067:52;-1:-1:-1;2138:23:17;;1987:180;-1:-1:-1;1987:180:17:o;2380:315::-;2448:6;2456;2509:2;2497:9;2488:7;2484:23;2480:32;2477:52;;;2525:1;2522;2515:12;2477:52;2564:9;2551:23;2583:31;2608:5;2583:31;:::i;:::-;2633:5;2685:2;2670:18;;;;2657:32;;-1:-1:-1;;;2380:315:17:o;2882:456::-;2959:6;2967;2975;3028:2;3016:9;3007:7;3003:23;2999:32;2996:52;;;3044:1;3041;3034:12;2996:52;3083:9;3070:23;3102:31;3127:5;3102:31;:::i;:::-;3152:5;-1:-1:-1;3209:2:17;3194:18;;3181:32;3222:33;3181:32;3222:33;:::i;:::-;2882:456;;3274:7;;-1:-1:-1;;;3328:2:17;3313:18;;;;3300:32;;2882:456::o;3343:247::-;3402:6;3455:2;3443:9;3434:7;3430:23;3426:32;3423:52;;;3471:1;3468;3461:12;3423:52;3510:9;3497:23;3529:31;3554:5;3529:31;:::i;3595:127::-;3656:10;3651:3;3647:20;3644:1;3637:31;3687:4;3684:1;3677:15;3711:4;3708:1;3701:15;3727:275;3798:2;3792:9;3863:2;3844:13;;-1:-1:-1;;3840:27:17;3828:40;;-1:-1:-1;;;;;3883:34:17;;3919:22;;;3880:62;3877:88;;;3945:18;;:::i;:::-;3981:2;3974:22;3727:275;;-1:-1:-1;3727:275:17:o;4007:183::-;4067:4;-1:-1:-1;;;;;4092:6:17;4089:30;4086:56;;;4122:18;;:::i;:::-;-1:-1:-1;4167:1:17;4163:14;4179:4;4159:25;;4007:183::o;4195:737::-;4249:5;4302:3;4295:4;4287:6;4283:17;4279:27;4269:55;;4320:1;4317;4310:12;4269:55;4356:6;4343:20;4382:4;4406:60;4422:43;4462:2;4422:43;:::i;:::-;4406:60;:::i;:::-;4500:15;;;4586:1;4582:10;;;;4570:23;;4566:32;;;4531:12;;;;4610:15;;;4607:35;;;4638:1;4635;4628:12;4607:35;4674:2;4666:6;4662:15;4686:217;4702:6;4697:3;4694:15;4686:217;;;4782:3;4769:17;4799:31;4824:5;4799:31;:::i;:::-;4843:18;;4881:12;;;;4719;;4686:217;;;-1:-1:-1;4921:5:17;4195:737;-1:-1:-1;;;;;;4195:737:17:o;4937:348::-;5021:6;5074:2;5062:9;5053:7;5049:23;5045:32;5042:52;;;5090:1;5087;5080:12;5042:52;5130:9;5117:23;-1:-1:-1;;;;;5155:6:17;5152:30;5149:50;;;5195:1;5192;5185:12;5149:50;5218:61;5271:7;5262:6;5251:9;5247:22;5218:61;:::i;5290:248::-;5358:6;5366;5419:2;5407:9;5398:7;5394:23;5390:32;5387:52;;;5435:1;5432;5425:12;5387:52;-1:-1:-1;;5458:23:17;;;5528:2;5513:18;;;5500:32;;-1:-1:-1;5290:248:17:o;5822:607::-;5879:5;5927:4;5915:9;5910:3;5906:19;5902:30;5899:50;;;5945:1;5942;5935:12;5899:50;5978:2;5972:9;6020:4;6012:6;6008:17;6091:6;6079:10;6076:22;-1:-1:-1;;;;;6043:10:17;6040:34;6037:62;6034:88;;;6102:18;;:::i;:::-;6142:10;6138:2;6131:22;;6171:6;6162:15;;6214:9;6201:23;6193:6;6186:39;6286:2;6275:9;6271:18;6258:32;6253:2;6245:6;6241:15;6234:57;6352:2;6341:9;6337:18;6324:32;6319:2;6311:6;6307:15;6300:57;6418:2;6407:9;6403:18;6390:32;6385:2;6377:6;6373:15;6366:57;;5822:607;;;;:::o;6434:721::-;6599:6;6607;6615;6623;6631;6684:3;6672:9;6663:7;6659:23;6655:33;6652:53;;;6701:1;6698;6691:12;6652:53;6740:9;6727:23;6759:31;6784:5;6759:31;:::i;:::-;6809:5;-1:-1:-1;6833:57:17;6882:7;6877:2;6862:18;;6833:57;:::i;:::-;6823:67;;6909:58;6959:7;6953:3;6942:9;6938:19;6909:58;:::i;:::-;6899:68;;7019:3;7008:9;7004:19;6991:33;7033;7058:7;7033:33;:::i;:::-;7085:7;-1:-1:-1;7111:38:17;7144:3;7129:19;;7111:38;:::i;:::-;7101:48;;6434:721;;;;;;;;:::o;7384:592::-;7455:6;7463;7516:2;7504:9;7495:7;7491:23;7487:32;7484:52;;;7532:1;7529;7522:12;7484:52;7572:9;7559:23;-1:-1:-1;;;;;7642:2:17;7634:6;7631:14;7628:34;;;7658:1;7655;7648:12;7628:34;7696:6;7685:9;7681:22;7671:32;;7741:7;7734:4;7730:2;7726:13;7722:27;7712:55;;7763:1;7760;7753:12;7712:55;7803:2;7790:16;7829:2;7821:6;7818:14;7815:34;;;7845:1;7842;7835:12;7815:34;7890:7;7885:2;7876:6;7872:2;7868:15;7864:24;7861:37;7858:57;;;7911:1;7908;7901:12;7858:57;7942:2;7934:11;;;;;7964:6;;-1:-1:-1;7384:592:17;;-1:-1:-1;;;;7384:592:17:o;7981:662::-;8035:5;8088:3;8081:4;8073:6;8069:17;8065:27;8055:55;;8106:1;8103;8096:12;8055:55;8142:6;8129:20;8168:4;8192:60;8208:43;8248:2;8208:43;:::i;8192:60::-;8286:15;;;8372:1;8368:10;;;;8356:23;;8352:32;;;8317:12;;;;8396:15;;;8393:35;;;8424:1;8421;8414:12;8393:35;8460:2;8452:6;8448:15;8472:142;8488:6;8483:3;8480:15;8472:142;;;8554:17;;8542:30;;8592:12;;;;8505;;8472:142;;8648:348;8732:6;8785:2;8773:9;8764:7;8760:23;8756:32;8753:52;;;8801:1;8798;8791:12;8753:52;8841:9;8828:23;-1:-1:-1;;;;;8866:6:17;8863:30;8860:50;;;8906:1;8903;8896:12;8860:50;8929:61;8982:7;8973:6;8962:9;8958:22;8929:61;:::i;9001:349::-;9085:12;;-1:-1:-1;;;;;9081:38:17;9069:51;;9173:4;9162:16;;;9156:23;-1:-1:-1;;;;;9152:48:17;9136:14;;;9129:72;9264:4;9253:16;;;9247:23;9240:31;9233:39;9217:14;;;9210:63;9326:4;9315:16;;;9309:23;9334:8;9305:38;9289:14;;9282:62;9001:349::o;9355:724::-;9590:2;9642:21;;;9712:13;;9615:18;;;9734:22;;;9561:4;;9590:2;9813:15;;;;9787:2;9772:18;;;9561:4;9856:197;9870:6;9867:1;9864:13;9856:197;;;9919:52;9967:3;9958:6;9952:13;9919:52;:::i;:::-;10028:15;;;;10000:4;9991:14;;;;;9892:1;9885:9;9856:197;;10747:632;10918:2;10970:21;;;11040:13;;10943:18;;;11062:22;;;10889:4;;10918:2;11141:15;;;;11115:2;11100:18;;;10889:4;11184:169;11198:6;11195:1;11192:13;11184:169;;;11259:13;;11247:26;;11328:15;;;;11293:12;;;;11220:1;11213:9;11184:169;;11384:383;11461:6;11469;11477;11530:2;11518:9;11509:7;11505:23;11501:32;11498:52;;;11546:1;11543;11536:12;11498:52;11585:9;11572:23;11604:31;11629:5;11604:31;:::i;:::-;11654:5;11706:2;11691:18;;11678:32;;-1:-1:-1;11757:2:17;11742:18;;;11729:32;;11384:383;-1:-1:-1;;;11384:383:17:o;11772:118::-;11858:5;11851:13;11844:21;11837:5;11834:32;11824:60;;11880:1;11877;11870:12;11895:382;11960:6;11968;12021:2;12009:9;12000:7;11996:23;11992:32;11989:52;;;12037:1;12034;12027:12;11989:52;12076:9;12063:23;12095:31;12120:5;12095:31;:::i;:::-;12145:5;-1:-1:-1;12202:2:17;12187:18;;12174:32;12215:30;12174:32;12215:30;:::i;:::-;12264:7;12254:17;;;11895:382;;;;;:::o;12610:1108::-;12705:6;12713;12721;12729;12782:3;12770:9;12761:7;12757:23;12753:33;12750:53;;;12799:1;12796;12789:12;12750:53;12838:9;12825:23;12857:31;12882:5;12857:31;:::i;:::-;12907:5;-1:-1:-1;12931:2:17;12970:18;;;12957:32;12998:33;12957:32;12998:33;:::i;:::-;13050:7;-1:-1:-1;13104:2:17;13089:18;;13076:32;;-1:-1:-1;13159:2:17;13144:18;;13131:32;-1:-1:-1;;;;;13212:14:17;;;13209:34;;;13239:1;13236;13229:12;13209:34;13277:6;13266:9;13262:22;13252:32;;13322:7;13315:4;13311:2;13307:13;13303:27;13293:55;;13344:1;13341;13334:12;13293:55;13380:2;13367:16;13402:2;13398;13395:10;13392:36;;;13408:18;;:::i;:::-;13450:53;13493:2;13474:13;;-1:-1:-1;;13470:27:17;13466:36;;13450:53;:::i;:::-;13437:66;;13526:2;13519:5;13512:17;13566:7;13561:2;13556;13552;13548:11;13544:20;13541:33;13538:53;;;13587:1;13584;13577:12;13538:53;13642:2;13637;13633;13629:11;13624:2;13617:5;13613:14;13600:45;13686:1;13681:2;13676;13669:5;13665:14;13661:23;13654:34;;13707:5;13697:15;;;;;12610:1108;;;;;;;:::o;13723:234::-;13810:6;13863:3;13851:9;13842:7;13838:23;13834:33;13831:53;;;13880:1;13877;13870:12;13831:53;13903:48;13943:7;13932:9;13903:48;:::i;13962:268::-;14160:3;14145:19;;14173:51;14149:9;14206:6;14173:51;:::i;14235:595::-;14353:6;14361;14414:2;14402:9;14393:7;14389:23;14385:32;14382:52;;;14430:1;14427;14420:12;14382:52;14470:9;14457:23;-1:-1:-1;;;;;14540:2:17;14532:6;14529:14;14526:34;;;14556:1;14553;14546:12;14526:34;14579:61;14632:7;14623:6;14612:9;14608:22;14579:61;:::i;:::-;14569:71;;14693:2;14682:9;14678:18;14665:32;14649:48;;14722:2;14712:8;14709:16;14706:36;;;14738:1;14735;14728:12;14706:36;;14761:63;14816:7;14805:8;14794:9;14790:24;14761:63;:::i;:::-;14751:73;;;14235:595;;;;;:::o;15058:388::-;15126:6;15134;15187:2;15175:9;15166:7;15162:23;15158:32;15155:52;;;15203:1;15200;15193:12;15155:52;15242:9;15229:23;15261:31;15286:5;15261:31;:::i;:::-;15311:5;-1:-1:-1;15368:2:17;15353:18;;15340:32;15381:33;15340:32;15381:33;:::i;15451:356::-;15653:2;15635:21;;;15672:18;;;15665:30;15731:34;15726:2;15711:18;;15704:62;15798:2;15783:18;;15451:356::o;15812:355::-;16014:2;15996:21;;;16053:2;16033:18;;;16026:30;16092:33;16087:2;16072:18;;16065:61;16158:2;16143:18;;15812:355::o;16172:380::-;16251:1;16247:12;;;;16294;;;16315:61;;16369:4;16361:6;16357:17;16347:27;;16315:61;16422:2;16414:6;16411:14;16391:18;16388:38;16385:161;;;16468:10;16463:3;16459:20;16456:1;16449:31;16503:4;16500:1;16493:15;16531:4;16528:1;16521:15;16385:161;;16172:380;;;:::o;16557:412::-;16759:2;16741:21;;;16798:2;16778:18;;;16771:30;16837:34;16832:2;16817:18;;16810:62;-1:-1:-1;;;16903:2:17;16888:18;;16881:46;16959:3;16944:19;;16557:412::o;16974:127::-;17035:10;17030:3;17026:20;17023:1;17016:31;17066:4;17063:1;17056:15;17090:4;17087:1;17080:15;17106:127;17167:10;17162:3;17158:20;17155:1;17148:31;17198:4;17195:1;17188:15;17222:4;17219:1;17212:15;17238:136;17277:3;17305:5;17295:39;;17314:18;;:::i;:::-;-1:-1:-1;;;17350:18:17;;17238:136::o;17379:135::-;17418:3;-1:-1:-1;;17439:17:17;;17436:43;;;17459:18;;:::i;:::-;-1:-1:-1;17506:1:17;17495:13;;17379:135::o;17519:168::-;17559:7;17625:1;17621;17617:6;17613:14;17610:1;17607:21;17602:1;17595:9;17588:17;17584:45;17581:71;;;17632:18;;:::i;:::-;-1:-1:-1;17672:9:17;;17519:168::o;17692:217::-;17732:1;17758;17748:132;;17802:10;17797:3;17793:20;17790:1;17783:31;17837:4;17834:1;17827:15;17865:4;17862:1;17855:15;17748:132;-1:-1:-1;17894:9:17;;17692:217::o;17914:415::-;18116:2;18098:21;;;18155:2;18135:18;;;18128:30;18194:34;18189:2;18174:18;;18167:62;-1:-1:-1;;;18260:2:17;18245:18;;18238:49;18319:3;18304:19;;17914:415::o;18334:128::-;18374:3;18405:1;18401:6;18398:1;18395:13;18392:39;;;18411:18;;:::i;:::-;-1:-1:-1;18447:9:17;;18334:128::o;18467:476::-;18669:2;18651:21;;;18708:2;18688:18;;;18681:30;18747:34;18742:2;18727:18;;18720:62;18818:34;18813:2;18798:18;;18791:62;-1:-1:-1;;;18884:3:17;18869:19;;18862:39;18933:3;18918:19;;18467:476::o;19201:402::-;19403:2;19385:21;;;19442:2;19422:18;;;19415:30;19481:34;19476:2;19461:18;;19454:62;-1:-1:-1;;;19547:2:17;19532:18;;19525:36;19593:3;19578:19;;19201:402::o;21262:125::-;21302:4;21330:1;21327;21324:8;21321:34;;;21335:18;;:::i;:::-;-1:-1:-1;21372:9:17;;21262:125::o;23085:427::-;23287:2;23269:21;;;23326:2;23306:18;;;23299:30;23365:34;23360:2;23345:18;;23338:62;23436:33;23431:2;23416:18;;23409:61;23502:3;23487:19;;23085:427::o;23517:422::-;23719:2;23701:21;;;23758:2;23738:18;;;23731:30;23797:34;23792:2;23777:18;;23770:62;23868:28;23863:2;23848:18;;23841:56;23929:3;23914:19;;23517:422::o;23944:::-;24146:2;24128:21;;;24185:2;24165:18;;;24158:30;24224:34;24219:2;24204:18;;24197:62;24295:28;24290:2;24275:18;;24268:56;24356:3;24341:19;;23944:422::o;24371:420::-;24573:2;24555:21;;;24612:2;24592:18;;;24585:30;24651:34;24646:2;24631:18;;24624:62;24722:26;24717:2;24702:18;;24695:54;24781:3;24766:19;;24371:420::o;24796:404::-;24998:2;24980:21;;;25037:2;25017:18;;;25010:30;25076:34;25071:2;25056:18;;25049:62;-1:-1:-1;;;25142:2:17;25127:18;;25120:38;25190:3;25175:19;;24796:404::o;25640:417::-;25842:2;25824:21;;;25881:2;25861:18;;;25854:30;25920:34;25915:2;25900:18;;25893:62;-1:-1:-1;;;25986:2:17;25971:18;;25964:51;26047:3;26032:19;;25640:417::o;26482:404::-;26684:2;26666:21;;;26723:2;26703:18;;;26696:30;26762:34;26757:2;26742:18;;26735:62;-1:-1:-1;;;26828:2:17;26813:18;;26806:38;26876:3;26861:19;;26482:404::o;26891:470::-;27070:3;27108:6;27102:13;27124:53;27170:6;27165:3;27158:4;27150:6;27146:17;27124:53;:::i;:::-;27240:13;;27199:16;;;;27262:57;27240:13;27199:16;27296:4;27284:17;;27262:57;:::i;:::-;27335:20;;26891:470;-1:-1:-1;;;;26891:470:17:o;27366:413::-;27568:2;27550:21;;;27607:2;27587:18;;;27580:30;27646:34;27641:2;27626:18;;27619:62;-1:-1:-1;;;27712:2:17;27697:18;;27690:47;27769:3;27754:19;;27366:413::o;30604:184::-;30674:6;30727:2;30715:9;30706:7;30702:23;30698:32;30695:52;;;30743:1;30740;30733:12;30695:52;-1:-1:-1;30766:16:17;;30604:184;-1:-1:-1;30604:184:17:o;32009:489::-;-1:-1:-1;;;;;32278:15:17;;;32260:34;;32330:15;;32325:2;32310:18;;32303:43;32377:2;32362:18;;32355:34;;;32425:3;32420:2;32405:18;;32398:31;;;32203:4;;32446:46;;32472:19;;32464:6;32446:46;:::i;:::-;32438:54;32009:489;-1:-1:-1;;;;;;32009:489:17:o;32503:249::-;32572:6;32625:2;32613:9;32604:7;32600:23;32596:32;32593:52;;;32641:1;32638;32631:12;32593:52;32673:9;32667:16;32692:30;32716:5;32692:30;:::i;33347:245::-;33414:6;33467:2;33455:9;33446:7;33442:23;33438:32;33435:52;;;33483:1;33480;33473:12;33435:52;33515:9;33509:16;33534:28;33556:5;33534:28;:::i;34773:274::-;34902:3;34940:6;34934:13;34956:53;35002:6;34997:3;34990:4;34982:6;34978:17;34956:53;:::i;:::-;35025:16;;;;;34773:274;-1:-1:-1;;34773:274:17:o
Swarm Source
ipfs://90e9632fde8c1bc17c01e5208b90218d8d1ca96cb3454bdf504080716f6c1955
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.