ERC-721
Overview
Max Total Supply
60 RP
Holders
25
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 RPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Rockpals
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.7; import "./Ownable.sol"; import "./PaymentSplitter.sol"; import "./MerkleProof.sol"; import "./ERC721Enumerable.sol"; /// @author no-op (nftlab: https://discord.gg/kH7Gvnr2qp) /// @title Rockpals contract Rockpals is ERC721Enumerable, PaymentSplitter, Ownable { /** Maximum number of tokens per tx */ uint256 public constant MAX_TX = 10; /** Maximum number of tokens per wallet */ uint256 public constant MAX_PER_WALLET = 30; /** Maximum amount of tokens in collection */ uint256 public constant MAX_SUPPLY = 4321; /** Base URI */ string public baseURI; /** Merkle tree for whitelist */ bytes32 public merkleRoot; /** Whitelist max per wallet */ uint256 public constant MAX_PER_WHITELIST = 30; /** Public sale state */ bool public saleActive = false; /** Presale state */ bool public presaleActive = false; /** Notify on sale state change */ event SaleStateChanged(bool val); /** Notify on presale state change */ event PresaleStateChanged(bool val); /** Notify on total supply change */ event TotalSupplyChanged(uint256 val); constructor( address[] memory shareholders, uint256[] memory shares ) ERC721("Rockpals", "RP") PaymentSplitter(shareholders, shares) {} /// @notice Returns the URI for a given token /// @param tokenId The token to get a URI for function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Token does not exist."); return string(abi.encodePacked(baseURI, Strings.toString(tokenId))); } /// @notice Checks if an address is whitelisted /// @param addr Address to check /// @param proof Merkle proof function isWhitelisted(address addr, bytes32[] calldata proof) public view returns (bool) { bytes32 _leaf = keccak256(abi.encodePacked(addr)); return MerkleProof.verify(proof, merkleRoot, _leaf); } /// @notice Calculates pack discounts /// @param amt Number being purchased function cost(uint256 amt) public view returns (uint256) { uint256 presaleDiscount = presaleActive ? 0 : 0.01 ether; if (amt % 10 == 0) { return amt * (0.02 ether + presaleDiscount); } if (amt % 3 == 0) { return amt * (0.03 ether + presaleDiscount); } return amt * (0.04 ether + presaleDiscount); } /// @notice Sets public sale state /// @param val The new value function setSaleState(bool val) external onlyOwner { saleActive = val; emit SaleStateChanged(val); } /// @notice Sets presale state /// @param val The new value function setPresaleState(bool val) external onlyOwner { presaleActive = val; emit PresaleStateChanged(val); } /// @notice Sets the whitelist /// @param val Root function setWhitelist(bytes32 val) external onlyOwner { merkleRoot = val; } /// @notice Sets the base metadata URI /// @param val The new URI function setBaseURI(string calldata val) external onlyOwner { baseURI = val; } /// @notice Reserves a set of NFTs for collection owner (giveaways, etc) /// @param amt The amount to reserve function reserve(uint256 amt) external onlyOwner { uint256 _currentSupply = totalSupply(); for (uint256 i = 0; i < amt; i++) { _mint(msg.sender, _currentSupply + i); } emit TotalSupplyChanged(totalSupply()); } /// @notice Mints a new token in public sale /// @param amt The number of tokens to mint /// @dev Must send COST * amt in ETH function mint(uint256 amt) external payable { uint256 _currentSupply = totalSupply(); require(saleActive, "Sale is not yet active."); require(amt <= MAX_TX, "Amount of tokens exceeds transaction limit."); require(balanceOf(msg.sender) + amt <= MAX_PER_WALLET, "Amount of tokens exceeds wallet limit."); require(_currentSupply + amt <= MAX_SUPPLY, "Amount exceeds supply."); require(cost(amt) <= msg.value, "ETH sent is below cost."); for (uint256 i = 0; i < amt; i++) { _safeMint(msg.sender, _currentSupply + i); } emit TotalSupplyChanged(totalSupply()); } /// @notice Mints a new token in presale /// @param amt The number of tokens to mint /// @param proof Merkle proof /// @dev Must send COST * amt in ETH function preMint(uint256 amt, bytes32[] calldata proof) external payable { uint256 _currentSupply = totalSupply(); require(presaleActive, "Presale is not yet active."); require(isWhitelisted(msg.sender, proof), "Address is not whitelisted."); require(balanceOf(msg.sender) + amt <= MAX_PER_WHITELIST, "Amount of tokens exceeds whitelist limit."); require(_currentSupply + amt <= MAX_SUPPLY, "Amount exceeds supply."); require(cost(amt) <= msg.value, "ETH sent is below cost."); for (uint256 i = 0; i < amt; i++) { _safeMint(msg.sender, _currentSupply + i); } emit TotalSupplyChanged(totalSupply()); } /// @notice Burns a token /// @param tokenId The token to be burned /// @dev Must have approval to burn function burn(uint256 tokenId) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn."); _burn(tokenId); } }
// 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/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 pragma solidity ^0.8.7; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Address.sol"; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private _name; string private _symbol; address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; 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 (uint) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ) ++count; } return count; } /** * @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 {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _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); _owners.push(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); _owners[tokenId] = address(0); 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); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./IERC721Enumerable.sol"; import "./ERC721.sol"; abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { /** * @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-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < _owners.length, "ERC721Enumerable: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint count; for(uint i; i < _owners.length; i++){ if(owner == _owners[i]){ if(count == index) return i; else count++; } } revert("ERC721Enumerable: owner index out of bounds"); } }
// 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":[{"internalType":"address[]","name":"shareholders","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":false,"internalType":"bool","name":"val","type":"bool"}],"name":"PresaleStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"val","type":"bool"}],"name":"SaleStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"TotalSupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"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":[{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleActive","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":"uint256","name":"amt","type":"uint256"}],"name":"reserve","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"val","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"val","type":"bytes32"}],"name":"setWhitelist","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":"tokenId","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":[{"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
6080604052600f805461ffff191690553480156200001c57600080fd5b506040516200413d3803806200413d8339810160408190526200003f9162000560565b6040805180820182526008815267526f636b70616c7360c01b602080830191825283518085019094526002845261052560f41b908401528151859385939290916200008d9160009162000440565b508051620000a390600190602084019062000440565b5050508051825114620001185760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200016b5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200010f565b60005b8251811015620001d757620001c283828151811062000191576200019162000729565b6020026020010151838381518110620001ae57620001ae62000729565b6020026020010151620001fc60201b60201c565b80620001ce81620006f5565b9150506200016e565b505050620001f4620001ee620003ea60201b60201c565b620003ee565b505062000755565b6001600160a01b038216620002695760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200010f565b60008111620002bb5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200010f565b6001600160a01b03821660009081526007602052604090205415620003375760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200010f565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b0384169081179091556000908152600760205260409020819055600554620003a19082906200069d565b600555604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200044e90620006b8565b90600052602060002090601f016020900481019282620004725760008555620004bd565b82601f106200048d57805160ff1916838001178555620004bd565b82800160010185558215620004bd579182015b82811115620004bd578251825591602001919060010190620004a0565b50620004cb929150620004cf565b5090565b5b80821115620004cb5760008155600101620004d0565b600082601f830112620004f857600080fd5b81516020620005116200050b8362000677565b62000644565b80838252828201915082860187848660051b89010111156200053257600080fd5b60005b85811015620005535781518452928401929084019060010162000535565b5090979650505050505050565b600080604083850312156200057457600080fd5b82516001600160401b03808211156200058c57600080fd5b818501915085601f830112620005a157600080fd5b81516020620005b46200050b8362000677565b8083825282820191508286018a848660051b8901011115620005d557600080fd5b600096505b84871015620006105780516001600160a01b0381168114620005fb57600080fd5b835260019690960195918301918301620005da565b50918801519196509093505050808211156200062b57600080fd5b506200063a85828601620004e6565b9150509250929050565b604051601f8201601f191681016001600160401b03811182821017156200066f576200066f6200073f565b604052919050565b60006001600160401b038211156200069357620006936200073f565b5060051b60200190565b60008219821115620006b357620006b362000713565b500190565b600181811c90821680620006cd57607f821691505b60208210811415620006ef57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200070c576200070c62000713565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6139d880620007656000396000f3fe6080604052600436106103015760003560e01c80636352211e1161018f578063a0712d68116100e1578063ce7c2ac21161008a578063e985e9c511610064578063e985e9c5146108b2578063f2fde38b146108fb578063f3b2db3f1461091b57600080fd5b8063ce7c2ac214610831578063d79779b214610867578063e33b7de31461089d57600080fd5b8063bce4d6ae116100bb578063bce4d6ae146107d1578063c4e37095146107f1578063c87b56dd1461081157600080fd5b8063a0712d681461077e578063a22cb46514610791578063b88d4fde146107b157600080fd5b8063819b25ba116101435780639097548d1161011d5780639097548d1461071357806395d89b41146107335780639852595c1461074857600080fd5b8063819b25ba146106b55780638b83209b146106d55780638da5cb5b146106f557600080fd5b80636c0360eb116101745780636c0360eb1461066b57806370a0823114610680578063715018a6146106a057600080fd5b80636352211e1461063157806368428a1b1461065157600080fd5b806332cb6b0c1161025357806348b75044116101fc57806355f804b3116101d657806355f804b3146105de5780635a23dd99146105fe5780635a5462231461061e57600080fd5b806348b750441461057f5780634f6ccce71461059f57806353135ca0146105bf57600080fd5b806342842e0e1161022d57806342842e0e1461051f57806342966c681461053f578063440bc7f31461055f57600080fd5b806332cb6b0c146104ae5780633a98ef39146104c4578063406072a9146104d957600080fd5b806318160ddd116102b55780632e0367681161028f5780632e036768146104005780632eb4a7ab146104785780632f745c591461048e57600080fd5b806318160ddd14610423578063191655871461043857806323b872dd1461045857600080fd5b8063081812fc116102e6578063081812fc146103a6578063095ea7b3146103de5780630f2cdd6c1461040057600080fd5b806301ffc9a71461034f57806306fdde031461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a3660046134aa565b610930565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b5061039961098c565b60405161037b9190613735565b3480156103b257600080fd5b506103c66103c1366004613491565b610a1e565b6040516001600160a01b03909116815260200161037b565b3480156103ea57600080fd5b506103fe6103f936600461342b565b610abc565b005b34801561040c57600080fd5b50610415601e81565b60405190815260200161037b565b34801561042f57600080fd5b50600254610415565b34801561044457600080fd5b506103fe610453366004613213565b610bee565b34801561046457600080fd5b506103fe610473366004613269565b610dc8565b34801561048457600080fd5b50610415600e5481565b34801561049a57600080fd5b506104156104a936600461342b565b610e50565b3480156104ba57600080fd5b506104156110e181565b3480156104d057600080fd5b50600554610415565b3480156104e557600080fd5b506104156104f4366004613230565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561052b57600080fd5b506103fe61053a366004613269565b610faf565b34801561054b57600080fd5b506103fe61055a366004613491565b610fca565b34801561056b57600080fd5b506103fe61057a366004613491565b61102b565b34801561058b57600080fd5b506103fe61059a366004613230565b61108a565b3480156105ab57600080fd5b506104156105ba366004613491565b611337565b3480156105cb57600080fd5b50600f5461036f90610100900460ff1681565b3480156105ea57600080fd5b506103fe6105f93660046134e4565b6113b5565b34801561060a57600080fd5b5061036f6106193660046133a8565b61141b565b6103fe61062c36600461356f565b6114b6565b34801561063d57600080fd5b506103c661064c366004613491565b611721565b34801561065d57600080fd5b50600f5461036f9060ff1681565b34801561067757600080fd5b506103996117c1565b34801561068c57600080fd5b5061041561069b366004613213565b61184f565b3480156106ac57600080fd5b506103fe611930565b3480156106c157600080fd5b506103fe6106d0366004613491565b611996565b3480156106e157600080fd5b506103c66106f0366004613491565b611a6d565b34801561070157600080fd5b50600c546001600160a01b03166103c6565b34801561071f57600080fd5b5061041561072e366004613491565b611a9d565b34801561073f57600080fd5b50610399611b27565b34801561075457600080fd5b50610415610763366004613213565b6001600160a01b031660009081526008602052604090205490565b6103fe61078c366004613491565b611b36565b34801561079d57600080fd5b506103fe6107ac3660046133fd565b611d75565b3480156107bd57600080fd5b506103fe6107cc3660046132aa565b611e58565b3480156107dd57600080fd5b506103fe6107ec366004613457565b611ee6565b3480156107fd57600080fd5b506103fe61080c366004613457565b611fb1565b34801561081d57600080fd5b5061039961082c366004613491565b61206a565b34801561083d57600080fd5b5061041561084c366004613213565b6001600160a01b031660009081526007602052604090205490565b34801561087357600080fd5b50610415610882366004613213565b6001600160a01b03166000908152600a602052604090205490565b3480156108a957600080fd5b50600654610415565b3480156108be57600080fd5b5061036f6108cd366004613230565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561090757600080fd5b506103fe610916366004613213565b6120f3565b34801561092757600080fd5b50610415600a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806109865750610986826121d2565b92915050565b60606000805461099b906137f4565b80601f01602080910402602001604051908101604052809291908181526020018280546109c7906137f4565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b6000610a29826122b5565b610aa05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610ac782611721565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a97565b336001600160a01b0382161480610b6d5750610b6d81336108cd565b610bdf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a97565b610be983836122ff565b505050565b6001600160a01b038116600090815260076020526040902054610c795760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a97565b6000610c8460065490565b610c8e9047613748565b90506000610cbb8383610cb6866001600160a01b031660009081526008602052604090205490565b612385565b905080610d305760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b03831660009081526008602052604081208054839290610d58908490613748565b925050819055508060066000828254610d719190613748565b90915550610d81905083826123cb565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610dd3335b826124e4565b610e455760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a97565b610be98383836125db565b6000610e5b8361184f565b8210610ecf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a97565b6000805b600254811015610f405760028181548110610ef057610ef06138f3565b6000918252602090912001546001600160a01b0386811691161415610f2e5783821415610f205791506109869050565b81610f2a81613848565b9250505b80610f3881613848565b915050610ed3565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a97565b610be983838360405180602001604052806000815250611e58565b610fd333610dcd565b61101f5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e00000000000000000000006044820152606401610a97565b61102881612776565b50565b600c546001600160a01b031633146110855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600e55565b6001600160a01b0381166000908152600760205260409020546111155760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b0382166000908152600a60205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190613556565b6111c89190613748565b905060006112018383610cb687876001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b9050806112765760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b038085166000908152600b60209081526040808320938716835292905290812080548392906112ad908490613748565b90915550506001600160a01b0384166000908152600a6020526040812080548392906112da908490613748565b909155506112eb9050848483612810565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60025460009082106113b15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a97565b5090565b600c546001600160a01b0316331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b610be9600d8383613119565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506114ab84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612890565b9150505b9392505050565b60006114c160025490565b600f54909150610100900460ff1661151b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206973206e6f7420796574206163746976652e0000000000006044820152606401610a97565b61152633848461141b565b6115725760405162461bcd60e51b815260206004820152601b60248201527f41646472657373206973206e6f742077686974656c69737465642e00000000006044820152606401610a97565b601e8461157e3361184f565b6115889190613748565b11156115fc5760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206f6620746f6b656e7320657863656564732077686974656c6960448201527f7374206c696d69742e00000000000000000000000000000000000000000000006064820152608401610a97565b6110e16116098583613748565b11156116575760405162461bcd60e51b815260206004820152601660248201527f416d6f756e74206578636565647320737570706c792e000000000000000000006044820152606401610a97565b3461166185611a9d565b11156116af5760405162461bcd60e51b815260206004820152601760248201527f4554482073656e742069732062656c6f7720636f73742e0000000000000000006044820152606401610a97565b60005b848110156116df576116cd336116c88385613748565b6128a6565b806116d781613848565b9150506116b2565b507fc8b17f75f53401f272e9ee7fa431e81ba33779363238896180425a422420c8f761170a60025490565b60405190815260200160405180910390a150505050565b60008060028381548110611737576117376138f3565b6000918252602090912001546001600160a01b03169050806109865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a97565b600d80546117ce906137f4565b80601f01602080910402602001604051908101604052809291908181526020018280546117fa906137f4565b80156118475780601f1061181c57610100808354040283529160200191611847565b820191906000526020600020905b81548152906001019060200180831161182a57829003601f168201915b505050505081565b60006001600160a01b0382166118cd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a97565b6000805b60025481101561192957600281815481106118ee576118ee6138f3565b6000918252602090912001546001600160a01b03858116911614156119195761191682613848565b91505b61192281613848565b90506118d1565b5092915050565b600c546001600160a01b0316331461198a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b61199460006128c4565b565b600c546001600160a01b031633146119f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b60006119fb60025490565b905060005b82811015611a2d57611a1b33611a168385613748565b61292e565b80611a2581613848565b915050611a00565b507fc8b17f75f53401f272e9ee7fa431e81ba33779363238896180425a422420c8f7611a5860025490565b60405190815260200160405180910390a15050565b600060098281548110611a8257611a826138f3565b6000918252602090912001546001600160a01b031692915050565b600f546000908190610100900460ff16611abe57662386f26fc10000611ac1565b60005b66ffffffffffffff169050611ad7600a84613881565b611af657611aec8166470de4df820000613748565b6114af9084613774565b611b01600384613881565b611b1657611aec81666a94d74f430000613748565b611aec81668e1bc9bf040000613748565b60606001805461099b906137f4565b6000611b4160025490565b600f5490915060ff16611b965760405162461bcd60e51b815260206004820152601760248201527f53616c65206973206e6f7420796574206163746976652e0000000000000000006044820152606401610a97565b600a821115611c0d5760405162461bcd60e51b815260206004820152602b60248201527f416d6f756e74206f6620746f6b656e732065786365656473207472616e73616360448201527f74696f6e206c696d69742e0000000000000000000000000000000000000000006064820152608401610a97565b601e82611c193361184f565b611c239190613748565b1115611c975760405162461bcd60e51b815260206004820152602660248201527f416d6f756e74206f6620746f6b656e7320657863656564732077616c6c65742060448201527f6c696d69742e00000000000000000000000000000000000000000000000000006064820152608401610a97565b6110e1611ca48383613748565b1115611cf25760405162461bcd60e51b815260206004820152601660248201527f416d6f756e74206578636565647320737570706c792e000000000000000000006044820152606401610a97565b34611cfc83611a9d565b1115611d4a5760405162461bcd60e51b815260206004820152601760248201527f4554482073656e742069732062656c6f7720636f73742e0000000000000000006044820152606401610a97565b60005b82811015611a2d57611d63336116c88385613748565b80611d6d81613848565b915050611d4d565b6001600160a01b038216331415611dce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a97565b3360008181526004602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611e6233836124e4565b611ed45760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a97565b611ee084848484612a6e565b50505050565b600c546001600160a01b03163314611f405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f81490611fa690831515815260200190565b60405180910390a150565b600c546001600160a01b0316331461200b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527fe333f8a36ee86e754548af2d6f50c73ff0d501e22e6c784662123dbbe493c60290602001611fa6565b6060612075826122b5565b6120c15760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006044820152606401610a97565b600d6120cc83612af7565b6040516020016120dd929190613624565b6040516020818303038152906040529050919050565b600c546001600160a01b0316331461214d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b6001600160a01b0381166121c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a97565b611028816128c4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061226557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061098657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610986565b60025460009082108015610986575060006001600160a01b0316600283815481106122e2576122e26138f3565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061234c82611721565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6005546001600160a01b038416600090815260076020526040812054909183916123af9086613774565b6123b99190613760565b6123c391906137b1565b949350505050565b8047101561241b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a97565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612468576040519150601f19603f3d011682016040523d82523d6000602084013e61246d565b606091505b5050905080610be95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a97565b60006124ef826122b5565b6125615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a97565b600061256c83611721565b9050806001600160a01b0316846001600160a01b031614806125a75750836001600160a01b031661259c84610a1e565b6001600160a01b0316145b806123c357506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff166123c3565b826001600160a01b03166125ee82611721565b6001600160a01b03161461266a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b0382166126e55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a97565b6126f06000826122ff565b8160028281548110612704576127046138f3565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600061278182611721565b905061278e6000836122ff565b6000600283815481106127a3576127a36138f3565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610be9908490612c29565b60008261289d8584612d0e565b14949350505050565b6128c0828260405180602001604052806000815250612dba565b5050565b600c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166129845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a97565b61298d816122b5565b156129da5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612a798484846125db565b612a8584848484612e43565b611ee05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b606081612b3757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b615780612b4b81613848565b9150612b5a9050600a83613760565b9150612b3b565b60008167ffffffffffffffff811115612b7c57612b7c613922565b6040519080825280601f01601f191660200182016040528015612ba6576020820181803683370190505b5090505b84156123c357612bbb6001836137b1565b9150612bc8600a86613881565b612bd3906030613748565b60f81b818381518110612be857612be86138f3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c22600a86613760565b9450612baa565b6000612c7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661300e9092919063ffffffff16565b805190915015610be95780806020019051810190612c9c9190613474565b610be95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a97565b600081815b8451811015612db2576000858281518110612d3057612d306138f3565b60200260200101519050808311612d72576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d9f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612daa81613848565b915050612d13565b509392505050565b612dc4838361292e565b612dd16000848484612e43565b610be95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b60006001600160a01b0384163b15613003576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ea09033908990889088906004016136f9565b602060405180830381600087803b158015612eba57600080fd5b505af1925050508015612f08575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f05918101906134c7565b60015b612fb8573d808015612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b508051612fb05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506123c3565b506001949350505050565b60606123c3848460008585843b6130675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a97565b600080866001600160a01b031685876040516130839190613608565b60006040518083038185875af1925050503d80600081146130c0576040519150601f19603f3d011682016040523d82523d6000602084013e6130c5565b606091505b50915091506130d58282866130e0565b979650505050505050565b606083156130ef5750816114af565b8251156130ff5782518084602001fd5b8160405162461bcd60e51b8152600401610a979190613735565b828054613125906137f4565b90600052602060002090601f01602090048101928261314757600085556131ab565b82601f1061317e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008235161785556131ab565b828001600101855582156131ab579182015b828111156131ab578235825591602001919060010190613190565b506113b19291505b808211156113b157600081556001016131b3565b60008083601f8401126131d957600080fd5b50813567ffffffffffffffff8111156131f157600080fd5b6020830191508360208260051b850101111561320c57600080fd5b9250929050565b60006020828403121561322557600080fd5b81356114af81613951565b6000806040838503121561324357600080fd5b823561324e81613951565b9150602083013561325e81613951565b809150509250929050565b60008060006060848603121561327e57600080fd5b833561328981613951565b9250602084013561329981613951565b929592945050506040919091013590565b600080600080608085870312156132c057600080fd5b84356132cb81613951565b935060208501356132db81613951565b925060408501359150606085013567ffffffffffffffff808211156132ff57600080fd5b818701915087601f83011261331357600080fd5b81358181111561332557613325613922565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561336b5761336b613922565b816040528281528a602084870101111561338457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156133bd57600080fd5b83356133c881613951565b9250602084013567ffffffffffffffff8111156133e457600080fd5b6133f0868287016131c7565b9497909650939450505050565b6000806040838503121561341057600080fd5b823561341b81613951565b9150602083013561325e81613966565b6000806040838503121561343e57600080fd5b823561344981613951565b946020939093013593505050565b60006020828403121561346957600080fd5b81356114af81613966565b60006020828403121561348657600080fd5b81516114af81613966565b6000602082840312156134a357600080fd5b5035919050565b6000602082840312156134bc57600080fd5b81356114af81613974565b6000602082840312156134d957600080fd5b81516114af81613974565b600080602083850312156134f757600080fd5b823567ffffffffffffffff8082111561350f57600080fd5b818501915085601f83011261352357600080fd5b81358181111561353257600080fd5b86602082850101111561354457600080fd5b60209290920196919550909350505050565b60006020828403121561356857600080fd5b5051919050565b60008060006040848603121561358457600080fd5b83359250602084013567ffffffffffffffff8111156133e457600080fd5b600081518084526135ba8160208601602086016137c8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516135fe8185602086016137c8565b9290920192915050565b6000825161361a8184602087016137c8565b9190910192915050565b600080845481600182811c91508083168061364057607f831692505b6020808410821415613679577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561368d57600181146136bc576136e9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136e9565b60008b81526020902060005b868110156136e15781548b8201529085019083016136c8565b505084890196505b5050505050506114ab81856135ec565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372b60808301846135a2565b9695505050505050565b6020815260006114af60208301846135a2565b6000821982111561375b5761375b613895565b500190565b60008261376f5761376f6138c4565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ac576137ac613895565b500290565b6000828210156137c3576137c3613895565b500390565b60005b838110156137e35781810151838201526020016137cb565b83811115611ee05750506000910152565b600181811c9082168061380857607f821691505b60208210811415613842577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561387a5761387a613895565b5060010190565b600082613890576138906138c4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461102857600080fd5b801515811461102857600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461102857600080fdfea26469706673582212202872a1f0088be9e985e5342ed0d1d8bf556e34ea812957a5fe46f33bb1b2643a64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006b99d2b10f3cc0ce6b871a9f5f94e1ecd6222f47000000000000000000000000ab24486ec4c95563b34170163e26d4cbc10a8e7b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000055
Deployed Bytecode
0x6080604052600436106103015760003560e01c80636352211e1161018f578063a0712d68116100e1578063ce7c2ac21161008a578063e985e9c511610064578063e985e9c5146108b2578063f2fde38b146108fb578063f3b2db3f1461091b57600080fd5b8063ce7c2ac214610831578063d79779b214610867578063e33b7de31461089d57600080fd5b8063bce4d6ae116100bb578063bce4d6ae146107d1578063c4e37095146107f1578063c87b56dd1461081157600080fd5b8063a0712d681461077e578063a22cb46514610791578063b88d4fde146107b157600080fd5b8063819b25ba116101435780639097548d1161011d5780639097548d1461071357806395d89b41146107335780639852595c1461074857600080fd5b8063819b25ba146106b55780638b83209b146106d55780638da5cb5b146106f557600080fd5b80636c0360eb116101745780636c0360eb1461066b57806370a0823114610680578063715018a6146106a057600080fd5b80636352211e1461063157806368428a1b1461065157600080fd5b806332cb6b0c1161025357806348b75044116101fc57806355f804b3116101d657806355f804b3146105de5780635a23dd99146105fe5780635a5462231461061e57600080fd5b806348b750441461057f5780634f6ccce71461059f57806353135ca0146105bf57600080fd5b806342842e0e1161022d57806342842e0e1461051f57806342966c681461053f578063440bc7f31461055f57600080fd5b806332cb6b0c146104ae5780633a98ef39146104c4578063406072a9146104d957600080fd5b806318160ddd116102b55780632e0367681161028f5780632e036768146104005780632eb4a7ab146104785780632f745c591461048e57600080fd5b806318160ddd14610423578063191655871461043857806323b872dd1461045857600080fd5b8063081812fc116102e6578063081812fc146103a6578063095ea7b3146103de5780630f2cdd6c1461040057600080fd5b806301ffc9a71461034f57806306fdde031461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a3660046134aa565b610930565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b5061039961098c565b60405161037b9190613735565b3480156103b257600080fd5b506103c66103c1366004613491565b610a1e565b6040516001600160a01b03909116815260200161037b565b3480156103ea57600080fd5b506103fe6103f936600461342b565b610abc565b005b34801561040c57600080fd5b50610415601e81565b60405190815260200161037b565b34801561042f57600080fd5b50600254610415565b34801561044457600080fd5b506103fe610453366004613213565b610bee565b34801561046457600080fd5b506103fe610473366004613269565b610dc8565b34801561048457600080fd5b50610415600e5481565b34801561049a57600080fd5b506104156104a936600461342b565b610e50565b3480156104ba57600080fd5b506104156110e181565b3480156104d057600080fd5b50600554610415565b3480156104e557600080fd5b506104156104f4366004613230565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561052b57600080fd5b506103fe61053a366004613269565b610faf565b34801561054b57600080fd5b506103fe61055a366004613491565b610fca565b34801561056b57600080fd5b506103fe61057a366004613491565b61102b565b34801561058b57600080fd5b506103fe61059a366004613230565b61108a565b3480156105ab57600080fd5b506104156105ba366004613491565b611337565b3480156105cb57600080fd5b50600f5461036f90610100900460ff1681565b3480156105ea57600080fd5b506103fe6105f93660046134e4565b6113b5565b34801561060a57600080fd5b5061036f6106193660046133a8565b61141b565b6103fe61062c36600461356f565b6114b6565b34801561063d57600080fd5b506103c661064c366004613491565b611721565b34801561065d57600080fd5b50600f5461036f9060ff1681565b34801561067757600080fd5b506103996117c1565b34801561068c57600080fd5b5061041561069b366004613213565b61184f565b3480156106ac57600080fd5b506103fe611930565b3480156106c157600080fd5b506103fe6106d0366004613491565b611996565b3480156106e157600080fd5b506103c66106f0366004613491565b611a6d565b34801561070157600080fd5b50600c546001600160a01b03166103c6565b34801561071f57600080fd5b5061041561072e366004613491565b611a9d565b34801561073f57600080fd5b50610399611b27565b34801561075457600080fd5b50610415610763366004613213565b6001600160a01b031660009081526008602052604090205490565b6103fe61078c366004613491565b611b36565b34801561079d57600080fd5b506103fe6107ac3660046133fd565b611d75565b3480156107bd57600080fd5b506103fe6107cc3660046132aa565b611e58565b3480156107dd57600080fd5b506103fe6107ec366004613457565b611ee6565b3480156107fd57600080fd5b506103fe61080c366004613457565b611fb1565b34801561081d57600080fd5b5061039961082c366004613491565b61206a565b34801561083d57600080fd5b5061041561084c366004613213565b6001600160a01b031660009081526007602052604090205490565b34801561087357600080fd5b50610415610882366004613213565b6001600160a01b03166000908152600a602052604090205490565b3480156108a957600080fd5b50600654610415565b3480156108be57600080fd5b5061036f6108cd366004613230565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561090757600080fd5b506103fe610916366004613213565b6120f3565b34801561092757600080fd5b50610415600a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806109865750610986826121d2565b92915050565b60606000805461099b906137f4565b80601f01602080910402602001604051908101604052809291908181526020018280546109c7906137f4565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b6000610a29826122b5565b610aa05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b6000610ac782611721565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a97565b336001600160a01b0382161480610b6d5750610b6d81336108cd565b610bdf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a97565b610be983836122ff565b505050565b6001600160a01b038116600090815260076020526040902054610c795760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a97565b6000610c8460065490565b610c8e9047613748565b90506000610cbb8383610cb6866001600160a01b031660009081526008602052604090205490565b612385565b905080610d305760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b03831660009081526008602052604081208054839290610d58908490613748565b925050819055508060066000828254610d719190613748565b90915550610d81905083826123cb565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610dd3335b826124e4565b610e455760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a97565b610be98383836125db565b6000610e5b8361184f565b8210610ecf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a97565b6000805b600254811015610f405760028181548110610ef057610ef06138f3565b6000918252602090912001546001600160a01b0386811691161415610f2e5783821415610f205791506109869050565b81610f2a81613848565b9250505b80610f3881613848565b915050610ed3565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a97565b610be983838360405180602001604052806000815250611e58565b610fd333610dcd565b61101f5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e00000000000000000000006044820152606401610a97565b61102881612776565b50565b600c546001600160a01b031633146110855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600e55565b6001600160a01b0381166000908152600760205260409020546111155760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b0382166000908152600a60205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190613556565b6111c89190613748565b905060006112018383610cb687876001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b9050806112765760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b038085166000908152600b60209081526040808320938716835292905290812080548392906112ad908490613748565b90915550506001600160a01b0384166000908152600a6020526040812080548392906112da908490613748565b909155506112eb9050848483612810565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60025460009082106113b15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a97565b5090565b600c546001600160a01b0316331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b610be9600d8383613119565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506114ab84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612890565b9150505b9392505050565b60006114c160025490565b600f54909150610100900460ff1661151b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206973206e6f7420796574206163746976652e0000000000006044820152606401610a97565b61152633848461141b565b6115725760405162461bcd60e51b815260206004820152601b60248201527f41646472657373206973206e6f742077686974656c69737465642e00000000006044820152606401610a97565b601e8461157e3361184f565b6115889190613748565b11156115fc5760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206f6620746f6b656e7320657863656564732077686974656c6960448201527f7374206c696d69742e00000000000000000000000000000000000000000000006064820152608401610a97565b6110e16116098583613748565b11156116575760405162461bcd60e51b815260206004820152601660248201527f416d6f756e74206578636565647320737570706c792e000000000000000000006044820152606401610a97565b3461166185611a9d565b11156116af5760405162461bcd60e51b815260206004820152601760248201527f4554482073656e742069732062656c6f7720636f73742e0000000000000000006044820152606401610a97565b60005b848110156116df576116cd336116c88385613748565b6128a6565b806116d781613848565b9150506116b2565b507fc8b17f75f53401f272e9ee7fa431e81ba33779363238896180425a422420c8f761170a60025490565b60405190815260200160405180910390a150505050565b60008060028381548110611737576117376138f3565b6000918252602090912001546001600160a01b03169050806109865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a97565b600d80546117ce906137f4565b80601f01602080910402602001604051908101604052809291908181526020018280546117fa906137f4565b80156118475780601f1061181c57610100808354040283529160200191611847565b820191906000526020600020905b81548152906001019060200180831161182a57829003601f168201915b505050505081565b60006001600160a01b0382166118cd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a97565b6000805b60025481101561192957600281815481106118ee576118ee6138f3565b6000918252602090912001546001600160a01b03858116911614156119195761191682613848565b91505b61192281613848565b90506118d1565b5092915050565b600c546001600160a01b0316331461198a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b61199460006128c4565b565b600c546001600160a01b031633146119f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b60006119fb60025490565b905060005b82811015611a2d57611a1b33611a168385613748565b61292e565b80611a2581613848565b915050611a00565b507fc8b17f75f53401f272e9ee7fa431e81ba33779363238896180425a422420c8f7611a5860025490565b60405190815260200160405180910390a15050565b600060098281548110611a8257611a826138f3565b6000918252602090912001546001600160a01b031692915050565b600f546000908190610100900460ff16611abe57662386f26fc10000611ac1565b60005b66ffffffffffffff169050611ad7600a84613881565b611af657611aec8166470de4df820000613748565b6114af9084613774565b611b01600384613881565b611b1657611aec81666a94d74f430000613748565b611aec81668e1bc9bf040000613748565b60606001805461099b906137f4565b6000611b4160025490565b600f5490915060ff16611b965760405162461bcd60e51b815260206004820152601760248201527f53616c65206973206e6f7420796574206163746976652e0000000000000000006044820152606401610a97565b600a821115611c0d5760405162461bcd60e51b815260206004820152602b60248201527f416d6f756e74206f6620746f6b656e732065786365656473207472616e73616360448201527f74696f6e206c696d69742e0000000000000000000000000000000000000000006064820152608401610a97565b601e82611c193361184f565b611c239190613748565b1115611c975760405162461bcd60e51b815260206004820152602660248201527f416d6f756e74206f6620746f6b656e7320657863656564732077616c6c65742060448201527f6c696d69742e00000000000000000000000000000000000000000000000000006064820152608401610a97565b6110e1611ca48383613748565b1115611cf25760405162461bcd60e51b815260206004820152601660248201527f416d6f756e74206578636565647320737570706c792e000000000000000000006044820152606401610a97565b34611cfc83611a9d565b1115611d4a5760405162461bcd60e51b815260206004820152601760248201527f4554482073656e742069732062656c6f7720636f73742e0000000000000000006044820152606401610a97565b60005b82811015611a2d57611d63336116c88385613748565b80611d6d81613848565b915050611d4d565b6001600160a01b038216331415611dce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a97565b3360008181526004602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611e6233836124e4565b611ed45760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a97565b611ee084848484612a6e565b50505050565b600c546001600160a01b03163314611f405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f81490611fa690831515815260200190565b60405180910390a150565b600c546001600160a01b0316331461200b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527fe333f8a36ee86e754548af2d6f50c73ff0d501e22e6c784662123dbbe493c60290602001611fa6565b6060612075826122b5565b6120c15760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006044820152606401610a97565b600d6120cc83612af7565b6040516020016120dd929190613624565b6040516020818303038152906040529050919050565b600c546001600160a01b0316331461214d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a97565b6001600160a01b0381166121c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a97565b611028816128c4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061226557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061098657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610986565b60025460009082108015610986575060006001600160a01b0316600283815481106122e2576122e26138f3565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061234c82611721565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6005546001600160a01b038416600090815260076020526040812054909183916123af9086613774565b6123b99190613760565b6123c391906137b1565b949350505050565b8047101561241b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a97565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612468576040519150601f19603f3d011682016040523d82523d6000602084013e61246d565b606091505b5050905080610be95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a97565b60006124ef826122b5565b6125615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a97565b600061256c83611721565b9050806001600160a01b0316846001600160a01b031614806125a75750836001600160a01b031661259c84610a1e565b6001600160a01b0316145b806123c357506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff166123c3565b826001600160a01b03166125ee82611721565b6001600160a01b03161461266a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a97565b6001600160a01b0382166126e55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a97565b6126f06000826122ff565b8160028281548110612704576127046138f3565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600061278182611721565b905061278e6000836122ff565b6000600283815481106127a3576127a36138f3565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610be9908490612c29565b60008261289d8584612d0e565b14949350505050565b6128c0828260405180602001604052806000815250612dba565b5050565b600c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166129845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a97565b61298d816122b5565b156129da5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a97565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612a798484846125db565b612a8584848484612e43565b611ee05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b606081612b3757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b615780612b4b81613848565b9150612b5a9050600a83613760565b9150612b3b565b60008167ffffffffffffffff811115612b7c57612b7c613922565b6040519080825280601f01601f191660200182016040528015612ba6576020820181803683370190505b5090505b84156123c357612bbb6001836137b1565b9150612bc8600a86613881565b612bd3906030613748565b60f81b818381518110612be857612be86138f3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c22600a86613760565b9450612baa565b6000612c7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661300e9092919063ffffffff16565b805190915015610be95780806020019051810190612c9c9190613474565b610be95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a97565b600081815b8451811015612db2576000858281518110612d3057612d306138f3565b60200260200101519050808311612d72576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d9f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612daa81613848565b915050612d13565b509392505050565b612dc4838361292e565b612dd16000848484612e43565b610be95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b60006001600160a01b0384163b15613003576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ea09033908990889088906004016136f9565b602060405180830381600087803b158015612eba57600080fd5b505af1925050508015612f08575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612f05918101906134c7565b60015b612fb8573d808015612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b508051612fb05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a97565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506123c3565b506001949350505050565b60606123c3848460008585843b6130675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a97565b600080866001600160a01b031685876040516130839190613608565b60006040518083038185875af1925050503d80600081146130c0576040519150601f19603f3d011682016040523d82523d6000602084013e6130c5565b606091505b50915091506130d58282866130e0565b979650505050505050565b606083156130ef5750816114af565b8251156130ff5782518084602001fd5b8160405162461bcd60e51b8152600401610a979190613735565b828054613125906137f4565b90600052602060002090601f01602090048101928261314757600085556131ab565b82601f1061317e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008235161785556131ab565b828001600101855582156131ab579182015b828111156131ab578235825591602001919060010190613190565b506113b19291505b808211156113b157600081556001016131b3565b60008083601f8401126131d957600080fd5b50813567ffffffffffffffff8111156131f157600080fd5b6020830191508360208260051b850101111561320c57600080fd5b9250929050565b60006020828403121561322557600080fd5b81356114af81613951565b6000806040838503121561324357600080fd5b823561324e81613951565b9150602083013561325e81613951565b809150509250929050565b60008060006060848603121561327e57600080fd5b833561328981613951565b9250602084013561329981613951565b929592945050506040919091013590565b600080600080608085870312156132c057600080fd5b84356132cb81613951565b935060208501356132db81613951565b925060408501359150606085013567ffffffffffffffff808211156132ff57600080fd5b818701915087601f83011261331357600080fd5b81358181111561332557613325613922565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561336b5761336b613922565b816040528281528a602084870101111561338457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156133bd57600080fd5b83356133c881613951565b9250602084013567ffffffffffffffff8111156133e457600080fd5b6133f0868287016131c7565b9497909650939450505050565b6000806040838503121561341057600080fd5b823561341b81613951565b9150602083013561325e81613966565b6000806040838503121561343e57600080fd5b823561344981613951565b946020939093013593505050565b60006020828403121561346957600080fd5b81356114af81613966565b60006020828403121561348657600080fd5b81516114af81613966565b6000602082840312156134a357600080fd5b5035919050565b6000602082840312156134bc57600080fd5b81356114af81613974565b6000602082840312156134d957600080fd5b81516114af81613974565b600080602083850312156134f757600080fd5b823567ffffffffffffffff8082111561350f57600080fd5b818501915085601f83011261352357600080fd5b81358181111561353257600080fd5b86602082850101111561354457600080fd5b60209290920196919550909350505050565b60006020828403121561356857600080fd5b5051919050565b60008060006040848603121561358457600080fd5b83359250602084013567ffffffffffffffff8111156133e457600080fd5b600081518084526135ba8160208601602086016137c8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516135fe8185602086016137c8565b9290920192915050565b6000825161361a8184602087016137c8565b9190910192915050565b600080845481600182811c91508083168061364057607f831692505b6020808410821415613679577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561368d57600181146136bc576136e9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136e9565b60008b81526020902060005b868110156136e15781548b8201529085019083016136c8565b505084890196505b5050505050506114ab81856135ec565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372b60808301846135a2565b9695505050505050565b6020815260006114af60208301846135a2565b6000821982111561375b5761375b613895565b500190565b60008261376f5761376f6138c4565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ac576137ac613895565b500290565b6000828210156137c3576137c3613895565b500390565b60005b838110156137e35781810151838201526020016137cb565b83811115611ee05750506000910152565b600181811c9082168061380857607f821691505b60208210811415613842577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561387a5761387a613895565b5060010190565b600082613890576138906138c4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461102857600080fd5b801515811461102857600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461102857600080fdfea26469706673582212202872a1f0088be9e985e5342ed0d1d8bf556e34ea812957a5fe46f33bb1b2643a64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006b99d2b10f3cc0ce6b871a9f5f94e1ecd6222f47000000000000000000000000ab24486ec4c95563b34170163e26d4cbc10a8e7b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000055
-----Decoded View---------------
Arg [0] : shareholders (address[]): 0x6B99D2B10f3Cc0CE6b871A9F5f94e1ECD6222f47,0xAB24486eC4C95563b34170163E26D4cbC10A8e7b
Arg [1] : shares (uint256[]): 15,85
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000006b99d2b10f3cc0ce6b871a9f5f94e1ecd6222f47
Arg [4] : 000000000000000000000000ab24486ec4c95563b34170163e26d4cbc10a8e7b
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000055
Deployed Bytecode Sourcemap
260:4898:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:40:13;719:10:1;3216:40:13;;;-1:-1:-1;;;;;10962:55:17;;;10944:74;;3246:9:13;11049:2:17;11034:18;;11027:34;10917:18;3216:40:13;;;;;;;260:4898:14;;;;;247:222:4;;;;;;;;;;-1:-1:-1;247:222:4;;;;;:::i;:::-;;:::i;:::-;;;12066:14:17;;12059:22;12041:41;;12029:2;12014:18;247:222:4;;;;;;;;2113:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2896:295::-;;;;;;;;;;-1:-1:-1;2896:295:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10695:55:17;;;10677:74;;10665:2;10650:18;2896:295:3;10531:226:17;2434:401:3;;;;;;;;;;-1:-1:-1;2434:401:3;;;;;:::i;:::-;;:::i;:::-;;453:43:14;;;;;;;;;;;;494:2;453:43;;;;;12239:25:17;;;12227:2;12212:18;453:43:14;12093:177:17;540:108:4;;;;;;;;;;-1:-1:-1;627:7:4;:14;540:108;;4944:553:13;;;;;;;;;;-1:-1:-1;4944:553:13;;;;;:::i;:::-;;:::i;3910:364:3:-;;;;;;;;;;-1:-1:-1;3910:364:3;;;;;:::i;:::-;;:::i;672:25:14:-;;;;;;;;;;;;;;;;1001:478:4;;;;;;;;;;-1:-1:-1;1001:478:4;;;;;:::i;:::-;;:::i;548:41:14:-;;;;;;;;;;;;585:4;548:41;;3341:89:13;;;;;;;;;;-1:-1:-1;3411:12:13;;3341:89;;4433:133;;;;;;;;;;-1:-1:-1;4433:133:13;;;;;:::i;:::-;-1:-1:-1;;;;;4529:21:13;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;4340:179:3;;;;;;;;;;-1:-1:-1;4340:179:3;;;;;:::i;:::-;;:::i;5011:145:14:-;;;;;;;;;;-1:-1:-1;5011:145:14;;;;;:::i;:::-;;:::i;2758:81::-;;;;;;;;;;-1:-1:-1;2758:81:14;;;;;:::i;:::-;;:::i;5758:628:13:-;;;;;;;;;;-1:-1:-1;5758:628:13;;;;;:::i;:::-;;:::i;720:202:4:-;;;;;;;;;;-1:-1:-1;720:202:4;;;;;:::i;:::-;;:::i;870:33:14:-;;;;;;;;;;-1:-1:-1;870:33:14;;;;;;;;;;;2913:84;;;;;;;;;;-1:-1:-1;2913:84:14;;;;;:::i;:::-;;:::i;1722:207::-;;;;;;;;;;-1:-1:-1;1722:207:14;;;;;:::i;:::-;;:::i;4251:646::-;;;;;;:::i;:::-;;:::i;1738:313:3:-;;;;;;;;;;-1:-1:-1;1738:313:3;;;;;:::i;:::-;;:::i;813:30:14:-;;;;;;;;;;-1:-1:-1;813:30:14;;;;;;;;611:21;;;;;;;;;;;;;:::i;1304:377:3:-;;;;;;;;;;-1:-1:-1;1304:377:3;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;3115:234:14:-;;;;;;;;;;-1:-1:-1;3115:234:14;;;;;:::i;:::-;;:::i;4652:98:13:-;;;;;;;;;;-1:-1:-1;4652:98:13;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;2013:317:14;;;;;;;;;;-1:-1:-1;2013:317:14;;;;;:::i;:::-;;:::i;2275:102:3:-;;;;;;;;;;;;;:::i;4163:107:13:-;;;;;;;;;;-1:-1:-1;4163:107:13;;;;;:::i;:::-;-1:-1:-1;;;;;4245:18:13;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;3485:602:14;;;;;;:::i;:::-;;:::i;3258:318:3:-;;;;;;;;;;-1:-1:-1;3258:318:3;;;;;:::i;:::-;;:::i;4585:354::-;;;;;;;;;;-1:-1:-1;4585:354:3;;;;;:::i;:::-;;:::i;2580:119:14:-;;;;;;;;;;-1:-1:-1;2580:119:14;;;;;:::i;:::-;;:::i;2402:110::-;;;;;;;;;;-1:-1:-1;2402:110:14;;;;;:::i;:::-;;:::i;1387:214::-;;;;;;;;;;-1:-1:-1;1387:214:14;;;;;:::i;:::-;;:::i;3966:103:13:-;;;;;;;;;;-1:-1:-1;3966:103:13;;;;;:::i;:::-;-1:-1:-1;;;;;4046:16:13;4020:7;4046:16;;;:7;:16;;;;;;;3966:103;3763:117;;;;;;;;;;-1:-1:-1;3763:117:13;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:13;3821:7;3847:26;;;:19;:26;;;;;;;3763:117;3519:93;;;;;;;;;;-1:-1:-1;3591:14:13;;3519:93;;3642:206:3;;;;;;;;;;-1:-1:-1;3642:206:3;;;;;:::i;:::-;-1:-1:-1;;;;;3806:25:3;;;3779:4;3806:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3642:206;1911:198:12;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;369:35:14:-;;;;;;;;;;;;402:2;369:35;;247:222:4;349:4;372:50;;;387:35;372:50;;:90;;;426:36;450:11;426:23;:36::i;:::-;365:97;247:222;-1:-1:-1;;247:222:4:o;2113:98:3:-;2167:13;2199:5;2192:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2113:98;:::o;2896:295::-;3012:7;3056:16;3064:7;3056;:16::i;:::-;3035:107;;;;-1:-1:-1;;;3035:107:3;;20967:2:17;3035:107:3;;;20949:21:17;21006:2;20986:18;;;20979:30;21045:34;21025:18;;;21018:62;21116:14;21096:18;;;21089:42;21148:19;;3035:107:3;;;;;;;;;-1:-1:-1;3160:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;3160:24:3;;2896:295::o;2434:401::-;2514:13;2530:23;2545:7;2530:14;:23::i;:::-;2514:39;;2577:5;-1:-1:-1;;;;;2571:11:3;:2;-1:-1:-1;;;;;2571:11:3;;;2563:57;;;;-1:-1:-1;;;2563:57:3;;22853:2:17;2563:57:3;;;22835:21:17;22892:2;22872:18;;;22865:30;22931:34;22911:18;;;22904:62;23002:3;22982:18;;;22975:31;23023:19;;2563:57:3;22651:397:17;2563:57:3;719:10:1;-1:-1:-1;;;;;2652:21:3;;;;:62;;-1:-1:-1;2677:37:3;2694:5;719:10:1;3642:206:3;:::i;2677:37::-;2631:165;;;;-1:-1:-1;;;2631:165:3;;19010:2:17;2631:165:3;;;18992:21:17;19049:2;19029:18;;;19022:30;19088:34;19068:18;;;19061:62;19159:26;19139:18;;;19132:54;19203:19;;2631:165:3;18808:420:17;2631:165:3;2807:21;2816:2;2820:7;2807:8;:21::i;:::-;2504:331;2434:401;;:::o;4944:553:13:-;-1:-1:-1;;;;;5019:16:13;;5038:1;5019:16;;;:7;:16;;;;;;5011:71;;;;-1:-1:-1;;;5011:71:13;;15476:2:17;5011:71:13;;;15458:21:17;15515:2;15495:18;;;15488:30;15554:34;15534:18;;;15527:62;15625:8;15605:18;;;15598:36;15651:19;;5011:71:13;15274:402:17;5011:71:13;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:13;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;5224:17;5184:15;:58::i;:::-;5166:76;-1:-1:-1;5261:12:13;5253:68;;;;-1:-1:-1;;;5253:68:13;;18247:2:17;5253:68:13;;;18229:21:17;18286:2;18266:18;;;18259:30;18325:34;18305:18;;;18298:62;18396:13;18376:18;;;18369:41;18427:19;;5253:68:13;18045:407:17;5253:68:13;-1:-1:-1;;;;;5332:18:13;;;;;;:9;:18;;;;;:29;;5354:7;;5332:18;:29;;5354:7;;5332:29;:::i;:::-;;;;;;;;5389:7;5371:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5407:35:13;;-1:-1:-1;5425:7:13;5434;5407:17;:35::i;:::-;5457:33;;;-1:-1:-1;;;;;10962:55:17;;10944:74;;11049:2;11034:18;;11027:34;;;5457:33:13;;10917:18:17;5457:33:13;;;;;;;5001:496;;4944:553;:::o;3910:364:3:-;4112:41;719:10:1;4131:12:3;4145:7;4112:18;:41::i;:::-;4091:137;;;;-1:-1:-1;;;4091:137:3;;24023:2:17;4091:137:3;;;24005:21:17;24062:2;24042:18;;;24035:30;24101:34;24081:18;;;24074:62;24172:19;24152:18;;;24145:47;24209:19;;4091:137:3;23821:413:17;4091:137:3;4239:28;4249:4;4255:2;4259:7;4239:9;:28::i;1001:478:4:-;1098:15;1141:16;1151:5;1141:9;:16::i;:::-;1133:5;:24;1125:80;;;;-1:-1:-1;;;1125:80:4;;13474:2:17;1125:80:4;;;13456:21:17;13513:2;13493:18;;;13486:30;13552:34;13532:18;;;13525:62;13623:13;13603:18;;;13596:41;13654:19;;1125:80:4;13272:407:17;1125:80:4;1216:10;1240:6;1236:173;1252:7;:14;1248:18;;1236:173;;;1298:7;1306:1;1298:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1289:19:4;;;1298:10;;1289:19;1286:113;;;1339:5;1330;:14;1327:57;;;1353:1;-1:-1:-1;1346:8:4;;-1:-1:-1;1346:8:4;1327:57;1377:7;;;;:::i;:::-;;;;1327:57;1268:3;;;;:::i;:::-;;;;1236:173;;;-1:-1:-1;1419:53:4;;-1:-1:-1;;;1419:53:4;;13474:2:17;1419:53:4;;;13456:21:17;13513:2;13493:18;;;13486:30;13552:34;13532:18;;;13525:62;13623:13;13603:18;;;13596:41;13654:19;;1419:53:4;13272:407:17;4340:179:3;4473:39;4490:4;4496:2;4500:7;4473:39;;;;;;;;;;;;:16;:39::i;5011:145:14:-;5064:41;719:10:1;5083:12:14;640:96:1;5064:41:14;5056:75;;;;-1:-1:-1;;;5056:75:14;;22503:2:17;5056:75:14;;;22485:21:17;22542:2;22522:18;;;22515:30;22581:23;22561:18;;;22554:51;22622:18;;5056:75:14;22301:345:17;5056:75:14;5137:14;5143:7;5137:5;:14::i;:::-;5011:145;:::o;2758:81::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;2818:10:14::1;:16:::0;2758:81::o;5758:628:13:-;-1:-1:-1;;;;;5839:16:13;;5858:1;5839:16;;;:7;:16;;;;;;5831:71;;;;-1:-1:-1;;;5831:71:13;;15476:2:17;5831:71:13;;;15458:21:17;15515:2;15495:18;;;15488:30;15554:34;15534:18;;;15527:62;15625:8;15605:18;;;15598:36;15651:19;;5831:71:13;15274:402:17;5831:71:13;-1:-1:-1;;;;;3847:26:13;;5913:21;3847:26;;;:19;:26;;;;;;5937:30;;;;;5961:4;5937:30;;;10677:74:17;-1:-1:-1;;;;;5937:15:13;;;;;10650:18:17;;5937:30:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;5913:77;;6000:15;6018:65;6034:7;6043:13;6058:24;6067:5;6074:7;-1:-1:-1;;;;;4529:21:13;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;6018:65;6000:83;-1:-1:-1;6102:12:13;6094:68;;;;-1:-1:-1;;;6094:68:13;;18247:2:17;6094:68:13;;;18229:21:17;18286:2;18266:18;;;18259:30;18325:34;18305:18;;;18298:62;18396:13;18376:18;;;18369:41;18427:19;;6094:68:13;18045:407:17;6094:68:13;-1:-1:-1;;;;;6173:21:13;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6207:7;;6173:21;:41;;6207:7;;6173:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6224:26:13;;;;;;:19;:26;;;;;:37;;6254:7;;6224:26;:37;;6254:7;;6224:37;:::i;:::-;;;;-1:-1:-1;6272:47:13;;-1:-1:-1;6295:5:13;6302:7;6311;6272:22;:47::i;:::-;6334:45;;;-1:-1:-1;;;;;10962:55:17;;;10944:74;;11049:2;11034:18;;11027:34;;;6334:45:13;;;;;10917:18:17;6334:45:13;;;;;;;5821:565;;5758:628;;:::o;720:202:4:-;830:7;:14;795:7;;822:22;;814:79;;;;-1:-1:-1;;;814:79:4;;24799:2:17;814:79:4;;;24781:21:17;24838:2;24818:18;;;24811:30;24877:34;24857:18;;;24850:62;24948:14;24928:18;;;24921:42;24980:19;;814:79:4;24597:408:17;814:79:4;-1:-1:-1;910:5:4;720:202::o;2913:84:14:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;2979:13:14::1;:7;2989:3:::0;;2979:13:::1;:::i;1722:207::-:0;1844:22;;8390:66:17;8377:2;8373:15;;;8369:88;1844:22:14;;;8357:101:17;1806:4:14;;;;8474:12:17;;1844:22:14;;;;;;;;;;;;1834:33;;;;;;1818:49;;1880:44;1899:5;;1880:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1906:10:14;;;-1:-1:-1;1918:5:14;;-1:-1:-1;1880:18:14;:44::i;:::-;1873:51;;;1722:207;;;;;;:::o;4251:646::-;4330:22;4355:13;627:7:4;:14;;540:108;4355:13:14;4382;;4330:38;;-1:-1:-1;4382:13:14;;;;;4374:52;;;;-1:-1:-1;;;4374:52:14;;25623:2:17;4374:52:14;;;25605:21:17;25662:2;25642:18;;;25635:30;25701:28;25681:18;;;25674:56;25747:18;;4374:52:14;25421:350:17;4374:52:14;4440:32;4454:10;4466:5;;4440:13;:32::i;:::-;4432:72;;;;-1:-1:-1;;;4432:72:14;;23255:2:17;4432:72:14;;;23237:21:17;23294:2;23274:18;;;23267:30;23333:29;23313:18;;;23306:57;23380:18;;4432:72:14;23053:351:17;4432:72:14;779:2;4542:3;4518:21;4528:10;4518:9;:21::i;:::-;:27;;;;:::i;:::-;:48;;4510:102;;;;-1:-1:-1;;;4510:102:14;;13064:2:17;4510:102:14;;;13046:21:17;13103:2;13083:18;;;13076:30;13142:34;13122:18;;;13115:62;13213:11;13193:18;;;13186:39;13242:19;;4510:102:14;12862:405:17;4510:102:14;585:4;4626:20;4643:3;4626:14;:20;:::i;:::-;:34;;4618:69;;;;-1:-1:-1;;;4618:69:14;;18659:2:17;4618:69:14;;;18641:21:17;18698:2;18678:18;;;18671:30;18737:24;18717:18;;;18710:52;18779:18;;4618:69:14;18457:346:17;4618:69:14;4714:9;4701;4706:3;4701:4;:9::i;:::-;:22;;4693:58;;;;-1:-1:-1;;;4693:58:14;;12712:2:17;4693:58:14;;;12694:21:17;12751:2;12731:18;;;12724:30;12790:25;12770:18;;;12763:53;12833:18;;4693:58:14;12510:347:17;4693:58:14;4763:9;4758:90;4782:3;4778:1;:7;4758:90;;;4800:41;4810:10;4822:18;4839:1;4822:14;:18;:::i;:::-;4800:9;:41::i;:::-;4787:3;;;;:::i;:::-;;;;4758:90;;;;4859:33;4878:13;627:7:4;:14;;540:108;4878:13:14;4859:33;;12239:25:17;;;12227:2;12212:18;4859:33:14;;;;;;;4324:573;4251:646;;;:::o;1738:313:3:-;1850:7;1873:13;1889:7;1897;1889:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1889:16:3;;-1:-1:-1;1936:19:3;1915:107;;;;-1:-1:-1;;;1915:107:3;;19846:2:17;1915:107:3;;;19828:21:17;19885:2;19865:18;;;19858:30;19924:34;19904:18;;;19897:62;19995:11;19975:18;;;19968:39;20024:19;;1915:107:3;19644:405:17;611:21:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1304:377:3:-;1421:4;-1:-1:-1;;;;;1450:19:3;;1442:74;;;;-1:-1:-1;;;1442:74:3;;19435:2:17;1442:74:3;;;19417:21:17;19474:2;19454:18;;;19447:30;19513:34;19493:18;;;19486:62;19584:12;19564:18;;;19557:40;19614:19;;1442:74:3;19233:406:17;1442:74:3;1527:10;1552:6;1547:106;1564:7;:14;1560:18;;1547:106;;;1610:7;1618:1;1610:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1601:19:3;;;1610:10;;1601:19;1597:45;;;1635:7;;;:::i;:::-;;;1597:45;1580:3;;;:::i;:::-;;;1547:106;;;-1:-1:-1;1669:5:3;1304:377;-1:-1:-1;;1304:377:3:o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;3115:234:14:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;3170:22:14::1;3195:13;627:7:4::0;:14;;540:108;3195:13:14::1;3170:38;;3219:9;3214:86;3238:3;3234:1;:7;3214:86;;;3256:37;3262:10;3274:18;3291:1:::0;3274:14;:18:::1;:::i;:::-;3256:5;:37::i;:::-;3243:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3214:86;;;;3311:33;3330:13;627:7:4::0;:14;;540:108;3330:13:14::1;3311:33;::::0;12239:25:17;;;12227:2;12212:18;3311:33:14::1;;;;;;;3164:185;3115:234:::0;:::o;4652:98:13:-;4703:7;4729;4737:5;4729:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4729:14:13;;4652:98;-1:-1:-1;;4652:98:13:o;2013:317:14:-;2102:13;;2061:7;;;;2102:13;;;;;:30;;2122:10;2102:30;;;2118:1;2102:30;2076:56;;;-1:-1:-1;2142:8:14;2148:2;2142:3;:8;:::i;:::-;2138:67;;2173:28;2186:15;2173:10;:28;:::i;:::-;2166:36;;:3;:36;:::i;2138:67::-;2214:7;2220:1;2214:3;:7;:::i;:::-;2210:67;;2245:28;2258:15;2245:10;:28;:::i;2210:67::-;2296:28;2309:15;2296:10;:28;:::i;2275:102:3:-;2331:13;2363:7;2356:14;;;;;:::i;3485:602:14:-;3535:22;3560:13;627:7:4;:14;;540:108;3560:13:14;3587:10;;3535:38;;-1:-1:-1;3587:10:14;;3579:46;;;;-1:-1:-1;;;3579:46:14;;21741:2:17;3579:46:14;;;21723:21:17;21780:2;21760:18;;;21753:30;21819:25;21799:18;;;21792:53;21862:18;;3579:46:14;21539:347:17;3579:46:14;402:2;3639:3;:13;;3631:69;;;;-1:-1:-1;;;3631:69:14;;23611:2:17;3631:69:14;;;23593:21:17;23650:2;23630:18;;;23623:30;23689:34;23669:18;;;23662:62;23760:13;23740:18;;;23733:41;23791:19;;3631:69:14;23409:407:17;3631:69:14;494:2;3738:3;3714:21;3724:10;3714:9;:21::i;:::-;:27;;;;:::i;:::-;:45;;3706:96;;;;-1:-1:-1;;;3706:96:14;;15069:2:17;3706:96:14;;;15051:21:17;15108:2;15088:18;;;15081:30;15147:34;15127:18;;;15120:62;15218:8;15198:18;;;15191:36;15244:19;;3706:96:14;14867:402:17;3706:96:14;585:4;3816:20;3833:3;3816:14;:20;:::i;:::-;:34;;3808:69;;;;-1:-1:-1;;;3808:69:14;;18659:2:17;3808:69:14;;;18641:21:17;18698:2;18678:18;;;18671:30;18737:24;18717:18;;;18710:52;18779:18;;3808:69:14;18457:346:17;3808:69:14;3904:9;3891;3896:3;3891:4;:9::i;:::-;:22;;3883:58;;;;-1:-1:-1;;;3883:58:14;;12712:2:17;3883:58:14;;;12694:21:17;12751:2;12731:18;;;12724:30;12790:25;12770:18;;;12763:53;12833:18;;3883:58:14;12510:347:17;3883:58:14;3953:9;3948:90;3972:3;3968:1;:7;3948:90;;;3990:41;4000:10;4012:18;4029:1;4012:14;:18;:::i;3990:41::-;3977:3;;;;:::i;:::-;;;;3948:90;;3258:318:3;-1:-1:-1;;;;;3388:24:3;;719:10:1;3388:24:3;;3380:62;;;;-1:-1:-1;;;3380:62:3;;16288:2:17;3380:62:3;;;16270:21:17;16327:2;16307:18;;;16300:30;16366:27;16346:18;;;16339:55;16411:18;;3380:62:3;16086:349:17;3380:62:3;719:10:1;3453:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;3453:42:3;;;;;;;;;;;;:53;;;;;;;;;;;;;3521:48;;12041:41:17;;;3453:42:3;;719:10:1;3521:48:3;;12014:18:17;3521:48:3;;;;;;;3258:318;;:::o;4585:354::-;4767:41;719:10:1;4800:7:3;4767:18;:41::i;:::-;4746:137;;;;-1:-1:-1;;;4746:137:3;;24023:2:17;4746:137:3;;;24005:21:17;24062:2;24042:18;;;24035:30;24101:34;24081:18;;;24074:62;24172:19;24152:18;;;24145:47;24209:19;;4746:137:3;23821:413:17;4746:137:3;4893:39;4907:4;4913:2;4917:7;4926:5;4893:13;:39::i;:::-;4585:354;;;;:::o;2580:119:14:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;2640:13:14::1;:19:::0;;;::::1;;;;::::0;;;::::1;;::::0;;2670:24:::1;::::0;::::1;::::0;::::1;::::0;2656:3;12066:14:17;12059:22;12041:41;;12029:2;12014:18;;11901:187;2670:24:14::1;;;;;;;;2580:119:::0;:::o;2402:110::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;2459:10:14::1;:16:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;2486:21:::1;::::0;12041:41:17;;;2486:21:14::1;::::0;12029:2:17;12014:18;2486:21:14::1;11901:187:17::0;1387:214:14;1452:13;1481:16;1489:7;1481;:16::i;:::-;1473:50;;;;-1:-1:-1;;;1473:50:14;;20617:2:17;1473:50:14;;;20599:21:17;20656:2;20636:18;;;20629:30;20695:23;20675:18;;;20668:51;20736:18;;1473:50:14;20415:345:17;1473:50:14;1560:7;1569:25;1586:7;1569:16;:25::i;:::-;1543:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1529:67;;1387:214;;;:::o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;21380:2:17;1233:68:12;;;21362:21:17;;;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;21510:18;;1233:68:12;21178:356:17;1233:68:12;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;14305:2:17;1991:73:12::1;::::0;::::1;14287:21:17::0;14344:2;14324:18;;;14317:30;14383:34;14363:18;;;14356:62;14454:8;14434:18;;;14427:36;14480:19;;1991:73:12::1;14103:402:17::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;901:344:3:-:0;1043:4;1082:40;;;1097:25;1082:40;;:104;;-1:-1:-1;1138:48:3;;;1153:33;1138:48;1082:104;:156;;;-1:-1:-1;952:25:2;937:40;;;;1202:36:3;829:155:2;6445:153:3;6543:7;:14;6510:4;;6533:24;;:58;;;;;6589:1;-1:-1:-1;;;;;6561:30:3;:7;6569;6561:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6561:16:3;:30;;6526:65;6445:153;-1:-1:-1;;6445:153:3:o;10333:171::-;10407:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;10407:29:3;;;;;;;;:24;;10460:23;10407:24;10460:14;:23::i;:::-;-1:-1:-1;;;;;10451:46:3;;;;;;;;;;;10333:171;;:::o;6558:242:13:-;6763:12;;-1:-1:-1;;;;;6743:16:13;;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:13:o;2065:312:0:-;2179:6;2154:21;:31;;2146:73;;;;-1:-1:-1;;;2146:73:0;;17069:2:17;2146:73:0;;;17051:21:17;17108:2;17088:18;;;17081:30;17147:31;17127:18;;;17120:59;17196:18;;2146:73:0;16867:353:17;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;;16642:2:17;2292:78:0;;;16624:21:17;16681:2;16661:18;;;16654:30;16720:34;16700:18;;;16693:62;16791:28;16771:18;;;16764:56;16837:19;;2292:78:0;16440:422:17;6756:438:3;6881:4;6922:16;6930:7;6922;:16::i;:::-;6901:107;;;;-1:-1:-1;;;6901:107:3;;17834:2:17;6901:107:3;;;17816:21:17;17873:2;17853:18;;;17846:30;17912:34;17892:18;;;17885:62;17983:14;17963:18;;;17956:42;18015:19;;6901:107:3;17632:408:17;6901:107:3;7018:13;7034:23;7049:7;7034:14;:23::i;:::-;7018:39;;7086:5;-1:-1:-1;;;;;7075:16:3;:7;-1:-1:-1;;;;;7075:16:3;;:63;;;;7131:7;-1:-1:-1;;;;;7107:31:3;:20;7119:7;7107:11;:20::i;:::-;-1:-1:-1;;;;;7107:31:3;;7075:63;:111;;;-1:-1:-1;;;;;;3806:25:3;;;3779:4;3806:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7154:32;3642:206;9687:535;9854:4;-1:-1:-1;;;;;9827:31:3;:23;9842:7;9827:14;:23::i;:::-;-1:-1:-1;;;;;9827:31:3;;9806:119;;;;-1:-1:-1;;;9806:119:3;;22093:2:17;9806:119:3;;;22075:21:17;22132:2;22112:18;;;22105:30;22171:34;22151:18;;;22144:62;22242:11;22222:18;;;22215:39;22271:19;;9806:119:3;21891:405:17;9806:119:3;-1:-1:-1;;;;;9943:16:3;;9935:65;;;;-1:-1:-1;;;9935:65:3;;15883:2:17;9935:65:3;;;15865:21:17;15922:2;15902:18;;;15895:30;15961:34;15941:18;;;15934:62;16032:6;16012:18;;;16005:34;16056:19;;9935:65:3;15681:400:17;9935:65:3;10112:29;10129:1;10133:7;10112:8;:29::i;:::-;10170:2;10151:7;10159;10151:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;-1:-1:-1;;;;;10151:21:3;;;;;;10188:27;;10207:7;;10188:27;;;;;;;;;;10151:16;10188:27;9687:535;;;:::o;9041:322::-;9100:13;9116:23;9131:7;9116:14;:23::i;:::-;9100:39;;9236:29;9253:1;9257:7;9236:8;:29::i;:::-;9302:1;9275:7;9283;9275:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;;;-1:-1:-1;;;;;9275:29:3;;;;;;9320:36;;9348:7;;9320:36;;;;;9275:16;;9320:36;9090:273;9041:322;:::o;687:205:15:-;826:58;;;-1:-1:-1;;;;;10962:55:17;;826:58:15;;;10944:74:17;11034:18;;;;11027:34;;;826:58:15;;;;;;;;;;10917:18:17;;;;826:58:15;;;;;;;;;;849:23;826:58;;;799:86;;819:5;;799:19;:86::i;847:184:11:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:11:o;7524:108:3:-;7599:26;7609:2;7613:7;7599:26;;;;;;;;;;;;:9;:26::i;:::-;7524:108;;:::o;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;8486:338:3:-;-1:-1:-1;;;;;8565:16:3;;8557:61;;;;-1:-1:-1;;;8557:61:3;;20256:2:17;8557:61:3;;;20238:21:17;;;20275:18;;;20268:30;20334:34;20314:18;;;20307:62;20386:18;;8557:61:3;20054:356:17;8557:61:3;8637:16;8645:7;8637;:16::i;:::-;8636:17;8628:58;;;;-1:-1:-1;;;8628:58:3;;14712:2:17;8628:58:3;;;14694:21:17;14751:2;14731:18;;;14724:30;14790;14770:18;;;14763:58;14838:18;;8628:58:3;14510:352:17;8628:58:3;8752:7;:16;;;;;;;-1:-1:-1;8752:16:3;;;;;;;;;-1:-1:-1;;;;;8752:16:3;;;;;;;;8784:33;;8809:7;;-1:-1:-1;8784:33:3;;-1:-1:-1;;8784:33:3;8486:338;;:::o;5801:341::-;5952:28;5962:4;5968:2;5972:7;5952:9;:28::i;:::-;6011:48;6034:4;6040:2;6044:7;6053:5;6011:22;:48::i;:::-;5990:145;;;;-1:-1:-1;;;5990:145:3;;13886:2:17;5990:145:3;;;13868:21:17;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;14035:20;14015:18;;;14008:48;14073:19;;5990:145:3;13684:414:17;328:703:16;384:13;601:10;597:51;;-1:-1:-1;;627:10:16;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:16;;-1:-1:-1;773:2:16;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:16;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:16;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:16;981:2;972:11;;:::i;:::-;;;844:150;;3193:706:15;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:15;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:15;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:15;;25212:2:17;3797:85:15;;;25194:21:17;25251:2;25231:18;;;25224:30;25290:34;25270:18;;;25263:62;25361:12;25341:18;;;25334:40;25391:19;;3797:85:15;25010:406:17;1383:688:11;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;;;;;;8654:19:17;;;8689:12;;;8682:28;;;8726:12;;1779:44:11;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;8654:19:17;;;8689:12;;;8682:28;;;8726:12;;1966:44:11;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:11;;;;:::i;:::-;;;;1522:514;;;-1:-1:-1;2052:12:11;1383:688;-1:-1:-1;;;1383:688:11:o;7853:311:3:-;7978:18;7984:2;7988:7;7978:5;:18::i;:::-;8027:54;8058:1;8062:2;8066:7;8075:5;8027:22;:54::i;:::-;8006:151;;;;-1:-1:-1;;;8006:151:3;;13886:2:17;8006:151:3;;;13868:21:17;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;14035:20;14015:18;;;14008:48;14073:19;;8006:151:3;13684:414:17;11057:950:3;11207:4;-1:-1:-1;;;;;11227:13:3;;1087:20:0;1133:8;11223:778:3;;11278:170;;;;;-1:-1:-1;;;;;11278:36:3;;;;;:170;;719:10:1;;11370:4:3;;11396:7;;11425:5;;11278:170;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11278:170:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11258:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11627:13:3;;11623:312;;11669:106;;-1:-1:-1;;;11669:106:3;;13886:2:17;11669:106:3;;;13868:21:17;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;14035:20;14015:18;;;14008:48;14073:19;;11669:106:3;13684:414:17;11623:312:3;11887:6;11881:13;11872:6;11868:2;11864:15;11857:38;11258:691;11510:51;;11520:41;11510:51;;-1:-1:-1;11503:58:3;;11223:778;-1:-1:-1;11986:4:3;11057:950;;;;;;:::o;3514:223:0:-;3647:12;3678:52;3700:6;3708:4;3714:1;3717:12;3647;1087:20;;4881:60;;;;-1:-1:-1;;;4881:60:0;;24441:2:17;4881:60:0;;;24423:21:17;24480:2;24460:18;;;24453:30;24519:31;24499:18;;;24492:59;24568:18;;4881:60:0;24239:353:17;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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:367:17;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:17;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:247::-;445:6;498:2;486:9;477:7;473:23;469:32;466:52;;;514:1;511;504:12;466:52;553:9;540:23;572:31;597:5;572:31;:::i;898:388::-;966:6;974;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1082:9;1069:23;1101:31;1126:5;1101:31;:::i;:::-;1151:5;-1:-1:-1;1208:2:17;1193:18;;1180:32;1221:33;1180:32;1221:33;:::i;:::-;1273:7;1263:17;;;898:388;;;;;:::o;1291:456::-;1368:6;1376;1384;1437:2;1425:9;1416:7;1412:23;1408:32;1405:52;;;1453:1;1450;1443:12;1405:52;1492:9;1479:23;1511:31;1536:5;1511:31;:::i;:::-;1561:5;-1:-1:-1;1618:2:17;1603:18;;1590:32;1631:33;1590:32;1631:33;:::i;:::-;1291:456;;1683:7;;-1:-1:-1;;;1737:2:17;1722:18;;;;1709:32;;1291:456::o;1752:1325::-;1847:6;1855;1863;1871;1924:3;1912:9;1903:7;1899:23;1895:33;1892:53;;;1941:1;1938;1931:12;1892:53;1980:9;1967:23;1999:31;2024:5;1999:31;:::i;:::-;2049:5;-1:-1:-1;2106:2:17;2091:18;;2078:32;2119:33;2078:32;2119:33;:::i;:::-;2171:7;-1:-1:-1;2225:2:17;2210:18;;2197:32;;-1:-1:-1;2280:2:17;2265:18;;2252:32;2303:18;2333:14;;;2330:34;;;2360:1;2357;2350:12;2330:34;2398:6;2387:9;2383:22;2373:32;;2443:7;2436:4;2432:2;2428:13;2424:27;2414:55;;2465:1;2462;2455:12;2414:55;2501:2;2488:16;2523:2;2519;2516:10;2513:36;;;2529:18;;:::i;:::-;2663:2;2657:9;2725:4;2717:13;;2568:66;2713:22;;;2737:2;2709:31;2705:40;2693:53;;;2761:18;;;2781:22;;;2758:46;2755:72;;;2807:18;;:::i;:::-;2847:10;2843:2;2836:22;2882:2;2874:6;2867:18;2922:7;2917:2;2912;2908;2904:11;2900:20;2897:33;2894:53;;;2943:1;2940;2933:12;2894:53;2999:2;2994;2990;2986:11;2981:2;2973:6;2969:15;2956:46;3044:1;3039:2;3034;3026:6;3022:15;3018:24;3011:35;3065:6;3055:16;;;;;;;1752:1325;;;;;;;:::o;3082:572::-;3177:6;3185;3193;3246:2;3234:9;3225:7;3221:23;3217:32;3214:52;;;3262:1;3259;3252:12;3214:52;3301:9;3288:23;3320:31;3345:5;3320:31;:::i;:::-;3370:5;-1:-1:-1;3426:2:17;3411:18;;3398:32;3453:18;3442:30;;3439:50;;;3485:1;3482;3475:12;3439:50;3524:70;3586:7;3577:6;3566:9;3562:22;3524:70;:::i;:::-;3082:572;;3613:8;;-1:-1:-1;3498:96:17;;-1:-1:-1;;;;3082:572:17:o;3659:382::-;3724:6;3732;3785:2;3773:9;3764:7;3760:23;3756:32;3753:52;;;3801:1;3798;3791:12;3753:52;3840:9;3827:23;3859:31;3884:5;3859:31;:::i;:::-;3909:5;-1:-1:-1;3966:2:17;3951:18;;3938:32;3979:30;3938:32;3979:30;:::i;4046:315::-;4114:6;4122;4175:2;4163:9;4154:7;4150:23;4146:32;4143:52;;;4191:1;4188;4181:12;4143:52;4230:9;4217:23;4249:31;4274:5;4249:31;:::i;:::-;4299:5;4351:2;4336:18;;;;4323:32;;-1:-1:-1;;;4046:315:17:o;4366:241::-;4422:6;4475:2;4463:9;4454:7;4450:23;4446:32;4443:52;;;4491:1;4488;4481:12;4443:52;4530:9;4517:23;4549:28;4571:5;4549:28;:::i;4612:245::-;4679:6;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;4780:9;4774:16;4799:28;4821:5;4799:28;:::i;4862:180::-;4921:6;4974:2;4962:9;4953:7;4949:23;4945:32;4942:52;;;4990:1;4987;4980:12;4942:52;-1:-1:-1;5013:23:17;;4862:180;-1:-1:-1;4862:180:17:o;5047:245::-;5105:6;5158:2;5146:9;5137:7;5133:23;5129:32;5126:52;;;5174:1;5171;5164:12;5126:52;5213:9;5200:23;5232:30;5256:5;5232:30;:::i;5297:249::-;5366:6;5419:2;5407:9;5398:7;5394:23;5390:32;5387:52;;;5435:1;5432;5425:12;5387:52;5467:9;5461:16;5486:30;5510:5;5486:30;:::i;6226:592::-;6297:6;6305;6358:2;6346:9;6337:7;6333:23;6329:32;6326:52;;;6374:1;6371;6364:12;6326:52;6414:9;6401:23;6443:18;6484:2;6476:6;6473:14;6470:34;;;6500:1;6497;6490:12;6470:34;6538:6;6527:9;6523:22;6513:32;;6583:7;6576:4;6572:2;6568:13;6564:27;6554:55;;6605:1;6602;6595:12;6554:55;6645:2;6632:16;6671:2;6663:6;6660:14;6657:34;;;6687:1;6684;6677:12;6657:34;6732:7;6727:2;6718:6;6714:2;6710:15;6706:24;6703:37;6700:57;;;6753:1;6750;6743:12;6700:57;6784:2;6776:11;;;;;6806:6;;-1:-1:-1;6226:592:17;;-1:-1:-1;;;;6226:592:17:o;7008:184::-;7078:6;7131:2;7119:9;7110:7;7106:23;7102:32;7099:52;;;7147:1;7144;7137:12;7099:52;-1:-1:-1;7170:16:17;;7008:184;-1:-1:-1;7008:184:17:o;7197:505::-;7292:6;7300;7308;7361:2;7349:9;7340:7;7336:23;7332:32;7329:52;;;7377:1;7374;7367:12;7329:52;7413:9;7400:23;7390:33;;7474:2;7463:9;7459:18;7446:32;7501:18;7493:6;7490:30;7487:50;;;7533:1;7530;7523:12;7707:327;7759:3;7797:5;7791:12;7824:6;7819:3;7812:19;7840:63;7896:6;7889:4;7884:3;7880:14;7873:4;7866:5;7862:16;7840:63;:::i;:::-;7948:2;7936:15;7953:66;7932:88;7923:98;;;;8023:4;7919:109;;7707:327;-1:-1:-1;;7707:327:17:o;8039:184::-;8080:3;8118:5;8112:12;8133:52;8178:6;8173:3;8166:4;8159:5;8155:16;8133:52;:::i;:::-;8201:16;;;;;8039:184;-1:-1:-1;;8039:184:17:o;8749:274::-;8878:3;8916:6;8910:13;8932:53;8978:6;8973:3;8966:4;8958:6;8954:17;8932:53;:::i;:::-;9001:16;;;;;8749:274;-1:-1:-1;;8749:274:17:o;9028:1288::-;9204:3;9233:1;9266:6;9260:13;9296:3;9318:1;9346:9;9342:2;9338:18;9328:28;;9406:2;9395:9;9391:18;9428;9418:61;;9472:4;9464:6;9460:17;9450:27;;9418:61;9498:2;9546;9538:6;9535:14;9515:18;9512:38;9509:222;;;9585:77;9580:3;9573:90;9686:4;9683:1;9676:15;9716:4;9711:3;9704:17;9509:222;9747:18;9774:162;;;;9950:1;9945:320;;;;9740:525;;9774:162;9822:66;9811:9;9807:82;9802:3;9795:95;9919:6;9914:3;9910:16;9903:23;;9774:162;;9945:320;26031:1;26024:14;;;26068:4;26055:18;;10040:1;10054:165;10068:6;10065:1;10062:13;10054:165;;;10146:14;;10133:11;;;10126:35;10189:16;;;;10083:10;;10054:165;;;10058:3;;10248:6;10243:3;10239:16;10232:23;;9740:525;;;;;;;10281:29;10306:3;10298:6;10281:29;:::i;11072:522::-;11266:4;-1:-1:-1;;;;;11376:2:17;11368:6;11364:15;11353:9;11346:34;11428:2;11420:6;11416:15;11411:2;11400:9;11396:18;11389:43;;11468:6;11463:2;11452:9;11448:18;11441:34;11511:3;11506:2;11495:9;11491:18;11484:31;11532:56;11583:3;11572:9;11568:19;11560:6;11532:56;:::i;:::-;11524:64;11072:522;-1:-1:-1;;;;;;11072:522:17:o;12275:230::-;12424:2;12413:9;12406:21;12387:4;12444:55;12495:2;12484:9;12480:18;12472:6;12444:55;:::i;26084:128::-;26124:3;26155:1;26151:6;26148:1;26145:13;26142:39;;;26161:18;;:::i;:::-;-1:-1:-1;26197:9:17;;26084:128::o;26217:120::-;26257:1;26283;26273:35;;26288:18;;:::i;:::-;-1:-1:-1;26322:9:17;;26217:120::o;26342:228::-;26382:7;26508:1;26440:66;26436:74;26433:1;26430:81;26425:1;26418:9;26411:17;26407:105;26404:131;;;26515:18;;:::i;:::-;-1:-1:-1;26555:9:17;;26342:228::o;26575:125::-;26615:4;26643:1;26640;26637:8;26634:34;;;26648:18;;:::i;:::-;-1:-1:-1;26685:9:17;;26575:125::o;26705:258::-;26777:1;26787:113;26801:6;26798:1;26795:13;26787:113;;;26877:11;;;26871:18;26858:11;;;26851:39;26823:2;26816:10;26787:113;;;26918:6;26915:1;26912:13;26909:48;;;-1:-1:-1;;26953:1:17;26935:16;;26928:27;26705:258::o;26968:437::-;27047:1;27043:12;;;;27090;;;27111:61;;27165:4;27157:6;27153:17;27143:27;;27111:61;27218:2;27210:6;27207:14;27187:18;27184:38;27181:218;;;27255:77;27252:1;27245:88;27356:4;27353:1;27346:15;27384:4;27381:1;27374:15;27181:218;;26968:437;;;:::o;27410:195::-;27449:3;27480:66;27473:5;27470:77;27467:103;;;27550:18;;:::i;:::-;-1:-1:-1;27597:1:17;27586:13;;27410:195::o;27610:112::-;27642:1;27668;27658:35;;27673:18;;:::i;:::-;-1:-1:-1;27707:9:17;;27610:112::o;27727:184::-;27779:77;27776:1;27769:88;27876:4;27873:1;27866:15;27900:4;27897:1;27890:15;27916:184;27968:77;27965:1;27958:88;28065:4;28062:1;28055:15;28089:4;28086:1;28079:15;28105:184;28157:77;28154:1;28147:88;28254:4;28251:1;28244:15;28278:4;28275:1;28268:15;28294:184;28346:77;28343:1;28336:88;28443:4;28440:1;28433:15;28467:4;28464:1;28457:15;28483:154;-1:-1:-1;;;;;28562:5:17;28558:54;28551:5;28548:65;28538:93;;28627:1;28624;28617:12;28642:118;28728:5;28721:13;28714:21;28707:5;28704:32;28694:60;;28750:1;28747;28740:12;28765:177;28850:66;28843:5;28839:78;28832:5;28829:89;28819:117;;28932:1;28929;28922:12
Swarm Source
ipfs://2872a1f0088be9e985e5342ed0d1d8bf556e34ea812957a5fe46f33bb1b2643a
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.