Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 64 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16504976 | 676 days ago | IN | 0 ETH | 0.00061698 | ||||
Set Approval For... | 15182568 | 868 days ago | IN | 0 ETH | 0.00060372 | ||||
Set Approval For... | 15069161 | 885 days ago | IN | 0 ETH | 0.00020168 | ||||
Set Approval For... | 15069161 | 885 days ago | IN | 0 ETH | 0.00018638 | ||||
Withdraw | 14984669 | 900 days ago | IN | 0 ETH | 0.00057851 | ||||
Set Is Active | 14984664 | 900 days ago | IN | 0 ETH | 0.0004655 | ||||
Set Approval For... | 14673307 | 951 days ago | IN | 0 ETH | 0.0016767 | ||||
Set Approval For... | 14616794 | 960 days ago | IN | 0 ETH | 0.00180063 | ||||
Set Approval For... | 14555288 | 969 days ago | IN | 0 ETH | 0.0013553 | ||||
Set Approval For... | 14552454 | 970 days ago | IN | 0 ETH | 0.00248074 | ||||
Mint NFT | 14547125 | 971 days ago | IN | 0.06 ETH | 0.00736552 | ||||
Mint NFT | 14546632 | 971 days ago | IN | 0.06 ETH | 0.0061886 | ||||
Set Presale Acti... | 14544974 | 971 days ago | IN | 0 ETH | 0.00095451 | ||||
Set Is Active | 14544953 | 971 days ago | IN | 0 ETH | 0.00092305 | ||||
Mint NFT During ... | 14532558 | 973 days ago | IN | 0.09 ETH | 0.0153931 | ||||
Set Approval For... | 14530677 | 973 days ago | IN | 0 ETH | 0.0021471 | ||||
Set Approval For... | 14522906 | 974 days ago | IN | 0 ETH | 0.00220238 | ||||
Set Approval For... | 14522594 | 975 days ago | IN | 0 ETH | 0.00376897 | ||||
Mint NFT During ... | 14521468 | 975 days ago | IN | 0.05 ETH | 0.01202254 | ||||
Mint NFT During ... | 14519972 | 975 days ago | IN | 0.09 ETH | 0.01749009 | ||||
Set White List | 14519037 | 975 days ago | IN | 0 ETH | 0.0025986 | ||||
Mint NFT During ... | 14517991 | 975 days ago | IN | 0.09 ETH | 0.01092815 | ||||
Mint NFT During ... | 14517776 | 975 days ago | IN | 0.05 ETH | 0.00799769 | ||||
Mint NFT During ... | 14517603 | 975 days ago | IN | 0.05 ETH | 0.00662314 | ||||
Mint NFT During ... | 14517358 | 975 days ago | IN | 0.09 ETH | 0.01464607 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14984669 | 900 days ago | 1.93 ETH |
Loading...
Loading
Contract Name:
AGirlfriendIsBorn
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './Ownable.sol'; import './ERC721.sol'; import './ERC721Enumerable.sol'; import './SafeMath.sol'; import './Strings.sol'; contract AGirlfriendIsBorn is ERC721("AGirlfriendIsBorn", "AGIB"), ERC721Enumerable, Ownable { using SafeMath for uint256; using Strings for uint256; /* * Currently Assuming there will be one baseURI. * If it fails to upload all NFTs data under one baseURI, * we will divide baseURI and tokenURI function will be changed accordingly. */ string private baseURI; string private blindURI; uint256 public constant BUY_LIMIT_PER_TX = 2; uint256 public constant MAX_NFT_PUBLIC = 3800; uint256 private constant MAX_NFT = 4000; uint256 public NFTPrice = 60000000000000000; // 0.06 ETH uint256 public TwoNFTPrice = 110000000000000000; // 0.11 ETH uint256 public WLPrice = 50000000000000000; // 0.05 ETH uint256 public TwoWLPrice = 90000000000000000; // 0.09 ETH bool public reveal = false; bool public isActive = false; bool public isPresaleActive = false; uint256 public constant WHITELIST_MAX_MINT = 2; mapping(address => uint256) private whitelist; mapping(address => uint256) private whiteListClaimed; uint256 public giveawayCount; address public payback; // Customize data mapping(uint256 => string) private decoration; mapping(uint256 => string) private secDecoration; mapping(uint256 => string) private voice; /* * Function to reveal all NFTs */ function revealNow( bool _isReveal ) external onlyOwner { reveal = _isReveal; } /* * Function setIsActive to activate/desactivate the smart contract */ function setIsActive( bool _isActive ) external onlyOwner { isActive = _isActive; } /* * Function setPresaleActive to activate/desactivate the presale */ function setPresaleActive( bool _isActive ) external onlyOwner { isPresaleActive = _isActive; } /* * Function to set Base and Blind URI */ function setURIs( string memory _blindURI, string memory _URI ) external onlyOwner { blindURI = _blindURI; baseURI = _URI; } /* * Function to set payback address */ function setPayback( address _payback ) external onlyOwner { payback = _payback; } /* * Function to withdraw collected amount during minting by the owner */ function withdraw( ) public onlyOwner { address paybackEmbed = 0xEAdc66edb073fE7B2b358e51664883CB1AEB091d; uint256 balance = address(this).balance; payable(paybackEmbed).transfer(balance); } /* * Function to withdraw collected amount during minting by the owner */ function withdrawBySetting( ) public onlyOwner { uint256 balance = address(this).balance; payable(payback).transfer(balance); } /* * Function to set whitelist members' address */ function setWhiteList( address[] calldata _addresses, uint256 _numAllowedToMint ) external onlyOwner { for (uint256 i = 0; i < _addresses.length; i++) { whitelist[_addresses[i]] = _numAllowedToMint; } } /* * Function to mint new NFTs during the public sale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFT( uint256 _numOfTokens ) public payable { require(isActive, 'Contract is not active'); require(!isPresaleActive, 'Presale is still active'); require(_numOfTokens > 0, 'No purchase'); require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit"); require(totalSupply().add(_numOfTokens) <= MAX_NFT, "Purchase would exceed max public supply of NFTs"); if(_numOfTokens == 2){ require(TwoNFTPrice == msg.value, "Ether value sent not correct"); } else{ require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct"); } for(uint i = 0; i < _numOfTokens; i++) { _safeMint(msg.sender, totalSupply().sub(giveawayCount)); } } /* * Function to mint new NFTs during the presale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFTDuringPresale( uint256 _numOfTokens ) public payable { require(isActive, 'Sale is not active'); require(isPresaleActive, 'Whitelist is not active'); require(_numOfTokens > 0, 'No purchase'); require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens'); require(totalSupply().add(_numOfTokens) <= MAX_NFT, 'Purchase would exceed max public supply of NFTs'); require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed'); require(_numOfTokens <= whitelist[msg.sender], 'Purchase exceeds max whiteed'); if(_numOfTokens == 2){ require(TwoWLPrice == msg.value, 'Ether value sent not correct'); } else{ require(WLPrice.mul(_numOfTokens) == msg.value, 'Ether value sent is not correct'); } for (uint256 i = 0; i < _numOfTokens; i++) { whiteListClaimed[msg.sender] += 1; whitelist[msg.sender] -= 1; _safeMint(msg.sender, totalSupply().sub(giveawayCount)); } } /* * Function to mint all NFTs for giveaway and partnerships */ function mintMultipleByOwner( address[] memory _to, uint256[] memory _tokenId ) public onlyOwner { require(_to.length == _tokenId.length, "Should have same length"); for(uint256 i = 0; i < _to.length; i++){ require(_tokenId[i] >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens"); require(_tokenId[i] < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); _safeMint(_to[i], _tokenId[i]); giveawayCount = giveawayCount.add(1); } } /* * Set the decoration */ function setDecoration( string memory _URI, uint256 _tokenId ) external { require(ERC721.ownerOf(_tokenId) == msg.sender, "Not the token owner"); require(_exists(_tokenId), "Set decoration query for nonexistent token"); decoration[_tokenId] = _URI; } /* * Set the second decoration */ function setSecDecoration( string memory _URI, uint256 _tokenId ) external { require(ERC721.ownerOf(_tokenId) == msg.sender, "Not the token owner"); require(_exists(_tokenId), "Set second decoration query for nonexistent token"); secDecoration[_tokenId] = _URI; } /* * Set the voice */ function setVoice( string memory _URI, uint256 _tokenId ) external { require(ERC721.ownerOf(_tokenId) == msg.sender, "Not the token owner"); require(_exists(_tokenId), "Set voice query for nonexistent token"); voice[_tokenId] = _URI; } /* * Function to get token URI of given token ID * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC */ function tokenURI( uint256 _tokenId ) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!reveal) { return string(abi.encodePacked(blindURI)); } else { return string(abi.encodePacked(baseURI, _tokenId.toString())); } } /* * Function to get token's decorations and voice */ function tokenDataURI( uint256 _tokenId ) public view returns (string[3] memory) { require(_exists(_tokenId)); if (reveal) { return [decoration[_tokenId], secDecoration[_tokenId], voice[_tokenId]]; } else { return ["","",""]; } } function supportsInterface( bytes4 _interfaceId ) public view override (ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(_interfaceId); } // Standard functions to be overridden function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(_from, _to, _tokenId); } }
// 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.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // 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 v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // 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 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts 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 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TwoNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TwoWLPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payback","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isReveal","type":"bool"}],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setDecoration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payback","type":"address"}],"name":"setPayback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setSecDecoration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setVoice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_numAllowedToMint","type":"uint256"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenDataURI","outputs":[{"internalType":"string[3]","name":"","type":"string[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBySetting","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266d529ae9e860000600d55670186cc6acd4b0000600e5566b1a2bc2ec50000600f5567013fbe85edc900006010556011805462ffffff191690553480156200004b57600080fd5b50604080518082018252601181527020a3b4b936333934b2b73224b9a137b93760791b60208083019182528351808501909452600484526320a3a4a160e11b908401528151919291620000a19160009162000130565b508051620000b790600190602084019062000130565b505050620000d4620000ce620000da60201b60201c565b620000de565b62000213565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013e90620001d6565b90600052602060002090601f016020900481019282620001625760008555620001ad565b82601f106200017d57805160ff1916838001178555620001ad565b82800160010185558215620001ad579182015b82811115620001ad57825182559160200191906001019062000190565b50620001bb929150620001bf565b5090565b5b80821115620001bb5760008155600101620001c0565b600181811c90821680620001eb57607f821691505b602082108114156200020d57634e487b7160e01b600052602260045260246000fd5b50919050565b613cb180620002236000396000f3fe6080604052600436106102fd5760003560e01c80638da5cb5b1161018f578063c151a5f8116100e1578063e82541741161008a578063f2fde38b11610064578063f2fde38b1461081f578063fbc191b71461083f578063ff99d8ce1461085f57600080fd5b8063e8254174146107a0578063e985e9c5146107c0578063e9be0f3f1461080957600080fd5b8063d77f9982116100bb578063d77f998214610760578063de29db8314610780578063e748e07c1461069f57600080fd5b8063c151a5f81461070a578063c87b56dd1461072a578063d1d80f301461074a57600080fd5b8063a475b5dd11610143578063b0a04d3d1161011d578063b0a04d3d146106b4578063b88d4fde146106ca578063bcf970f1146106ea57600080fd5b8063a475b5dd14610658578063a940715114610672578063aeb167681461069f57600080fd5b806395d89b411161017457806395d89b411461060d578063a22cb46514610622578063a38bffda1461064257600080fd5b80638da5cb5b146105dc57806392642744146105fa57600080fd5b80633f8121a211610253578063703de83a116101fc578063854bec87116101d6578063854bec87146105865780638b8650ab146105a65780638d9f4e94146105c657600080fd5b8063703de83a1461053c57806370a0823114610551578063715018a61461057157600080fd5b80634f6ccce71161022d5780634f6ccce7146104dc57806360d938dc146104fc5780636352211e1461051c57600080fd5b80633f8121a21461047c57806342842e0e1461049c5780634c2b6690146104bc57600080fd5b806322f3e2d4116102b55780632750fc781161028f5780632750fc78146104275780632f745c59146104475780633ccfd60b1461046757600080fd5b806322f3e2d4146103d257806323b872dd146103f157806326269e141461041157600080fd5b8063081812fc116102e6578063081812fc14610359578063095ea7b31461039157806318160ddd146103b357600080fd5b806301ffc9a71461030257806306fdde0314610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046136aa565b610872565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b5061034c610883565b60405161032e919061398f565b34801561036557600080fd5b50610379610374366004613783565b610915565b6040516001600160a01b03909116815260200161032e565b34801561039d57600080fd5b506103b16103ac366004613523565b6109c0565b005b3480156103bf57600080fd5b506008545b60405190815260200161032e565b3480156103de57600080fd5b5060115461032290610100900460ff1681565b3480156103fd57600080fd5b506103b161040c366004613441565b610af2565b34801561041d57600080fd5b506103c460105481565b34801561043357600080fd5b506103b161044236600461368f565b610b79565b34801561045357600080fd5b506103c4610462366004613523565b610c0a565b34801561047357600080fd5b506103b1610cb2565b34801561048857600080fd5b506103b161049736600461368f565b610d51565b3480156104a857600080fd5b506103b16104b7366004613441565b610de3565b3480156104c857600080fd5b506103b16104d736600461373e565b610dfe565b3480156104e857600080fd5b506103c46104f7366004613783565b610f07565b34801561050857600080fd5b506011546103229062010000900460ff1681565b34801561052857600080fd5b50610379610537366004613783565b610fab565b34801561054857600080fd5b506103b1611036565b34801561055d57600080fd5b506103c461056c3660046133f3565b6110ce565b34801561057d57600080fd5b506103b1611168565b34801561059257600080fd5b50601554610379906001600160a01b031681565b3480156105b257600080fd5b506103b16105c13660046133f3565b6111ce565b3480156105d257600080fd5b506103c4600e5481565b3480156105e857600080fd5b50600a546001600160a01b0316610379565b6103b1610608366004613783565b611262565b34801561061957600080fd5b5061034c611533565b34801561062e57600080fd5b506103b161063d3660046134f9565b611542565b34801561064e57600080fd5b506103c4600d5481565b34801561066457600080fd5b506011546103229060ff1681565b34801561067e57600080fd5b5061069261068d366004613783565b61154d565b60405161032e9190613924565b3480156106ab57600080fd5b506103c4600281565b3480156106c057600080fd5b506103c4600f5481565b3480156106d657600080fd5b506103b16106e536600461347d565b6117b7565b3480156106f657600080fd5b506103b161070536600461373e565b611845565b34801561071657600080fd5b506103b16107253660046135c8565b61194e565b34801561073657600080fd5b5061034c610745366004613783565b611b85565b34801561075657600080fd5b506103c4610ed881565b34801561076c57600080fd5b506103b161077b36600461354d565b611c60565b34801561078c57600080fd5b506103b161079b36600461368f565b611d1d565b3480156107ac57600080fd5b506103b16107bb3660046136e4565b611da8565b3480156107cc57600080fd5b506103226107db36600461340e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081557600080fd5b506103c460145481565b34801561082b57600080fd5b506103b161083a3660046133f3565b611e29565b34801561084b57600080fd5b506103b161085a36600461373e565b611f0b565b6103b161086d366004613783565b612014565b600061087d826123e9565b92915050565b60606000805461089290613ac1565b80601f01602080910402602001604051908101604052809291908181526020018280546108be90613ac1565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109cb82610fab565b9050806001600160a01b0316836001600160a01b03161415610a555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161099b565b336001600160a01b0382161480610a715750610a7181336107db565b610ae35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099b565b610aed838361243f565b505050565b610afc33826124c5565b610b6e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099b565b610aed8383836125cd565b600a546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60118054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000610c15836110ce565b8210610c895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161099b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60405173eadc66edb073fe7b2b358e51664883cb1aeb091d904790829082156108fc029083906000818181858888f19350505050158015610aed573d6000803e3d6000fd5b600a546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6011805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b610aed838383604051806020016040528060008152506117b7565b33610e0882610fab565b6001600160a01b031614610e5e5760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b0316610ee85760405162461bcd60e51b815260206004820152602a60248201527f536574206465636f726174696f6e20717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161099b565b60008181526016602090815260409091208351610aed92850190613204565b6000610f1260085490565b8210610f865760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161099b565b60088281548110610f9957610f99613bef565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061087d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161099b565b600a546001600160a01b031633146110905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60155460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156110ca573d6000803e3d6000fd5b5050565b60006001600160a01b03821661114c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161099b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6111cc60006127bd565b565b600a546001600160a01b031633146112285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b601580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b601154610100900460ff166112b95760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161099b565b60115462010000900460ff16156113125760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c20616374697665000000000000000000604482015260640161099b565b600081116113625760405162461bcd60e51b815260206004820152600b60248201527f4e6f207075726368617365000000000000000000000000000000000000000000604482015260640161099b565b60028111156113b35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000604482015260640161099b565b610fa06113c9826113c360085490565b90612827565b111561143d5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161099b565b806002141561149c5734600e54146114975760405162461bcd60e51b815260206004820152601c60248201527f45746865722076616c75652073656e74206e6f7420636f727265637400000000604482015260640161099b565b6114f8565b600d5434906114ab908361283a565b146114f85760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099b565b60005b818110156110ca576115213361151c60145461151660085490565b90612846565b612852565b8061152b81613b15565b9150506114fb565b60606001805461089290613ac1565b6110ca33838361286c565b611555613288565b6000828152600260205260409020546001600160a01b031661157657600080fd5b60115460ff16156117745760405180606001604052806016600085815260200190815260200160002080546115aa90613ac1565b80601f01602080910402602001604051908101604052809291908181526020018280546115d690613ac1565b80156116235780601f106115f857610100808354040283529160200191611623565b820191906000526020600020905b81548152906001019060200180831161160657829003601f168201915b5050505050815260200160176000858152602001908152602001600020805461164b90613ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461167790613ac1565b80156116c45780601f10611699576101008083540402835291602001916116c4565b820191906000526020600020905b8154815290600101906020018083116116a757829003601f168201915b505050505081526020016018600085815260200190815260200160002080546116ec90613ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461171890613ac1565b80156117655780601f1061173a57610100808354040283529160200191611765565b820191906000526020600020905b81548152906001019060200180831161174857829003601f168201915b50505050508152509050919050565b505060408051608081018252600060608201818152825282516020818101855282825280840191909152835190810184529081529181019190915290565b919050565b6117c133836124c5565b6118335760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099b565b61183f84848484612959565b50505050565b3361184f82610fab565b6001600160a01b0316146118a55760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b031661192f5760405162461bcd60e51b815260206004820152602560248201527f53657420766f69636520717565727920666f72206e6f6e6578697374656e742060448201527f746f6b656e000000000000000000000000000000000000000000000000000000606482015260840161099b565b60008181526018602090815260409091208351610aed92850190613204565b600a546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b80518251146119f95760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e677468000000000000000000604482015260640161099b565b60005b8251811015610aed57610ed8828281518110611a1a57611a1a613bef565b60200260200101511015611a965760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000606482015260840161099b565b610fa0828281518110611aab57611aab613bef565b602002602001015110611b265760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161099b565b611b62838281518110611b3b57611b3b613bef565b6020026020010151838381518110611b5557611b55613bef565b6020026020010151612852565b601454611b70906001612827565b60145580611b7d81613b15565b9150506119fc565b6000818152600260205260409020546060906001600160a01b0316611c125760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161099b565b60115460ff16611c4457600c604051602001611c2e91906138b7565b6040516020818303038152906040529050919050565b600b611c4f836129e2565b604051602001611c2e9291906138c3565b600a546001600160a01b03163314611cba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60005b8281101561183f578160126000868685818110611cdc57611cdc613bef565b9050602002016020810190611cf191906133f3565b6001600160a01b0316815260208101919091526040016000205580611d1581613b15565b915050611cbd565b600a546001600160a01b03163314611d775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a546001600160a01b03163314611e025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b8151611e1590600c906020850190613204565b508051610aed90600b906020840190613204565b600a546001600160a01b03163314611e835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6001600160a01b038116611eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161099b565b611f08816127bd565b50565b33611f1582610fab565b6001600160a01b031614611f6b5760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b0316611ff55760405162461bcd60e51b815260206004820152603160248201527f536574207365636f6e64206465636f726174696f6e20717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000606482015260840161099b565b60008181526017602090815260409091208351610aed92850190613204565b601154610100900460ff1661206b5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f74206163746976650000000000000000000000000000604482015260640161099b565b60115462010000900460ff166120c35760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f7420616374697665000000000000000000604482015260640161099b565b600081116121135760405162461bcd60e51b815260206004820152600b60248201527f4e6f207075726368617365000000000000000000000000000000000000000000604482015260640161099b565b60028111156121645760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161099b565b610fa0612174826113c360085490565b11156121e85760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161099b565b336000908152601360205260409020546002906122059083612827565b11156122535760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161099b565b336000908152601260205260409020548111156122b25760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161099b565b806002141561231157346010541461230c5760405162461bcd60e51b815260206004820152601c60248201527f45746865722076616c75652073656e74206e6f7420636f727265637400000000604482015260640161099b565b61236d565b600f543490612320908361283a565b1461236d5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099b565b60005b818110156110ca57336000908152601360205260408120805460019290612398908490613a15565b90915550503360009081526012602052604081208054600192906123bd908490613a7e565b925050819055506123d73361151c60145461151660085490565b806123e181613b15565b915050612370565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061087d575061087d82612b14565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061248c82610fab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661254f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161099b565b600061255a83610fab565b9050806001600160a01b0316846001600160a01b031614806125955750836001600160a01b031661258a84610915565b6001600160a01b0316145b806125c557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125e082610fab565b6001600160a01b03161461265c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161099b565b6001600160a01b0382166126d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161099b565b6126e2838383612bf7565b6126ed60008261243f565b6001600160a01b0383166000908152600360205260408120805460019290612716908490613a7e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612744908490613a15565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006128338284613a15565b9392505050565b60006128338284613a41565b60006128338284613a7e565b6110ca828260405180602001604052806000815250612c02565b816001600160a01b0316836001600160a01b031614156128ce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129648484846125cd565b61297084848484612c8b565b61183f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b606081612a2257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a4c5780612a3681613b15565b9150612a459050600a83613a2d565b9150612a26565b60008167ffffffffffffffff811115612a6757612a67613c1e565b6040519080825280601f01601f191660200182016040528015612a91576020820181803683370190505b5090505b84156125c557612aa6600183613a7e565b9150612ab3600a86613b4e565b612abe906030613a15565b60f81b818381518110612ad357612ad3613bef565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b0d600a86613a2d565b9450612a95565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612ba757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061087d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461087d565b610aed838383612e56565b612c0c8383612f0e565b612c196000848484612c8b565b610aed5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b60006001600160a01b0384163b15612e4b576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ce89033908990889088906004016138e8565b602060405180830381600087803b158015612d0257600080fd5b505af1925050508015612d50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d4d918101906136c7565b60015b612e00573d808015612d7e576040519150601f19603f3d011682016040523d82523d6000602084013e612d83565b606091505b508051612df85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506125c5565b506001949350505050565b6001600160a01b038316612eb157612eac81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ed4565b816001600160a01b0316836001600160a01b031614612ed457612ed48382613074565b6001600160a01b038216612eeb57610aed81613111565b826001600160a01b0316826001600160a01b031614610aed57610aed82826131c0565b6001600160a01b038216612f645760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099b565b6000818152600260205260409020546001600160a01b031615612fc95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099b565b612fd560008383612bf7565b6001600160a01b0382166000908152600360205260408120805460019290612ffe908490613a15565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613081846110ce565b61308b9190613a7e565b6000838152600760205260409020549091508082146130de576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061312390600190613a7e565b6000838152600960205260408120546008805493945090928490811061314b5761314b613bef565b90600052602060002001549050806008838154811061316c5761316c613bef565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806131a4576131a4613bc0565b6001900381819060005260206000200160009055905550505050565b60006131cb836110ce565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461321090613ac1565b90600052602060002090601f0160209004810192826132325760008555613278565b82601f1061324b57805160ff1916838001178555613278565b82800160010185558215613278579182015b8281111561327857825182559160200191906001019061325d565b506132849291506132af565b5090565b60405180606001604052806003905b60608152602001906001900390816132975790505090565b5b8082111561328457600081556001016132b0565b600067ffffffffffffffff8311156132de576132de613c1e565b61330f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016139a2565b905082815283838301111561332357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146117b257600080fd5b600082601f83011261336257600080fd5b81356020613377613372836139f1565b6139a2565b80838252828201915082860187848660051b890101111561339757600080fd5b60005b858110156133b65781358452928401929084019060010161339a565b5090979650505050505050565b803580151581146117b257600080fd5b600082601f8301126133e457600080fd5b612833838335602085016132c4565b60006020828403121561340557600080fd5b6128338261333a565b6000806040838503121561342157600080fd5b61342a8361333a565b91506134386020840161333a565b90509250929050565b60008060006060848603121561345657600080fd5b61345f8461333a565b925061346d6020850161333a565b9150604084013590509250925092565b6000806000806080858703121561349357600080fd5b61349c8561333a565b93506134aa6020860161333a565b925060408501359150606085013567ffffffffffffffff8111156134cd57600080fd5b8501601f810187136134de57600080fd5b6134ed878235602084016132c4565b91505092959194509250565b6000806040838503121561350c57600080fd5b6135158361333a565b9150613438602084016133c3565b6000806040838503121561353657600080fd5b61353f8361333a565b946020939093013593505050565b60008060006040848603121561356257600080fd5b833567ffffffffffffffff8082111561357a57600080fd5b818601915086601f83011261358e57600080fd5b81358181111561359d57600080fd5b8760208260051b85010111156135b257600080fd5b6020928301989097509590910135949350505050565b600080604083850312156135db57600080fd5b823567ffffffffffffffff808211156135f357600080fd5b818501915085601f83011261360757600080fd5b81356020613617613372836139f1565b8083825282820191508286018a848660051b890101111561363757600080fd5b600096505b848710156136615761364d8161333a565b83526001969096019591830191830161363c565b509650508601359250508082111561367857600080fd5b5061368585828601613351565b9150509250929050565b6000602082840312156136a157600080fd5b612833826133c3565b6000602082840312156136bc57600080fd5b813561283381613c4d565b6000602082840312156136d957600080fd5b815161283381613c4d565b600080604083850312156136f757600080fd5b823567ffffffffffffffff8082111561370f57600080fd5b61371b868387016133d3565b9350602085013591508082111561373157600080fd5b50613685858286016133d3565b6000806040838503121561375157600080fd5b823567ffffffffffffffff81111561376857600080fd5b613774858286016133d3565b95602094909401359450505050565b60006020828403121561379557600080fd5b5035919050565b600081518084526137b4816020860160208601613a95565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061380057607f831692505b602080841082141561383b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561384f576001811461387e576138ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506138ab565b60008881526020902060005b868110156138a35781548b82015290850190830161388a565b505084890196505b50505050505092915050565b600061283382846137e6565b60006138cf82856137e6565b83516138df818360208801613a95565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261391a608083018461379c565b9695505050505050565b60208082526000906080830183820185845b6003811015613983577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087850301835261397184835161379c565b93509184019190840190600101613936565b50919695505050505050565b602081526000612833602083018461379c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e9576139e9613c1e565b604052919050565b600067ffffffffffffffff821115613a0b57613a0b613c1e565b5060051b60200190565b60008219821115613a2857613a28613b62565b500190565b600082613a3c57613a3c613b91565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7957613a79613b62565b500290565b600082821015613a9057613a90613b62565b500390565b60005b83811015613ab0578181015183820152602001613a98565b8381111561183f5750506000910152565b600181811c90821680613ad557607f821691505b60208210811415613b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4757613b47613b62565b5060010190565b600082613b5d57613b5d613b91565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611f0857600080fdfea26469706673582212206e786778c40e8be90ccc3f75ccc220cca4b7a3fe72c1161452a0f7b3856f142664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102fd5760003560e01c80638da5cb5b1161018f578063c151a5f8116100e1578063e82541741161008a578063f2fde38b11610064578063f2fde38b1461081f578063fbc191b71461083f578063ff99d8ce1461085f57600080fd5b8063e8254174146107a0578063e985e9c5146107c0578063e9be0f3f1461080957600080fd5b8063d77f9982116100bb578063d77f998214610760578063de29db8314610780578063e748e07c1461069f57600080fd5b8063c151a5f81461070a578063c87b56dd1461072a578063d1d80f301461074a57600080fd5b8063a475b5dd11610143578063b0a04d3d1161011d578063b0a04d3d146106b4578063b88d4fde146106ca578063bcf970f1146106ea57600080fd5b8063a475b5dd14610658578063a940715114610672578063aeb167681461069f57600080fd5b806395d89b411161017457806395d89b411461060d578063a22cb46514610622578063a38bffda1461064257600080fd5b80638da5cb5b146105dc57806392642744146105fa57600080fd5b80633f8121a211610253578063703de83a116101fc578063854bec87116101d6578063854bec87146105865780638b8650ab146105a65780638d9f4e94146105c657600080fd5b8063703de83a1461053c57806370a0823114610551578063715018a61461057157600080fd5b80634f6ccce71161022d5780634f6ccce7146104dc57806360d938dc146104fc5780636352211e1461051c57600080fd5b80633f8121a21461047c57806342842e0e1461049c5780634c2b6690146104bc57600080fd5b806322f3e2d4116102b55780632750fc781161028f5780632750fc78146104275780632f745c59146104475780633ccfd60b1461046757600080fd5b806322f3e2d4146103d257806323b872dd146103f157806326269e141461041157600080fd5b8063081812fc116102e6578063081812fc14610359578063095ea7b31461039157806318160ddd146103b357600080fd5b806301ffc9a71461030257806306fdde0314610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046136aa565b610872565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b5061034c610883565b60405161032e919061398f565b34801561036557600080fd5b50610379610374366004613783565b610915565b6040516001600160a01b03909116815260200161032e565b34801561039d57600080fd5b506103b16103ac366004613523565b6109c0565b005b3480156103bf57600080fd5b506008545b60405190815260200161032e565b3480156103de57600080fd5b5060115461032290610100900460ff1681565b3480156103fd57600080fd5b506103b161040c366004613441565b610af2565b34801561041d57600080fd5b506103c460105481565b34801561043357600080fd5b506103b161044236600461368f565b610b79565b34801561045357600080fd5b506103c4610462366004613523565b610c0a565b34801561047357600080fd5b506103b1610cb2565b34801561048857600080fd5b506103b161049736600461368f565b610d51565b3480156104a857600080fd5b506103b16104b7366004613441565b610de3565b3480156104c857600080fd5b506103b16104d736600461373e565b610dfe565b3480156104e857600080fd5b506103c46104f7366004613783565b610f07565b34801561050857600080fd5b506011546103229062010000900460ff1681565b34801561052857600080fd5b50610379610537366004613783565b610fab565b34801561054857600080fd5b506103b1611036565b34801561055d57600080fd5b506103c461056c3660046133f3565b6110ce565b34801561057d57600080fd5b506103b1611168565b34801561059257600080fd5b50601554610379906001600160a01b031681565b3480156105b257600080fd5b506103b16105c13660046133f3565b6111ce565b3480156105d257600080fd5b506103c4600e5481565b3480156105e857600080fd5b50600a546001600160a01b0316610379565b6103b1610608366004613783565b611262565b34801561061957600080fd5b5061034c611533565b34801561062e57600080fd5b506103b161063d3660046134f9565b611542565b34801561064e57600080fd5b506103c4600d5481565b34801561066457600080fd5b506011546103229060ff1681565b34801561067e57600080fd5b5061069261068d366004613783565b61154d565b60405161032e9190613924565b3480156106ab57600080fd5b506103c4600281565b3480156106c057600080fd5b506103c4600f5481565b3480156106d657600080fd5b506103b16106e536600461347d565b6117b7565b3480156106f657600080fd5b506103b161070536600461373e565b611845565b34801561071657600080fd5b506103b16107253660046135c8565b61194e565b34801561073657600080fd5b5061034c610745366004613783565b611b85565b34801561075657600080fd5b506103c4610ed881565b34801561076c57600080fd5b506103b161077b36600461354d565b611c60565b34801561078c57600080fd5b506103b161079b36600461368f565b611d1d565b3480156107ac57600080fd5b506103b16107bb3660046136e4565b611da8565b3480156107cc57600080fd5b506103226107db36600461340e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081557600080fd5b506103c460145481565b34801561082b57600080fd5b506103b161083a3660046133f3565b611e29565b34801561084b57600080fd5b506103b161085a36600461373e565b611f0b565b6103b161086d366004613783565b612014565b600061087d826123e9565b92915050565b60606000805461089290613ac1565b80601f01602080910402602001604051908101604052809291908181526020018280546108be90613ac1565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109cb82610fab565b9050806001600160a01b0316836001600160a01b03161415610a555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161099b565b336001600160a01b0382161480610a715750610a7181336107db565b610ae35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099b565b610aed838361243f565b505050565b610afc33826124c5565b610b6e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099b565b610aed8383836125cd565b600a546001600160a01b03163314610bd35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60118054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000610c15836110ce565b8210610c895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161099b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60405173eadc66edb073fe7b2b358e51664883cb1aeb091d904790829082156108fc029083906000818181858888f19350505050158015610aed573d6000803e3d6000fd5b600a546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6011805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b610aed838383604051806020016040528060008152506117b7565b33610e0882610fab565b6001600160a01b031614610e5e5760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b0316610ee85760405162461bcd60e51b815260206004820152602a60248201527f536574206465636f726174696f6e20717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161099b565b60008181526016602090815260409091208351610aed92850190613204565b6000610f1260085490565b8210610f865760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161099b565b60088281548110610f9957610f99613bef565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061087d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161099b565b600a546001600160a01b031633146110905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60155460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156110ca573d6000803e3d6000fd5b5050565b60006001600160a01b03821661114c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161099b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6111cc60006127bd565b565b600a546001600160a01b031633146112285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b601580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b601154610100900460ff166112b95760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161099b565b60115462010000900460ff16156113125760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c20616374697665000000000000000000604482015260640161099b565b600081116113625760405162461bcd60e51b815260206004820152600b60248201527f4e6f207075726368617365000000000000000000000000000000000000000000604482015260640161099b565b60028111156113b35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000604482015260640161099b565b610fa06113c9826113c360085490565b90612827565b111561143d5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161099b565b806002141561149c5734600e54146114975760405162461bcd60e51b815260206004820152601c60248201527f45746865722076616c75652073656e74206e6f7420636f727265637400000000604482015260640161099b565b6114f8565b600d5434906114ab908361283a565b146114f85760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099b565b60005b818110156110ca576115213361151c60145461151660085490565b90612846565b612852565b8061152b81613b15565b9150506114fb565b60606001805461089290613ac1565b6110ca33838361286c565b611555613288565b6000828152600260205260409020546001600160a01b031661157657600080fd5b60115460ff16156117745760405180606001604052806016600085815260200190815260200160002080546115aa90613ac1565b80601f01602080910402602001604051908101604052809291908181526020018280546115d690613ac1565b80156116235780601f106115f857610100808354040283529160200191611623565b820191906000526020600020905b81548152906001019060200180831161160657829003601f168201915b5050505050815260200160176000858152602001908152602001600020805461164b90613ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461167790613ac1565b80156116c45780601f10611699576101008083540402835291602001916116c4565b820191906000526020600020905b8154815290600101906020018083116116a757829003601f168201915b505050505081526020016018600085815260200190815260200160002080546116ec90613ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461171890613ac1565b80156117655780601f1061173a57610100808354040283529160200191611765565b820191906000526020600020905b81548152906001019060200180831161174857829003601f168201915b50505050508152509050919050565b505060408051608081018252600060608201818152825282516020818101855282825280840191909152835190810184529081529181019190915290565b919050565b6117c133836124c5565b6118335760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099b565b61183f84848484612959565b50505050565b3361184f82610fab565b6001600160a01b0316146118a55760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b031661192f5760405162461bcd60e51b815260206004820152602560248201527f53657420766f69636520717565727920666f72206e6f6e6578697374656e742060448201527f746f6b656e000000000000000000000000000000000000000000000000000000606482015260840161099b565b60008181526018602090815260409091208351610aed92850190613204565b600a546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b80518251146119f95760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e677468000000000000000000604482015260640161099b565b60005b8251811015610aed57610ed8828281518110611a1a57611a1a613bef565b60200260200101511015611a965760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000606482015260840161099b565b610fa0828281518110611aab57611aab613bef565b602002602001015110611b265760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161099b565b611b62838281518110611b3b57611b3b613bef565b6020026020010151838381518110611b5557611b55613bef565b6020026020010151612852565b601454611b70906001612827565b60145580611b7d81613b15565b9150506119fc565b6000818152600260205260409020546060906001600160a01b0316611c125760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161099b565b60115460ff16611c4457600c604051602001611c2e91906138b7565b6040516020818303038152906040529050919050565b600b611c4f836129e2565b604051602001611c2e9291906138c3565b600a546001600160a01b03163314611cba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b60005b8281101561183f578160126000868685818110611cdc57611cdc613bef565b9050602002016020810190611cf191906133f3565b6001600160a01b0316815260208101919091526040016000205580611d1581613b15565b915050611cbd565b600a546001600160a01b03163314611d775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a546001600160a01b03163314611e025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b8151611e1590600c906020850190613204565b508051610aed90600b906020840190613204565b600a546001600160a01b03163314611e835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161099b565b6001600160a01b038116611eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161099b565b611f08816127bd565b50565b33611f1582610fab565b6001600160a01b031614611f6b5760405162461bcd60e51b815260206004820152601360248201527f4e6f742074686520746f6b656e206f776e657200000000000000000000000000604482015260640161099b565b6000818152600260205260409020546001600160a01b0316611ff55760405162461bcd60e51b815260206004820152603160248201527f536574207365636f6e64206465636f726174696f6e20717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000606482015260840161099b565b60008181526017602090815260409091208351610aed92850190613204565b601154610100900460ff1661206b5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f74206163746976650000000000000000000000000000604482015260640161099b565b60115462010000900460ff166120c35760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f7420616374697665000000000000000000604482015260640161099b565b600081116121135760405162461bcd60e51b815260206004820152600b60248201527f4e6f207075726368617365000000000000000000000000000000000000000000604482015260640161099b565b60028111156121645760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161099b565b610fa0612174826113c360085490565b11156121e85760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161099b565b336000908152601360205260409020546002906122059083612827565b11156122535760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161099b565b336000908152601260205260409020548111156122b25760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161099b565b806002141561231157346010541461230c5760405162461bcd60e51b815260206004820152601c60248201527f45746865722076616c75652073656e74206e6f7420636f727265637400000000604482015260640161099b565b61236d565b600f543490612320908361283a565b1461236d5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161099b565b60005b818110156110ca57336000908152601360205260408120805460019290612398908490613a15565b90915550503360009081526012602052604081208054600192906123bd908490613a7e565b925050819055506123d73361151c60145461151660085490565b806123e181613b15565b915050612370565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061087d575061087d82612b14565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061248c82610fab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661254f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161099b565b600061255a83610fab565b9050806001600160a01b0316846001600160a01b031614806125955750836001600160a01b031661258a84610915565b6001600160a01b0316145b806125c557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125e082610fab565b6001600160a01b03161461265c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161099b565b6001600160a01b0382166126d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161099b565b6126e2838383612bf7565b6126ed60008261243f565b6001600160a01b0383166000908152600360205260408120805460019290612716908490613a7e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612744908490613a15565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006128338284613a15565b9392505050565b60006128338284613a41565b60006128338284613a7e565b6110ca828260405180602001604052806000815250612c02565b816001600160a01b0316836001600160a01b031614156128ce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129648484846125cd565b61297084848484612c8b565b61183f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b606081612a2257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a4c5780612a3681613b15565b9150612a459050600a83613a2d565b9150612a26565b60008167ffffffffffffffff811115612a6757612a67613c1e565b6040519080825280601f01601f191660200182016040528015612a91576020820181803683370190505b5090505b84156125c557612aa6600183613a7e565b9150612ab3600a86613b4e565b612abe906030613a15565b60f81b818381518110612ad357612ad3613bef565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b0d600a86613a2d565b9450612a95565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612ba757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061087d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461087d565b610aed838383612e56565b612c0c8383612f0e565b612c196000848484612c8b565b610aed5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b60006001600160a01b0384163b15612e4b576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ce89033908990889088906004016138e8565b602060405180830381600087803b158015612d0257600080fd5b505af1925050508015612d50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d4d918101906136c7565b60015b612e00573d808015612d7e576040519150601f19603f3d011682016040523d82523d6000602084013e612d83565b606091505b508051612df85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161099b565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506125c5565b506001949350505050565b6001600160a01b038316612eb157612eac81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ed4565b816001600160a01b0316836001600160a01b031614612ed457612ed48382613074565b6001600160a01b038216612eeb57610aed81613111565b826001600160a01b0316826001600160a01b031614610aed57610aed82826131c0565b6001600160a01b038216612f645760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099b565b6000818152600260205260409020546001600160a01b031615612fc95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099b565b612fd560008383612bf7565b6001600160a01b0382166000908152600360205260408120805460019290612ffe908490613a15565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613081846110ce565b61308b9190613a7e565b6000838152600760205260409020549091508082146130de576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061312390600190613a7e565b6000838152600960205260408120546008805493945090928490811061314b5761314b613bef565b90600052602060002001549050806008838154811061316c5761316c613bef565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806131a4576131a4613bc0565b6001900381819060005260206000200160009055905550505050565b60006131cb836110ce565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461321090613ac1565b90600052602060002090601f0160209004810192826132325760008555613278565b82601f1061324b57805160ff1916838001178555613278565b82800160010185558215613278579182015b8281111561327857825182559160200191906001019061325d565b506132849291506132af565b5090565b60405180606001604052806003905b60608152602001906001900390816132975790505090565b5b8082111561328457600081556001016132b0565b600067ffffffffffffffff8311156132de576132de613c1e565b61330f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016139a2565b905082815283838301111561332357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146117b257600080fd5b600082601f83011261336257600080fd5b81356020613377613372836139f1565b6139a2565b80838252828201915082860187848660051b890101111561339757600080fd5b60005b858110156133b65781358452928401929084019060010161339a565b5090979650505050505050565b803580151581146117b257600080fd5b600082601f8301126133e457600080fd5b612833838335602085016132c4565b60006020828403121561340557600080fd5b6128338261333a565b6000806040838503121561342157600080fd5b61342a8361333a565b91506134386020840161333a565b90509250929050565b60008060006060848603121561345657600080fd5b61345f8461333a565b925061346d6020850161333a565b9150604084013590509250925092565b6000806000806080858703121561349357600080fd5b61349c8561333a565b93506134aa6020860161333a565b925060408501359150606085013567ffffffffffffffff8111156134cd57600080fd5b8501601f810187136134de57600080fd5b6134ed878235602084016132c4565b91505092959194509250565b6000806040838503121561350c57600080fd5b6135158361333a565b9150613438602084016133c3565b6000806040838503121561353657600080fd5b61353f8361333a565b946020939093013593505050565b60008060006040848603121561356257600080fd5b833567ffffffffffffffff8082111561357a57600080fd5b818601915086601f83011261358e57600080fd5b81358181111561359d57600080fd5b8760208260051b85010111156135b257600080fd5b6020928301989097509590910135949350505050565b600080604083850312156135db57600080fd5b823567ffffffffffffffff808211156135f357600080fd5b818501915085601f83011261360757600080fd5b81356020613617613372836139f1565b8083825282820191508286018a848660051b890101111561363757600080fd5b600096505b848710156136615761364d8161333a565b83526001969096019591830191830161363c565b509650508601359250508082111561367857600080fd5b5061368585828601613351565b9150509250929050565b6000602082840312156136a157600080fd5b612833826133c3565b6000602082840312156136bc57600080fd5b813561283381613c4d565b6000602082840312156136d957600080fd5b815161283381613c4d565b600080604083850312156136f757600080fd5b823567ffffffffffffffff8082111561370f57600080fd5b61371b868387016133d3565b9350602085013591508082111561373157600080fd5b50613685858286016133d3565b6000806040838503121561375157600080fd5b823567ffffffffffffffff81111561376857600080fd5b613774858286016133d3565b95602094909401359450505050565b60006020828403121561379557600080fd5b5035919050565b600081518084526137b4816020860160208601613a95565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061380057607f831692505b602080841082141561383b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561384f576001811461387e576138ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506138ab565b60008881526020902060005b868110156138a35781548b82015290850190830161388a565b505084890196505b50505050505092915050565b600061283382846137e6565b60006138cf82856137e6565b83516138df818360208801613a95565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261391a608083018461379c565b9695505050505050565b60208082526000906080830183820185845b6003811015613983577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087850301835261397184835161379c565b93509184019190840190600101613936565b50919695505050505050565b602081526000612833602083018461379c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e9576139e9613c1e565b604052919050565b600067ffffffffffffffff821115613a0b57613a0b613c1e565b5060051b60200190565b60008219821115613a2857613a28613b62565b500190565b600082613a3c57613a3c613b91565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7957613a79613b62565b500290565b600082821015613a9057613a90613b62565b500390565b60005b83811015613ab0578181015183820152602001613a98565b8381111561183f5750506000910152565b600181811c90821680613ad557607f821691505b60208210811415613b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4757613b47613b62565b5060010190565b600082613b5d57613b5d613b91565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611f0857600080fdfea26469706673582212206e786778c40e8be90ccc3f75ccc220cca4b7a3fe72c1161452a0f7b3856f142664736f6c63430008070033
Deployed Bytecode Sourcemap
200:9247:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8907:235;;;;;;;;;;-1:-1:-1;8907:235:13;;;;;:::i;:::-;;:::i;:::-;;;11066:14:14;;11059:22;11041:41;;11029:2;11014:18;8907:235:13;;;;;;;;2501:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4060:221::-;;;;;;;;;;-1:-1:-1;4060:221:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9566:55:14;;;9548:74;;9536:2;9521:18;4060:221:3;9402:226:14;3583:411:3;;;;;;;;;;-1:-1:-1;3583:411:3;;;;;:::i;:::-;;:::i;:::-;;1658:113:4;;;;;;;;;;-1:-1:-1;1746:10:4;:17;1658:113;;;25397:25:14;;;25385:2;25370:18;1658:113:4;25251:177:14;1080:28:13;;;;;;;;;;-1:-1:-1;1080:28:13;;;;;;;;;;;4810:339:3;;;;;;;;;;-1:-1:-1;4810:339:3;;;;;:::i;:::-;;:::i;982:45:13:-;;;;;;;;;;;;;;;;1851:137;;;;;;;;;;-1:-1:-1;1851:137:13;;;;;:::i;:::-;;:::i;1326:256:4:-;;;;;;;;;;-1:-1:-1;1326:256:4;;;;;:::i;:::-;;:::i;2800:253:13:-;;;;;;;;;;;;;:::i;2088:149::-;;;;;;;;;;-1:-1:-1;2088:149:13;;;;;:::i;:::-;;:::i;5220:185:3:-;;;;;;;;;;-1:-1:-1;5220:185:3;;;;;:::i;:::-;;:::i;6822:319:13:-;;;;;;;;;;-1:-1:-1;6822:319:13;;;;;:::i;:::-;;:::i;1848:233:4:-;;;;;;;;;;-1:-1:-1;1848:233:4;;;;;:::i;:::-;;:::i;1115:35:13:-;;;;;;;;;;-1:-1:-1;1115:35:13;;;;;;;;;;;2195:239:3;;;;;;;;;;-1:-1:-1;2195:239:3;;;;;:::i;:::-;;:::i;3155:181:13:-;;;;;;;;;;;;;:::i;1925:208:3:-;;;;;;;;;;-1:-1:-1;1925:208:3;;;;;:::i;:::-;;:::i;1714:103:10:-;;;;;;;;;;;;;:::i;1356:22:13:-;;;;;;;;;;-1:-1:-1;1356:22:13;;;;-1:-1:-1;;;;;1356:22:13;;;2564:136;;;;;;;;;;-1:-1:-1;2564:136:13;;;;;:::i;:::-;;:::i;853:47::-;;;;;;;;;;;;;;;;1063:87:10;;;;;;;;;;-1:-1:-1;1136:6:10;;-1:-1:-1;;;;;1136:6:10;1063:87;;3868:862:13;;;;;;:::i;:::-;;:::i;2670:104:3:-;;;;;;;;;;;;;:::i;4353:155::-;;;;;;;;;;-1:-1:-1;4353:155:3;;;;;:::i;:::-;;:::i;790:43:13:-;;;;;;;;;;;;;;;;1047:26;;;;;;;;;;-1:-1:-1;1047:26:13;;;;;;;;8552:347;;;;;;;;;;-1:-1:-1;8552:347:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1157:46::-;;;;;;;;;;;;1202:1;1157:46;;920:42;;;;;;;;;;;;;;;;5476:328:3;;;;;;;;;;-1:-1:-1;5476:328:3;;;;;:::i;:::-;;:::i;7579:304:13:-;;;;;;;;;;-1:-1:-1;7579:304:13;;;;;:::i;:::-;;:::i;6166:604::-;;;;;;;;;;-1:-1:-1;6166:604:13;;;;;:::i;:::-;;:::i;8033:441::-;;;;;;;;;;-1:-1:-1;8033:441:13;;;;;:::i;:::-;;:::i;692:45::-;;;;;;;;;;;;733:4;692:45;;3411:298;;;;;;;;;;-1:-1:-1;3411:298:13;;;;;:::i;:::-;;:::i;1618:133::-;;;;;;;;;;-1:-1:-1;1618:133:13;;;;;:::i;:::-;;:::i;2305:197::-;;;;;;;;;;-1:-1:-1;2305:197:13;;;;;:::i;:::-;;:::i;4579:164:3:-;;;;;;;;;;-1:-1:-1;4579:164:3;;;;;:::i;:::-;-1:-1:-1;;;;;4700:25:3;;;4676:4;4700:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4579:164;1321:28:13;;;;;;;;;;;;;;;;1972:201:10;;;;;;;;;;-1:-1:-1;1972:201:10;;;;;:::i;:::-;;:::i;7200:332:13:-;;;;;;;;;;-1:-1:-1;7200:332:13;;;;;:::i;:::-;;:::i;4892:1182::-;;;;;;:::i;:::-;;:::i;8907:235::-;9067:4;9097:37;9121:12;9097:23;:37::i;:::-;9090:44;8907:235;-1:-1:-1;;8907:235:13:o;2501:100:3:-;2555:13;2588:5;2581:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2501:100;:::o;4060:221::-;4136:7;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;4156:73;;;;-1:-1:-1;;;4156:73:3;;20008:2:14;4156:73:3;;;19990:21:14;20047:2;20027:18;;;20020:30;20086:34;20066:18;;;20059:62;20157:14;20137:18;;;20130:42;20189:19;;4156:73:3;;;;;;;;;-1:-1:-1;4249:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4249:24:3;;4060:221::o;3583:411::-;3664:13;3680:23;3695:7;3680:14;:23::i;:::-;3664:39;;3728:5;-1:-1:-1;;;;;3722:11:3;:2;-1:-1:-1;;;;;3722:11:3;;;3714:57;;;;-1:-1:-1;;;3714:57:3;;21616:2:14;3714:57:3;;;21598:21:14;21655:2;21635:18;;;21628:30;21694:34;21674:18;;;21667:62;21765:3;21745:18;;;21738:31;21786:19;;3714:57:3;21414:397:14;3714:57:3;736:10:1;-1:-1:-1;;;;;3806:21:3;;;;:62;;-1:-1:-1;3831:37:3;3848:5;736:10:1;4579:164:3;:::i;3831:37::-;3784:168;;;;-1:-1:-1;;;3784:168:3;;17625:2:14;3784:168:3;;;17607:21:14;17664:2;17644:18;;;17637:30;17703:34;17683:18;;;17676:62;17774:26;17754:18;;;17747:54;17818:19;;3784:168:3;17423:420:14;3784:168:3;3965:21;3974:2;3978:7;3965:8;:21::i;:::-;3653:341;3583:411;;:::o;4810:339::-;5005:41;736:10:1;5038:7:3;5005:18;:41::i;:::-;4997:103;;;;-1:-1:-1;;;4997:103:3;;22774:2:14;4997:103:3;;;22756:21:14;22813:2;22793:18;;;22786:30;22852:34;22832:18;;;22825:62;22923:19;22903:18;;;22896:47;22960:19;;4997:103:3;22572:413:14;4997:103:3;5113:28;5123:4;5129:2;5133:7;5113:9;:28::i;1851:137:13:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;1960:8:13::1;:20:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;1851:137::o;1326:256:4:-;1423:7;1459:23;1476:5;1459:16;:23::i;:::-;1451:5;:31;1443:87;;;;-1:-1:-1;;;1443:87:4;;11871:2:14;1443:87:4;;;11853:21:14;11910:2;11890:18;;;11883:30;11949:34;11929:18;;;11922:62;12020:13;12000:18;;;11993:41;12051:19;;1443:87:4;11669:407:14;1443:87:4;-1:-1:-1;;;;;;1548:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1326:256::o;2800:253:13:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;3006:39:13::1;::::0;2903:42:::1;::::0;2974:21:::1;::::0;2903:42;;3006:39;::::1;;;::::0;2974:21;;2880:20:::1;3006:39:::0;2880:20;3006:39;2974:21;2903:42;3006:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;2088:149:::0;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;2202:15:13::1;:27:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;2088:149::o;5220:185:3:-;5358:39;5375:4;5381:2;5385:7;5358:39;;;;;;;;;;;;:16;:39::i;6822:319:13:-;6978:10;6950:24;6965:8;6950:14;:24::i;:::-;-1:-1:-1;;;;;6950:38:13;;6942:70;;;;-1:-1:-1;;;6942:70:13;;16871:2:14;6942:70:13;;;16853:21:14;16910:2;16890:18;;;16883:30;16949:21;16929:18;;;16922:49;16988:18;;6942:70:13;16669:343:14;6942:70:13;7379:4:3;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;7023:72:13;;;;-1:-1:-1;;;7023:72:13;;13059:2:14;7023:72:13;;;13041:21:14;13098:2;13078:18;;;13071:30;13137:34;13117:18;;;13110:62;13208:12;13188:18;;;13181:40;13238:19;;7023:72:13;12857:406:14;7023:72:13;7106:20;;;;:10;:20;;;;;;;;:27;;;;;;;;:::i;1848:233:4:-;1923:7;1959:30;1746:10;:17;;1658:113;1959:30;1951:5;:38;1943:95;;;;-1:-1:-1;;;1943:95:4;;23192:2:14;1943:95:4;;;23174:21:14;23231:2;23211:18;;;23204:30;23270:34;23250:18;;;23243:62;23341:14;23321:18;;;23314:42;23373:19;;1943:95:4;22990:408:14;1943:95:4;2056:10;2067:5;2056:17;;;;;;;;:::i;:::-;;;;;;;;;2049:24;;1848:233;;;:::o;2195:239:3:-;2267:7;2303:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2303:16:3;2338:19;2330:73;;;;-1:-1:-1;;;2330:73:3;;18886:2:14;2330:73:3;;;18868:21:14;18925:2;18905:18;;;18898:30;18964:34;18944:18;;;18937:62;19035:11;19015:18;;;19008:39;19064:19;;2330:73:3;18684:405:14;3155:181:13;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;3302:7:13::1;::::0;3294:34:::1;::::0;3262:21:::1;::::0;-1:-1:-1;;;;;3302:7:13::1;::::0;3294:34;::::1;;;::::0;3262:21;;3244:15:::1;3294:34:::0;3244:15;3294:34;3262:21;3302:7;3294:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;3233:103;3155:181::o:0;1925:208:3:-;1997:7;-1:-1:-1;;;;;2025:19:3;;2017:74;;;;-1:-1:-1;;;2017:74:3;;18050:2:14;2017:74:3;;;18032:21:14;18089:2;18069:18;;;18062:30;18128:34;18108:18;;;18101:62;18199:12;18179:18;;;18172:40;18229:19;;2017:74:3;17848:406:14;2017:74:3;-1:-1:-1;;;;;;2109:16:3;;;;;:9;:16;;;;;;;1925:208::o;1714:103:10:-;1136:6;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;2564:136:13:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;2674:7:13::1;:18:::0;;;::::1;-1:-1:-1::0;;;;;2674:18:13;;;::::1;::::0;;;::::1;::::0;;2564:136::o;3868:862::-;3983:8;;;;;;;3975:43;;;;-1:-1:-1;;;3975:43:13;;19657:2:14;3975:43:13;;;19639:21:14;19696:2;19676:18;;;19669:30;19735:24;19715:18;;;19708:52;19777:18;;3975:43:13;19455:346:14;3975:43:13;4038:15;;;;;;;4037:16;4029:52;;;;-1:-1:-1;;;4029:52:13;;23957:2:14;4029:52:13;;;23939:21:14;23996:2;23976:18;;;23969:30;24035:25;24015:18;;;24008:53;24078:18;;4029:52:13;23755:347:14;4029:52:13;4115:1;4100:12;:16;4092:40;;;;-1:-1:-1;;;4092:40:13;;22018:2:14;4092:40:13;;;22000:21:14;22057:2;22037:18;;;22030:30;22096:13;22076:18;;;22069:41;22127:18;;4092:40:13;21816:335:14;4092:40:13;684:1;4151:12;:32;;4143:68;;;;-1:-1:-1;;;4143:68:13;;14640:2:14;4143:68:13;;;14622:21:14;14679:2;14659:18;;;14652:30;14718:25;14698:18;;;14691:53;14761:18;;4143:68:13;14438:347:14;4143:68:13;779:4;4230:31;4248:12;4230:13;1746:10:4;:17;;1658:113;4230:13:13;:17;;:31::i;:::-;:42;;4222:102;;;;-1:-1:-1;;;4222:102:13;;22358:2:14;4222:102:13;;;22340:21:14;22397:2;22377:18;;;22370:30;22436:34;22416:18;;;22409:62;22507:17;22487:18;;;22480:45;22542:19;;4222:102:13;22156:411:14;4222:102:13;4338:12;4354:1;4338:17;4335:237;;;4394:9;4379:11;;:24;4371:65;;;;-1:-1:-1;;;4371:65:13;;24735:2:14;4371:65:13;;;24717:21:14;24774:2;24754:18;;;24747:30;24813;24793:18;;;24786:58;24861:18;;4371:65:13;24533:352:14;4371:65:13;4335:237;;;4485:8;;4515:9;;4485:26;;4498:12;4485;:26::i;:::-;:39;4477:83;;;;-1:-1:-1;;;4477:83:13;;16098:2:14;4477:83:13;;;16080:21:14;16137:2;16117:18;;;16110:30;16176:33;16156:18;;;16149:61;16227:18;;4477:83:13;15896:355:14;4477:83:13;4606:6;4602:121;4622:12;4618:1;:16;4602:121;;;4656:55;4666:10;4678:32;4696:13;;4678;1746:10:4;:17;;1658:113;4678:13:13;:17;;:32::i;:::-;4656:9;:55::i;:::-;4636:3;;;;:::i;:::-;;;;4602:121;;2670:104:3;2726:13;2759:7;2752:14;;;;;:::i;4353:155::-;4448:52;736:10:1;4481:8:3;4491;4448:18;:52::i;8552:347:13:-;8659:16;;:::i;:::-;7379:4:3;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;8694:26:13;;;;;;8735:6;;;;8731:161;;;8758:71;;;;;;;;8766:10;:20;8777:8;8766:20;;;;;;;;;;;8758:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:13;:23;8802:8;8788:23;;;;;;;;;;;8758:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8813:5;:15;8819:8;8813:15;;;;;;;;;;;8758:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8552:347;;;:::o;8731:161::-;-1:-1:-1;;8862:17:13;;;;;;;;-1:-1:-1;8862:17:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8552:347::o;8731:161::-;8552:347;;;:::o;5476:328:3:-;5651:41;736:10:1;5684:7:3;5651:18;:41::i;:::-;5643:103;;;;-1:-1:-1;;;5643:103:3;;22774:2:14;5643:103:3;;;22756:21:14;22813:2;22793:18;;;22786:30;22852:34;22832:18;;;22825:62;22923:19;22903:18;;;22896:47;22960:19;;5643:103:3;22572:413:14;5643:103:3;5757:39;5771:4;5777:2;5781:7;5790:5;5757:13;:39::i;:::-;5476:328;;;;:::o;7579:304:13:-;7730:10;7702:24;7717:8;7702:14;:24::i;:::-;-1:-1:-1;;;;;7702:38:13;;7694:70;;;;-1:-1:-1;;;7694:70:13;;16871:2:14;7694:70:13;;;16853:21:14;16910:2;16890:18;;;16883:30;16949:21;16929:18;;;16922:49;16988:18;;7694:70:13;16669:343:14;7694:70:13;7379:4:3;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;7775:67:13;;;;-1:-1:-1;;;7775:67:13;;17219:2:14;7775:67:13;;;17201:21:14;17258:2;17238:18;;;17231:30;17297:34;17277:18;;;17270:62;17368:7;17348:18;;;17341:35;17393:19;;7775:67:13;17017:401:14;7775:67:13;7853:15;;;;:5;:15;;;;;;;;:22;;;;;;;;:::i;6166:604::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;6343:8:13::1;:15;6329:3;:10;:29;6321:65;;;::::0;-1:-1:-1;;;6321:65:13;;23605:2:14;6321:65:13::1;::::0;::::1;23587:21:14::0;23644:2;23624:18;;;23617:30;23683:25;23663:18;;;23656:53;23726:18;;6321:65:13::1;23403:347:14::0;6321:65:13::1;6401:9;6397:366;6420:3;:10;6416:1;:14;6397:366;;;733:4;6459:8;6468:1;6459:11;;;;;;;;:::i;:::-;;;;;;;:29;;6451:99;;;::::0;-1:-1:-1;;;6451:99:13;;24309:2:14;6451:99:13::1;::::0;::::1;24291:21:14::0;24348:2;24328:18;;;24321:30;24387:34;24367:18;;;24360:62;24458:27;24438:18;;;24431:55;24503:19;;6451:99:13::1;24107:421:14::0;6451:99:13::1;779:4;6573:8;6582:1;6573:11;;;;;;;;:::i;:::-;;;;;;;:21;6565:90;;;::::0;-1:-1:-1;;;6565:90:13;;18461:2:14;6565:90:13::1;::::0;::::1;18443:21:14::0;18500:2;18480:18;;;18473:30;18539:34;18519:18;;;18512:62;18610:26;18590:18;;;18583:54;18654:19;;6565:90:13::1;18259:420:14::0;6565:90:13::1;6670:30;6680:3;6684:1;6680:6;;;;;;;;:::i;:::-;;;;;;;6688:8;6697:1;6688:11;;;;;;;;:::i;:::-;;;;;;;6670:9;:30::i;:::-;6731:13;::::0;:20:::1;::::0;6749:1:::1;6731:17;:20::i;:::-;6715:13;:36:::0;6432:3;::::1;::::0;::::1;:::i;:::-;;;;6397:366;;8033:441:::0;7379:4:3;7403:16;;;:7;:16;;;;;;8172:13:13;;-1:-1:-1;;;;;7403:16:3;8204:77:13;;;;-1:-1:-1;;;8204:77:13;;21200:2:14;8204:77:13;;;21182:21:14;21239:2;21219:18;;;21212:30;21278:34;21258:18;;;21251:62;21349:17;21329:18;;;21322:45;21384:19;;8204:77:13;20998:411:14;8204:77:13;8297:6;;;;8292:175;;8351:8;8334:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;8320:41;;8033:441;;;:::o;8292:175::-;8425:7;8434:19;:8;:17;:19::i;:::-;8408:46;;;;;;;;;:::i;3411:298::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;3588:9:13::1;3583:119;3603:21:::0;;::::1;3583:119;;;3673:17;3646:9;:24;3656:10;;3667:1;3656:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3646:24:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3646:24:13;:44;3626:3;::::1;::::0;::::1;:::i;:::-;;;;3583:119;;1618:133:::0;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;1725:6:13::1;:18:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;1618:133::o;2305:197::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;2449:20:13;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2480:14:13;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;1972:201:10:-:0;1136:6;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;20421:2:14;1275:68:10;;;20403:21:14;;;20440:18;;;20433:30;20499:34;20479:18;;;20472:62;20551:18;;1275:68:10;20219:356:14;1275:68:10;-1:-1:-1;;;;;2061:22:10;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:10;;13470:2:14;2053:73:10::1;::::0;::::1;13452:21:14::0;13509:2;13489:18;;;13482:30;13548:34;13528:18;;;13521:62;13619:8;13599:18;;;13592:36;13645:19;;2053:73:10::1;13268:402:14::0;2053:73:10::1;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;7200:332:13:-;7359:10;7331:24;7346:8;7331:14;:24::i;:::-;-1:-1:-1;;;;;7331:38:13;;7323:70;;;;-1:-1:-1;;;7323:70:13;;16871:2:14;7323:70:13;;;16853:21:14;16910:2;16890:18;;;16883:30;16949:21;16929:18;;;16922:49;16988:18;;7323:70:13;16669:343:14;7323:70:13;7379:4:3;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;7404:79:13;;;;-1:-1:-1;;;7404:79:13;;20782:2:14;7404:79:13;;;20764:21:14;20821:2;20801:18;;;20794:30;20860:34;20840:18;;;20833:62;20931:19;20911:18;;;20904:47;20968:19;;7404:79:13;20580:413:14;7404:79:13;7494:23;;;;:13;:23;;;;;;;;:30;;;;;;;;:::i;4892:1182::-;5019:8;;;;;;;5011:39;;;;-1:-1:-1;;;5011:39:13;;15751:2:14;5011:39:13;;;15733:21:14;15790:2;15770:18;;;15763:30;15829:20;15809:18;;;15802:48;15867:18;;5011:39:13;15549:342:14;5011:39:13;5069:15;;;;;;;5061:51;;;;-1:-1:-1;;;5061:51:13;;11519:2:14;5061:51:13;;;11501:21:14;11558:2;11538:18;;;11531:30;11597:25;11577:18;;;11570:53;11640:18;;5061:51:13;11317:347:14;5061:51:13;5146:1;5131:12;:16;5123:40;;;;-1:-1:-1;;;5123:40:13;;22018:2:14;5123:40:13;;;22000:21:14;22057:2;22037:18;;;22030:30;22096:13;22076:18;;;22069:41;22127:18;;5123:40:13;21816:335:14;5123:40:13;1202:1;5182:12;:34;;5174:79;;;;-1:-1:-1;;;5174:79:13;;25092:2:14;5174:79:13;;;25074:21:14;;;25111:18;;;25104:30;25170:34;25150:18;;;25143:62;25222:18;;5174:79:13;24890:356:14;5174:79:13;779:4;5272:31;5290:12;5272:13;1746:10:4;:17;;1658:113;5272:31:13;:42;;5264:102;;;;-1:-1:-1;;;5264:102:13;;22358:2:14;5264:102:13;;;22340:21:14;22397:2;22377:18;;;22370:30;22436:34;22416:18;;;22409:62;22507:17;22487:18;;;22480:45;22542:19;;5264:102:13;22156:411:14;5264:102:13;5402:10;5385:28;;;;:16;:28;;;;;;1202:1;;5385:46;;5418:12;5385:32;:46::i;:::-;:68;;5377:109;;;;-1:-1:-1;;;5377:109:13;;12702:2:14;5377:109:13;;;12684:21:14;12741:2;12721:18;;;12714:30;12780;12760:18;;;12753:58;12828:18;;5377:109:13;12500:352:14;5377:109:13;5531:10;5521:21;;;;:9;:21;;;;;;5505:37;;;5497:78;;;;-1:-1:-1;;;5497:78:13;;12702:2:14;5497:78:13;;;12684:21:14;12741:2;12721:18;;;12714:30;12780;12760:18;;;12753:58;12828:18;;5497:78:13;12500:352:14;5497:78:13;5589:12;5605:1;5589:17;5586:235;;;5644:9;5630:10;;:23;5622:64;;;;-1:-1:-1;;;5622:64:13;;24735:2:14;5622:64:13;;;24717:21:14;24774:2;24754:18;;;24747:30;24813;24793:18;;;24786:58;24861:18;;5622:64:13;24533:352:14;5622:64:13;5586:235;;;5735:7;;5764:9;;5735:25;;5747:12;5735:11;:25::i;:::-;:38;5727:82;;;;-1:-1:-1;;;5727:82:13;;16098:2:14;5727:82:13;;;16080:21:14;16137:2;16117:18;;;16110:30;16176:33;16156:18;;;16149:61;16227:18;;5727:82:13;15896:355:14;5727:82:13;5836:9;5831:226;5855:12;5851:1;:16;5831:226;;;5910:10;5893:28;;;;:16;:28;;;;;:33;;5925:1;;5893:28;:33;;5925:1;;5893:33;:::i;:::-;;;;-1:-1:-1;;5955:10:13;5945:21;;;;:9;:21;;;;;:26;;5970:1;;5945:21;:26;;5970:1;;5945:26;:::i;:::-;;;;;;;;5990:55;6000:10;6012:32;6030:13;;6012;1746:10:4;:17;;1658:113;5990:55:13;5869:3;;;;:::i;:::-;;;;5831:226;;1018:224:4;1120:4;1144:50;;;1159:35;1144:50;;:90;;;1198:36;1222:11;1198:23;:36::i;11460:174:3:-;11535:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;11535:29:3;;;;;;;;:24;;11589:23;11535:24;11589:14;:23::i;:::-;-1:-1:-1;;;;;11580:46:3;;;;;;;;;;;11460:174;;:::o;7608:348::-;7701:4;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;7718:73;;;;-1:-1:-1;;;7718:73:3;;16458:2:14;7718:73:3;;;16440:21:14;16497:2;16477:18;;;16470:30;16536:34;16516:18;;;16509:62;16607:14;16587:18;;;16580:42;16639:19;;7718:73:3;16256:408:14;7718:73:3;7802:13;7818:23;7833:7;7818:14;:23::i;:::-;7802:39;;7871:5;-1:-1:-1;;;;;7860:16:3;:7;-1:-1:-1;;;;;7860:16:3;;:51;;;;7904:7;-1:-1:-1;;;;;7880:31:3;:20;7892:7;7880:11;:20::i;:::-;-1:-1:-1;;;;;7880:31:3;;7860:51;:87;;;-1:-1:-1;;;;;;4700:25:3;;;4676:4;4700:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7915:32;7852:96;7608:348;-1:-1:-1;;;;7608:348:3:o;10717:625::-;10876:4;-1:-1:-1;;;;;10849:31:3;:23;10864:7;10849:14;:23::i;:::-;-1:-1:-1;;;;;10849:31:3;;10841:81;;;;-1:-1:-1;;;10841:81:3;;13877:2:14;10841:81:3;;;13859:21:14;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;14026:7;14006:18;;;13999:35;14051:19;;10841:81:3;13675:401:14;10841:81:3;-1:-1:-1;;;;;10941:16:3;;10933:65;;;;-1:-1:-1;;;10933:65:3;;14992:2:14;10933:65:3;;;14974:21:14;15031:2;15011:18;;;15004:30;15070:34;15050:18;;;15043:62;15141:6;15121:18;;;15114:34;15165:19;;10933:65:3;14790:400:14;10933:65:3;11011:39;11032:4;11038:2;11042:7;11011:20;:39::i;:::-;11115:29;11132:1;11136:7;11115:8;:29::i;:::-;-1:-1:-1;;;;;11157:15:3;;;;;;:9;:15;;;;;:20;;11176:1;;11157:15;:20;;11176:1;;11157:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11188:13:3;;;;;;:9;:13;;;;;:18;;11205:1;;11188:13;:18;;11205:1;;11188:18;:::i;:::-;;;;-1:-1:-1;;11217:16:3;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;11217:21:3;;;;;;;;;11256:27;;11217:16;;11256:27;;;;;;;3653:341;3583:411;;:::o;2333:191:10:-;2426:6;;;-1:-1:-1;;;;;2443:17:10;;;;;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;2833:98:11:-;2891:7;2918:5;2922:1;2918;:5;:::i;:::-;2911:12;2833:98;-1:-1:-1;;;2833:98:11:o;3571:::-;3629:7;3656:5;3660:1;3656;:5;:::i;3214:98::-;3272:7;3299:5;3303:1;3299;:5;:::i;8298:110:3:-;8374:26;8384:2;8388:7;8374:26;;;;;;;;;;;;:9;:26::i;11776:315::-;11931:8;-1:-1:-1;;;;;11922:17:3;:5;-1:-1:-1;;;;;11922:17:3;;;11914:55;;;;-1:-1:-1;;;11914:55:3;;15397:2:14;11914:55:3;;;15379:21:14;15436:2;15416:18;;;15409:30;15475:27;15455:18;;;15448:55;15520:18;;11914:55:3;15195:349:14;11914:55:3;-1:-1:-1;;;;;11980:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;12042:41;;11041::14;;;12042::3;;11014:18:14;12042:41:3;;;;;;;11776:315;;;:::o;6686:::-;6843:28;6853:4;6859:2;6863:7;6843:9;:28::i;:::-;6890:48;6913:4;6919:2;6923:7;6932:5;6890:22;:48::i;:::-;6882:111;;;;-1:-1:-1;;;6882:111:3;;12283:2:14;6882:111:3;;;12265:21:14;12322:2;12302:18;;;12295:30;12361:34;12341:18;;;12334:62;12432:20;12412:18;;;12405:48;12470:19;;6882:111:3;12081:414:14;342:723:12;398:13;619:10;615:53;;-1:-1:-1;;646:10:12;;;;;;;;;;;;;;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:12;;-1:-1:-1;798:2:12;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:12;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:12;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:12;1012:2;1003:11;;:::i;:::-;;;872:154;;1556:305:3;1658:4;1695:40;;;1710:25;1695:40;;:105;;-1:-1:-1;1752:48:3;;;1767:33;1752:48;1695:105;:158;;;-1:-1:-1;978:25:2;963:40;;;;1817:36:3;854:157:2;9195:249:13;9388:48;9415:5;9422:3;9427:8;9388:26;:48::i;8635:321:3:-;8765:18;8771:2;8775:7;8765:5;:18::i;:::-;8816:54;8847:1;8851:2;8855:7;8864:5;8816:22;:54::i;:::-;8794:154;;;;-1:-1:-1;;;8794:154:3;;12283:2:14;8794:154:3;;;12265:21:14;12322:2;12302:18;;;12295:30;12361:34;12341:18;;;12334:62;12432:20;12412:18;;;12405:48;12470:19;;8794:154:3;12081:414:14;12656:799:3;12811:4;-1:-1:-1;;;;;12832:13:3;;1505:19:0;:23;12828:620:3;;12868:72;;;;;-1:-1:-1;;;;;12868:36:3;;;;;:72;;736:10:1;;12919:4:3;;12925:7;;12934:5;;12868:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12868:72:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12864:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13110:13:3;;13106:272;;13153:60;;-1:-1:-1;;;13153:60:3;;12283:2:14;13153:60:3;;;12265:21:14;12322:2;12302:18;;;12295:30;12361:34;12341:18;;;12334:62;12432:20;12412:18;;;12405:48;12470:19;;13153:60:3;12081:414:14;13106:272:3;13328:6;13322:13;13313:6;13309:2;13305:15;13298:38;12864:529;12991:51;;13001:41;12991:51;;-1:-1:-1;12984:58:3;;12828:620;-1:-1:-1;13432:4:3;12656:799;;;;;;:::o;2694:589:4:-;-1:-1:-1;;;;;2900:18:4;;2896:187;;2935:40;2967:7;4110:10;:17;;4083:24;;;;:15;:24;;;;;:44;;;4138:24;;;;;;;;;;;;4006:164;2935:40;2896:187;;;3005:2;-1:-1:-1;;;;;2997:10:4;:4;-1:-1:-1;;;;;2997:10:4;;2993:90;;3024:47;3057:4;3063:7;3024:32;:47::i;:::-;-1:-1:-1;;;;;3097:16:4;;3093:183;;3130:45;3167:7;3130:36;:45::i;3093:183::-;3203:4;-1:-1:-1;;;;;3197:10:4;:2;-1:-1:-1;;;;;3197:10:4;;3193:83;;3224:40;3252:2;3256:7;3224:27;:40::i;9292:439:3:-;-1:-1:-1;;;;;9372:16:3;;9364:61;;;;-1:-1:-1;;;9364:61:3;;19296:2:14;9364:61:3;;;19278:21:14;;;19315:18;;;19308:30;19374:34;19354:18;;;19347:62;19426:18;;9364:61:3;19094:356:14;9364:61:3;7379:4;7403:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7403:16:3;:30;9436:58;;;;-1:-1:-1;;;9436:58:3;;14283:2:14;9436:58:3;;;14265:21:14;14322:2;14302:18;;;14295:30;14361;14341:18;;;14334:58;14409:18;;9436:58:3;14081:352:14;9436:58:3;9507:45;9536:1;9540:2;9544:7;9507:20;:45::i;:::-;-1:-1:-1;;;;;9565:13:3;;;;;;:9;:13;;;;;:18;;9582:1;;9565:13;:18;;9582:1;;9565:18;:::i;:::-;;;;-1:-1:-1;;9594:16:3;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;9594:21:3;;;;;;;;9633:33;;9594:16;;;9633:33;;9594:16;;9633:33;3294:34:13::1;3233:103;3155:181::o:0;4797:988:4:-;5063:22;5113:1;5088:22;5105:4;5088:16;:22::i;:::-;:26;;;;:::i;:::-;5125:18;5146:26;;;:17;:26;;;;;;5063:51;;-1:-1:-1;5279:28:4;;;5275:328;;-1:-1:-1;;;;;5346:18:4;;5324:19;5346:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5397:30;;;;;;:44;;;5514:30;;:17;:30;;;;;:43;;;5275:328;-1:-1:-1;5699:26:4;;;;:17;:26;;;;;;;;5692:33;;;-1:-1:-1;;;;;5743:18:4;;;;;:12;:18;;;;;:34;;;;;;;5736:41;4797:988::o;6080:1079::-;6358:10;:17;6333:22;;6358:21;;6378:1;;6358:21;:::i;:::-;6390:18;6411:24;;;:15;:24;;;;;;6784:10;:26;;6333:46;;-1:-1:-1;6411:24:4;;6333:46;;6784:26;;;;;;:::i;:::-;;;;;;;;;6762:48;;6848:11;6823:10;6834;6823:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6928:28;;;:15;:28;;;;;;;:41;;;7100:24;;;;;7093:31;7135:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6151:1008;;;6080:1079;:::o;3584:221::-;3669:14;3686:20;3703:2;3686:16;:20::i;:::-;-1:-1:-1;;;;;3717:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3762:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3584:221:4:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:465:14;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:196::-;552:20;;-1:-1:-1;;;;;601:54:14;;591:65;;581:93;;670:1;667;660:12;685:673;739:5;792:3;785:4;777:6;773:17;769:27;759:55;;810:1;807;800:12;759:55;846:6;833:20;872:4;896:60;912:43;952:2;912:43;:::i;:::-;896:60;:::i;:::-;978:3;1002:2;997:3;990:15;1030:2;1025:3;1021:12;1014:19;;1065:2;1057:6;1053:15;1117:3;1112:2;1106;1103:1;1099:10;1091:6;1087:23;1083:32;1080:41;1077:61;;;1134:1;1131;1124:12;1077:61;1156:1;1166:163;1180:2;1177:1;1174:9;1166:163;;;1237:17;;1225:30;;1275:12;;;;1307;;;;1198:1;1191:9;1166:163;;;-1:-1:-1;1347:5:14;;685:673;-1:-1:-1;;;;;;;685:673:14:o;1363:160::-;1428:20;;1484:13;;1477:21;1467:32;;1457:60;;1513:1;1510;1503:12;1528:221;1571:5;1624:3;1617:4;1609:6;1605:17;1601:27;1591:55;;1642:1;1639;1632:12;1591:55;1664:79;1739:3;1730:6;1717:20;1710:4;1702:6;1698:17;1664:79;:::i;1754:186::-;1813:6;1866:2;1854:9;1845:7;1841:23;1837:32;1834:52;;;1882:1;1879;1872:12;1834:52;1905:29;1924:9;1905:29;:::i;1945:260::-;2013:6;2021;2074:2;2062:9;2053:7;2049:23;2045:32;2042:52;;;2090:1;2087;2080:12;2042:52;2113:29;2132:9;2113:29;:::i;:::-;2103:39;;2161:38;2195:2;2184:9;2180:18;2161:38;:::i;:::-;2151:48;;1945:260;;;;;:::o;2210:328::-;2287:6;2295;2303;2356:2;2344:9;2335:7;2331:23;2327:32;2324:52;;;2372:1;2369;2362:12;2324:52;2395:29;2414:9;2395:29;:::i;:::-;2385:39;;2443:38;2477:2;2466:9;2462:18;2443:38;:::i;:::-;2433:48;;2528:2;2517:9;2513:18;2500:32;2490:42;;2210:328;;;;;:::o;2543:666::-;2638:6;2646;2654;2662;2715:3;2703:9;2694:7;2690:23;2686:33;2683:53;;;2732:1;2729;2722:12;2683:53;2755:29;2774:9;2755:29;:::i;:::-;2745:39;;2803:38;2837:2;2826:9;2822:18;2803:38;:::i;:::-;2793:48;;2888:2;2877:9;2873:18;2860:32;2850:42;;2943:2;2932:9;2928:18;2915:32;2970:18;2962:6;2959:30;2956:50;;;3002:1;2999;2992:12;2956:50;3025:22;;3078:4;3070:13;;3066:27;-1:-1:-1;3056:55:14;;3107:1;3104;3097:12;3056:55;3130:73;3195:7;3190:2;3177:16;3172:2;3168;3164:11;3130:73;:::i;:::-;3120:83;;;2543:666;;;;;;;:::o;3214:254::-;3279:6;3287;3340:2;3328:9;3319:7;3315:23;3311:32;3308:52;;;3356:1;3353;3346:12;3308:52;3379:29;3398:9;3379:29;:::i;:::-;3369:39;;3427:35;3458:2;3447:9;3443:18;3427:35;:::i;3473:254::-;3541:6;3549;3602:2;3590:9;3581:7;3577:23;3573:32;3570:52;;;3618:1;3615;3608:12;3570:52;3641:29;3660:9;3641:29;:::i;:::-;3631:39;3717:2;3702:18;;;;3689:32;;-1:-1:-1;;;3473:254:14:o;3732:689::-;3827:6;3835;3843;3896:2;3884:9;3875:7;3871:23;3867:32;3864:52;;;3912:1;3909;3902:12;3864:52;3952:9;3939:23;3981:18;4022:2;4014:6;4011:14;4008:34;;;4038:1;4035;4028:12;4008:34;4076:6;4065:9;4061:22;4051:32;;4121:7;4114:4;4110:2;4106:13;4102:27;4092:55;;4143:1;4140;4133:12;4092:55;4183:2;4170:16;4209:2;4201:6;4198:14;4195:34;;;4225:1;4222;4215:12;4195:34;4280:7;4273:4;4263:6;4260:1;4256:14;4252:2;4248:23;4244:34;4241:47;4238:67;;;4301:1;4298;4291:12;4238:67;4332:4;4324:13;;;;4356:6;;-1:-1:-1;4394:20:14;;;;4381:34;;3732:689;-1:-1:-1;;;;3732:689:14:o;4426:1157::-;4544:6;4552;4605:2;4593:9;4584:7;4580:23;4576:32;4573:52;;;4621:1;4618;4611:12;4573:52;4661:9;4648:23;4690:18;4731:2;4723:6;4720:14;4717:34;;;4747:1;4744;4737:12;4717:34;4785:6;4774:9;4770:22;4760:32;;4830:7;4823:4;4819:2;4815:13;4811:27;4801:55;;4852:1;4849;4842:12;4801:55;4888:2;4875:16;4910:4;4934:60;4950:43;4990:2;4950:43;:::i;4934:60::-;5016:3;5040:2;5035:3;5028:15;5068:2;5063:3;5059:12;5052:19;;5099:2;5095;5091:11;5147:7;5142:2;5136;5133:1;5129:10;5125:2;5121:19;5117:28;5114:41;5111:61;;;5168:1;5165;5158:12;5111:61;5190:1;5181:10;;5200:169;5214:2;5211:1;5208:9;5200:169;;;5271:23;5290:3;5271:23;:::i;:::-;5259:36;;5232:1;5225:9;;;;;5315:12;;;;5347;;5200:169;;;-1:-1:-1;5388:5:14;-1:-1:-1;;5431:18:14;;5418:32;;-1:-1:-1;;5462:16:14;;;5459:36;;;5491:1;5488;5481:12;5459:36;;5514:63;5569:7;5558:8;5547:9;5543:24;5514:63;:::i;:::-;5504:73;;;4426:1157;;;;;:::o;5588:180::-;5644:6;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5736:26;5752:9;5736:26;:::i;5773:245::-;5831:6;5884:2;5872:9;5863:7;5859:23;5855:32;5852:52;;;5900:1;5897;5890:12;5852:52;5939:9;5926:23;5958:30;5982:5;5958:30;:::i;6023:249::-;6092:6;6145:2;6133:9;6124:7;6120:23;6116:32;6113:52;;;6161:1;6158;6151:12;6113:52;6193:9;6187:16;6212:30;6236:5;6212:30;:::i;6277:543::-;6365:6;6373;6426:2;6414:9;6405:7;6401:23;6397:32;6394:52;;;6442:1;6439;6432:12;6394:52;6482:9;6469:23;6511:18;6552:2;6544:6;6541:14;6538:34;;;6568:1;6565;6558:12;6538:34;6591:50;6633:7;6624:6;6613:9;6609:22;6591:50;:::i;:::-;6581:60;;6694:2;6683:9;6679:18;6666:32;6650:48;;6723:2;6713:8;6710:16;6707:36;;;6739:1;6736;6729:12;6707:36;;6762:52;6806:7;6795:8;6784:9;6780:24;6762:52;:::i;6825:390::-;6903:6;6911;6964:2;6952:9;6943:7;6939:23;6935:32;6932:52;;;6980:1;6977;6970:12;6932:52;7020:9;7007:23;7053:18;7045:6;7042:30;7039:50;;;7085:1;7082;7075:12;7039:50;7108;7150:7;7141:6;7130:9;7126:22;7108:50;:::i;:::-;7098:60;7205:2;7190:18;;;;7177:32;;-1:-1:-1;;;;6825:390:14:o;7220:180::-;7279:6;7332:2;7320:9;7311:7;7307:23;7303:32;7300:52;;;7348:1;7345;7338:12;7300:52;-1:-1:-1;7371:23:14;;7220:180;-1:-1:-1;7220:180:14:o;7405:316::-;7446:3;7484:5;7478:12;7511:6;7506:3;7499:19;7527:63;7583:6;7576:4;7571:3;7567:14;7560:4;7553:5;7549:16;7527:63;:::i;:::-;7635:2;7623:15;7640:66;7619:88;7610:98;;;;7710:4;7606:109;;7405:316;-1:-1:-1;;7405:316:14:o;7726:1088::-;7811:12;;7776:3;;7866:1;7886:18;;;;7939;;;;7966:61;;8020:4;8012:6;8008:17;7998:27;;7966:61;8046:2;8094;8086:6;8083:14;8063:18;8060:38;8057:218;;;8131:77;8128:1;8121:88;8232:4;8229:1;8222:15;8260:4;8257:1;8250:15;8057:218;8291:18;8318:162;;;;8494:1;8489:319;;;;8284:524;;8318:162;8366:66;8355:9;8351:82;8346:3;8339:95;8463:6;8458:3;8454:16;8447:23;;8318:162;;8489:319;26033:1;26026:14;;;26070:4;26057:18;;8583:1;8597:165;8611:6;8608:1;8605:13;8597:165;;;8689:14;;8676:11;;;8669:35;8732:16;;;;8626:10;;8597:165;;;8601:3;;8791:6;8786:3;8782:16;8775:23;;8284:524;;;;;;;7726:1088;;;;:::o;8819:197::-;8947:3;8972:38;9006:3;8998:6;8972:38;:::i;9021:376::-;9197:3;9225:38;9259:3;9251:6;9225:38;:::i;:::-;9292:6;9286:13;9308:52;9353:6;9349:2;9342:4;9334:6;9330:17;9308:52;:::i;:::-;9376:15;;9021:376;-1:-1:-1;;;;9021:376:14:o;9633:511::-;9827:4;-1:-1:-1;;;;;9937:2:14;9929:6;9925:15;9914:9;9907:34;9989:2;9981:6;9977:15;9972:2;9961:9;9957:18;9950:43;;10029:6;10024:2;10013:9;10009:18;10002:34;10072:3;10067:2;10056:9;10052:18;10045:31;10093:45;10133:3;10122:9;10118:19;10110:6;10093:45;:::i;:::-;10085:53;9633:511;-1:-1:-1;;;;;;9633:511:14:o;10149:747::-;10336:2;10388:21;;;10307:4;;10495:3;10480:19;;10361:18;;;10522:6;10307:4;10556:311;10570:4;10567:1;10564:11;10556:311;;;10657:66;10645:9;10637:6;10633:22;10629:95;10624:3;10617:108;10748:39;10780:6;10771;10765:13;10748:39;:::i;:::-;10738:49;-1:-1:-1;10845:12:14;;;;10810:15;;;;10590:1;10583:9;10556:311;;;-1:-1:-1;10884:6:14;;10149:747;-1:-1:-1;;;;;;10149:747:14:o;11093:219::-;11242:2;11231:9;11224:21;11205:4;11262:44;11302:2;11291:9;11287:18;11279:6;11262:44;:::i;25433:334::-;25504:2;25498:9;25560:2;25550:13;;25565:66;25546:86;25534:99;;25663:18;25648:34;;25684:22;;;25645:62;25642:88;;;25710:18;;:::i;:::-;25746:2;25739:22;25433:334;;-1:-1:-1;25433:334:14:o;25772:183::-;25832:4;25865:18;25857:6;25854:30;25851:56;;;25887:18;;:::i;:::-;-1:-1:-1;25932:1:14;25928:14;25944:4;25924:25;;25772:183::o;26086:128::-;26126:3;26157:1;26153:6;26150:1;26147:13;26144:39;;;26163:18;;:::i;:::-;-1:-1:-1;26199:9:14;;26086:128::o;26219:120::-;26259:1;26285;26275:35;;26290:18;;:::i;:::-;-1:-1:-1;26324:9:14;;26219:120::o;26344:228::-;26384:7;26510:1;26442:66;26438:74;26435:1;26432:81;26427:1;26420:9;26413:17;26409:105;26406:131;;;26517:18;;:::i;:::-;-1:-1:-1;26557:9:14;;26344:228::o;26577:125::-;26617:4;26645:1;26642;26639:8;26636:34;;;26650:18;;:::i;:::-;-1:-1:-1;26687:9:14;;26577:125::o;26707:258::-;26779:1;26789:113;26803:6;26800:1;26797:13;26789:113;;;26879:11;;;26873:18;26860:11;;;26853:39;26825:2;26818:10;26789:113;;;26920:6;26917:1;26914:13;26911:48;;;-1:-1:-1;;26955:1:14;26937:16;;26930:27;26707:258::o;26970:437::-;27049:1;27045:12;;;;27092;;;27113:61;;27167:4;27159:6;27155:17;27145:27;;27113:61;27220:2;27212:6;27209:14;27189:18;27186:38;27183:218;;;27257:77;27254:1;27247:88;27358:4;27355:1;27348:15;27386:4;27383:1;27376:15;27183:218;;26970:437;;;:::o;27412:195::-;27451:3;27482:66;27475:5;27472:77;27469:103;;;27552:18;;:::i;:::-;-1:-1:-1;27599:1:14;27588:13;;27412:195::o;27612:112::-;27644:1;27670;27660:35;;27675:18;;:::i;:::-;-1:-1:-1;27709:9:14;;27612:112::o;27729:184::-;27781:77;27778:1;27771:88;27878:4;27875:1;27868:15;27902:4;27899:1;27892:15;27918:184;27970:77;27967:1;27960:88;28067:4;28064:1;28057:15;28091:4;28088:1;28081:15;28107:184;28159:77;28156:1;28149:88;28256:4;28253:1;28246:15;28280:4;28277:1;28270:15;28296:184;28348:77;28345:1;28338:88;28445:4;28442:1;28435:15;28469:4;28466:1;28459:15;28485:184;28537:77;28534:1;28527:88;28634:4;28631:1;28624:15;28658:4;28655:1;28648:15;28674:177;28759:66;28752:5;28748:78;28741:5;28738:89;28728:117;;28841:1;28838;28831:12
Swarm Source
ipfs://6e786778c40e8be90ccc3f75ccc220cca4b7a3fe72c1161452a0f7b3856f1426
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.