Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
894 MEL
Holders
517
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MELLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MELegend
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./PaymentSplitter.sol"; import "./Counters.sol"; import "./MerkleProof.sol"; // // ,-. ,-. ,------. ,--. ,--. // / .',--,--,--.'. \ | .---',-----.| | ,---. ,---. ,---. ,--,--, ,-| | // | | | | | || `--, '-----'| | | .-. :| .-. || .-. :| \' .-. | // | | | | | | | || `---. | '--.\ --.' '-' '\ --.| || |\ `-' | // \ '.`--`--`--'.' / `------' `-----' `----'.`- / `----'`--''--' `---' // `-' `-' `---' // // Author: Richard Hutta // Email: [email protected] // contract MELegend is ERC721Enumerable, Ownable, PaymentSplitter { using Strings for uint256; using Counters for Counters.Counter; uint256 public maxMintSupply = 888; uint256 public maxGiftSupply = 50; uint256 public totalMinted; uint256 public totalGifted; uint256 presaleMintLimit = 3; string public baseURI; string public baseExtension = ".json"; bool public publicState = false; bool public presaleState = false; mapping(address => uint256) public _presaleClaimed; uint256 _price = 150000000000000000; //0.15 ETH bytes32 public presaleRoot; Counters.Counter private _tokenIds; uint256[] private _teamShares = [10, 1, 89]; address[] private _team = [ 0xBD584cE590B7dcdbB93b11e095d9E1D5880B44d9, 0x7c95D1209E2f95496C4c9A18aA653FdeD834503F, 0x9b3397fcD9c19E6104D24Ff1542323Bd80f9109d ]; constructor() ERC721("(m)E-Legend", "MEL") PaymentSplitter(_team, _teamShares) {} function enablePresale(bytes32 _presaleRoot) public onlyOwner { presaleState = true; presaleRoot = _presaleRoot; } function enablePublic() public onlyOwner { presaleState = false; publicState = true; } function disable() public onlyOwner { presaleState = false; publicState = false; } function setBaseURI(string calldata _tokenBaseURI) external onlyOwner { baseURI = _tokenBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "nonexistent token"); string memory base = _baseURI(); return bytes(base).length > 0 ? string(abi.encodePacked(base,tokenId.toString(),baseExtension)) : ""; } /** * Presale Mint, allows you to mint nft but you need to provide merkle proof, * see function verify(). */ function mint(uint256 _amount, bytes32[] memory proof) external payable { require(presaleState, "presale disabled"); require(!publicState, "presale disabled"); require( totalMinted + _amount <= maxMintSupply, "max supply exceeded" ); require( _price * _amount <= msg.value, "value sent is not correct" ); require( _presaleClaimed[msg.sender] + _amount <= presaleMintLimit, "can't mint such a amount" ); require(verify(msg.sender, proof), "not selected for the presale"); for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _safeMint(msg.sender, _tokenIds.current()); _presaleClaimed[msg.sender] = _presaleClaimed[msg.sender] + 1; totalMinted = totalMinted + 1; } } function mint(uint256 _amount) external payable { require(publicState, "mint disabled"); require(_amount > 0, "zero amount"); require(_amount <= 3, "can't mint so much tokens"); require( totalMinted + _amount <= maxMintSupply, "max supply exceeded" ); require( _price * _amount <= msg.value, "value sent is not correct" ); for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _safeMint(msg.sender, _tokenIds.current()); totalMinted = totalMinted + 1; } } function gift(address[] calldata _addresses) external onlyOwner { require( totalGifted + _addresses.length <= maxGiftSupply, "max gift supply exceeded" ); require(_addresses.length > 0, "no addresses to gift"); for (uint256 ind = 0; ind < _addresses.length; ind++) { require(_addresses[ind] != address(0), "null address"); _tokenIds.increment(); _safeMint(_addresses[ind], _tokenIds.current()); totalGifted = totalGifted + 1; } } function gift(address _address, uint256 _amount) external onlyOwner { require( totalGifted + _amount <= maxGiftSupply, "max gift supply exceeded" ); require(_address != address(0), "null address"); for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _safeMint(_address, _tokenIds.current()); totalGifted = totalGifted + 1; } } function _baseURI() internal view override returns (string memory) { return baseURI; } function verify(address account, bytes32[] memory proof) internal view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(account)); return MerkleProof.verify(proof, presaleRoot, leaf); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // 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/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// 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 v4.4.1 (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); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // 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/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// 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 v4.4.1 (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 tokenId); /** * @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 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// 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 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; import "./SafeERC20.sol"; import "./Address.sol"; import "./Context.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// 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
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[{"internalType":"address","name":"","type":"address"}],"name":"_presaleClaimed","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_presaleRoot","type":"bytes32"}],"name":"enablePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGifted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6103786012556032601355600360165560c06040526005608081905264173539b7b760d91b60a0908152620000389160189190620005a6565b506019805461ffff19169055670214e8348c4f0000601b5560408051606081018252600a8152600160208201526059918101919091526200007e90601e90600362000635565b506040805160608101825273bd584ce590b7dcdbb93b11e095d9e1d5880b44d98152737c95d1209e2f95496c4c9a18aa653fded834503f6020820152739b3397fcd9c19e6104d24ff1542323bd80f9109d91810191909152620000e690601f90600362000678565b50348015620000f457600080fd5b50601f8054806020026020016040519081016040528092919081815260200182805480156200014d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200012e575b5050505050601e805480602002602001604051908101604052809291908181526020018280548015620001a057602002820191906000526020600020905b8154815260200190600101908083116200018b575b5050604080518082018252600b81526a0a1b4a514b531959d95b9960aa1b60208083019182528351808501909452600384526213515360ea1b908401528151919550919350620001f5925060009190620005a6565b5080516200020b906001906020840190620005a6565b50505062000228620002226200036260201b60201c565b62000366565b80518251146200029a5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002ed5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000291565b60005b8251811015620003595762000344838281518110620003135762000313620006e7565b6020026020010151838381518110620003305762000330620006e7565b6020026020010151620003b860201b60201c565b80620003508162000713565b915050620002f0565b50505062000789565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004255760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000291565b60008111620004775760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000291565b6001600160a01b0382166000908152600d602052604090205415620004f35760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000291565b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b546200055d90829062000731565b600b55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620005b4906200074c565b90600052602060002090601f016020900481019282620005d8576000855562000623565b82601f10620005f357805160ff191683800117855562000623565b8280016001018555821562000623579182015b828111156200062357825182559160200191906001019062000606565b5062000631929150620006d0565b5090565b82805482825590600052602060002090810192821562000623579160200282015b8281111562000623578251829060ff1690559160200191906001019062000656565b82805482825590600052602060002090810192821562000623579160200282015b828111156200062357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000699565b5b80821115620006315760008155600101620006d1565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156200072a576200072a620006fd565b5060010190565b60008219821115620007475762000747620006fd565b500190565b600181811c908216806200076157607f821691505b602082108114156200078357634e487b7160e01b600052602260045260246000fd5b50919050565b61352180620007996000396000f3fe60806040526004361061028c5760003560e01c8063854496971161015a578063ba41b0c6116100c1578063d79779b21161007a578063d79779b2146107f2578063da3ef23f14610828578063dc64a75414610848578063e33b7de31461085d578063e985e9c514610872578063f2fde38b146108bb57600080fd5b8063ba41b0c61461073e578063c285e10714610751578063c668286214610767578063c87b56dd1461077c578063cbce4c971461079c578063ce7c2ac2146107bc57600080fd5b80639852595c116101135780639852595c14610685578063a0712d68146106bb578063a22cb465146106ce578063a2309ff8146106ee578063abfe761414610704578063b88d4fde1461071e57600080fd5b806385449697146105cf5780638b83209b146105e55780638cc4de19146106055780638da5cb5b14610632578063946cc04e1461065057806395d89b411461067057600080fd5b80632f745c59116101fe57806355f804b3116101b757806355f804b31461052f5780635edbc28c1461054f5780636352211e146105655780636c0360eb1461058557806370a082311461059a578063715018a6146105ba57600080fd5b80632f745c59146104545780633a98ef3914610474578063406072a91461048957806342842e0e146104cf57806348b75044146104ef5780634f6ccce71461050f57600080fd5b8063163e1e6111610250578063163e1e61146103aa57806318160ddd146103ca57806319165587146103e95780631a9b81551461040957806323b872dd1461041f5780632f2770db1461043f57600080fd5b806301ffc9a7146102da57806306fdde031461030f578063081812fc14610331578063095ea7b3146103695780630d0c31b71461038b57600080fd5b366102d5577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102e657600080fd5b506102fa6102f5366004612c4a565b6108db565b60405190151581526020015b60405180910390f35b34801561031b57600080fd5b50610324610906565b6040516103069190612cbf565b34801561033d57600080fd5b5061035161034c366004612cd2565b610998565b6040516001600160a01b039091168152602001610306565b34801561037557600080fd5b50610389610384366004612d00565b610a32565b005b34801561039757600080fd5b506019546102fa90610100900460ff1681565b3480156103b657600080fd5b506103896103c5366004612d2c565b610b48565b3480156103d657600080fd5b506008545b604051908152602001610306565b3480156103f557600080fd5b50610389610404366004612da1565b610cf2565b34801561041557600080fd5b506103db60155481565b34801561042b57600080fd5b5061038961043a366004612dbe565b610e20565b34801561044b57600080fd5b50610389610e51565b34801561046057600080fd5b506103db61046f366004612d00565b610e88565b34801561048057600080fd5b50600b546103db565b34801561049557600080fd5b506103db6104a4366004612dff565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b3480156104db57600080fd5b506103896104ea366004612dbe565b610f1e565b3480156104fb57600080fd5b5061038961050a366004612dff565b610f39565b34801561051b57600080fd5b506103db61052a366004612cd2565b611112565b34801561053b57600080fd5b5061038961054a366004612e38565b6111a5565b34801561055b57600080fd5b506103db60135481565b34801561057157600080fd5b50610351610580366004612cd2565b6111db565b34801561059157600080fd5b50610324611252565b3480156105a657600080fd5b506103db6105b5366004612da1565b6112e0565b3480156105c657600080fd5b50610389611367565b3480156105db57600080fd5b506103db601c5481565b3480156105f157600080fd5b50610351610600366004612cd2565b61139d565b34801561061157600080fd5b506103db610620366004612da1565b601a6020526000908152604090205481565b34801561063e57600080fd5b50600a546001600160a01b0316610351565b34801561065c57600080fd5b5061038961066b366004612cd2565b6113cd565b34801561067c57600080fd5b5061032461140b565b34801561069157600080fd5b506103db6106a0366004612da1565b6001600160a01b03166000908152600e602052604090205490565b6103896106c9366004612cd2565b61141a565b3480156106da57600080fd5b506103896106e9366004612ea6565b6115e6565b3480156106fa57600080fd5b506103db60145481565b34801561071057600080fd5b506019546102fa9060ff1681565b34801561072a57600080fd5b50610389610739366004612f73565b6115f1565b61038961074c366004612ff3565b611629565b34801561075d57600080fd5b506103db60125481565b34801561077357600080fd5b5061032461189d565b34801561078857600080fd5b50610324610797366004612cd2565b6118aa565b3480156107a857600080fd5b506103896107b7366004612d00565b611964565b3480156107c857600080fd5b506103db6107d7366004612da1565b6001600160a01b03166000908152600d602052604090205490565b3480156107fe57600080fd5b506103db61080d366004612da1565b6001600160a01b031660009081526010602052604090205490565b34801561083457600080fd5b506103896108433660046130a5565b611a76565b34801561085457600080fd5b50610389611ab3565b34801561086957600080fd5b50600c546103db565b34801561087e57600080fd5b506102fa61088d366004612dff565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c757600080fd5b506103896108d6366004612da1565b611aed565b60006001600160e01b0319821663780e9d6360e01b1480610900575061090082611b88565b92915050565b606060008054610915906130ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610941906130ee565b801561098e5780601f106109635761010080835404028352916020019161098e565b820191906000526020600020905b81548152906001019060200180831161097157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a3d826111db565b9050806001600160a01b0316836001600160a01b03161415610aab5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a0d565b336001600160a01b0382161480610ac75750610ac7813361088d565b610b395760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a0d565b610b438383611bd8565b505050565b600a546001600160a01b03163314610b725760405162461bcd60e51b8152600401610a0d90613129565b601354601554610b83908390613174565b1115610bcc5760405162461bcd60e51b81526020600482015260186024820152771b585e0819da599d081cdd5c1c1b1e48195e18d95959195960421b6044820152606401610a0d565b80610c105760405162461bcd60e51b81526020600482015260146024820152731b9bc81859191c995cdcd95cc81d1bc819da599d60621b6044820152606401610a0d565b60005b81811015610b43576000838383818110610c2f57610c2f61318c565b9050602002016020810190610c449190612da1565b6001600160a01b03161415610c8a5760405162461bcd60e51b815260206004820152600c60248201526b6e756c6c206164647265737360a01b6044820152606401610a0d565b610c98601d80546001019055565b610ccf838383818110610cad57610cad61318c565b9050602002016020810190610cc29190612da1565b601d54611c46565b611c46565b601554610cdd906001613174565b60155580610cea816131a2565b915050610c13565b6001600160a01b0381166000908152600d6020526040902054610d275760405162461bcd60e51b8152600401610a0d906131bd565b6000610d32600c5490565b610d3c9047613174565b90506000610d698383610d64866001600160a01b03166000908152600e602052604090205490565b611c60565b905080610d885760405162461bcd60e51b8152600401610a0d90613203565b6001600160a01b0383166000908152600e602052604081208054839290610db0908490613174565b9250508190555080600c6000828254610dc99190613174565b90915550610dd990508382611ca6565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610e2a3382611dbf565b610e465760405162461bcd60e51b8152600401610a0d9061324e565b610b43838383611eb5565b600a546001600160a01b03163314610e7b5760405162461bcd60e51b8152600401610a0d90613129565b6019805461ffff19169055565b6000610e93836112e0565b8210610ef55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a0d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b43838383604051806020016040528060008152506115f1565b6001600160a01b0381166000908152600d6020526040902054610f6e5760405162461bcd60e51b8152600401610a0d906131bd565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fef919061329f565b610ff99190613174565b905060006110328383610d6487876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b9050806110515760405162461bcd60e51b8152600401610a0d90613203565b6001600160a01b03808516600090815260116020908152604080832093871683529290529081208054839290611088908490613174565b90915550506001600160a01b038416600090815260106020526040812080548392906110b5908490613174565b909155506110c69050848483612060565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600061111d60085490565b82106111805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a0d565b600882815481106111935761119361318c565b90600052602060002001549050919050565b600a546001600160a01b031633146111cf5760405162461bcd60e51b8152600401610a0d90613129565b610b4360178383612b27565b6000818152600260205260408120546001600160a01b0316806109005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a0d565b6017805461125f906130ee565b80601f016020809104026020016040519081016040528092919081815260200182805461128b906130ee565b80156112d85780601f106112ad576101008083540402835291602001916112d8565b820191906000526020600020905b8154815290600101906020018083116112bb57829003601f168201915b505050505081565b60006001600160a01b03821661134b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a0d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113915760405162461bcd60e51b8152600401610a0d90613129565b61139b60006120b2565b565b6000600f82815481106113b2576113b261318c565b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b031633146113f75760405162461bcd60e51b8152600401610a0d90613129565b6019805461ff001916610100179055601c55565b606060018054610915906130ee565b60195460ff1661145c5760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d08191a5cd8589b1959609a1b6044820152606401610a0d565b6000811161149a5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc8185b5bdd5b9d60aa1b6044820152606401610a0d565b60038111156114eb5760405162461bcd60e51b815260206004820152601960248201527f63616e2774206d696e7420736f206d75636820746f6b656e73000000000000006044820152606401610a0d565b601254816014546114fc9190613174565b11156115405760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610a0d565b3481601b5461154f91906132b8565b11156115995760405162461bcd60e51b81526020600482015260196024820152781d985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610a0d565b60005b818110156115e2576115b2601d80546001019055565b6115bf33610cca601d5490565b6014546115cd906001613174565b601455806115da816131a2565b91505061159c565b5050565b6115e2338383612104565b6115fb3383611dbf565b6116175760405162461bcd60e51b8152600401610a0d9061324e565b611623848484846121d3565b50505050565b601954610100900460ff166116735760405162461bcd60e51b815260206004820152601060248201526f1c1c995cd85b1948191a5cd8589b195960821b6044820152606401610a0d565b60195460ff16156116b95760405162461bcd60e51b815260206004820152601060248201526f1c1c995cd85b1948191a5cd8589b195960821b6044820152606401610a0d565b601254826014546116ca9190613174565b111561170e5760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610a0d565b3482601b5461171d91906132b8565b11156117675760405162461bcd60e51b81526020600482015260196024820152781d985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610a0d565b601654336000908152601a6020526040902054611785908490613174565b11156117d35760405162461bcd60e51b815260206004820152601860248201527f63616e2774206d696e742073756368206120616d6f756e7400000000000000006044820152606401610a0d565b6117dd3382612206565b6118295760405162461bcd60e51b815260206004820152601c60248201527f6e6f742073656c656374656420666f72207468652070726573616c65000000006044820152606401610a0d565b60005b82811015610b4357611842601d80546001019055565b61184f33610cca601d5490565b336000908152601a602052604090205461186a906001613174565b336000908152601a6020526040902055601454611888906001613174565b60145580611895816131a2565b91505061182c565b6018805461125f906130ee565b6000818152600260205260409020546060906001600160a01b03166119055760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a0d565b600061190f61224f565b9050600081511161192f576040518060200160405280600081525061195d565b806119398461225e565b601860405160200161194d939291906132d7565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461198e5760405162461bcd60e51b8152600401610a0d90613129565b6013548160155461199f9190613174565b11156119e85760405162461bcd60e51b81526020600482015260186024820152771b585e0819da599d081cdd5c1c1b1e48195e18d95959195960421b6044820152606401610a0d565b6001600160a01b038216611a2d5760405162461bcd60e51b815260206004820152600c60248201526b6e756c6c206164647265737360a01b6044820152606401610a0d565b60005b81811015610b4357611a46601d80546001019055565b611a5383610cca601d5490565b601554611a61906001613174565b60155580611a6e816131a2565b915050611a30565b600a546001600160a01b03163314611aa05760405162461bcd60e51b8152600401610a0d90613129565b80516115e2906018906020840190612bab565b600a546001600160a01b03163314611add5760405162461bcd60e51b8152600401610a0d90613129565b6019805461ffff19166001179055565b600a546001600160a01b03163314611b175760405162461bcd60e51b8152600401610a0d90613129565b6001600160a01b038116611b7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a0d565b611b85816120b2565b50565b60006001600160e01b031982166380ac58cd60e01b1480611bb957506001600160e01b03198216635b5e139f60e01b145b8061090057506301ffc9a760e01b6001600160e01b0319831614610900565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c0d826111db565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6115e282826040518060200160405280600081525061235c565b600b546001600160a01b0384166000908152600d602052604081205490918391611c8a90866132b8565b611c9491906133b1565b611c9e91906133c5565b949350505050565b80471015611cf65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a0d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d43576040519150601f19603f3d011682016040523d82523d6000602084013e611d48565b606091505b5050905080610b435760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a0d565b6000818152600260205260408120546001600160a01b0316611e385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a0d565b6000611e43836111db565b9050806001600160a01b0316846001600160a01b03161480611e7e5750836001600160a01b0316611e7384610998565b6001600160a01b0316145b80611c9e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611ec8826111db565b6001600160a01b031614611f305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a0d565b6001600160a01b038216611f925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a0d565b611f9d83838361238f565b611fa8600082611bd8565b6001600160a01b0383166000908152600360205260408120805460019290611fd19084906133c5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fff908490613174565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b43908490612447565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a0d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121de848484611eb5565b6121ea84848484612519565b6116235760405162461bcd60e51b8152600401610a0d906133dc565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050611c9e83601c5483612617565b606060178054610915906130ee565b6060816122825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122ac5780612296816131a2565b91506122a59050600a836133b1565b9150612286565b60008167ffffffffffffffff8111156122c7576122c7612ed4565b6040519080825280601f01601f1916602001820160405280156122f1576020820181803683370190505b5090505b8415611c9e576123066001836133c5565b9150612313600a8661342e565b61231e906030613174565b60f81b8183815181106123335761233361318c565b60200101906001600160f81b031916908160001a905350612355600a866133b1565b94506122f5565b612366838361262d565b6123736000848484612519565b610b435760405162461bcd60e51b8152600401610a0d906133dc565b6001600160a01b0383166123ea576123e581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61240d565b816001600160a01b0316836001600160a01b03161461240d5761240d838261277b565b6001600160a01b03821661242457610b4381612818565b826001600160a01b0316826001600160a01b031614610b4357610b4382826128c7565b600061249c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661290b9092919063ffffffff16565b805190915015610b4357808060200190518101906124ba9190613442565b610b435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a0d565b60006001600160a01b0384163b1561260c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061255d90339089908890889060040161345f565b6020604051808303816000875af1925050508015612598575060408051601f3d908101601f191682019092526125959181019061349c565b60015b6125f2573d8080156125c6576040519150601f19603f3d011682016040523d82523d6000602084013e6125cb565b606091505b5080516125ea5760405162461bcd60e51b8152600401610a0d906133dc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c9e565b506001949350505050565b600082612624858461291a565b14949350505050565b6001600160a01b0382166126835760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a0d565b6000818152600260205260409020546001600160a01b0316156126e85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a0d565b6126f46000838361238f565b6001600160a01b038216600090815260036020526040812080546001929061271d908490613174565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612788846112e0565b61279291906133c5565b6000838152600760205260409020549091508082146127e5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061282a906001906133c5565b600083815260096020526040812054600880549394509092849081106128525761285261318c565b9060005260206000200154905080600883815481106128735761287361318c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128ab576128ab6134b9565b6001900381819060005260206000200160009055905550505050565b60006128d2836112e0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060611c9e84846000856129c6565b600081815b84518110156129be57600085828151811061293c5761293c61318c565b6020026020010151905080831161297e5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506129ab565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806129b6816131a2565b91505061291f565b509392505050565b606082471015612a275760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a0d565b843b612a755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a0d565b600080866001600160a01b03168587604051612a9191906134cf565b60006040518083038185875af1925050503d8060008114612ace576040519150601f19603f3d011682016040523d82523d6000602084013e612ad3565b606091505b5091509150612ae3828286612aee565b979650505050505050565b60608315612afd57508161195d565b825115612b0d5782518084602001fd5b8160405162461bcd60e51b8152600401610a0d9190612cbf565b828054612b33906130ee565b90600052602060002090601f016020900481019282612b555760008555612b9b565b82601f10612b6e5782800160ff19823516178555612b9b565b82800160010185558215612b9b579182015b82811115612b9b578235825591602001919060010190612b80565b50612ba7929150612c1f565b5090565b828054612bb7906130ee565b90600052602060002090601f016020900481019282612bd95760008555612b9b565b82601f10612bf257805160ff1916838001178555612b9b565b82800160010185558215612b9b579182015b82811115612b9b578251825591602001919060010190612c04565b5b80821115612ba75760008155600101612c20565b6001600160e01b031981168114611b8557600080fd5b600060208284031215612c5c57600080fd5b813561195d81612c34565b60005b83811015612c82578181015183820152602001612c6a565b838111156116235750506000910152565b60008151808452612cab816020860160208601612c67565b601f01601f19169290920160200192915050565b60208152600061195d6020830184612c93565b600060208284031215612ce457600080fd5b5035919050565b6001600160a01b0381168114611b8557600080fd5b60008060408385031215612d1357600080fd5b8235612d1e81612ceb565b946020939093013593505050565b60008060208385031215612d3f57600080fd5b823567ffffffffffffffff80821115612d5757600080fd5b818501915085601f830112612d6b57600080fd5b813581811115612d7a57600080fd5b8660208260051b8501011115612d8f57600080fd5b60209290920196919550909350505050565b600060208284031215612db357600080fd5b813561195d81612ceb565b600080600060608486031215612dd357600080fd5b8335612dde81612ceb565b92506020840135612dee81612ceb565b929592945050506040919091013590565b60008060408385031215612e1257600080fd5b8235612e1d81612ceb565b91506020830135612e2d81612ceb565b809150509250929050565b60008060208385031215612e4b57600080fd5b823567ffffffffffffffff80821115612e6357600080fd5b818501915085601f830112612e7757600080fd5b813581811115612e8657600080fd5b866020828501011115612d8f57600080fd5b8015158114611b8557600080fd5b60008060408385031215612eb957600080fd5b8235612ec481612ceb565b91506020830135612e2d81612e98565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f1357612f13612ed4565b604052919050565b600067ffffffffffffffff831115612f3557612f35612ed4565b612f48601f8401601f1916602001612eea565b9050828152838383011115612f5c57600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215612f8957600080fd5b8435612f9481612ceb565b93506020850135612fa481612ceb565b925060408501359150606085013567ffffffffffffffff811115612fc757600080fd5b8501601f81018713612fd857600080fd5b612fe787823560208401612f1b565b91505092959194509250565b6000806040838503121561300657600080fd5b8235915060208084013567ffffffffffffffff8082111561302657600080fd5b818601915086601f83011261303a57600080fd5b81358181111561304c5761304c612ed4565b8060051b915061305d848301612eea565b818152918301840191848101908984111561307757600080fd5b938501935b838510156130955784358252938501939085019061307c565b8096505050505050509250929050565b6000602082840312156130b757600080fd5b813567ffffffffffffffff8111156130ce57600080fd5b8201601f810184136130df57600080fd5b611c9e84823560208401612f1b565b600181811c9082168061310257607f821691505b6020821081141561312357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156131875761318761315e565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156131b6576131b661315e565b5060010190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000602082840312156132b157600080fd5b5051919050565b60008160001904831182151516156132d2576132d261315e565b500290565b6000845160206132ea8285838a01612c67565b8551918401916132fd8184848a01612c67565b8554920191600090600181811c908083168061331a57607f831692505b85831081141561333857634e487b7160e01b85526022600452602485fd5b80801561334c576001811461335d5761338a565b60ff1985168852838801955061338a565b60008b81526020902060005b858110156133825781548a820152908401908801613369565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826133c0576133c061339b565b500490565b6000828210156133d7576133d761315e565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261343d5761343d61339b565b500690565b60006020828403121561345457600080fd5b815161195d81612e98565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061349290830184612c93565b9695505050505050565b6000602082840312156134ae57600080fd5b815161195d81612c34565b634e487b7160e01b600052603160045260246000fd5b600082516134e1818460208701612c67565b919091019291505056fea26469706673582212206aa9be2943caddea482514609a9105e9637d8a75405507b108a63f4bc10118d864736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061028c5760003560e01c8063854496971161015a578063ba41b0c6116100c1578063d79779b21161007a578063d79779b2146107f2578063da3ef23f14610828578063dc64a75414610848578063e33b7de31461085d578063e985e9c514610872578063f2fde38b146108bb57600080fd5b8063ba41b0c61461073e578063c285e10714610751578063c668286214610767578063c87b56dd1461077c578063cbce4c971461079c578063ce7c2ac2146107bc57600080fd5b80639852595c116101135780639852595c14610685578063a0712d68146106bb578063a22cb465146106ce578063a2309ff8146106ee578063abfe761414610704578063b88d4fde1461071e57600080fd5b806385449697146105cf5780638b83209b146105e55780638cc4de19146106055780638da5cb5b14610632578063946cc04e1461065057806395d89b411461067057600080fd5b80632f745c59116101fe57806355f804b3116101b757806355f804b31461052f5780635edbc28c1461054f5780636352211e146105655780636c0360eb1461058557806370a082311461059a578063715018a6146105ba57600080fd5b80632f745c59146104545780633a98ef3914610474578063406072a91461048957806342842e0e146104cf57806348b75044146104ef5780634f6ccce71461050f57600080fd5b8063163e1e6111610250578063163e1e61146103aa57806318160ddd146103ca57806319165587146103e95780631a9b81551461040957806323b872dd1461041f5780632f2770db1461043f57600080fd5b806301ffc9a7146102da57806306fdde031461030f578063081812fc14610331578063095ea7b3146103695780630d0c31b71461038b57600080fd5b366102d5577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102e657600080fd5b506102fa6102f5366004612c4a565b6108db565b60405190151581526020015b60405180910390f35b34801561031b57600080fd5b50610324610906565b6040516103069190612cbf565b34801561033d57600080fd5b5061035161034c366004612cd2565b610998565b6040516001600160a01b039091168152602001610306565b34801561037557600080fd5b50610389610384366004612d00565b610a32565b005b34801561039757600080fd5b506019546102fa90610100900460ff1681565b3480156103b657600080fd5b506103896103c5366004612d2c565b610b48565b3480156103d657600080fd5b506008545b604051908152602001610306565b3480156103f557600080fd5b50610389610404366004612da1565b610cf2565b34801561041557600080fd5b506103db60155481565b34801561042b57600080fd5b5061038961043a366004612dbe565b610e20565b34801561044b57600080fd5b50610389610e51565b34801561046057600080fd5b506103db61046f366004612d00565b610e88565b34801561048057600080fd5b50600b546103db565b34801561049557600080fd5b506103db6104a4366004612dff565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b3480156104db57600080fd5b506103896104ea366004612dbe565b610f1e565b3480156104fb57600080fd5b5061038961050a366004612dff565b610f39565b34801561051b57600080fd5b506103db61052a366004612cd2565b611112565b34801561053b57600080fd5b5061038961054a366004612e38565b6111a5565b34801561055b57600080fd5b506103db60135481565b34801561057157600080fd5b50610351610580366004612cd2565b6111db565b34801561059157600080fd5b50610324611252565b3480156105a657600080fd5b506103db6105b5366004612da1565b6112e0565b3480156105c657600080fd5b50610389611367565b3480156105db57600080fd5b506103db601c5481565b3480156105f157600080fd5b50610351610600366004612cd2565b61139d565b34801561061157600080fd5b506103db610620366004612da1565b601a6020526000908152604090205481565b34801561063e57600080fd5b50600a546001600160a01b0316610351565b34801561065c57600080fd5b5061038961066b366004612cd2565b6113cd565b34801561067c57600080fd5b5061032461140b565b34801561069157600080fd5b506103db6106a0366004612da1565b6001600160a01b03166000908152600e602052604090205490565b6103896106c9366004612cd2565b61141a565b3480156106da57600080fd5b506103896106e9366004612ea6565b6115e6565b3480156106fa57600080fd5b506103db60145481565b34801561071057600080fd5b506019546102fa9060ff1681565b34801561072a57600080fd5b50610389610739366004612f73565b6115f1565b61038961074c366004612ff3565b611629565b34801561075d57600080fd5b506103db60125481565b34801561077357600080fd5b5061032461189d565b34801561078857600080fd5b50610324610797366004612cd2565b6118aa565b3480156107a857600080fd5b506103896107b7366004612d00565b611964565b3480156107c857600080fd5b506103db6107d7366004612da1565b6001600160a01b03166000908152600d602052604090205490565b3480156107fe57600080fd5b506103db61080d366004612da1565b6001600160a01b031660009081526010602052604090205490565b34801561083457600080fd5b506103896108433660046130a5565b611a76565b34801561085457600080fd5b50610389611ab3565b34801561086957600080fd5b50600c546103db565b34801561087e57600080fd5b506102fa61088d366004612dff565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c757600080fd5b506103896108d6366004612da1565b611aed565b60006001600160e01b0319821663780e9d6360e01b1480610900575061090082611b88565b92915050565b606060008054610915906130ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610941906130ee565b801561098e5780601f106109635761010080835404028352916020019161098e565b820191906000526020600020905b81548152906001019060200180831161097157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a3d826111db565b9050806001600160a01b0316836001600160a01b03161415610aab5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a0d565b336001600160a01b0382161480610ac75750610ac7813361088d565b610b395760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a0d565b610b438383611bd8565b505050565b600a546001600160a01b03163314610b725760405162461bcd60e51b8152600401610a0d90613129565b601354601554610b83908390613174565b1115610bcc5760405162461bcd60e51b81526020600482015260186024820152771b585e0819da599d081cdd5c1c1b1e48195e18d95959195960421b6044820152606401610a0d565b80610c105760405162461bcd60e51b81526020600482015260146024820152731b9bc81859191c995cdcd95cc81d1bc819da599d60621b6044820152606401610a0d565b60005b81811015610b43576000838383818110610c2f57610c2f61318c565b9050602002016020810190610c449190612da1565b6001600160a01b03161415610c8a5760405162461bcd60e51b815260206004820152600c60248201526b6e756c6c206164647265737360a01b6044820152606401610a0d565b610c98601d80546001019055565b610ccf838383818110610cad57610cad61318c565b9050602002016020810190610cc29190612da1565b601d54611c46565b611c46565b601554610cdd906001613174565b60155580610cea816131a2565b915050610c13565b6001600160a01b0381166000908152600d6020526040902054610d275760405162461bcd60e51b8152600401610a0d906131bd565b6000610d32600c5490565b610d3c9047613174565b90506000610d698383610d64866001600160a01b03166000908152600e602052604090205490565b611c60565b905080610d885760405162461bcd60e51b8152600401610a0d90613203565b6001600160a01b0383166000908152600e602052604081208054839290610db0908490613174565b9250508190555080600c6000828254610dc99190613174565b90915550610dd990508382611ca6565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610e2a3382611dbf565b610e465760405162461bcd60e51b8152600401610a0d9061324e565b610b43838383611eb5565b600a546001600160a01b03163314610e7b5760405162461bcd60e51b8152600401610a0d90613129565b6019805461ffff19169055565b6000610e93836112e0565b8210610ef55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a0d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b43838383604051806020016040528060008152506115f1565b6001600160a01b0381166000908152600d6020526040902054610f6e5760405162461bcd60e51b8152600401610a0d906131bd565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fef919061329f565b610ff99190613174565b905060006110328383610d6487876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b9050806110515760405162461bcd60e51b8152600401610a0d90613203565b6001600160a01b03808516600090815260116020908152604080832093871683529290529081208054839290611088908490613174565b90915550506001600160a01b038416600090815260106020526040812080548392906110b5908490613174565b909155506110c69050848483612060565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600061111d60085490565b82106111805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a0d565b600882815481106111935761119361318c565b90600052602060002001549050919050565b600a546001600160a01b031633146111cf5760405162461bcd60e51b8152600401610a0d90613129565b610b4360178383612b27565b6000818152600260205260408120546001600160a01b0316806109005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a0d565b6017805461125f906130ee565b80601f016020809104026020016040519081016040528092919081815260200182805461128b906130ee565b80156112d85780601f106112ad576101008083540402835291602001916112d8565b820191906000526020600020905b8154815290600101906020018083116112bb57829003601f168201915b505050505081565b60006001600160a01b03821661134b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a0d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113915760405162461bcd60e51b8152600401610a0d90613129565b61139b60006120b2565b565b6000600f82815481106113b2576113b261318c565b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b031633146113f75760405162461bcd60e51b8152600401610a0d90613129565b6019805461ff001916610100179055601c55565b606060018054610915906130ee565b60195460ff1661145c5760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d08191a5cd8589b1959609a1b6044820152606401610a0d565b6000811161149a5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc8185b5bdd5b9d60aa1b6044820152606401610a0d565b60038111156114eb5760405162461bcd60e51b815260206004820152601960248201527f63616e2774206d696e7420736f206d75636820746f6b656e73000000000000006044820152606401610a0d565b601254816014546114fc9190613174565b11156115405760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610a0d565b3481601b5461154f91906132b8565b11156115995760405162461bcd60e51b81526020600482015260196024820152781d985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610a0d565b60005b818110156115e2576115b2601d80546001019055565b6115bf33610cca601d5490565b6014546115cd906001613174565b601455806115da816131a2565b91505061159c565b5050565b6115e2338383612104565b6115fb3383611dbf565b6116175760405162461bcd60e51b8152600401610a0d9061324e565b611623848484846121d3565b50505050565b601954610100900460ff166116735760405162461bcd60e51b815260206004820152601060248201526f1c1c995cd85b1948191a5cd8589b195960821b6044820152606401610a0d565b60195460ff16156116b95760405162461bcd60e51b815260206004820152601060248201526f1c1c995cd85b1948191a5cd8589b195960821b6044820152606401610a0d565b601254826014546116ca9190613174565b111561170e5760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610a0d565b3482601b5461171d91906132b8565b11156117675760405162461bcd60e51b81526020600482015260196024820152781d985b1d59481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd603a1b6044820152606401610a0d565b601654336000908152601a6020526040902054611785908490613174565b11156117d35760405162461bcd60e51b815260206004820152601860248201527f63616e2774206d696e742073756368206120616d6f756e7400000000000000006044820152606401610a0d565b6117dd3382612206565b6118295760405162461bcd60e51b815260206004820152601c60248201527f6e6f742073656c656374656420666f72207468652070726573616c65000000006044820152606401610a0d565b60005b82811015610b4357611842601d80546001019055565b61184f33610cca601d5490565b336000908152601a602052604090205461186a906001613174565b336000908152601a6020526040902055601454611888906001613174565b60145580611895816131a2565b91505061182c565b6018805461125f906130ee565b6000818152600260205260409020546060906001600160a01b03166119055760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a0d565b600061190f61224f565b9050600081511161192f576040518060200160405280600081525061195d565b806119398461225e565b601860405160200161194d939291906132d7565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461198e5760405162461bcd60e51b8152600401610a0d90613129565b6013548160155461199f9190613174565b11156119e85760405162461bcd60e51b81526020600482015260186024820152771b585e0819da599d081cdd5c1c1b1e48195e18d95959195960421b6044820152606401610a0d565b6001600160a01b038216611a2d5760405162461bcd60e51b815260206004820152600c60248201526b6e756c6c206164647265737360a01b6044820152606401610a0d565b60005b81811015610b4357611a46601d80546001019055565b611a5383610cca601d5490565b601554611a61906001613174565b60155580611a6e816131a2565b915050611a30565b600a546001600160a01b03163314611aa05760405162461bcd60e51b8152600401610a0d90613129565b80516115e2906018906020840190612bab565b600a546001600160a01b03163314611add5760405162461bcd60e51b8152600401610a0d90613129565b6019805461ffff19166001179055565b600a546001600160a01b03163314611b175760405162461bcd60e51b8152600401610a0d90613129565b6001600160a01b038116611b7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a0d565b611b85816120b2565b50565b60006001600160e01b031982166380ac58cd60e01b1480611bb957506001600160e01b03198216635b5e139f60e01b145b8061090057506301ffc9a760e01b6001600160e01b0319831614610900565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c0d826111db565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6115e282826040518060200160405280600081525061235c565b600b546001600160a01b0384166000908152600d602052604081205490918391611c8a90866132b8565b611c9491906133b1565b611c9e91906133c5565b949350505050565b80471015611cf65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a0d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d43576040519150601f19603f3d011682016040523d82523d6000602084013e611d48565b606091505b5050905080610b435760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a0d565b6000818152600260205260408120546001600160a01b0316611e385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a0d565b6000611e43836111db565b9050806001600160a01b0316846001600160a01b03161480611e7e5750836001600160a01b0316611e7384610998565b6001600160a01b0316145b80611c9e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611ec8826111db565b6001600160a01b031614611f305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a0d565b6001600160a01b038216611f925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a0d565b611f9d83838361238f565b611fa8600082611bd8565b6001600160a01b0383166000908152600360205260408120805460019290611fd19084906133c5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fff908490613174565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b43908490612447565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a0d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121de848484611eb5565b6121ea84848484612519565b6116235760405162461bcd60e51b8152600401610a0d906133dc565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050611c9e83601c5483612617565b606060178054610915906130ee565b6060816122825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122ac5780612296816131a2565b91506122a59050600a836133b1565b9150612286565b60008167ffffffffffffffff8111156122c7576122c7612ed4565b6040519080825280601f01601f1916602001820160405280156122f1576020820181803683370190505b5090505b8415611c9e576123066001836133c5565b9150612313600a8661342e565b61231e906030613174565b60f81b8183815181106123335761233361318c565b60200101906001600160f81b031916908160001a905350612355600a866133b1565b94506122f5565b612366838361262d565b6123736000848484612519565b610b435760405162461bcd60e51b8152600401610a0d906133dc565b6001600160a01b0383166123ea576123e581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61240d565b816001600160a01b0316836001600160a01b03161461240d5761240d838261277b565b6001600160a01b03821661242457610b4381612818565b826001600160a01b0316826001600160a01b031614610b4357610b4382826128c7565b600061249c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661290b9092919063ffffffff16565b805190915015610b4357808060200190518101906124ba9190613442565b610b435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a0d565b60006001600160a01b0384163b1561260c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061255d90339089908890889060040161345f565b6020604051808303816000875af1925050508015612598575060408051601f3d908101601f191682019092526125959181019061349c565b60015b6125f2573d8080156125c6576040519150601f19603f3d011682016040523d82523d6000602084013e6125cb565b606091505b5080516125ea5760405162461bcd60e51b8152600401610a0d906133dc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c9e565b506001949350505050565b600082612624858461291a565b14949350505050565b6001600160a01b0382166126835760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a0d565b6000818152600260205260409020546001600160a01b0316156126e85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a0d565b6126f46000838361238f565b6001600160a01b038216600090815260036020526040812080546001929061271d908490613174565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612788846112e0565b61279291906133c5565b6000838152600760205260409020549091508082146127e5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061282a906001906133c5565b600083815260096020526040812054600880549394509092849081106128525761285261318c565b9060005260206000200154905080600883815481106128735761287361318c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128ab576128ab6134b9565b6001900381819060005260206000200160009055905550505050565b60006128d2836112e0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060611c9e84846000856129c6565b600081815b84518110156129be57600085828151811061293c5761293c61318c565b6020026020010151905080831161297e5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506129ab565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806129b6816131a2565b91505061291f565b509392505050565b606082471015612a275760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a0d565b843b612a755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a0d565b600080866001600160a01b03168587604051612a9191906134cf565b60006040518083038185875af1925050503d8060008114612ace576040519150601f19603f3d011682016040523d82523d6000602084013e612ad3565b606091505b5091509150612ae3828286612aee565b979650505050505050565b60608315612afd57508161195d565b825115612b0d5782518084602001fd5b8160405162461bcd60e51b8152600401610a0d9190612cbf565b828054612b33906130ee565b90600052602060002090601f016020900481019282612b555760008555612b9b565b82601f10612b6e5782800160ff19823516178555612b9b565b82800160010185558215612b9b579182015b82811115612b9b578235825591602001919060010190612b80565b50612ba7929150612c1f565b5090565b828054612bb7906130ee565b90600052602060002090601f016020900481019282612bd95760008555612b9b565b82601f10612bf257805160ff1916838001178555612b9b565b82800160010185558215612b9b579182015b82811115612b9b578251825591602001919060010190612c04565b5b80821115612ba75760008155600101612c20565b6001600160e01b031981168114611b8557600080fd5b600060208284031215612c5c57600080fd5b813561195d81612c34565b60005b83811015612c82578181015183820152602001612c6a565b838111156116235750506000910152565b60008151808452612cab816020860160208601612c67565b601f01601f19169290920160200192915050565b60208152600061195d6020830184612c93565b600060208284031215612ce457600080fd5b5035919050565b6001600160a01b0381168114611b8557600080fd5b60008060408385031215612d1357600080fd5b8235612d1e81612ceb565b946020939093013593505050565b60008060208385031215612d3f57600080fd5b823567ffffffffffffffff80821115612d5757600080fd5b818501915085601f830112612d6b57600080fd5b813581811115612d7a57600080fd5b8660208260051b8501011115612d8f57600080fd5b60209290920196919550909350505050565b600060208284031215612db357600080fd5b813561195d81612ceb565b600080600060608486031215612dd357600080fd5b8335612dde81612ceb565b92506020840135612dee81612ceb565b929592945050506040919091013590565b60008060408385031215612e1257600080fd5b8235612e1d81612ceb565b91506020830135612e2d81612ceb565b809150509250929050565b60008060208385031215612e4b57600080fd5b823567ffffffffffffffff80821115612e6357600080fd5b818501915085601f830112612e7757600080fd5b813581811115612e8657600080fd5b866020828501011115612d8f57600080fd5b8015158114611b8557600080fd5b60008060408385031215612eb957600080fd5b8235612ec481612ceb565b91506020830135612e2d81612e98565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f1357612f13612ed4565b604052919050565b600067ffffffffffffffff831115612f3557612f35612ed4565b612f48601f8401601f1916602001612eea565b9050828152838383011115612f5c57600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215612f8957600080fd5b8435612f9481612ceb565b93506020850135612fa481612ceb565b925060408501359150606085013567ffffffffffffffff811115612fc757600080fd5b8501601f81018713612fd857600080fd5b612fe787823560208401612f1b565b91505092959194509250565b6000806040838503121561300657600080fd5b8235915060208084013567ffffffffffffffff8082111561302657600080fd5b818601915086601f83011261303a57600080fd5b81358181111561304c5761304c612ed4565b8060051b915061305d848301612eea565b818152918301840191848101908984111561307757600080fd5b938501935b838510156130955784358252938501939085019061307c565b8096505050505050509250929050565b6000602082840312156130b757600080fd5b813567ffffffffffffffff8111156130ce57600080fd5b8201601f810184136130df57600080fd5b611c9e84823560208401612f1b565b600181811c9082168061310257607f821691505b6020821081141561312357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156131875761318761315e565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156131b6576131b661315e565b5060010190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000602082840312156132b157600080fd5b5051919050565b60008160001904831182151516156132d2576132d261315e565b500290565b6000845160206132ea8285838a01612c67565b8551918401916132fd8184848a01612c67565b8554920191600090600181811c908083168061331a57607f831692505b85831081141561333857634e487b7160e01b85526022600452602485fd5b80801561334c576001811461335d5761338a565b60ff1985168852838801955061338a565b60008b81526020902060005b858110156133825781548a820152908401908801613369565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826133c0576133c061339b565b500490565b6000828210156133d7576133d761315e565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261343d5761343d61339b565b500690565b60006020828403121561345457600080fd5b815161195d81612e98565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061349290830184612c93565b9695505050505050565b6000602082840312156134ae57600080fd5b815161195d81612c34565b634e487b7160e01b600052603160045260246000fd5b600082516134e1818460208701612c67565b919091019291505056fea26469706673582212206aa9be2943caddea482514609a9105e9637d8a75405507b108a63f4bc10118d864736f6c634300080b0033
Deployed Bytecode Sourcemap
845:4915:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:40:15;719:10:1;3216:40:15;;;-1:-1:-1;;;;;206:32:18;;;188:51;;3246:9:15;270:2:18;255:18;;248:34;161:18;3216:40:15;;;;;;;845:4915:12;;;;;989:222:5;;;;;;;;;;-1:-1:-1;989:222:5;;;;;:::i;:::-;;:::i;:::-;;;844:14:18;;837:22;819:41;;807:2;792:18;989:222:5;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1971:32:18;;;1953:51;;1941:2;1926:18;3919:217:4;1807:203:18;3457:401:4;;;;;;;;;;-1:-1:-1;3457:401:4;;;;;:::i;:::-;;:::i;:::-;;1276:32:12;;;;;;;;;;-1:-1:-1;1276:32:12;;;;;;;;;;;4433:546;;;;;;;;;;-1:-1:-1;4433:546:12;;;;;:::i;:::-;;:::i;1614:111:5:-;;;;;;;;;;-1:-1:-1;1701:10:5;:17;1614:111;;;3237:25:18;;;3225:2;3210:18;1614:111:5;3091:177:18;4944:553:15;;;;;;;;;;-1:-1:-1;4944:553:15;;;;;:::i;:::-;;:::i;1100:26:12:-;;;;;;;;;;;;;;;;4646:330:4;;;;;;;;;;-1:-1:-1;4646:330:4;;;;;:::i;:::-;;:::i;2101:102:12:-;;;;;;;;;;;;;:::i;1290:253:5:-;;;;;;;;;;-1:-1:-1;1290:253:5;;;;;:::i;:::-;;:::i;3341:89:15:-;;;;;;;;;;-1:-1:-1;3411:12:15;;3341:89;;4433:133;;;;;;;;;;-1:-1:-1;4433:133:15;;;;;:::i;:::-;-1:-1:-1;;;;;4529:21:15;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;5042:179:4;;;;;;;;;;-1:-1:-1;5042:179:4;;;;;:::i;:::-;;:::i;5758:628:15:-;;;;;;;;;;-1:-1:-1;5758:628:15;;;;;:::i;:::-;;:::i;1797:230:5:-;;;;;;;;;;-1:-1:-1;1797:230:5;;;;;:::i;:::-;;:::i;2209:110:12:-;;;;;;;;;;-1:-1:-1;2209:110:12;;;;;:::i;:::-;;:::i;1028:33::-;;;;;;;;;;;;;;;;2111:235:4;;;;;;;;;;-1:-1:-1;2111:235:4;;;;;:::i;:::-;;:::i;1168:21:12:-;;;;;;;;;;;;;:::i;1849:205:4:-;;;;;;;;;;-1:-1:-1;1849:205:4;;;;;:::i;:::-;;:::i;1661:101:14:-;;;;;;;;;;;;;:::i;1425:26:12:-;;;;;;;;;;;;;;;;4652:98:15;;;;;;;;;;-1:-1:-1;4652:98:15;;;;;:::i;:::-;;:::i;1315:50:12:-;;;;;;;;;;-1:-1:-1;1315:50:12;;;;;:::i;:::-;;;;;;;;;;;;;;1029:85:14;;;;;;;;;;-1:-1:-1;1101:6:14;;-1:-1:-1;;;;;1101:6:14;1029:85;;1849:134:12;;;;;;;;;;-1:-1:-1;1849:134:12;;;;;:::i;:::-;;:::i;2570:102:4:-;;;;;;;;;;;;;:::i;4163:107:15:-;;;;;;;;;;-1:-1:-1;4163:107:15;;;;;:::i;:::-;-1:-1:-1;;;;;4245:18:15;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;3795:632:12;;;;;;:::i;:::-;;:::i;4203:153:4:-;;;;;;;;;;-1:-1:-1;4203:153:4;;;;;:::i;:::-;;:::i;1068:26:12:-;;;;;;;;;;;;;;;;1239:31;;;;;;;;;;-1:-1:-1;1239:31:12;;;;;;;;5287:320:4;;;;;;;;;;-1:-1:-1;5287:320:4;;;;;:::i;:::-;;:::i;2894:895:12:-;;;;;;:::i;:::-;;:::i;988:34::-;;;;;;;;;;;;;;;;1195:37;;;;;;;;;;;;;:::i;2457:302::-;;;;;;;;;;-1:-1:-1;2457:302:12;;;;;:::i;:::-;;:::i;4985:447::-;;;;;;;;;;-1:-1:-1;4985:447:12;;;;;:::i;:::-;;:::i;3966:103:15:-;;;;;;;;;;-1:-1:-1;3966:103:15;;;;;:::i;:::-;-1:-1:-1;;;;;4046:16:15;4020:7;4046:16;;;:7;:16;;;;;;;3966:103;3763:117;;;;;;;;;;-1:-1:-1;3763:117:15;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:15;3821:7;3847:26;;;:19;:26;;;;;;;3763:117;2325:126:12;;;;;;;;;;-1:-1:-1;2325:126:12;;;;;:::i;:::-;;:::i;1989:106::-;;;;;;;;;;;;;:::i;3519:93:15:-;;;;;;;;;;-1:-1:-1;3591:14:15;;3519:93;;4422:162:4;;;;;;;;;;-1:-1:-1;4422:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:4;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;1911:198:14;;;;;;;;;;-1:-1:-1;1911:198:14;;;;;:::i;:::-;;:::i;989:222:5:-;1091:4;-1:-1:-1;;;;;;1114:50:5;;-1:-1:-1;;;1114:50:5;;:90;;;1168:36;1192:11;1168:23;:36::i;:::-;1107:97;989:222;-1:-1:-1;;989:222:5:o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;4014:73;;;;-1:-1:-1;;;4014:73:4;;10471:2:18;4014:73:4;;;10453:21:18;10510:2;10490:18;;;10483:30;10549:34;10529:18;;;10522:62;-1:-1:-1;;;10600:18:18;;;10593:42;10652:19;;4014:73:4;;;;;;;;;-1:-1:-1;4105:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:4;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:4;:2;-1:-1:-1;;;;;3594:11:4;;;3586:57;;;;-1:-1:-1;;;3586:57:4;;10884:2:18;3586:57:4;;;10866:21:18;10923:2;10903:18;;;10896:30;10962:34;10942:18;;;10935:62;-1:-1:-1;;;11013:18:18;;;11006:31;11054:19;;3586:57:4;10682:397:18;3586:57:4;719:10:1;-1:-1:-1;;;;;3675:21:4;;;;:62;;-1:-1:-1;3700:37:4;3717:5;719:10:1;4422:162:4;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:4;;11286:2:18;3654:165:4;;;11268:21:18;11325:2;11305:18;;;11298:30;11364:34;11344:18;;;11337:62;11435:26;11415:18;;;11408:54;11479:19;;3654:165:4;11084:420:18;3654:165:4;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;4433:546:12:-;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;4563:13:12::1;::::0;4528:11:::1;::::0;:31:::1;::::0;4542:10;;4528:31:::1;:::i;:::-;:48;;4507:119;;;::::0;-1:-1:-1;;;4507:119:12;;12337:2:18;4507:119:12::1;::::0;::::1;12319:21:18::0;12376:2;12356:18;;;12349:30;-1:-1:-1;;;12395:18:18;;;12388:54;12459:18;;4507:119:12::1;12135:348:18::0;4507:119:12::1;4644:21:::0;4636:54:::1;;;::::0;-1:-1:-1;;;4636:54:12;;12690:2:18;4636:54:12::1;::::0;::::1;12672:21:18::0;12729:2;12709:18;;;12702:30;-1:-1:-1;;;12748:18:18;;;12741:50;12808:18;;4636:54:12::1;12488:344:18::0;4636:54:12::1;4706:11;4701:272;4723:23:::0;;::::1;4701:272;;;4804:1;4777:10:::0;;4788:3;4777:15;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4777:29:12::1;;;4769:54;;;::::0;-1:-1:-1;;;4769:54:12;;13171:2:18;4769:54:12::1;::::0;::::1;13153:21:18::0;13210:2;13190:18;;;13183:30;-1:-1:-1;;;13229:18:18;;;13222:42;13281:18;;4769:54:12::1;12969:336:18::0;4769:54:12::1;4837:21;:9;1032:19:2::0;;1050:1;1032:19;;;945:123;4837:21:12::1;4872:47;4882:10;;4893:3;4882:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4899:9;918:14:2::0;4872:9:12::1;:47::i;4899:19::-;4872:9;:47::i;:::-;4947:11;::::0;:15:::1;::::0;4961:1:::1;4947:15;:::i;:::-;4933:11;:29:::0;4748:5;::::1;::::0;::::1;:::i;:::-;;;;4701:272;;4944:553:15::0;-1:-1:-1;;;;;5019:16:15;;5038:1;5019:16;;;:7;:16;;;;;;5011:71;;;;-1:-1:-1;;;5011:71:15;;;;;;;:::i;:::-;5093:21;5141:15;3591:14;;;3519:93;5141:15;5117:39;;:21;:39;:::i;:::-;5093:63;;5166:15;5184:58;5200:7;5209:13;5224:17;5233:7;-1:-1:-1;;;;;4245:18:15;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;5224:17;5184:15;:58::i;:::-;5166:76;-1:-1:-1;5261:12:15;5253:68;;;;-1:-1:-1;;;5253:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;5332:18:15;;;;;;:9;:18;;;;;:29;;5354:7;;5332:18;:29;;5354:7;;5332:29;:::i;:::-;;;;;;;;5389:7;5371:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5407:35:15;;-1:-1:-1;5425:7:15;5434;5407:17;:35::i;:::-;5457:33;;;-1:-1:-1;;;;;206:32:18;;188:51;;270:2;255:18;;248:34;;;5457:33:15;;161:18:18;5457:33:15;;;;;;;5001:496;;4944:553;:::o;4646:330:4:-;4835:41;719:10:1;4868:7:4;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:4;;;;;;;:::i;:::-;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;2101:102:12:-;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;2147:12:12::1;:20:::0;;-1:-1:-1;;2177:19:12;;;2101:102::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:5;;15176:2:18;1406:87:5;;;15158:21:18;15215:2;15195:18;;;15188:30;15254:34;15234:18;;;15227:62;-1:-1:-1;;;15305:18:18;;;15298:41;15356:19;;1406:87:5;14974:407:18;1406:87:5;-1:-1:-1;;;;;;1510:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;5758:628:15:-;-1:-1:-1;;;;;5839:16:15;;5858:1;5839:16;;;:7;:16;;;;;;5831:71;;;;-1:-1:-1;;;5831:71:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:15;;5913:21;3847:26;;;:19;:26;;;;;;5937:30;;-1:-1:-1;;;5937:30:15;;5961:4;5937:30;;;1953:51:18;-1:-1:-1;;;;;5937:15:15;;;;;1926:18:18;;5937:30:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;5913:77;;6000:15;6018:65;6034:7;6043:13;6058:24;6067:5;6074:7;-1:-1:-1;;;;;4529:21:15;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;6018:65;6000:83;-1:-1:-1;6102:12:15;6094:68;;;;-1:-1:-1;;;6094:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;6173:21:15;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6207:7;;6173:21;:41;;6207:7;;6173:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6224:26:15;;;;;;:19;:26;;;;;:37;;6254:7;;6224:26;:37;;6254:7;;6224:37;:::i;:::-;;;;-1:-1:-1;6272:47:15;;-1:-1:-1;6295:5:15;6302:7;6311;6272:22;:47::i;:::-;6334:45;;;-1:-1:-1;;;;;206:32:18;;;188:51;;270:2;255:18;;248:34;;;6334:45:15;;;;;161:18:18;6334:45:15;;;;;;;5821:565;;5758:628;;:::o;1797:230:5:-;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:5;;15777:2:18;1891:95:5;;;15759:21:18;15816:2;15796:18;;;15789:30;15855:34;15835:18;;;15828:62;-1:-1:-1;;;15906:18:18;;;15899:42;15958:19;;1891:95:5;15575:408:18;1891:95:5;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;2209:110:12:-;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;2289:23:12::1;:7;2299:13:::0;;2289:23:::1;:::i;2111:235:4:-:0;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:4;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:4;;16190:2:18;2244:73:4;;;16172:21:18;16229:2;16209:18;;;16202:30;16268:34;16248:18;;;16241:62;-1:-1:-1;;;16319:18:18;;;16312:39;16368:19;;2244:73:4;15988:405:18;1168:21:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1849:205:4:-;1921:7;-1:-1:-1;;;;;1948:19:4;;1940:74;;;;-1:-1:-1;;;1940:74:4;;16600:2:18;1940:74:4;;;16582:21:18;16639:2;16619:18;;;16612:30;16678:34;16658:18;;;16651:62;-1:-1:-1;;;16729:18:18;;;16722:40;16779:19;;1940:74:4;16398:406:18;1940:74:4;-1:-1:-1;;;;;;2031:16:4;;;;;:9;:16;;;;;;;1849:205::o;1661:101:14:-;1101:6;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4652:98:15:-;4703:7;4729;4737:5;4729:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4729:14:15;;4652:98;-1:-1:-1;;4652:98:15:o;1849:134:12:-;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;1921:12:12::1;:19:::0;;-1:-1:-1;;1921:19:12::1;;;::::0;;1950:11:::1;:26:::0;1849:134::o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;3795:632:12:-;3861:11;;;;3853:37;;;;-1:-1:-1;;;3853:37:12;;17011:2:18;3853:37:12;;;16993:21:18;17050:2;17030:18;;;17023:30;-1:-1:-1;;;17069:18:18;;;17062:43;17122:18;;3853:37:12;16809:337:18;3853:37:12;3919:1;3909:7;:11;3901:35;;;;-1:-1:-1;;;3901:35:12;;17353:2:18;3901:35:12;;;17335:21:18;17392:2;17372:18;;;17365:30;-1:-1:-1;;;17411:18:18;;;17404:41;17462:18;;3901:35:12;17151:335:18;3901:35:12;3965:1;3954:7;:12;;3946:50;;;;-1:-1:-1;;;3946:50:12;;17693:2:18;3946:50:12;;;17675:21:18;17732:2;17712:18;;;17705:30;17771:27;17751:18;;;17744:55;17816:18;;3946:50:12;17491:349:18;3946:50:12;4053:13;;4042:7;4028:11;;:21;;;;:::i;:::-;:38;;4007:104;;;;-1:-1:-1;;;4007:104:12;;18047:2:18;4007:104:12;;;18029:21:18;18086:2;18066:18;;;18059:30;-1:-1:-1;;;18105:18:18;;;18098:49;18164:18;;4007:104:12;17845:343:18;4007:104:12;4162:9;4151:7;4142:6;;:16;;;;:::i;:::-;:29;;4121:101;;;;-1:-1:-1;;;4121:101:12;;18568:2:18;4121:101:12;;;18550:21:18;18607:2;18587:18;;;18580:30;-1:-1:-1;;;18626:18:18;;;18619:55;18691:18;;4121:101:12;18366:349:18;4121:101:12;4237:11;4232:189;4260:7;4254:3;:13;4232:189;;;4290:21;:9;1032:19:2;;1050:1;1032:19;;;945:123;4290:21:12;4325:42;4335:10;4347:19;:9;918:14:2;;827:112;4325:42:12;4395:11;;:15;;4409:1;4395:15;:::i;:::-;4381:11;:29;4269:5;;;;:::i;:::-;;;;4232:189;;;;3795:632;:::o;4203:153:4:-;4297:52;719:10:1;4330:8:4;4340;4297:18;:52::i;5287:320::-;5456:41;719:10:1;5489:7:4;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:4;;;;;;;:::i;:::-;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;2894:895:12:-;2984:12;;;;;;;2976:41;;;;-1:-1:-1;;;2976:41:12;;18922:2:18;2976:41:12;;;18904:21:18;18961:2;18941:18;;;18934:30;-1:-1:-1;;;18980:18:18;;;18973:46;19036:18;;2976:41:12;18720:340:18;2976:41:12;3036:11;;;;3035:12;3027:41;;;;-1:-1:-1;;;3027:41:12;;18922:2:18;3027:41:12;;;18904:21:18;18961:2;18941:18;;;18934:30;-1:-1:-1;;;18980:18:18;;;18973:46;19036:18;;3027:41:12;18720:340:18;3027:41:12;3125:13;;3114:7;3100:11;;:21;;;;:::i;:::-;:38;;3079:104;;;;-1:-1:-1;;;3079:104:12;;18047:2:18;3079:104:12;;;18029:21:18;18086:2;18066:18;;;18059:30;-1:-1:-1;;;18105:18:18;;;18098:49;18164:18;;3079:104:12;17845:343:18;3079:104:12;3234:9;3223:7;3214:6;;:16;;;;:::i;:::-;:29;;3193:101;;;;-1:-1:-1;;;3193:101:12;;18568:2:18;3193:101:12;;;18550:21:18;18607:2;18587:18;;;18580:30;-1:-1:-1;;;18626:18:18;;;18619:55;18691:18;;3193:101:12;18366:349:18;3193:101:12;3366:16;;3341:10;3325:27;;;;:15;:27;;;;;;:37;;3355:7;;3325:37;:::i;:::-;:57;;3304:128;;;;-1:-1:-1;;;3304:128:12;;19267:2:18;3304:128:12;;;19249:21:18;19306:2;19286:18;;;19279:30;19345:26;19325:18;;;19318:54;19389:18;;3304:128:12;19065:348:18;3304:128:12;3450:25;3457:10;3469:5;3450:6;:25::i;:::-;3442:66;;;;-1:-1:-1;;;3442:66:12;;19620:2:18;3442:66:12;;;19602:21:18;19659:2;19639:18;;;19632:30;19698;19678:18;;;19671:58;19746:18;;3442:66:12;19418:352:18;3442:66:12;3524:11;3519:264;3547:7;3541:3;:13;3519:264;;;3577:21;:9;1032:19:2;;1050:1;1032:19;;;945:123;3577:21:12;3612:42;3622:10;3634:19;:9;918:14:2;;827:112;3612:42:12;3714:10;3698:27;;;;:15;:27;;;;;;:31;;3728:1;3698:31;:::i;:::-;3684:10;3668:27;;;;:15;:27;;;;;:61;3757:11;;:15;;3771:1;3757:15;:::i;:::-;3743:11;:29;3556:5;;;;:::i;:::-;;;;3519:264;;1195:37;;;;;;;:::i;2457:302::-;7144:4:4;7167:16;;;:7;:16;;;;;;2530:13:12;;-1:-1:-1;;;;;7167:16:4;2555:46:12;;;;-1:-1:-1;;;2555:46:12;;19977:2:18;2555:46:12;;;19959:21:18;20016:2;19996:18;;;19989:30;-1:-1:-1;;;20035:18:18;;;20028:47;20092:18;;2555:46:12;19775:341:18;2555:46:12;2611:18;2632:10;:8;:10::i;:::-;2611:31;;2680:1;2665:4;2659:18;:22;:93;;;;;;;;;;;;;;;;;2708:4;2713:18;:7;:16;:18::i;:::-;2732:13;2691:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2659:93;2652:100;2457:302;-1:-1:-1;;;2457:302:12:o;4985:447::-;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;5109:13:12::1;;5098:7;5084:11;;:21;;;;:::i;:::-;:38;;5063:109;;;::::0;-1:-1:-1;;;5063:109:12;;12337:2:18;5063:109:12::1;::::0;::::1;12319:21:18::0;12376:2;12356:18;;;12349:30;-1:-1:-1;;;12395:18:18;;;12388:54;12459:18;;5063:109:12::1;12135:348:18::0;5063:109:12::1;-1:-1:-1::0;;;;;5190:22:12;::::1;5182:47;;;::::0;-1:-1:-1;;;5182:47:12;;13171:2:18;5182:47:12::1;::::0;::::1;13153:21:18::0;13210:2;13190:18;;;13183:30;-1:-1:-1;;;13229:18:18;;;13222:42;13281:18;;5182:47:12::1;12969:336:18::0;5182:47:12::1;5244:11;5239:187;5267:7;5261:3;:13;5239:187;;;5297:21;:9;1032:19:2::0;;1050:1;1032:19;;;945:123;5297:21:12::1;5332:40;5342:8;5352:19;:9;918:14:2::0;;827:112;5332:40:12::1;5400:11;::::0;:15:::1;::::0;5414:1:::1;5400:15;:::i;:::-;5386:11;:29:::0;5276:5;::::1;::::0;::::1;:::i;:::-;;;;5239:187;;2325:126:::0;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;2411:33:12;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;1989:106::-:0;1101:6:14;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;2040:12:12::1;:20:::0;;-1:-1:-1;;2070:18:12;2040:12:::1;2070:18;::::0;;1989:106::o;1911:198:14:-;1101:6;;-1:-1:-1;;;;;1101:6:14;719:10:1;1241:23:14;1233:68;;;;-1:-1:-1;;;1233:68:14;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:14;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:14;;21981:2:18;1991:73:14::1;::::0;::::1;21963:21:18::0;22020:2;22000:18;;;21993:30;22059:34;22039:18;;;22032:62;-1:-1:-1;;;22110:18:18;;;22103:36;22156:19;;1991:73:14::1;21779:402:18::0;1991:73:14::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1490:300:4:-;1592:4;-1:-1:-1;;;;;;1627:40:4;;-1:-1:-1;;;1627:40:4;;:104;;-1:-1:-1;;;;;;;1683:48:4;;-1:-1:-1;;;1683:48:4;1627:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:3;;;1747:36:4;829:155:3;10930:171:4;11004:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11004:29:4;-1:-1:-1;;;;;11004:29:4;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;-1:-1:-1;;;;;11048:46:4;;;;;;;;;;;10930:171;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;6558:242:15:-;6763:12;;-1:-1:-1;;;;;6743:16:15;;6700:7;6743:16;;;:7;:16;;;;;;6700:7;;6778:15;;6727:32;;:13;:32;:::i;:::-;6726:49;;;;:::i;:::-;:67;;;;:::i;:::-;6719:74;6558:242;-1:-1:-1;;;;6558:242:15:o;2065:312:0:-;2179:6;2154:21;:31;;2146:73;;;;-1:-1:-1;;;2146:73:0;;22775:2:18;2146:73:0;;;22757:21:18;22814:2;22794:18;;;22787:30;22853:31;22833:18;;;22826:59;22902:18;;2146:73:0;22573:353:18;2146:73:0;2231:12;2249:9;-1:-1:-1;;;;;2249:14:0;2271:6;2249:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:52;;;2300:7;2292:78;;;;-1:-1:-1;;;2292:78:0;;23343:2:18;2292:78:0;;;23325:21:18;23382:2;23362:18;;;23355:30;23421:34;23401:18;;;23394:62;23492:28;23472:18;;;23465:56;23538:19;;2292:78:0;23141:422:18;7362:344:4;7455:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;7471:73;;;;-1:-1:-1;;;7471:73:4;;23770:2:18;7471:73:4;;;23752:21:18;23809:2;23789:18;;;23782:30;23848:34;23828:18;;;23821:62;-1:-1:-1;;;23899:18:18;;;23892:42;23951:19;;7471:73:4;23568:408:18;7471:73:4;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:4;:7;-1:-1:-1;;;;;7611:16:4;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:4;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:4;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:4;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7603:96;7362:344;-1:-1:-1;;;;7362:344:4:o;10259:560::-;10413:4;-1:-1:-1;;;;;10386:31:4;:23;10401:7;10386:14;:23::i;:::-;-1:-1:-1;;;;;10386:31:4;;10378:85;;;;-1:-1:-1;;;10378:85:4;;24183:2:18;10378:85:4;;;24165:21:18;24222:2;24202:18;;;24195:30;24261:34;24241:18;;;24234:62;-1:-1:-1;;;24312:18:18;;;24305:39;24361:19;;10378:85:4;23981:405:18;10378:85:4;-1:-1:-1;;;;;10481:16:4;;10473:65;;;;-1:-1:-1;;;10473:65:4;;24593:2:18;10473:65:4;;;24575:21:18;24632:2;24612:18;;;24605:30;24671:34;24651:18;;;24644:62;-1:-1:-1;;;24722:18:18;;;24715:34;24766:19;;10473:65:4;24391:400:18;10473:65:4;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;-1:-1:-1;;;;;10690:15:4;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10720:13:4;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10748:21:4;-1:-1:-1;;;;;10748:21:4;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;687:205:16:-;826:58;;;-1:-1:-1;;;;;206:32:18;;826:58:16;;;188:51:18;255:18;;;;248:34;;;826:58:16;;;;;;;;;;161:18:18;;;;826:58:16;;;;;;;;-1:-1:-1;;;;;826:58:16;-1:-1:-1;;;826:58:16;;;799:86;;819:5;;799:19;:86::i;2263:187:14:-;2355:6;;;-1:-1:-1;;;;;2371:17:14;;;-1:-1:-1;;;;;;2371:17:14;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;11236:307:4:-;11386:8;-1:-1:-1;;;;;11377:17:4;:5;-1:-1:-1;;;;;11377:17:4;;;11369:55;;;;-1:-1:-1;;;11369:55:4;;24998:2:18;11369:55:4;;;24980:21:18;25037:2;25017:18;;;25010:30;25076:27;25056:18;;;25049:55;25121:18;;11369:55:4;24796:349:18;11369:55:4;-1:-1:-1;;;;;11434:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11434:46:4;;;;;;;;;;11495:41;;819::18;;;11495::4;;792:18:18;11495:41:4;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:4;;;;;;;:::i;5542:215:12:-;5663:25;;-1:-1:-1;;25718:2:18;25714:15;;;25710:53;5663:25:12;;;25698:66:18;5622:4:12;;;;25780:12:18;;5663:25:12;;;;;;;;;;;;5653:36;;;;;;5638:51;;5706:44;5725:5;5732:11;;5745:4;5706:18;:44::i;5438:98::-;5490:13;5522:7;5515:14;;;;;:::i;328:703:17:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:17;;;;;;;;;;;;-1:-1:-1;;;627:10:17;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:17;;-1:-1:-1;773:2:17;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:17;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:17;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:17;;;;;;;;-1:-1:-1;972:11:17;981:2;972:11;;:::i;:::-;;;844:150;;8365:311:4;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:4;;;;;;;:::i;2623:572:5:-;-1:-1:-1;;;;;2822:18:5;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:5;:4;-1:-1:-1;;;;;2917:10:5;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:5;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:5;:2;-1:-1:-1;;;;;3112:10:5;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;3193:706:16:-;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:16;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:16;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:16;;26372:2:18;3797:85:16;;;26354:21:18;26411:2;26391:18;;;26384:30;26450:34;26430:18;;;26423:62;-1:-1:-1;;;26501:18:18;;;26494:40;26551:19;;3797:85:16;26170:406:18;12096:778:4;12246:4;-1:-1:-1;;;;;12266:13:4;;1087:20:0;1133:8;12262:606:4;;12301:72;;-1:-1:-1;;;12301:72:4;;-1:-1:-1;;;;;12301:36:4;;;;;:72;;719:10:1;;12352:4:4;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:4;;;;;;;;-1:-1:-1;;12301:72:4;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:4;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:4;;;;;;;:::i;12536:266::-;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;-1:-1:-1;;;;;;12423:51:4;-1:-1:-1;;;12423:51:4;;-1:-1:-1;12416:58:4;;12262:606;-1:-1:-1;12853:4:4;12096:778;;;;;;:::o;847:184:13:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:13:o;8998:372:4:-;-1:-1:-1;;;;;9077:16:4;;9069:61;;;;-1:-1:-1;;;9069:61:4;;27531:2:18;9069:61:4;;;27513:21:18;;;27550:18;;;27543:30;27609:34;27589:18;;;27582:62;27661:18;;9069:61:4;27329:356:18;9069:61:4;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;:30;9140:58;;;;-1:-1:-1;;;9140:58:4;;27892:2:18;9140:58:4;;;27874:21:18;27931:2;27911:18;;;27904:30;27970;27950:18;;;27943:58;28018:18;;9140:58:4;27690:352:18;9140:58:4;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:4;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9293:21:4;-1:-1:-1;;;;;9293:21:4;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;4679:970:5:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:5;;;5149:323;;-1:-1:-1;;;;;5219:18:5;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:5;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:5;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:5;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:5:o;3514:223:0:-;3647:12;3678:52;3700:6;3708:4;3714:1;3717:12;3678:21;:52::i;1383:688:13:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;28336:19:18;;;28371:12;;;28364:28;;;28408:12;;1779:44:13;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;28336:19:18;;;28371:12;;;28364:28;;;28408:12;;1966:44:13;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:13;;;;:::i;:::-;;;;1522:514;;;-1:-1:-1;2052:12:13;1383:688;-1:-1:-1;;;1383:688:13:o;4601:499:0:-;4766:12;4823:5;4798:21;:30;;4790:81;;;;-1:-1:-1;;;4790:81:0;;28633:2:18;4790:81:0;;;28615:21:18;28672:2;28652:18;;;28645:30;28711:34;28691:18;;;28684:62;-1:-1:-1;;;28762:18:18;;;28755:36;28808:19;;4790:81:0;28431:402:18;4790:81:0;1087:20;;4881:60;;;;-1:-1:-1;;;4881:60:0;;29040:2:18;4881:60:0;;;29022:21:18;29079:2;29059:18;;;29052:30;29118:31;29098:18;;;29091:59;29167:18;;4881:60:0;28838:353:18;4881:60:0;4953:12;4967:23;4994:6;-1:-1:-1;;;;;4994:11:0;5013:5;5020:4;4994:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:73;;;;5042:51;5059:7;5068:10;5080:12;5042:16;:51::i;:::-;5035:58;4601:499;-1:-1:-1;;;;;;;4601:499:0:o;7214:692::-;7360:12;7388:7;7384:516;;;-1:-1:-1;7418:10:0;7411:17;;7384:516;7529:17;;:21;7525:365;;7723:10;7717:17;7783:15;7770:10;7766:2;7762:19;7755:44;7525:365;7862:12;7855:20;;-1:-1:-1;;;7855:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;293:131:18;-1:-1:-1;;;;;;367:32:18;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:258::-;943:1;953:113;967:6;964:1;961:13;953:113;;;1043:11;;;1037:18;1024:11;;;1017:39;989:2;982:10;953:113;;;1084:6;1081:1;1078:13;1075:48;;;-1:-1:-1;;1119:1:18;1101:16;;1094:27;871:258::o;1134:::-;1176:3;1214:5;1208:12;1241:6;1236:3;1229:19;1257:63;1313:6;1306:4;1301:3;1297:14;1290:4;1283:5;1279:16;1257:63;:::i;:::-;1374:2;1353:15;-1:-1:-1;;1349:29:18;1340:39;;;;1381:4;1336:50;;1134:258;-1:-1:-1;;1134:258:18:o;1397:220::-;1546:2;1535:9;1528:21;1509:4;1566:45;1607:2;1596:9;1592:18;1584:6;1566:45;:::i;1622:180::-;1681:6;1734:2;1722:9;1713:7;1709:23;1705:32;1702:52;;;1750:1;1747;1740:12;1702:52;-1:-1:-1;1773:23:18;;1622:180;-1:-1:-1;1622:180:18:o;2015:131::-;-1:-1:-1;;;;;2090:31:18;;2080:42;;2070:70;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:18:o;2471:615::-;2557:6;2565;2618:2;2606:9;2597:7;2593:23;2589:32;2586:52;;;2634:1;2631;2624:12;2586:52;2674:9;2661:23;2703:18;2744:2;2736:6;2733:14;2730:34;;;2760:1;2757;2750:12;2730:34;2798:6;2787:9;2783:22;2773:32;;2843:7;2836:4;2832:2;2828:13;2824:27;2814:55;;2865:1;2862;2855:12;2814:55;2905:2;2892:16;2931:2;2923:6;2920:14;2917:34;;;2947:1;2944;2937:12;2917:34;3000:7;2995:2;2985:6;2982:1;2978:14;2974:2;2970:23;2966:32;2963:45;2960:65;;;3021:1;3018;3011:12;2960:65;3052:2;3044:11;;;;;3074:6;;-1:-1:-1;2471:615:18;;-1:-1:-1;;;;2471:615:18:o;3273:255::-;3340:6;3393:2;3381:9;3372:7;3368:23;3364:32;3361:52;;;3409:1;3406;3399:12;3361:52;3448:9;3435:23;3467:31;3492:5;3467:31;:::i;3533:456::-;3610:6;3618;3626;3679:2;3667:9;3658:7;3654:23;3650:32;3647:52;;;3695:1;3692;3685:12;3647:52;3734:9;3721:23;3753:31;3778:5;3753:31;:::i;:::-;3803:5;-1:-1:-1;3860:2:18;3845:18;;3832:32;3873:33;3832:32;3873:33;:::i;:::-;3533:456;;3925:7;;-1:-1:-1;;;3979:2:18;3964:18;;;;3951:32;;3533:456::o;3994:403::-;4077:6;4085;4138:2;4126:9;4117:7;4113:23;4109:32;4106:52;;;4154:1;4151;4144:12;4106:52;4193:9;4180:23;4212:31;4237:5;4212:31;:::i;:::-;4262:5;-1:-1:-1;4319:2:18;4304:18;;4291:32;4332:33;4291:32;4332:33;:::i;:::-;4384:7;4374:17;;;3994:403;;;;;:::o;4402:592::-;4473:6;4481;4534:2;4522:9;4513:7;4509:23;4505:32;4502:52;;;4550:1;4547;4540:12;4502:52;4590:9;4577:23;4619:18;4660:2;4652:6;4649:14;4646:34;;;4676:1;4673;4666:12;4646:34;4714:6;4703:9;4699:22;4689:32;;4759:7;4752:4;4748:2;4744:13;4740:27;4730:55;;4781:1;4778;4771:12;4730:55;4821:2;4808:16;4847:2;4839:6;4836:14;4833:34;;;4863:1;4860;4853:12;4833:34;4908:7;4903:2;4894:6;4890:2;4886:15;4882:24;4879:37;4876:57;;;4929:1;4926;4919:12;5618:118;5704:5;5697:13;5690:21;5683:5;5680:32;5670:60;;5726:1;5723;5716:12;5741:382;5806:6;5814;5867:2;5855:9;5846:7;5842:23;5838:32;5835:52;;;5883:1;5880;5873:12;5835:52;5922:9;5909:23;5941:31;5966:5;5941:31;:::i;:::-;5991:5;-1:-1:-1;6048:2:18;6033:18;;6020:32;6061:30;6020:32;6061:30;:::i;6128:127::-;6189:10;6184:3;6180:20;6177:1;6170:31;6220:4;6217:1;6210:15;6244:4;6241:1;6234:15;6260:275;6331:2;6325:9;6396:2;6377:13;;-1:-1:-1;;6373:27:18;6361:40;;6431:18;6416:34;;6452:22;;;6413:62;6410:88;;;6478:18;;:::i;:::-;6514:2;6507:22;6260:275;;-1:-1:-1;6260:275:18:o;6540:406::-;6604:5;6638:18;6630:6;6627:30;6624:56;;;6660:18;;:::i;:::-;6698:57;6743:2;6722:15;;-1:-1:-1;;6718:29:18;6749:4;6714:40;6698:57;:::i;:::-;6689:66;;6778:6;6771:5;6764:21;6818:3;6809:6;6804:3;6800:16;6797:25;6794:45;;;6835:1;6832;6825:12;6794:45;6884:6;6879:3;6872:4;6865:5;6861:16;6848:43;6938:1;6931:4;6922:6;6915:5;6911:18;6907:29;6900:40;6540:406;;;;;:::o;6951:794::-;7046:6;7054;7062;7070;7123:3;7111:9;7102:7;7098:23;7094:33;7091:53;;;7140:1;7137;7130:12;7091:53;7179:9;7166:23;7198:31;7223:5;7198:31;:::i;:::-;7248:5;-1:-1:-1;7305:2:18;7290:18;;7277:32;7318:33;7277:32;7318:33;:::i;:::-;7370:7;-1:-1:-1;7424:2:18;7409:18;;7396:32;;-1:-1:-1;7479:2:18;7464:18;;7451:32;7506:18;7495:30;;7492:50;;;7538:1;7535;7528:12;7492:50;7561:22;;7614:4;7606:13;;7602:27;-1:-1:-1;7592:55:18;;7643:1;7640;7633:12;7592:55;7666:73;7731:7;7726:2;7713:16;7708:2;7704;7700:11;7666:73;:::i;:::-;7656:83;;;6951:794;;;;;;;:::o;7750:1014::-;7843:6;7851;7904:2;7892:9;7883:7;7879:23;7875:32;7872:52;;;7920:1;7917;7910:12;7872:52;7956:9;7943:23;7933:33;;7985:2;8038;8027:9;8023:18;8010:32;8061:18;8102:2;8094:6;8091:14;8088:34;;;8118:1;8115;8108:12;8088:34;8156:6;8145:9;8141:22;8131:32;;8201:7;8194:4;8190:2;8186:13;8182:27;8172:55;;8223:1;8220;8213:12;8172:55;8259:2;8246:16;8281:2;8277;8274:10;8271:36;;;8287:18;;:::i;:::-;8333:2;8330:1;8326:10;8316:20;;8356:28;8380:2;8376;8372:11;8356:28;:::i;:::-;8418:15;;;8488:11;;;8484:20;;;8449:12;;;;8516:19;;;8513:39;;;8548:1;8545;8538:12;8513:39;8572:11;;;;8592:142;8608:6;8603:3;8600:15;8592:142;;;8674:17;;8662:30;;8625:12;;;;8712;;;;8592:142;;;8753:5;8743:15;;;;;;;;7750:1014;;;;;:::o;9036:450::-;9105:6;9158:2;9146:9;9137:7;9133:23;9129:32;9126:52;;;9174:1;9171;9164:12;9126:52;9214:9;9201:23;9247:18;9239:6;9236:30;9233:50;;;9279:1;9276;9269:12;9233:50;9302:22;;9355:4;9347:13;;9343:27;-1:-1:-1;9333:55:18;;9384:1;9381;9374:12;9333:55;9407:73;9472:7;9467:2;9454:16;9449:2;9445;9441:11;9407:73;:::i;9884:380::-;9963:1;9959:12;;;;10006;;;10027:61;;10081:4;10073:6;10069:17;10059:27;;10027:61;10134:2;10126:6;10123:14;10103:18;10100:38;10097:161;;;10180:10;10175:3;10171:20;10168:1;10161:31;10215:4;10212:1;10205:15;10243:4;10240:1;10233:15;10097:161;;9884:380;;;:::o;11509:356::-;11711:2;11693:21;;;11730:18;;;11723:30;11789:34;11784:2;11769:18;;11762:62;11856:2;11841:18;;11509:356::o;11870:127::-;11931:10;11926:3;11922:20;11919:1;11912:31;11962:4;11959:1;11952:15;11986:4;11983:1;11976:15;12002:128;12042:3;12073:1;12069:6;12066:1;12063:13;12060:39;;;12079:18;;:::i;:::-;-1:-1:-1;12115:9:18;;12002:128::o;12837:127::-;12898:10;12893:3;12889:20;12886:1;12879:31;12929:4;12926:1;12919:15;12953:4;12950:1;12943:15;13310:135;13349:3;-1:-1:-1;;13370:17:18;;13367:43;;;13390:18;;:::i;:::-;-1:-1:-1;13437:1:18;13426:13;;13310:135::o;13450:402::-;13652:2;13634:21;;;13691:2;13671:18;;;13664:30;13730:34;13725:2;13710:18;;13703:62;-1:-1:-1;;;13796:2:18;13781:18;;13774:36;13842:3;13827:19;;13450:402::o;13857:407::-;14059:2;14041:21;;;14098:2;14078:18;;;14071:30;14137:34;14132:2;14117:18;;14110:62;-1:-1:-1;;;14203:2:18;14188:18;;14181:41;14254:3;14239:19;;13857:407::o;14556:413::-;14758:2;14740:21;;;14797:2;14777:18;;;14770:30;14836:34;14831:2;14816:18;;14809:62;-1:-1:-1;;;14902:2:18;14887:18;;14880:47;14959:3;14944:19;;14556:413::o;15386:184::-;15456:6;15509:2;15497:9;15488:7;15484:23;15480:32;15477:52;;;15525:1;15522;15515:12;15477:52;-1:-1:-1;15548:16:18;;15386:184;-1:-1:-1;15386:184:18:o;18193:168::-;18233:7;18299:1;18295;18291:6;18287:14;18284:1;18281:21;18276:1;18269:9;18262:17;18258:45;18255:71;;;18306:18;;:::i;:::-;-1:-1:-1;18346:9:18;;18193:168::o;20247:1527::-;20471:3;20509:6;20503:13;20535:4;20548:51;20592:6;20587:3;20582:2;20574:6;20570:15;20548:51;:::i;:::-;20662:13;;20621:16;;;;20684:55;20662:13;20621:16;20706:15;;;20684:55;:::i;:::-;20828:13;;20761:20;;;20801:1;;20888;20910:18;;;;20963;;;;20990:93;;21068:4;21058:8;21054:19;21042:31;;20990:93;21131:2;21121:8;21118:16;21098:18;21095:40;21092:167;;;-1:-1:-1;;;21158:33:18;;21214:4;21211:1;21204:15;21244:4;21165:3;21232:17;21092:167;21275:18;21302:110;;;;21426:1;21421:328;;;;21268:481;;21302:110;-1:-1:-1;;21337:24:18;;21323:39;;21382:20;;;;-1:-1:-1;21302:110:18;;21421:328;20194:1;20187:14;;;20231:4;20218:18;;21516:1;21530:169;21544:8;21541:1;21538:15;21530:169;;;21626:14;;21611:13;;;21604:37;21669:16;;;;21561:10;;21530:169;;;21534:3;;21730:8;21723:5;21719:20;21712:27;;21268:481;-1:-1:-1;21765:3:18;;20247:1527;-1:-1:-1;;;;;;;;;;;20247:1527:18:o;22186:127::-;22247:10;22242:3;22238:20;22235:1;22228:31;22278:4;22275:1;22268:15;22302:4;22299:1;22292:15;22318:120;22358:1;22384;22374:35;;22389:18;;:::i;:::-;-1:-1:-1;22423:9:18;;22318:120::o;22443:125::-;22483:4;22511:1;22508;22505:8;22502:34;;;22516:18;;:::i;:::-;-1:-1:-1;22553:9:18;;22443:125::o;25150:414::-;25352:2;25334:21;;;25391:2;25371:18;;;25364:30;25430:34;25425:2;25410:18;;25403:62;-1:-1:-1;;;25496:2:18;25481:18;;25474:48;25554:3;25539:19;;25150:414::o;25803:112::-;25835:1;25861;25851:35;;25866:18;;:::i;:::-;-1:-1:-1;25900:9:18;;25803:112::o;25920:245::-;25987:6;26040:2;26028:9;26019:7;26015:23;26011:32;26008:52;;;26056:1;26053;26046:12;26008:52;26088:9;26082:16;26107:28;26129:5;26107:28;:::i;26581:489::-;-1:-1:-1;;;;;26850:15:18;;;26832:34;;26902:15;;26897:2;26882:18;;26875:43;26949:2;26934:18;;26927:34;;;26997:3;26992:2;26977:18;;26970:31;;;26775:4;;27018:46;;27044:19;;27036:6;27018:46;:::i;:::-;27010:54;26581:489;-1:-1:-1;;;;;;26581:489:18:o;27075:249::-;27144:6;27197:2;27185:9;27176:7;27172:23;27168:32;27165:52;;;27213:1;27210;27203:12;27165:52;27245:9;27239:16;27264:30;27288:5;27264:30;:::i;28047:127::-;28108:10;28103:3;28099:20;28096:1;28089:31;28139:4;28136:1;28129:15;28163:4;28160:1;28153:15;29196:274;29325:3;29363:6;29357:13;29379:53;29425:6;29420:3;29413:4;29405:6;29401:17;29379:53;:::i;:::-;29448:16;;;;;29196:274;-1:-1:-1;;29196:274:18:o
Swarm Source
ipfs://6aa9be2943caddea482514609a9105e9637d8a75405507b108a63f4bc10118d8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.